{
"cost-structure": "Costs: 25 dollars for Google API access\n\nBreak even: 2 dollars per user per month for 13 users",
"high-level-concept": "Ansible meets Wikipedia for projects and teams.",
"uvp": "Single source of truth for projects, teams and operations/activities.",
"unfair-advantage": "OnePlaybook's secret sauce: we use open source software that's easy to deploy, customize, self host (so no need to run servers), that uses open standards, and has an established user community base."
}
{
"uvp": "The only playbook you'll ever need to professionally manage and grow your consulting gigs at little to no cost.",
"high-level-concept": "Asana for independent consultancy",
"cost-structure": "Time intensive because of real-time collab tool and integrations\n\n25 dollars monthly to access Google cloud platform.\n\nBreakeven: 2$ * 13 customers per month = $26"
}
{
"uvp": "Unify your knowledge sources into one insightful, distributed wiki space.",
"high-level-concept": "IDE, git and GitHub for private knowledge management.",
"unfair-advantage": "We delegate backend hosting to curated 3rd parties, so we can be totally 'serverless' & focus on enabling our UVP."
}
{
"high-level-concept": "Canva + Wikipedia for apps",
"cost-structure": "Costs: 25 dollars for Google API access\n\nBreak even: 2 dollars per user per month for 13 users",
"uvp": "Helps you go from zero to low code hero faster at minimal cost."
}
{
"uvp": "Manage projects better for less with just one app to avoid drowning your project in hundreds of app subscriptions, email burnout & lost knowledge.",
"high-level-concept": "Digital assistant for projects.",
"cost-structure": "Time intensive because of gmail & other integrations \nrequired, real-time collaboration manager \n\nAccess to Google APIs at 25 dollars."
}
{
"high-level-concept": "Pinterest for actionable knowledge"
}
{
"high-level-concept": "Wikis + social network + Git for knowledge",
"uvp": "Group knowledge creation, capture, organization and sharing made better",
"unfair-advantage": "We don't need servers to run. It's truly server less."
}
{
"uvp": "An all-in-one toolkit to design & run a lean, mean startup machine",
"high-level-concept": "GitHub meets Asana and Notion for startup stakeholders",
"cost-structure": "Maybe 25 dollars but otherwise there's not much in terms of costs\n\nBreak even: 2$ *13 users per month = $26"
}
{
"high-level-concept": "Miro meets Notion for teams with tight budgets",
"uvp": "TiddlyWiki made simple for work and collaboration",
"cost-structure": "Costs: 25 dollars for Google API access\n\nBreak even: 2 dollars per user per month for 13 users"
}
{
"uvp": "Knowledge creation, capture and sharing made simpler, flexible and accessible.",
"high-level-concept": "Github for knowledge and knowledge processes.",
"unfair-advantage": "We don't need servers to run. It's truly server less."
}
{
"high-level-concept": "A distributed wiki notebook workspace",
"uvp": "A notebook paradigm workspace to create, consolidate, share and reuse knowledge and tools better than with directories & app switching.",
"unfair-advantage": "We delegate backend hosting to curated 3rd parties, so we can be totally 'serverless' & focus on enabling our UVP."
}
<<todolist-ui caption:"!!🏡 Home affairs" base:"home" width:50%>>
<<todolist-ui caption:"!! Work" base:"work" width:50%>>
<<todolist-ui caption:"!! Hobbies" base:"hobbies" width:50%>>
<$tmap editor="advanced" height="600px" ></$tmap>
:focus {
outline: 2px solid black;
}
button:focus-visible {
outline: 2px solid blue;
}
<$action-sendmessage $message="tm-save-wiki"/>
<$navigator story="$:/StoryList" history="$:/HistoryList">
<$action-navigate $to="$:/ControlPanel"/>
<$action-sendmessage $message="tm-focus-selector" $param="""[data-tiddler-title="$:/ControlPanel"]""" preventScroll="true"/>
</$navigator>
<$navigator story="$:/StoryList" history="$:/HistoryList">
<$action-navigate $to="$:/core/ui/SideBar/Open"/>
<$action-sendmessage $message="tm-focus-selector" $param="""[data-tiddler-title="$:/core/ui/SideBar/Open"]""" preventScroll="true"/>
</$navigator>
<$navigator story="$:/StoryList" history="$:/HistoryList">
<$action-navigate $to="Content"/>
<$action-sendmessage $message="tm-focus-selector" $param="""[data-tiddler-title="Content"]""" preventScroll="true"/>
</$navigator>
Built from branch 'tiddlywiki-com' at commit 90b7961629943a43cd91000ebeb7f9d0cfe589e9 of https://github.com/Jermolene/TiddlyWiki5.git at 2019-01-27 19:41:46 UTC
{
"require": [
"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js",
"$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js",
"$:/plugins/tiddlywiki/codemirror/addon/search/searchcursor.js",
"$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js",
"$:/plugins/tiddlywiki/codemirror/keymap/sublime.js"
],
"configuration": {
"keyMap": "sublime",
"showCursorWhenSelecting": true,
"styleActiveLine": true,
"matchBrackets": true,
"autoCloseBrackets" : true,
"theme": "liquibyte"
}
}
<div class="topbar-nav">
<!--Modify text in navbar-->
<div class="topbar-nav-text">
{{$:/SiteTitle}}
</div>
<!--Add or remove tools in navbar-->
<div class="topbar-nav-tools">
{{$:/core/ui/Buttons/new-tiddler}}
{{$:/plugins/Abe/maarfapad/notes-list}}
{{$:/plugins/Abe/maarfapad/search-btn}}
{{$:/core/ui/Buttons/close-all}}
{{$:/plugins/Abe/maarfapad/save-wiki-button}}
{{$:/plugins/Abe/maarfapad/start-button}}
</div>
</div>
{{$:/language/OfficialPluginLibrary/Hint}}
{{$:/language/EditTemplate/Fields/Add/Button/Hint}}
{{$:/language/Buttons/AdvancedSearch/Hint}}
{{$:/language/Shortcuts/Input/AdvancedSearch/Hint}}
{{$:/language/Buttons/Bold/Hint}}
{{$:/language/Buttons/Cancel/Hint}}
{{$:/language/Shortcuts/SidebarLayout/Hint}}
{{$:/language/EditTemplate/Field/Remove/Hint}}
{{$:/language/Buttons/Excise/Hint}}
{{$:/language/Buttons/Heading1/Hint}}
{{$:/language/Buttons/Heading2/Hint}}
{{$:/language/Buttons/Heading3/Hint}}
{{$:/language/Buttons/Heading4/Hint}}
{{$:/language/Buttons/Heading5/Hint}}
{{$:/language/Buttons/Heading6/Hint}}
{{$:/language/Shortcuts/Input/Accept/Hint}}
{{$:/language/Shortcuts/Input/AcceptVariant/Hint}}
{{$:/language/Shortcuts/Input/Cancel/Hint}}
{{$:/language/Shortcuts/Input/Down/Hint}}
{{$:/language/Shortcuts/Input/Tab-Left/Hint}}
{{$:/language/Shortcuts/Input/Tab-Right/Hint}}
{{$:/language/Shortcuts/Input/Up/Hint}}
{{$:/language/Buttons/Italic/Hint}}
{{$:/language/LayoutSwitcher/Description}}
{{$:/language/Buttons/Link/Hint}}
{{$:/language/Buttons/Linkify/Hint}}
{{$:/language/Buttons/ListBullet/Hint}}
{{$:/language/Buttons/ListNumber/Hint}}
{{$:/language/Buttons/MonoBlock/Hint}}
{{$:/language/Buttons/MonoLine/Hint}}
{{$:/language/Buttons/NewImage/Hint}}
{{$:/language/Buttons/NewJournal/Hint}}
{{$:/language/Buttons/NewTiddler/Hint}}
{{$:/language/Buttons/Picture/Hint}}
{{$:/language/Buttons/Preview/Hint}}
{{$:/language/Buttons/Quote/Hint}}
{{$:/language/Buttons/Save/Hint}}
{{$:/language/Buttons/SaveWiki/Hint}}
{{$:/language/Buttons/SidebarSearch/Hint}}
{{$:/language/Buttons/Stamp/Hint}}
{{$:/language/Buttons/Strikethrough/Hint}}
{{$:/language/Buttons/Subscript/Hint}}
{{$:/language/Buttons/Superscript/Hint}}
{{$:/language/Buttons/ToggleSidebar/Hint}}
{{$:/language/Buttons/Transcludify/Hint}}
{{$:/language/Buttons/Underline/Hint}}
Navigate to Content tiddler
{
"tiddlers": {
"$:/Acknowledgements": {
"title": "$:/Acknowledgements",
"text": "TiddlyWiki incorporates code from these fine OpenSource projects:\n\n* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]\n* [[The Jasmine JavaScript Test Framework|http://pivotal.github.io/jasmine/]]\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\n\nAnd media from these projects:\n\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\n"
},
"$:/core/copyright.txt": {
"title": "$:/core/copyright.txt",
"type": "text/plain",
"text": "TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright (c) 2004-2007, Jeremy Ruston\nCopyright (c) 2007-2020, UnaMesa Association\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
},
"$:/core/icon": {
"title": "$:/core/icon",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path d=\"M64 0l54.56 32v64L64 128 9.44 96V32L64 0zm21.127 95.408c-3.578-.103-5.15-.094-6.974-3.152l-1.42.042c-1.653-.075-.964-.04-2.067-.097-1.844-.07-1.548-1.86-1.873-2.8-.52-3.202.687-6.43.65-9.632-.014-1.14-1.593-5.17-2.157-6.61-1.768.34-3.546.406-5.34.497-4.134-.01-8.24-.527-12.317-1.183-.8 3.35-3.16 8.036-1.21 11.44 2.37 3.52 4.03 4.495 6.61 4.707 2.572.212 3.16 3.18 2.53 4.242-.55.73-1.52.864-2.346 1.04l-1.65.08c-1.296-.046-2.455-.404-3.61-.955-1.93-1.097-3.925-3.383-5.406-5.024.345.658.55 1.938.24 2.53-.878 1.27-4.665 1.26-6.4.47-1.97-.89-6.73-7.162-7.468-11.86 1.96-3.78 4.812-7.07 6.255-11.186-3.146-2.05-4.83-5.384-4.61-9.16l.08-.44c-3.097.59-1.49.37-4.82.628-10.608-.032-19.935-7.37-14.68-18.774.34-.673.664-1.287 1.243-.994.466.237.4 1.18.166 2.227-3.005 13.627 11.67 13.732 20.69 11.21.89-.25 2.67-1.936 3.905-2.495 2.016-.91 4.205-1.282 6.376-1.55 5.4-.63 11.893 2.276 15.19 2.37 3.3.096 7.99-.805 10.87-.615 2.09.098 4.143.483 6.16 1.03 1.306-6.49 1.4-11.27 4.492-12.38 1.814.293 3.213 2.818 4.25 4.167 2.112-.086 4.12.46 6.115 1.066 3.61-.522 6.642-2.593 9.833-4.203-3.234 2.69-3.673 7.075-3.303 11.127.138 2.103-.444 4.386-1.164 6.54-1.348 3.507-3.95 7.204-6.97 7.014-1.14-.036-1.805-.695-2.653-1.4-.164 1.427-.81 2.7-1.434 3.96-1.44 2.797-5.203 4.03-8.687 7.016-3.484 2.985 1.114 13.65 2.23 15.594 1.114 1.94 4.226 2.652 3.02 4.406-.37.58-.936.785-1.54 1.01l-.82.11zm-40.097-8.85l.553.14c.694-.27 2.09.15 2.83.353-1.363-1.31-3.417-3.24-4.897-4.46-.485-1.47-.278-2.96-.174-4.46l.02-.123c-.582 1.205-1.322 2.376-1.72 3.645-.465 1.71 2.07 3.557 3.052 4.615l.336.3z\" fill-rule=\"evenodd\"/></svg>"
},
"$:/core/images/add-comment": {
"title": "$:/core/images/add-comment",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-add-comment tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 56H36a8 8 0 100 16h20v20a8 8 0 1016 0V72h20a8 8 0 100-16H72V36a8 8 0 10-16 0v20zm-12.595 58.362c-6.683 7.659-20.297 12.903-36.006 12.903-2.196 0-4.35-.102-6.451-.3 9.652-3.836 17.356-12.24 21.01-22.874C8.516 94.28 0 79.734 0 63.5 0 33.953 28.206 10 63 10s63 23.953 63 53.5S97.794 117 63 117c-6.841 0-13.428-.926-19.595-2.638z\"/></svg>"
},
"$:/core/images/advanced-search-button": {
"title": "$:/core/images/advanced-search-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-advanced-search-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M74.565 87.985A47.776 47.776 0 0148 96C21.49 96 0 74.51 0 48S21.49 0 48 0s48 21.49 48 48c0 9.854-2.97 19.015-8.062 26.636l34.347 34.347a9.443 9.443 0 010 13.36 9.446 9.446 0 01-13.36 0l-34.36-34.358zM48 80c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/><circle cx=\"48\" cy=\"48\" r=\"8\"/><circle cx=\"28\" cy=\"48\" r=\"8\"/><circle cx=\"68\" cy=\"48\" r=\"8\"/></g></svg>"
},
"$:/core/images/auto-height": {
"title": "$:/core/images/auto-height",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-auto-height tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M67.987 114.356l-.029-14.477a4 4 0 00-2.067-3.494l-15.966-8.813-1.933 7.502H79.9c4.222 0 5.564-5.693 1.786-7.58L49.797 71.572 48.01 79.15h31.982c4.217 0 5.564-5.682 1.795-7.575L49.805 55.517l-1.795 7.575h31.982c4.212 0 5.563-5.67 1.805-7.57l-16.034-8.105 2.195 3.57V35.614l9.214 9.213a4 4 0 105.656-5.656l-16-16a4 4 0 00-5.656 0l-16 16a4 4 0 105.656 5.656l9.13-9.13v15.288a4 4 0 002.195 3.57l16.035 8.106 1.804-7.57H48.01c-4.217 0-5.564 5.682-1.795 7.574l31.982 16.059 1.795-7.575H48.01c-4.222 0-5.564 5.693-1.787 7.579l31.89 15.923 1.787-7.578H47.992c-4.133 0-5.552 5.504-1.933 7.501l15.966 8.813-2.067-3.494.029 14.436-9.159-9.158a4 4 0 00-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656l-9.185 9.184zM16 20h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
},
"$:/core/images/blank": {
"title": "$:/core/images/blank",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-blank tc-image-button\" viewBox=\"0 0 128 128\"/>"
},
"$:/core/images/bold": {
"title": "$:/core/images/bold",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-bold tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.146 51.81V21.87h26.353c2.51 0 4.93.21 7.26.628 2.33.418 4.392 1.165 6.185 2.24 1.793 1.076 3.227 2.57 4.302 4.482 1.076 1.913 1.614 4.363 1.614 7.35 0 5.379-1.613 9.263-4.84 11.653-3.227 2.39-7.35 3.586-12.37 3.586H41.146zM13 0v128h62.028a65.45 65.45 0 0016.762-2.151c5.438-1.434 10.278-3.645 14.52-6.633 4.244-2.988 7.62-6.842 10.13-11.563 2.51-4.721 3.764-10.308 3.764-16.762 0-8.008-1.942-14.85-5.826-20.527-3.884-5.677-9.77-9.65-17.658-11.921 5.737-2.75 10.069-6.275 12.997-10.577 2.928-4.303 4.392-9.681 4.392-16.135 0-5.976-.986-10.995-2.958-15.059-1.972-4.063-4.75-7.32-8.336-9.77-3.585-2.45-7.888-4.213-12.907-5.289C84.888.538 79.33 0 73.235 0H13zm28.146 106.129V70.992H71.8c6.095 0 10.995 1.404 14.7 4.212 3.705 2.81 5.558 7.5 5.558 14.073 0 3.347-.568 6.096-1.703 8.247-1.136 2.151-2.66 3.854-4.572 5.11-1.912 1.254-4.123 2.15-6.633 2.688-2.51.538-5.139.807-7.888.807H41.146z\"/></svg>"
},
"$:/core/images/cancel-button": {
"title": "$:/core/images/cancel-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 76.314l-16.97 16.97a7.999 7.999 0 01-11.314 0c-3.118-3.118-3.124-8.19 0-11.313L52.686 65l-16.97-16.97a7.999 7.999 0 010-11.314c3.118-3.118 8.19-3.124 11.313 0L64 53.686l16.97-16.97a7.999 7.999 0 0111.314 0c3.118 3.118 3.124 8.19 0 11.313L75.314 65l16.97 16.97a7.999 7.999 0 010 11.314c-3.118 3.118-8.19 3.124-11.313 0L64 76.314zM64 129c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 1 0 29.654 0 65c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 17 64 17 16 38.49 16 65s21.49 48 48 48z\"/></svg>"
},
"$:/core/images/chevron-down": {
"title": "$:/core/images/chevron-down",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-down tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.053 85.456a7.889 7.889 0 01-5.6-2.316L2.473 27.16a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0L64.05 66.344l50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.105 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.317z\"/><path d=\"M64.053 124.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></g></svg>"
},
"$:/core/images/chevron-left": {
"title": "$:/core/images/chevron-left",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M47.544 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L66.656 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.105 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.317-5.595z\"/><path d=\"M8.931 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L28.041 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.104 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.316-5.595z\"/></g></svg>"
},
"$:/core/images/chevron-right": {
"title": "$:/core/images/chevron-right",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-right tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M83.456 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196L64.344 63.95 13.963 13.567a7.92 7.92 0 010-11.195c3.086-3.085 8.105-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.317 5.595z\"/><path d=\"M122.069 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></g></svg>"
},
"$:/core/images/chevron-up": {
"title": "$:/core/images/chevron-up",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-up tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M63.947 44.544c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 63.656l-50.382 50.382a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.317z\"/><path d=\"M63.947 5.931c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 25.041 13.567 75.423a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.104 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.316z\"/></g></svg>"
},
"$:/core/images/clone-button": {
"title": "$:/core/images/clone-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-clone-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M32.265 96v24.002A7.996 7.996 0 0040.263 128h79.74a7.996 7.996 0 007.997-7.998v-79.74a7.996 7.996 0 00-7.998-7.997H96V48h12.859a2.99 2.99 0 012.994 2.994v57.865a2.99 2.99 0 01-2.994 2.994H50.994A2.99 2.99 0 0148 108.859V96H32.265z\"/><path d=\"M40 56h-7.993C27.588 56 24 52.418 24 48c0-4.41 3.585-8 8.007-8H40v-7.993C40 27.588 43.582 24 48 24c4.41 0 8 3.585 8 8.007V40h7.993C68.412 40 72 43.582 72 48c0 4.41-3.585 8-8.007 8H56v7.993C56 68.412 52.418 72 48 72c-4.41 0-8-3.585-8-8.007V56zM8 0C3.58 0 0 3.588 0 8v80c0 4.419 3.588 8 8 8h80c4.419 0 8-3.588 8-8V8c0-4.419-3.588-8-8-8H8zM19 16A2.997 2.997 0 0016 19.001v57.998A2.997 2.997 0 0019.001 80h57.998A2.997 2.997 0 0080 76.999V19.001A2.997 2.997 0 0076.999 16H19.001z\"/></g></svg>"
},
"$:/core/images/close-all-button": {
"title": "$:/core/images/close-all-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-close-all-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M28 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L16.686 100 2.543 85.856a8 8 0 0111.313-11.313L28 88.686l14.144-14.143a8 8 0 0111.313 11.313L39.314 100l14.143 14.144a8 8 0 01-11.313 11.313L28 111.314zM28 39.314L13.856 53.457A8 8 0 012.543 42.144L16.686 28 2.543 13.856A8 8 0 0113.856 2.543L28 16.686 42.144 2.543a8 8 0 0111.313 11.313L39.314 28l14.143 14.144a8 8 0 01-11.313 11.313L28 39.314zM100 39.314L85.856 53.457a8 8 0 01-11.313-11.313L88.686 28 74.543 13.856A8 8 0 0185.856 2.543L100 16.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 28l14.143 14.144a8 8 0 01-11.313 11.313L100 39.314zM100 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L88.686 100 74.543 85.856a8 8 0 0111.313-11.313L100 88.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 100l14.143 14.144a8 8 0 01-11.313 11.313L100 111.314z\"/></g></svg>"
},
"$:/core/images/close-button": {
"title": "$:/core/images/close-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M65.086 75.41l-50.113 50.113c-3.121 3.121-8.192 3.126-11.316.002-3.118-3.118-3.123-8.19.002-11.316l50.114-50.114L3.659 13.982C.538 10.86.533 5.79 3.657 2.666c3.118-3.118 8.19-3.123 11.316.002l50.113 50.114L115.2 2.668c3.121-3.121 8.192-3.126 11.316-.002 3.118 3.118 3.123 8.19-.002 11.316L76.4 64.095l50.114 50.114c3.121 3.121 3.126 8.192.002 11.316-3.118 3.118-8.19 3.123-11.316-.002L65.086 75.409z\"/></svg>"
},
"$:/core/images/close-others-button": {
"title": "$:/core/images/close-others-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-others-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48zm0-16c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32zm0-16c8.837 0 16-7.163 16-16s-7.163-16-16-16-16 7.163-16 16 7.163 16 16 16z\"/></svg>"
},
"$:/core/images/copy-clipboard": {
"title": "$:/core/images/copy-clipboard",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-copy-clipboard tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"33\" height=\"8\" x=\"40\" y=\"40\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"82\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"54\" rx=\"4\"/><rect width=\"33\" height=\"8\" x=\"40\" y=\"96\" rx=\"4\"/><rect width=\"12\" height=\"8\" x=\"40\" y=\"68\" rx=\"4\"/><path d=\"M40 16H24c-4.419 0-8 3.59-8 8a8.031 8.031 0 000 .01v95.98a8.03 8.03 0 000 .01c0 4.41 3.581 8 8 8h80a7.975 7.975 0 005.652-2.34 7.958 7.958 0 002.348-5.652v-16.016c0-4.414-3.582-7.992-8-7.992-4.41 0-8 3.578-8 7.992V112H32V32h64v8.008C96 44.422 99.582 48 104 48c4.41 0 8-3.578 8-7.992V23.992a7.963 7.963 0 00-2.343-5.651A7.995 7.995 0 00104.001 16H88c0-4.41-3.585-8-8.007-8H48.007C43.588 8 40 11.582 40 16zm4-1.004A4.001 4.001 0 0148 11h32c2.21 0 4 1.797 4 3.996v4.008A4.001 4.001 0 0180 23H48c-2.21 0-4-1.797-4-3.996v-4.008z\"/><rect width=\"66\" height=\"16\" x=\"62\" y=\"64\" rx=\"8\"/><path d=\"M84.657 82.343l-16-16v11.314l16-16a8 8 0 10-11.314-11.314l-16 16a8 8 0 000 11.314l16 16a8 8 0 1011.314-11.314z\"/></g></svg>"
},
"$:/core/images/delete-button": {
"title": "$:/core/images/delete-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(12)\"><rect width=\"105\" height=\"16\" y=\"11\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"28\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"8\" y=\"16\" rx=\"8\"/><rect width=\"88\" height=\"16\" x=\"8\" y=\"112\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"80\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"56\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"32\" y=\"16\" rx=\"8\"/></g></svg>"
},
"$:/core/images/done-button": {
"title": "$:/core/images/done-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M42.26 111.032c-2.051.001-4.103-.78-5.668-2.345L2.662 74.758a8 8 0 01-.005-11.32c3.118-3.117 8.192-3.12 11.32.007l28.278 28.278 72.124-72.124a8.002 8.002 0 0111.314-.001c3.118 3.118 3.124 8.19 0 11.315l-77.78 77.78a7.978 7.978 0 01-5.658 2.343z\"/></svg>"
},
"$:/core/images/down-arrow": {
"title": "$:/core/images/down-arrow",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.177 100.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.086 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></svg>"
},
"$:/core/images/download-button": {
"title": "$:/core/images/download-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-download-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\" class=\"tc-image-download-button-ring\"/><path d=\"M34.35 66.43l26.892 27.205a4.57 4.57 0 006.516 0L94.65 66.43a4.7 4.7 0 000-6.593 4.581 4.581 0 00-3.258-1.365h-8.46c-2.545 0-4.608-2.087-4.608-4.661v-15.15c0-2.575-2.063-4.662-4.608-4.662H55.284c-2.545 0-4.608 2.087-4.608 4.662v15.15c0 2.574-2.063 4.661-4.608 4.661h-8.46c-2.545 0-4.608 2.087-4.608 4.662a4.69 4.69 0 001.35 3.296z\"/></g></svg>"
},
"$:/core/images/edit-button": {
"title": "$:/core/images/edit-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M95.627 10.059l-5.656 5.657 11.313 11.313 5.657-5.656-11.314-11.314zm5.657-5.657l1.966-1.966c3.123-3.122 8.194-3.129 11.319-.005 3.117 3.118 3.122 8.192-.005 11.32l-1.966 1.965-11.314-11.314zm-16.97 16.97l-60.25 60.25a8.12 8.12 0 00-.322.342c-.1.087-.198.179-.295.275-5.735 5.735-10.702 22.016-10.702 22.016s16.405-5.09 22.016-10.702c.095-.096.186-.193.272-.292a8.12 8.12 0 00.345-.325l60.25-60.25-11.314-11.313zM35.171 124.19c6.788-.577 13.898-2.272 23.689-5.348 1.825-.573 3.57-1.136 6.336-2.04 16-5.226 21.877-6.807 28.745-7.146 8.358-.413 13.854 2.13 17.58 8.699a4 4 0 006.959-3.946c-5.334-9.406-13.745-13.296-24.933-12.744-7.875.39-14.057 2.052-30.835 7.533-2.739.894-4.46 1.45-6.25 2.012-19.46 6.112-30.77 7.072-39.597 1.747a4 4 0 10-4.132 6.85c6.333 3.82 13.754 5.12 22.438 4.383z\"/></g></svg>"
},
"$:/core/images/erase": {
"title": "$:/core/images/erase",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-erase tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.087 127.996l63.015-63.015c6.535-6.535 6.528-17.115-.003-23.646L99.466 17.702c-6.539-6.538-17.117-6.532-23.646-.003L4.898 88.62c-6.535 6.534-6.528 17.115.003 23.646l15.73 15.73h39.456zm-34.95-7.313l-14.324-14.325c-3.267-3.268-3.268-8.564-.008-11.824L46.269 59.07l35.462 35.462-26.15 26.15H25.137z\"/></svg>"
},
"$:/core/images/excise": {
"title": "$:/core/images/excise",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-excise tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 107.314l-2.343 2.343a8 8 0 11-11.314-11.314l16-16a8 8 0 0111.314 0l16 16a8 8 0 11-11.314 11.314L72 107.314v14.284c0 3.536-3.582 6.402-8 6.402s-8-2.866-8-6.402v-14.284zM0 40.007C0 35.585 3.59 32 8 32c4.418 0 8 3.588 8 8.007v31.986C16 76.415 12.41 80 8 80c-4.418 0-8-3.588-8-8.007V40.007zm32 0C32 35.585 35.59 32 40 32c4.418 0 8 3.588 8 8.007v31.986C48 76.415 44.41 80 40 80c-4.418 0-8-3.588-8-8.007V40.007zm48 0C80 35.585 83.59 32 88 32c4.418 0 8 3.588 8 8.007v31.986C96 76.415 92.41 80 88 80c-4.418 0-8-3.588-8-8.007V40.007zm-24-32C56 3.585 59.59 0 64 0c4.418 0 8 3.588 8 8.007v31.986C72 44.415 68.41 48 64 48c-4.418 0-8-3.588-8-8.007V8.007zm56 32c0-4.422 3.59-8.007 8-8.007 4.418 0 8 3.588 8 8.007v31.986c0 4.422-3.59 8.007-8 8.007-4.418 0-8-3.588-8-8.007V40.007z\"/></svg>"
},
"$:/core/images/export-button": {
"title": "$:/core/images/export-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-export-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.003 128H119.993a7.984 7.984 0 005.664-2.349v.007A7.975 7.975 0 00128 120V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v56H16V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v64c0 4.418 3.59 8 8 8h.003zm48.62-100.689l-8.965 8.966c-3.125 3.125-8.195 3.13-11.319.005-3.118-3.118-3.122-8.192.005-11.319L58.962 2.346A7.986 7.986 0 0164.625 0l-.006.002c2.05-.001 4.102.78 5.666 2.344l22.618 22.617c3.124 3.125 3.129 8.195.005 11.319-3.118 3.118-8.192 3.122-11.319-.005l-8.965-8.966v61.256c0 4.411-3.582 8-8 8-4.41 0-8-3.582-8-8V27.311z\"/></svg>"
},
"$:/core/images/file": {
"title": "$:/core/images/file",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-file tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M111.968 30.5H112V120a8 8 0 01-8 8H24a8 8 0 01-8-8V8a8 8 0 018-8h57v.02a7.978 7.978 0 015.998 2.337l22.627 22.627a7.975 7.975 0 012.343 5.516zM81 8H24v112h80V30.5H89c-4.418 0-8-3.578-8-8V8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"68\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"84\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"100\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/></svg>"
},
"$:/core/images/fixed-height": {
"title": "$:/core/images/fixed-height",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fixed-height tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60 35.657l-9.172 9.171a4 4 0 11-5.656-5.656l16-16a4 4 0 015.656 0l16 16a4 4 0 01-5.656 5.656L68 35.657v57.686l9.172-9.171a4 4 0 115.656 5.656l-16 16a4 4 0 01-5.656 0l-16-16a4 4 0 115.656-5.656L60 93.343V35.657zM16 116h96a4 4 0 100-8H16a4 4 0 100 8zm0-96h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
},
"$:/core/images/fold-all-button": {
"title": "$:/core/images/fold-all-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M64.03 20.004c-2.05 0-4.102.78-5.667 2.344L35.746 44.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 22.348a7.986 7.986 0 00-5.663-2.346zM64.03 85.002c-2.05-.001-4.102.78-5.667 2.344l-22.617 22.617c-3.125 3.125-3.13 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.966 16.966 16.966c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.192-.005-11.319L69.687 87.346A7.986 7.986 0 0064.024 85z\"/></g></svg>"
},
"$:/core/images/fold-button": {
"title": "$:/core/images/fold-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M64.03 25.004c-2.05 0-4.102.78-5.667 2.344L35.746 49.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 27.348a7.986 7.986 0 00-5.663-2.346zM64.005 67.379c-2.05 0-4.102.78-5.666 2.344L35.722 92.34c-3.125 3.125-3.13 8.195-.006 11.32 3.118 3.117 8.192 3.121 11.32-.006L64 86.69l16.965 16.965c3.125 3.125 8.195 3.13 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L69.663 69.723A7.986 7.986 0 0064 67.377z\"/></g></svg>"
},
"$:/core/images/fold-others-button": {
"title": "$:/core/images/fold-others-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-others tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" y=\"56.031\" rx=\"8\"/><path d=\"M86.632 79.976c-2.05 0-4.102.78-5.666 2.345L64 99.286 47.034 82.321a7.986 7.986 0 00-5.662-2.346l.005.001c-2.05 0-4.102.78-5.666 2.345l-22.618 22.617c-3.124 3.125-3.129 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.966-16.966 16.965 16.966a7.986 7.986 0 005.663 2.346l-.005-.002c2.05 0 4.102-.78 5.666-2.344l16.965-16.966 16.966 16.966c3.125 3.124 8.194 3.129 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L92.289 82.321a7.986 7.986 0 00-5.663-2.346zM86.7 48.024c-2.05 0-4.102-.78-5.666-2.345L64.07 28.714 47.103 45.679a7.986 7.986 0 01-5.663 2.346l.005-.001c-2.05 0-4.101-.78-5.666-2.345L13.162 23.062c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L41.44 28.714l16.966-16.966a7.986 7.986 0 015.662-2.346l-.005.002c2.05 0 4.102.78 5.666 2.344l16.966 16.966 16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L92.358 45.679a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
},
"$:/core/images/folder": {
"title": "$:/core/images/folder",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-folder tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.694 128H8C3.58 128 0 124.414 0 119.996V48.004C0 43.584 3.584 40 7.999 40H16v-8c0-4.418 3.578-8 8-8h32a8 8 0 018 8v8h40.001c4.418 0 7.999 3.586 7.999 8.004V59.83l-8-.082v-7.749A4 4 0 0099.997 48H56V36c0-2.21-1.793-4-4.004-4H28.004A4 4 0 0024 36v12H12.003A4 4 0 008 52v64a4 4 0 004.003 4h46.76l-3.069 8z\"/><path d=\"M23.873 55.5h96.003c4.417 0 7.004 4.053 5.774 9.063l-13.344 54.374c-1.228 5.005-5.808 9.063-10.223 9.063H6.08c-4.417 0-7.003-4.053-5.774-9.063L13.65 64.563c1.228-5.005 5.808-9.063 10.223-9.063zm1.78 8.5h87.994c2.211 0 3.504 2.093 2.891 4.666l-11.12 46.668c-.614 2.577-2.902 4.666-5.115 4.666H12.31c-2.211 0-3.504-2.093-2.891-4.666l11.12-46.668C21.152 66.09 23.44 64 25.653 64z\"/></g></svg>"
},
"$:/core/images/full-screen-button": {
"title": "$:/core/images/full-screen-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-full-screen-button tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 8a8 8 0 018-8h32a8 8 0 110 16H16v24a8 8 0 11-16 0V8zM128 120a8 8 0 01-8 8H88a8 8 0 110-16h24V88a8 8 0 1116 0v32zM8 128a8 8 0 01-8-8V88a8 8 0 1116 0v24h24a8 8 0 110 16H8zM120 0a8 8 0 018 8v32a8 8 0 11-16 0V16H88a8 8 0 110-16h32z\"/></svg>"
},
"$:/core/images/github": {
"title": "$:/core/images/github",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-github tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M63.938 1.607c-35.336 0-63.994 28.69-63.994 64.084 0 28.312 18.336 52.329 43.768 60.802 3.202.59 4.37-1.388 4.37-3.088 0-1.518-.056-5.55-.087-10.897-17.802 3.871-21.558-8.591-21.558-8.591-2.911-7.404-7.108-9.375-7.108-9.375-5.81-3.973.44-3.895.44-3.895 6.424.453 9.803 6.606 9.803 6.606 5.709 9.791 14.981 6.963 18.627 5.322.582-4.138 2.236-6.963 4.063-8.564-14.211-1.617-29.153-7.117-29.153-31.672 0-6.995 2.495-12.718 6.589-17.195-.66-1.621-2.856-8.14.629-16.96 0 0 5.37-1.722 17.597 6.57 5.104-1.424 10.58-2.132 16.022-2.16 5.438.028 10.91.736 16.022 2.16 12.22-8.292 17.582-6.57 17.582-6.57 3.493 8.82 1.297 15.339.64 16.96 4.102 4.477 6.578 10.2 6.578 17.195 0 24.618-14.966 30.035-29.22 31.62 2.295 1.98 4.342 5.89 4.342 11.87 0 8.564-.079 15.476-.079 17.576 0 1.715 1.155 3.71 4.4 3.084 25.413-8.493 43.733-32.494 43.733-60.798 0-35.394-28.657-64.084-64.006-64.084\"/></svg>"
},
"$:/core/images/gitter": {
"title": "$:/core/images/gitter",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-gitter tc-image-button\" viewBox=\"0 0 18 25\"><path d=\"M15 5h2v10h-2zM10 5h2v20h-2zM5 5h2v20H5zM0 0h2v15H0z\"/></svg>"
},
"$:/core/images/globe": {
"title": "$:/core/images/globe",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-globe tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M72.811 37.128v2.554c0 2.196.978 6.881 0 8.832-1.466 2.928-4.65 3.54-6.394 5.867-1.182 1.577-4.618 10.601-3.69 12.92 3.969 9.922 11.534 3.187 17.962 9.293.864.821 2.887 2.273 3.296 3.296 3.29 8.223-7.576 15.009 3.757 26.3 1.245 1.24 3.813-3.817 4.079-4.614.852-2.563 6.725-5.45 9.088-7.053 2.02-1.37 4.873-2.667 6.328-4.745 2.27-3.244 1.48-7.514 3.098-10.745 2.139-4.274 3.828-9.635 5.998-13.966 3.898-7.781 4.721 2.093 5.067 2.439.358.357 1.011 0 1.517 0 .094 0 1.447.099 1.516 0 .65-.935-1.043-17.92-1.318-19.297-1.404-7.01-6.944-15.781-11.865-20.5-6.274-6.015-7.09-16.197-18.259-14.954-.204.022-5.084 10.148-7.777 13.512-3.728 4.657-2.47-4.153-6.526-4.153-.081 0-1.183-.103-1.253 0-.586.88-1.44 3.896-2.306 4.417-.265.16-1.722-.239-1.846 0-2.243 4.3 8.256 2.212 5.792 7.952-2.352 5.481-6.328-1.997-6.328 8.56M44.467 7.01c9.685 6.13.682 12.198 2.694 16.215 1.655 3.303 4.241 5.395 1.714 9.814-2.063 3.608-6.87 3.966-9.623 6.723-3.04 3.044-5.464 8.94-6.79 12.911-1.617 4.843 14.547 6.866 12.063 11.008-1.386 2.311-6.746 1.466-8.437.198-1.165-.873-3.593-.546-4.417-1.78-2.613-3.915-2.26-8.023-3.625-12.128-.938-2.822-6.313-2.12-7.844-.593-.523.522-.33 1.792-.33 2.505 0 5.285 7.12 3.316 7.12 6.46 0 14.636 3.927 6.534 11.14 11.336 10.036 6.683 7.844 7.303 14.946 14.404 3.673 3.673 7.741 3.686 9.425 9.294 1.602 5.331-9.327 5.339-11.716 7.448-1.123.991-2.813 4.146-4.219 4.615-1.792.598-3.234.496-4.944 1.78-2.427 1.82-3.9 4.932-4.02 4.81-2.148-2.147-3.52-15.479-3.89-18.257-.588-4.42-5.59-5.54-6.986-9.03-1.57-3.927 1.524-9.52-1.129-13.761-6.52-10.424-11.821-14.5-15.35-26.292-.942-3.148 3.342-6.529 4.877-8.833 1.877-2.816 2.662-5.854 4.746-8.635C22.147 24.19 40.855 9.461 43.857 8.635l.61-1.625z\"/><path d=\"M64 126c34.242 0 62-27.758 62-62 0-34.242-27.758-62-62-62C29.758 2 2 29.758 2 64c0 34.242 27.758 62 62 62zm0-6c30.928 0 56-25.072 56-56S94.928 8 64 8 8 33.072 8 64s25.072 56 56 56z\"/></g></svg>"
},
"$:/core/images/heading-1": {
"title": "$:/core/images/heading-1",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-1 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M14 30h13.25v30.104H61.7V30h13.25v75.684H61.7V71.552H27.25v34.132H14V30zm70.335 13.78c2.544 0 5.017-.212 7.42-.636 2.403-.424 4.576-1.13 6.52-2.12 1.942-.99 3.603-2.261 4.981-3.816 1.378-1.555 2.28-3.463 2.703-5.724h9.858v74.2h-13.25V53.32H84.335v-9.54z\"/></svg>"
},
"$:/core/images/heading-2": {
"title": "$:/core/images/heading-2",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-2 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm119.52 75.684H74.85c.07-6.148 1.555-11.519 4.452-16.112 2.897-4.593 6.855-8.586 11.872-11.978a133.725 133.725 0 017.526-5.141 59.6 59.6 0 007.208-5.353c2.19-1.908 3.993-3.975 5.406-6.201 1.413-2.226 2.155-4.788 2.226-7.685 0-1.343-.159-2.774-.477-4.293a11.357 11.357 0 00-1.855-4.24c-.919-1.307-2.19-2.403-3.816-3.286-1.625-.883-3.745-1.325-6.36-1.325-2.403 0-4.399.477-5.989 1.431-1.59.954-2.862 2.261-3.816 3.922-.954 1.66-1.66 3.622-2.12 5.883-.46 2.261-.724 4.7-.795 7.314H76.23c0-4.099.548-7.897 1.643-11.395 1.095-3.498 2.738-6.519 4.93-9.063 2.19-2.544 4.857-4.54 8.002-5.989C93.95 30.724 97.606 30 101.775 30c4.523 0 8.303.742 11.342 2.226 3.039 1.484 5.494 3.357 7.367 5.618 1.873 2.261 3.198 4.717 3.975 7.367.777 2.65 1.166 5.176 1.166 7.579 0 2.968-.46 5.653-1.378 8.056a25.942 25.942 0 01-3.71 6.625 37.5 37.5 0 01-5.3 5.565 79.468 79.468 0 01-6.148 4.77 165.627 165.627 0 01-6.36 4.24 94.28 94.28 0 00-5.883 4.028c-1.802 1.343-3.374 2.738-4.717 4.187-1.343 1.449-2.261 2.986-2.756 4.611h36.146v10.812z\"/></svg>"
},
"$:/core/images/heading-3": {
"title": "$:/core/images/heading-3",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-3 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm88.885 32.224c1.979.07 3.957-.07 5.936-.424 1.979-.353 3.745-.972 5.3-1.855a10.365 10.365 0 003.763-3.657c.954-1.555 1.431-3.463 1.431-5.724 0-3.18-1.078-5.724-3.233-7.632-2.155-1.908-4.929-2.862-8.32-2.862-2.12 0-3.958.424-5.513 1.272a11.318 11.318 0 00-3.869 3.445c-1.025 1.449-1.784 3.074-2.279 4.876a18.335 18.335 0 00-.636 5.565H75.381c.141-3.604.813-6.943 2.014-10.017 1.201-3.074 2.844-5.742 4.93-8.003 2.084-2.261 4.61-4.028 7.578-5.3C92.871 30.636 96.228 30 99.973 30a29.2 29.2 0 018.533 1.272c2.791.848 5.3 2.085 7.526 3.71s4.01 3.692 5.353 6.201c1.343 2.509 2.014 5.388 2.014 8.639 0 3.745-.848 7.014-2.544 9.805-1.696 2.791-4.346 4.823-7.95 6.095v.212c4.24.848 7.544 2.95 9.911 6.307s3.551 7.438 3.551 12.243c0 3.533-.707 6.696-2.12 9.487a21.538 21.538 0 01-5.724 7.102c-2.403 1.943-5.194 3.445-8.374 4.505-3.18 1.06-6.537 1.59-10.07 1.59-4.31 0-8.074-.618-11.289-1.855s-5.9-2.986-8.056-5.247c-2.155-2.261-3.798-4.982-4.929-8.162-1.13-3.18-1.731-6.713-1.802-10.6h12.084c-.141 4.523.972 8.286 3.34 11.289 2.366 3.003 5.917 4.505 10.652 4.505 4.028 0 7.402-1.148 10.123-3.445 2.72-2.297 4.081-5.565 4.081-9.805 0-2.897-.565-5.194-1.696-6.89a10.97 10.97 0 00-4.452-3.869c-1.837-.883-3.904-1.431-6.2-1.643a58.067 58.067 0 00-7.05-.212v-9.01z\"/></svg>"
},
"$:/core/images/heading-4": {
"title": "$:/core/images/heading-4",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-4 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8 30h13.25v30.104H55.7V30h13.25v75.684H55.7V71.552H21.25v34.132H8V30zm76.59 48.548h22.471V45.9h-.212L84.59 78.548zm43.46 9.54h-9.54v17.596H107.06V88.088h-31.8V76.11l31.8-44.626h11.448v47.064h9.54v9.54z\"/></svg>"
},
"$:/core/images/heading-5": {
"title": "$:/core/images/heading-5",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-5 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm77.755 1.484h38.372v10.812H92.765L88.95 61.164l.212.212c1.625-1.837 3.692-3.233 6.201-4.187 2.509-.954 5-1.431 7.473-1.431 3.675 0 6.96.618 9.858 1.855 2.897 1.237 5.335 2.968 7.314 5.194s3.48 4.858 4.505 7.897c1.025 3.039 1.537 6.325 1.537 9.858 0 2.968-.477 6.024-1.43 9.169a25.161 25.161 0 01-4.559 8.586c-2.085 2.58-4.752 4.7-8.003 6.36-3.25 1.66-7.137 2.491-11.66 2.491-3.604 0-6.943-.477-10.017-1.431-3.074-.954-5.777-2.385-8.109-4.293-2.332-1.908-4.187-4.258-5.565-7.049-1.378-2.791-2.138-6.06-2.279-9.805h12.084c.353 4.028 1.731 7.12 4.134 9.275 2.403 2.155 5.583 3.233 9.54 3.233 2.544 0 4.7-.424 6.466-1.272 1.767-.848 3.198-2.014 4.293-3.498 1.095-1.484 1.873-3.215 2.332-5.194.46-1.979.69-4.099.69-6.36 0-2.05-.284-4.01-.849-5.883-.565-1.873-1.413-3.516-2.544-4.929-1.13-1.413-2.597-2.544-4.399-3.392-1.802-.848-3.904-1.272-6.307-1.272-2.544 0-4.929.477-7.155 1.431-2.226.954-3.834 2.738-4.823 5.353H75.805l7.95-40.598z\"/></svg>"
},
"$:/core/images/heading-6": {
"title": "$:/core/images/heading-6",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-6 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm106.587 20.246c-.283-3.039-1.36-5.494-3.233-7.367-1.873-1.873-4.399-2.809-7.579-2.809-2.19 0-4.08.406-5.67 1.219a12.435 12.435 0 00-4.029 3.233c-1.095 1.343-1.979 2.88-2.65 4.611a37.696 37.696 0 00-1.643 5.459 46.08 46.08 0 00-.9 5.671 722.213 722.213 0 00-.478 5.247l.212.212c1.625-2.968 3.87-5.176 6.731-6.625 2.862-1.449 5.954-2.173 9.275-2.173 3.675 0 6.96.636 9.858 1.908 2.897 1.272 5.353 3.021 7.367 5.247 2.014 2.226 3.551 4.858 4.611 7.897 1.06 3.039 1.59 6.325 1.59 9.858 0 3.604-.583 6.943-1.749 10.017-1.166 3.074-2.844 5.76-5.035 8.056-2.19 2.297-4.805 4.081-7.844 5.353-3.039 1.272-6.395 1.908-10.07 1.908-5.441 0-9.91-1.007-13.409-3.021-3.498-2.014-6.254-4.77-8.268-8.268-2.014-3.498-3.41-7.597-4.187-12.296-.777-4.7-1.166-9.77-1.166-15.211 0-4.452.477-8.94 1.431-13.462.954-4.523 2.526-8.639 4.717-12.349 2.19-3.71 5.07-6.731 8.64-9.063C92.676 31.166 97.075 30 102.304 30c2.968 0 5.76.495 8.374 1.484 2.615.99 4.93 2.367 6.943 4.134 2.014 1.767 3.657 3.887 4.93 6.36 1.271 2.473 1.978 5.23 2.12 8.268h-12.085zm-11.66 46.852c2.19 0 4.099-.442 5.724-1.325a12.869 12.869 0 004.081-3.445c1.095-1.413 1.908-3.056 2.438-4.929.53-1.873.795-3.798.795-5.777s-.265-3.887-.795-5.724c-.53-1.837-1.343-3.445-2.438-4.823-1.095-1.378-2.456-2.491-4.08-3.339-1.626-.848-3.534-1.272-5.725-1.272-2.19 0-4.116.406-5.777 1.219-1.66.813-3.056 1.908-4.187 3.286-1.13 1.378-1.979 2.986-2.544 4.823-.565 1.837-.848 3.78-.848 5.83 0 2.05.283 3.993.848 5.83.565 1.837 1.413 3.48 2.544 4.929a12.39 12.39 0 004.187 3.445c1.66.848 3.586 1.272 5.777 1.272z\"/></svg>"
},
"$:/core/images/help": {
"title": "$:/core/images/help",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-help tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M36.055 111.441c-5.24 4.396-15.168 7.362-26.555 7.362-1.635 0-3.24-.06-4.806-.179 7.919-2.64 14.062-8.6 16.367-16.014C8.747 92.845 1.05 78.936 1.05 63.5c0-29.547 28.206-53.5 63-53.5s63 23.953 63 53.5-28.206 53.5-63 53.5c-10.055 0-19.56-2-27.994-5.559zm35.35-33.843a536.471 536.471 0 00.018-4.682 199.02 199.02 0 00-.023-3.042c.008-1.357.595-2.087 3.727-4.235.112-.077 1.085-.74 1.386-.948 3.093-2.133 5.022-3.786 6.762-6.187 2.34-3.228 3.558-7.077 3.558-11.649 0-13.292-9.86-21.952-21.455-21.952-11.103 0-22.499 9.609-24.066 22.295a6.023 6.023 0 1011.956 1.477c.806-6.527 6.972-11.726 12.11-11.726 5.265 0 9.408 3.64 9.408 9.906 0 3.634-1.1 5.153-5.111 7.919l-1.362.93c-2.682 1.84-4.227 3.1-5.7 4.931-2.109 2.62-3.242 5.717-3.258 9.314.013.892.02 1.86.022 2.981a470.766 470.766 0 01-.022 4.943 6.023 6.023 0 1012.046.12l.003-.395zm-6.027 24.499a7.529 7.529 0 100-15.058 7.529 7.529 0 000 15.058z\"/></svg>"
},
"$:/core/images/home-button": {
"title": "$:/core/images/home-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112.985 119.502c.01-.165.015-.331.015-.499V67.568c3.137 2.948 8.076 2.884 11.134-.174a7.999 7.999 0 00-.002-11.316L70.396 2.343A7.978 7.978 0 0064.734 0a7.957 7.957 0 00-5.656 2.343L33 28.42V8.007C33 3.585 29.41 0 25 0c-4.418 0-8 3.59-8 8.007V44.42L5.342 56.078c-3.125 3.125-3.12 8.198-.002 11.316a7.999 7.999 0 0011.316-.003l.344-.343v52.945a8.11 8.11 0 000 .007c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8a8.11 8.11 0 00-.015-.498zM97 112V51.574L64.737 19.31 33 51.048V112h64z\"/></svg>"
},
"$:/core/images/import-button": {
"title": "$:/core/images/import-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-import-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M114.832 60.436s3.235-3.27 6.921.417c3.686 3.686.231 7.14.231 7.14l-42.153 42.92s-30.765 32.367-58.798 4.333C-7 87.213 24.59 55.623 24.59 55.623L67.363 12.85s22.725-24.6 43.587-3.738c20.862 20.862-3.96 43.09-3.96 43.09l-35.04 35.04S49.903 112.546 36.426 99.07c-13.476-13.477 11.83-35.523 11.83-35.523l35.04-35.04s3.902-3.902 7.78-.023c3.879 3.878.118 7.921.118 7.921l-35.04 35.04s-13.212 13.212-8.872 17.551c4.34 4.34 16.77-9.653 16.77-9.653l35.04-35.04s16.668-14.598 3.966-27.3c-13.893-13.892-27.565 3.702-27.565 3.702l-42.91 42.91s-23.698 23.698-3.658 43.738 43.012-4.385 43.012-4.385l42.895-42.533z\"/></svg>"
},
"$:/core/images/info-button": {
"title": "$:/core/images/info-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(.05)\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\"/><circle cx=\"64\" cy=\"32\" r=\"8\"/><rect width=\"16\" height=\"56\" x=\"56\" y=\"48\" rx=\"8\"/></g></svg>"
},
"$:/core/images/italic": {
"title": "$:/core/images/italic",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-italic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M66.711 0h22.41L62.408 128H40z\"/></svg>"
},
"$:/core/images/left-arrow": {
"title": "$:/core/images/left-arrow",
"created": "20150315234410875",
"modified": "20150315235324760",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-left-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 64.177c0-2.026.771-4.054 2.317-5.6l55.98-55.98a7.92 7.92 0 0111.195.001c3.086 3.085 3.092 8.104.001 11.195L19.111 64.175l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.086-8.105 3.092-11.196.001l-55.98-55.98A7.892 7.892 0 010 64.177z\"/></svg>"
},
"$:/core/images/line-width": {
"title": "$:/core/images/line-width",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-line-width tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M16 18h96a2 2 0 000-4H16a2 2 0 100 4zm0 17h96a4 4 0 100-8H16a4 4 0 100 8zm0 21h96a6 6 0 000-12H16a6 6 0 100 12zm0 29h96c5.523 0 10-4.477 10-10s-4.477-10-10-10H16c-5.523 0-10 4.477-10 10s4.477 10 10 10zm0 43h96c8.837 0 16-7.163 16-16s-7.163-16-16-16H16c-8.837 0-16 7.163-16 16s7.163 16 16 16z\"/></svg>"
},
"$:/core/images/link": {
"title": "$:/core/images/link",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-link tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M42.263 69.38a31.919 31.919 0 006.841 10.13c12.5 12.5 32.758 12.496 45.255 0l22.627-22.628c12.502-12.501 12.497-32.758 0-45.255-12.5-12.5-32.758-12.496-45.254 0L49.104 34.255a32.333 32.333 0 00-2.666 3.019 36.156 36.156 0 0121.94.334l14.663-14.663c6.25-6.25 16.382-6.254 22.632-.004 6.248 6.249 6.254 16.373-.004 22.631l-22.62 22.62c-6.25 6.25-16.381 6.254-22.631.004a15.93 15.93 0 01-4.428-8.433 11.948 11.948 0 00-7.59 3.48l-6.137 6.137z\"/><path d=\"M86.35 59.234a31.919 31.919 0 00-6.84-10.13c-12.5-12.5-32.758-12.497-45.255 0L11.627 71.732c-12.501 12.5-12.496 32.758 0 45.254 12.5 12.5 32.758 12.497 45.255 0L79.51 94.36a32.333 32.333 0 002.665-3.02 36.156 36.156 0 01-21.94-.333l-14.663 14.663c-6.25 6.25-16.381 6.253-22.63.004-6.25-6.249-6.255-16.374.003-22.632l22.62-22.62c6.25-6.25 16.381-6.253 22.631-.003a15.93 15.93 0 014.428 8.432 11.948 11.948 0 007.59-3.48l6.137-6.136z\"/></g></svg>"
},
"$:/core/images/linkify": {
"title": "$:/core/images/linkify",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-linkify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M17.031 31.919H9.048V96.85h7.983v6.92H0V25h17.031v6.919zm24.66 0h-7.983V96.85h7.983v6.92H24.66V25h17.03v6.919zM67.77 56.422l11.975-3.903 2.306 7.096-12.063 3.903 7.628 10.379-6.12 4.435-7.63-10.467-7.45 10.2-5.943-4.523L58.1 63.518 45.95 59.35l2.306-7.096 12.064 4.17V43.825h7.45v12.596zM86.31 96.85h7.982V31.92H86.31V25h17.031v78.77H86.31v-6.92zm24.659 0h7.983V31.92h-7.983V25H128v78.77h-17.031v-6.92z\"/></svg>"
},
"$:/core/images/list-bullet": {
"title": "$:/core/images/list-bullet",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-bullet tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M11.636 40.273c6.427 0 11.637-5.21 11.637-11.637C23.273 22.21 18.063 17 11.636 17 5.21 17 0 22.21 0 28.636c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.637 0-6.426-5.21-11.636-11.637-11.636C5.21 51.91 0 57.12 0 63.545c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.636 0-6.427-5.21-11.637-11.637-11.637C5.21 86.818 0 92.028 0 98.455c0 6.426 5.21 11.636 11.636 11.636zM34.91 22.818H128v11.637H34.91V22.818zm0 34.91H128v11.636H34.91V57.727zm0 34.908H128v11.637H34.91V92.636z\"/></svg>"
},
"$:/core/images/list-number": {
"title": "$:/core/images/list-number",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-number tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M33.84 22.356H128v11.77H33.84v-11.77zm0 35.31H128v11.77H33.84v-11.77zm0 35.311H128v11.77H33.84v-11.77zM.38 42.631v-2.223h.998c.826 0 1.445-.14 1.858-.42.413-.28.619-.948.619-2.002V22.769c0-1.442-.193-2.336-.58-2.683-.385-.347-1.477-.52-3.275-.52v-2.143c3.502-.147 6.252-.955 8.25-2.423h2.117v22.865c0 .921.15 1.575.449 1.963.3.387.949.58 1.948.58h.998v2.223H.38zm-.3 35.356v-1.902c7.19-6.554 10.786-12.58 10.786-18.08 0-1.562-.326-2.81-.979-3.744-.652-.934-1.524-1.402-2.616-1.402-.893 0-1.655.317-2.287.952-.633.634-.95 1.364-.95 2.192 0 .974.247 1.829.74 2.563.106.16.16.28.16.36 0 .147-.16.28-.48.4-.213.08-.752.308-1.618.681-.839.374-1.358.561-1.558.561-.24 0-.512-.37-.819-1.111A6.2 6.2 0 010 57.064c0-1.949.849-3.544 2.547-4.785 1.698-1.242 3.798-1.862 6.302-1.862 2.463 0 4.53.67 6.202 2.012 1.67 1.341 2.506 3.093 2.506 5.256a8.644 8.644 0 01-.849 3.724c-.566 1.201-1.92 3.053-4.064 5.556a165.471 165.471 0 01-6.272 6.938h11.445l-1.019 5.726h-2.117c.08-.28.12-.534.12-.76 0-.388-.1-.631-.3-.731-.2-.1-.599-.15-1.198-.15H.08zm12.124 19.207c1.745.04 3.236.637 4.474 1.792 1.239 1.154 1.858 2.773 1.858 4.855 0 2.99-1.132 5.393-3.396 7.208-2.263 1.815-5 2.723-8.209 2.723-2.01 0-3.669-.384-4.974-1.151C.652 111.853 0 110.849 0 109.607c0-.774.27-1.398.809-1.872.54-.474 1.128-.71 1.768-.71.639 0 1.162.2 1.568.6.406.4.782 1.055 1.128 1.962.466 1.268 1.239 1.902 2.317 1.902 1.265 0 2.287-.477 3.066-1.431.78-.955 1.169-2.686 1.169-5.196 0-1.709-.12-3.023-.36-3.944-.24-.921-.792-1.382-1.658-1.382-.586 0-1.185.307-1.797.921-.493.494-.932.741-1.319.741-.333 0-.602-.147-.809-.44-.206-.294-.31-.574-.31-.841 0-.32.104-.594.31-.821.207-.227.69-.594 1.449-1.102 2.876-1.922 4.314-4.017 4.314-6.287 0-1.188-.306-2.092-.919-2.713a3.001 3.001 0 00-2.217-.93c-.799 0-1.525.263-2.177.79-.653.528-.979 1.158-.979 1.892 0 .641.253 1.235.76 1.782.172.2.259.367.259.5 0 .121-.57.428-1.708.922-1.139.494-1.854.74-2.147.74-.413 0-.75-.333-1.009-1-.26-.668-.39-1.282-.39-1.842 0-1.749.93-3.224 2.787-4.425 1.858-1.202 3.965-1.802 6.322-1.802 2.064 0 3.851.447 5.363 1.341 1.511.895 2.267 2.116 2.267 3.664 0 1.362-.57 2.623-1.708 3.784a13.387 13.387 0 01-3.945 2.784z\"/></svg>"
},
"$:/core/images/list": {
"title": "$:/core/images/list",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M87.748 128H23.999c-4.418 0-7.999-3.59-7.999-8.007V8.007C16 3.585 19.588 0 24 0h80c4.419 0 8 3.59 8 8.007V104H91.25c-.965 0-1.84.392-2.473 1.025a3.476 3.476 0 00-1.029 2.476V128zm8-.12l15.88-15.88h-15.88v15.88zM40 15.508A3.502 3.502 0 0143.5 12h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 20h-55a3.498 3.498 0 01-3.5-3.509v-.982zM32 22a6 6 0 100-12 6 6 0 000 12zm8 9.509A3.502 3.502 0 0143.5 28h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 36h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 44h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 52h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 60h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 68h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 76h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 84h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 92h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 100h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.505 3.505 0 0143.497 108h33.006A3.497 3.497 0 0180 111.509v.982A3.505 3.505 0 0176.503 116H43.497A3.497 3.497 0 0140 112.491v-.982zM32 38a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12z\"/></svg>"
},
"$:/core/images/locked-padlock": {
"title": "$:/core/images/locked-padlock",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-locked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M96.472 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h8c.003-15.723.303-47.731 32.16-47.731 31.794 0 32.305 32.057 32.312 47.731zm-15.897 0H48.44c.002-16.287.142-32 15.719-32 15.684 0 16.977 16.136 16.415 32zM67.732 92.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
},
"$:/core/images/mail": {
"title": "$:/core/images/mail",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mail tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M122.827 104.894a7.986 7.986 0 01-2.834.516H8.007c-.812 0-1.597-.12-2.335-.345l34.163-34.163 20.842 20.842a3.998 3.998 0 003.418 1.134 4.003 4.003 0 003.395-1.134L88.594 70.64c.075.09.155.176.24.26l33.993 33.994zm5.076-6.237c.064-.406.097-.823.097-1.247v-64c0-.669-.082-1.318-.237-1.94L94.23 65.006c.09.075.177.154.261.239l33.413 33.413zm-127.698.56A8.023 8.023 0 010 97.41v-64c0-.716.094-1.41.271-2.071l33.907 33.906L.205 99.218zM5.93 25.684a8.012 8.012 0 012.078-.273h111.986c.766 0 1.507.108 2.209.308L64.083 83.837 5.93 25.683z\"/></svg>"
},
"$:/core/images/menu-button": {
"title": "$:/core/images/menu-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 128 128\"><rect width=\"128\" height=\"16\" y=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"56\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"96\" rx=\"8\"/></svg>"
},
"$:/core/images/mono-block": {
"title": "$:/core/images/mono-block",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-block tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M23.965 32.967h.357c.755 0 1.328.192 1.72.577.39.384.586.947.586 1.688 0 .824-.206 1.418-.618 1.782-.413.363-1.094.545-2.045.545h-6.31c-.965 0-1.65-.178-2.056-.535-.405-.356-.608-.954-.608-1.792 0-.811.203-1.391.608-1.74.406-.35 1.09-.525 2.055-.525h.734l-.86-2.453H8.471l-.902 2.453h.734c.95 0 1.632.178 2.044.535.413.356.619.933.619 1.73 0 .824-.206 1.418-.619 1.782-.412.363-1.094.545-2.044.545h-5.41c-.964 0-1.649-.182-2.054-.545-.406-.364-.608-.958-.608-1.782 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.719-.577h.356l5.62-15.641H6.835c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.95-.619-1.76 0-.825.207-1.42.619-1.783.412-.363 1.094-.545 2.044-.545h7.863c1.244 0 2.118.67 2.62 2.013v.063l6.647 18.2zM12.98 17.326l-3.04 8.848h6.08l-3.04-8.848zm22.402 9.372v6.395h3.145c2.223 0 3.788-.245 4.697-.734.908-.49 1.362-1.307 1.362-2.453 0-1.16-.433-1.985-1.3-2.474-.866-.49-2.383-.734-4.55-.734h-3.354zm10.693-2.327c1.524.559 2.642 1.324 3.355 2.295.713.972 1.07 2.212 1.07 3.722 0 1.272-.308 2.432-.923 3.48-.615 1.049-1.496 1.909-2.642 2.58a7.499 7.499 0 01-2.254.849c-.832.174-2.01.262-3.533.262H30.202c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.782 0-.741.189-1.304.566-1.688.378-.385.93-.577 1.657-.577h.356V17.326h-.356c-.727 0-1.28-.196-1.657-.587-.377-.392-.566-.965-.566-1.72 0-.81.203-1.401.608-1.771.406-.37 1.062-.556 1.971-.556h9.645c2.95 0 5.19.573 6.72 1.72 1.53 1.145 2.296 2.823 2.296 5.031 0 1.09-.234 2.052-.703 2.883-.468.832-1.163 1.513-2.086 2.045zM35.381 17.2v5.284h2.83c1.72 0 2.932-.203 3.638-.609.706-.405 1.06-1.09 1.06-2.054 0-.909-.319-1.573-.955-1.992-.636-.42-1.667-.63-3.093-.63h-3.48zm35.863-3.816c.28-.503.566-.86.86-1.07.293-.21.664-.314 1.111-.314.685 0 1.17.182 1.457.545.287.364.43.986.43 1.866l.042 5.452c0 .964-.157 1.614-.472 1.95-.314.335-.884.503-1.709.503-.587 0-1.037-.14-1.352-.42-.314-.28-.584-.796-.807-1.551-.364-1.328-.944-2.282-1.74-2.862-.797-.58-1.901-.87-3.313-.87-2.153 0-3.802.727-4.948 2.18-1.147 1.454-1.72 3.558-1.72 6.311 0 2.74.58 4.844 1.74 6.311 1.16 1.468 2.817 2.202 4.97 2.202 1.467 0 3.085-.49 4.854-1.468 1.768-.978 2.883-1.467 3.344-1.467.545 0 1.003.23 1.373.692.37.46.556 1.034.556 1.719 0 1.23-1.084 2.39-3.25 3.48-2.167 1.09-4.606 1.636-7.318 1.636-3.662 0-6.625-1.21-8.89-3.627-2.264-2.419-3.396-5.578-3.396-9.478 0-3.76 1.146-6.884 3.438-9.372 2.293-2.488 5.2-3.732 8.723-3.732.992 0 1.97.112 2.935.335.964.224 1.992.574 3.082 1.049zm10.22 19.583V17.326h-.356c-.755 0-1.328-.196-1.72-.587-.39-.392-.586-.965-.586-1.72 0-.81.21-1.401.629-1.771.42-.37 1.097-.556 2.034-.556h5.178c2.922 0 5.06.126 6.416.377 1.356.252 2.51.671 3.46 1.258 1.691 1.007 2.988 2.443 3.89 4.31.9 1.865 1.352 4.021 1.352 6.467 0 2.586-.514 4.847-1.541 6.783-1.028 1.936-2.485 3.4-4.372 4.393-.853.447-1.852.772-2.998.975-1.147.203-2.852.304-5.116.304h-6.269c-.965 0-1.65-.178-2.055-.535-.406-.356-.608-.954-.608-1.792 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.72-.577h.356zm5.41-15.725v15.725h1.195c2.642 0 4.592-.646 5.85-1.94 1.258-1.292 1.887-3.28 1.887-5.965 0-2.641-.64-4.612-1.918-5.912-1.28-1.3-3.205-1.95-5.777-1.95-.335 0-.59.003-.765.01a7.992 7.992 0 00-.472.032zm35.067-.126h-9.75v5.368h3.69v-.252c0-.797.175-1.39.524-1.782.35-.392.88-.587 1.594-.587.629 0 1.142.178 1.54.534.4.357.598.808.598 1.353 0 .028.007.118.021.272.014.154.021.308.021.462v4.34c0 .936-.167 1.607-.503 2.013-.335.405-.88.608-1.635.608-.713 0-1.251-.19-1.615-.567-.363-.377-.545-.936-.545-1.677v-.377h-3.69v6.269h9.75v-2.495c0-.937.178-1.608.534-2.013.357-.405.94-.608 1.75-.608.798 0 1.367.2 1.71.597.342.399.513 1.073.513 2.024v5.074c0 .755-.146 1.258-.44 1.51-.293.251-.873.377-1.74.377h-17.172c-.923 0-1.583-.182-1.982-.545-.398-.364-.597-.958-.597-1.782 0-.741.189-1.304.566-1.688.377-.385.93-.577 1.656-.577h.357V17.326h-.357c-.712 0-1.261-.2-1.646-.598-.384-.398-.576-.968-.576-1.709 0-.81.203-1.401.608-1.771.405-.37 1.062-.556 1.97-.556h17.173c.853 0 1.43.13 1.73.388.3.258.45.772.45 1.54v4.698c0 .95-.174 1.631-.524 2.044-.35.412-.915.618-1.698.618-.81 0-1.394-.21-1.75-.629-.357-.419-.535-1.097-.535-2.033v-2.202zM19.77 47.641c.267-.504.55-.86.85-1.07.3-.21.675-.314 1.122-.314.685 0 1.17.181 1.457.545.287.363.43.985.43 1.866l.042 5.451c0 .965-.157 1.615-.472 1.95-.314.336-.891.504-1.73.504-.587 0-1.045-.144-1.373-.43-.329-.287-.598-.8-.807-1.541-.378-1.342-.958-2.3-1.74-2.873-.783-.573-1.88-.86-3.292-.86-2.153 0-3.799.727-4.938 2.181-1.14 1.454-1.709 3.557-1.709 6.311s.598 4.882 1.793 6.385C10.599 67.248 12.294 68 14.488 68c.503 0 1.077-.06 1.72-.179a23.809 23.809 0 002.264-.555v-3.313h-2.37c-.95 0-1.624-.175-2.023-.524-.398-.35-.597-.93-.597-1.74 0-.84.199-1.437.597-1.793.399-.357 1.073-.535 2.024-.535h7.569c.978 0 1.667.175 2.065.524.398.35.598.937.598 1.762 0 .74-.2 1.31-.598 1.708-.398.399-.975.598-1.73.598h-.335v5.242c0 .447-.05.758-.147.933-.098.174-.293.353-.587.534-.797.476-2.062.895-3.795 1.258a25.576 25.576 0 01-5.263.546c-3.662 0-6.625-1.21-8.89-3.628-2.264-2.418-3.397-5.577-3.397-9.477 0-3.76 1.147-6.884 3.44-9.372 2.292-2.488 5.199-3.732 8.721-3.732.979 0 1.954.112 2.925.335.972.224 2.003.573 3.093 1.049zm15.84 3.941v4.823h6.857v-4.823h-.336c-.754 0-1.331-.195-1.73-.587-.398-.391-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.364 1.093-.545 2.044-.545h5.41c.95 0 1.624.181 2.023.545.398.363.597.957.597 1.782 0 .755-.192 1.328-.576 1.72-.385.39-.947.586-1.688.586h-.357v15.642h.357c.755 0 1.328.192 1.719.576.391.385.587.947.587 1.688 0 .825-.203 1.419-.608 1.782-.405.364-1.09.546-2.055.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.2-1.303.598-1.688.398-.384.975-.576 1.73-.576h.335v-6.186h-6.856v6.186h.335c.755 0 1.331.192 1.73.576.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.412.364-1.094.546-2.044.546h-5.41c-.964 0-1.65-.179-2.055-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.392-.384.965-.576 1.72-.576h.356V51.582h-.356c-.741 0-1.304-.195-1.688-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.073-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.335zm31.754 0v15.642h3.523c.95 0 1.632.178 2.044.534.412.357.618.933.618 1.73 0 .811-.21 1.402-.629 1.772-.419.37-1.097.556-2.033.556H58.433c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.957-.619-1.782 0-.81.203-1.39.608-1.74.406-.35 1.09-.524 2.055-.524h3.523V51.582h-3.523c-.95 0-1.632-.181-2.044-.545-.412-.363-.619-.95-.619-1.761 0-.825.203-1.412.608-1.761.406-.35 1.09-.524 2.055-.524h12.455c.992 0 1.684.174 2.075.524.392.35.587.936.587 1.761 0 .81-.202 1.398-.608 1.761-.405.364-1.09.545-2.054.545h-3.523zm30.496 0v11.994c0 1.873-.122 3.228-.367 4.067a5.876 5.876 0 01-1.227 2.244c-.74.852-1.768 1.495-3.082 1.929-1.314.433-2.893.65-4.738.65-1.3 0-2.555-.126-3.764-.378a16.843 16.843 0 01-3.491-1.132c-.615-.28-1.017-.643-1.206-1.09-.188-.448-.283-1.175-.283-2.18v-4.32c0-1.202.175-2.04.525-2.516.349-.475.957-.713 1.824-.713 1.244 0 1.929.915 2.054 2.747.014.321.035.566.063.733.168 1.622.545 2.73 1.133 3.324.587.594 1.523.89 2.81.89 1.593 0 2.714-.422 3.364-1.268.65-.845.975-2.386.975-4.623V51.582H88.93c-.95 0-1.632-.181-2.044-.545-.413-.363-.619-.95-.619-1.761 0-.825.2-1.412.598-1.761.398-.35 1.086-.524 2.065-.524h10.693c.979 0 1.667.174 2.065.524.399.35.598.936.598 1.761 0 .81-.206 1.398-.619 1.761-.412.364-1.093.545-2.044.545h-1.761zm14.644 0v6.353l6.48-6.478c-.728-.084-1.238-.29-1.531-.619-.294-.328-.44-.85-.44-1.562 0-.825.198-1.419.597-1.782.398-.364 1.073-.545 2.023-.545h5.137c.95 0 1.625.181 2.023.545.399.363.598.957.598 1.782 0 .769-.2 1.345-.598 1.73-.398.384-.982.576-1.75.576h-.483l-6.101 6.06c1.132.839 2.167 1.94 3.103 3.302.937 1.363 2.034 3.456 3.292 6.28h.692c.825 0 1.44.188 1.845.566.405.377.608.943.608 1.698 0 .825-.206 1.419-.619 1.782-.412.364-1.093.546-2.044.546h-2.579c-1.132 0-2.048-.762-2.746-2.286-.126-.28-.224-.503-.294-.67-.923-1.958-1.768-3.467-2.537-4.53a16.616 16.616 0 00-2.705-2.914l-1.97 1.887v3.92h.335c.755 0 1.331.193 1.73.577.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.413.364-1.094.546-2.045.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.391-.384.965-.576 1.72-.576h.356V51.582h-.357c-.74 0-1.303-.195-1.687-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.072-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.336zM13.44 96.326l4.005-11.889c.251-.782.6-1.352 1.048-1.709.447-.356 1.041-.534 1.782-.534h3.271c.95 0 1.632.182 2.044.545.413.363.619.957.619 1.782 0 .755-.2 1.328-.598 1.72-.398.39-.975.587-1.73.587h-.335l.587 15.641h.357c.754 0 1.32.192 1.698.577.377.384.566.947.566 1.687 0 .825-.2 1.42-.598 1.783-.398.363-1.072.545-2.023.545h-4.718c-.95 0-1.624-.178-2.023-.535-.398-.356-.597-.954-.597-1.793 0-.74.192-1.303.576-1.687.385-.385.954-.577 1.709-.577h.335l-.293-12.79-3.061 9.52c-.224.712-.542 1.226-.954 1.54-.413.315-.982.472-1.709.472-.727 0-1.303-.157-1.73-.472-.426-.314-.751-.828-.975-1.54l-3.04-9.52-.294 12.79h.336c.755 0 1.324.192 1.709.577.384.384.576.947.576 1.687 0 .825-.202 1.42-.608 1.783-.405.363-1.076.545-2.013.545H2.621c-.937 0-1.608-.182-2.013-.545-.405-.364-.608-.958-.608-1.783 0-.74.192-1.303.577-1.687.384-.385.954-.577 1.708-.577h.336l.608-15.641h-.336c-.754 0-1.331-.196-1.73-.588-.398-.39-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.363 1.093-.545 2.044-.545h3.27c.728 0 1.311.175 1.752.524.44.35.8.923 1.08 1.72l4.109 11.888zm30.454 2.054V86.828H42.74c-.922 0-1.583-.182-1.981-.546-.398-.363-.598-.95-.598-1.76 0-.812.2-1.402.598-1.773.398-.37 1.059-.555 1.981-.555h5.955c.909 0 1.566.185 1.97.555.406.37.609.961.609 1.772 0 .741-.192 1.31-.577 1.709-.384.398-.933.598-1.646.598h-.356v19.038c0 .657-.07 1.069-.21 1.237-.14.167-.454.251-.943.251h-2.097c-.67 0-1.143-.07-1.415-.21-.273-.14-.507-.384-.703-.733l-8.722-15.327v11.385h1.216c.909 0 1.559.175 1.95.524.392.35.587.93.587 1.74 0 .825-.199 1.42-.597 1.783-.399.363-1.045.545-1.94.545h-6.017c-.909 0-1.566-.182-1.971-.545-.406-.364-.608-.958-.608-1.783 0-.74.188-1.303.566-1.687.377-.385.936-.577 1.677-.577h.336V86.828h-.336c-.713 0-1.265-.2-1.656-.598-.392-.398-.587-.968-.587-1.709 0-.81.206-1.401.618-1.772.413-.37 1.066-.555 1.96-.555h3.44c.824 0 1.383.108 1.677.325.293.216.622.653.985 1.31l7.989 14.551zM64.66 86.366c-1.803 0-3.218.727-4.245 2.18-1.028 1.455-1.541 3.474-1.541 6.06 0 2.586.517 4.613 1.551 6.08 1.034 1.468 2.446 2.202 4.235 2.202 1.804 0 3.222-.73 4.257-2.19 1.034-1.461 1.551-3.492 1.551-6.092 0-2.586-.513-4.605-1.54-6.06-1.028-1.453-2.45-2.18-4.268-2.18zm0-4.864c3.44 0 6.27 1.23 8.492 3.69 2.223 2.46 3.334 5.598 3.334 9.414 0 3.844-1.104 6.99-3.313 9.436-2.208 2.446-5.046 3.669-8.513 3.669-3.424 0-6.255-1.234-8.491-3.701-2.237-2.467-3.355-5.602-3.355-9.404 0-3.83 1.108-6.971 3.323-9.424 2.216-2.454 5.057-3.68 8.523-3.68zM87.461 98.17v4.298h2.16c.908 0 1.555.175 1.94.524.384.35.576.93.576 1.74 0 .825-.196 1.42-.587 1.783-.392.363-1.035.545-1.93.545h-7.254c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.783 0-.74.189-1.303.566-1.687.378-.385.93-.577 1.657-.577h.356V86.828h-.356c-.713 0-1.262-.2-1.646-.598-.385-.398-.577-.968-.577-1.709 0-.81.203-1.401.608-1.772.406-.37 1.063-.555 1.971-.555h8.66c3.424 0 6.014.657 7.768 1.97 1.754 1.315 2.631 3.25 2.631 5.809 0 2.697-.873 4.738-2.62 6.122-1.748 1.384-4.34 2.076-7.78 2.076h-3.564zm0-11.343v6.625h2.977c1.65 0 2.89-.28 3.722-.839.832-.559 1.248-1.397 1.248-2.516 0-1.048-.43-1.855-1.29-2.421-.86-.566-2.086-.85-3.68-.85h-2.977zm27.267 20.568l-1.636 1.636a12.37 12.37 0 011.772-.44c.58-.098 1.15-.147 1.709-.147 1.104 0 2.268.164 3.491.492 1.223.329 1.967.493 2.233.493.447 0 1.03-.15 1.75-.45.72-.301 1.206-.452 1.458-.452.517 0 .947.2 1.29.598.342.398.513.898.513 1.5 0 .796-.472 1.474-1.415 2.033-.944.56-2.1.839-3.47.839-.937 0-2.139-.22-3.607-.66-1.467-.441-2.53-.661-3.187-.661-.992 0-2.11.272-3.354.817-1.244.546-2.013.818-2.307.818a2.14 2.14 0 01-1.53-.597c-.42-.399-.63-.878-.63-1.437 0-.391.134-.807.4-1.247.265-.44.733-1.01 1.404-1.709l2.118-2.139c-2.335-.852-4.194-2.386-5.578-4.602-1.384-2.215-2.075-4.763-2.075-7.642 0-3.802 1.104-6.909 3.312-9.32 2.209-2.411 5.053-3.617 8.534-3.617 3.467 0 6.304 1.209 8.513 3.627 2.208 2.418 3.312 5.522 3.312 9.31 0 3.774-1.097 6.884-3.291 9.33-2.195 2.446-4.977 3.67-8.345 3.67a22.5 22.5 0 01-1.384-.043zm1.195-21.03c-1.803 0-3.218.727-4.246 2.18-1.027 1.455-1.54 3.474-1.54 6.06 0 2.586.516 4.613 1.55 6.08 1.035 1.468 2.447 2.202 4.236 2.202 1.803 0 3.222-.73 4.256-2.19 1.035-1.461 1.552-3.492 1.552-6.092 0-2.586-.514-4.605-1.541-6.06-1.028-1.453-2.45-2.18-4.267-2.18z\"/></svg>"
},
"$:/core/images/mono-line": {
"title": "$:/core/images/mono-line",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-line tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.437 84.523h.908c1.922 0 3.381.489 4.378 1.468.997.979 1.495 2.411 1.495 4.298 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388h-16.07c-2.456 0-4.2-.454-5.232-1.361-1.032-.908-1.548-2.43-1.548-4.565 0-2.065.516-3.542 1.548-4.432 1.032-.89 2.776-1.334 5.232-1.334h1.869l-2.19-6.247H20.983l-2.296 6.247h1.87c2.42 0 4.155.453 5.205 1.361 1.05.908 1.575 2.376 1.575 4.405 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388H6.781c-2.456 0-4.2-.463-5.233-1.388C.516 93.9 0 92.389 0 90.289c0-1.887.498-3.32 1.495-4.298.997-.979 2.456-1.468 4.378-1.468h.908l14.308-39.83h-4.271c-2.42 0-4.156-.462-5.206-1.387-1.05-.926-1.575-2.42-1.575-4.485 0-2.1.525-3.613 1.575-4.538 1.05-.926 2.785-1.388 5.206-1.388h20.021c3.168 0 5.392 1.708 6.674 5.125v.16l16.924 46.343zm-27.976-39.83L24.72 67.225h15.483l-7.742-22.53zM89.506 68.56v16.284h8.008c5.66 0 9.646-.623 11.96-1.869 2.313-1.245 3.47-3.328 3.47-6.246 0-2.955-1.103-5.055-3.31-6.3-2.207-1.246-6.069-1.869-11.586-1.869h-8.542zm27.229-5.926c3.88 1.423 6.727 3.372 8.542 5.846 1.815 2.474 2.723 5.633 2.723 9.477 0 3.239-.783 6.193-2.35 8.862-1.565 2.67-3.808 4.859-6.726 6.567-1.709.997-3.622 1.718-5.74 2.163-2.118.445-5.116.667-8.996.667h-27.87c-2.349 0-4.03-.463-5.045-1.388-1.014-.926-1.521-2.438-1.521-4.538 0-1.887.48-3.32 1.441-4.298.961-.979 2.367-1.468 4.218-1.468h.907v-39.83h-.907c-1.851 0-3.257-.498-4.218-1.494-.961-.997-1.441-2.456-1.441-4.378 0-2.065.516-3.568 1.548-4.512 1.032-.943 2.705-1.414 5.018-1.414h24.56c7.51 0 13.214 1.459 17.111 4.377 3.898 2.92 5.847 7.19 5.847 12.814 0 2.776-.597 5.223-1.789 7.341-1.192 2.118-2.963 3.853-5.312 5.206zm-27.23-18.26v13.455h7.208c4.378 0 7.466-.516 9.264-1.549 1.797-1.032 2.696-2.776 2.696-5.232 0-2.313-.81-4.004-2.43-5.072-1.619-1.068-4.244-1.602-7.874-1.602h-8.863z\"/></svg>"
},
"$:/core/images/new-button": {
"title": "$:/core/images/new-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 72H8.007C3.591 72 0 68.418 0 64c0-4.41 3.585-8 8.007-8H56V8.007C56 3.591 59.582 0 64 0c4.41 0 8 3.585 8 8.007V56h47.993c4.416 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H72v47.993c0 4.416-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V72z\"/></svg>"
},
"$:/core/images/new-here-button": {
"title": "$:/core/images/new-here-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-here-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.838 20.935l-3.572.938c-3.688.968-8.23 4.43-10.136 7.731L3.37 96.738c-1.905 3.3-.771 7.524 2.534 9.432l33.717 19.466c3.297 1.904 7.53.78 9.435-2.521l38.76-67.134c1.905-3.3 2.632-8.963 1.623-12.646L83.285 20.88c-1.009-3.68-4.821-5.884-8.513-4.915l-7.603 1.995.043.287c.524 3.394 2.053 7.498 4.18 11.55.418.163.829.36 1.23.59a8.864 8.864 0 014.438 8.169c.104.132.21.264.316.395l-.386.318a8.663 8.663 0 01-1.082 3.137c-2.42 4.192-7.816 5.608-12.051 3.163-4.12-2.379-5.624-7.534-3.476-11.671-2.177-4.394-3.788-8.874-4.543-12.964z\"/><path d=\"M69.554 44.76c-5.944-7.476-10.74-17.196-11.955-25.059-1.68-10.875 3.503-18.216 15.082-18.04 10.407.158 19.975 5.851 24.728 13.785 5.208 8.695 2.95 17.868-6.855 20.496l-2.037-7.601c4.232-1.134 4.999-4.248 2.24-8.853-3.37-5.626-10.465-9.848-18.146-9.965-6.392-.097-8.31 2.62-7.323 9.01.999 6.465 5.318 15.138 10.582 21.65l-.072.06c.559 1.553-4.17 6.44-5.938 4.888l-.005.004-.028-.034a1.323 1.323 0 01-.124-.135 2.618 2.618 0 01-.149-.205z\"/><rect width=\"16\" height=\"48\" x=\"96\" y=\"80\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"80\" y=\"96\" rx=\"8\"/></g></svg>"
},
"$:/core/images/new-image-button": {
"title": "$:/core/images/new-image-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-image-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.362 73.627l15.826-27.41a2.626 2.626 0 00-.962-3.59l-50.01-28.872a2.626 2.626 0 00-3.588.961L30.058 36.49l10.04-5.261c3.042-1.595 6.771.114 7.55 3.46l3.607 17.702 9.88.85a5.25 5.25 0 014.571 3.77c.034.115.1.344.199.671.165.553.353 1.172.562 1.843.595 1.914 1.23 3.85 1.872 5.678.207.588.412 1.156.614 1.701.625 1.685 1.209 3.114 1.725 4.207.255.54.485.977.726 1.427.214.212.547.425 1.011.622 1.141.482 2.784.74 4.657.758.864.008 1.71-.034 2.492-.11.448-.043.753-.085.871-.104.315-.053.625-.077.927-.076zM37.47 2.649A5.257 5.257 0 0144.649.725l63.645 36.746a5.257 5.257 0 011.923 7.178L73.47 108.294a5.257 5.257 0 01-7.177 1.923L2.649 73.47a5.257 5.257 0 01-1.924-7.177L37.471 2.649zm42.837 50.49a5.25 5.25 0 105.25-9.092 5.25 5.25 0 00-5.25 9.093zM96 112h-7.993c-4.419 0-8.007-3.582-8.007-8 0-4.41 3.585-8 8.007-8H96v-7.993C96 83.588 99.582 80 104 80c4.41 0 8 3.585 8 8.007V96h7.993c4.419 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H112v7.993c0 4.419-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V112zM33.347 51.791c7.428 7.948 9.01 10.69 7.449 13.394-1.56 2.703-13.838-2.328-16.094 1.58-2.256 3.908-.907 3.258-2.437 5.908l19.73 11.39s-5.605-8.255-4.235-10.628c2.515-4.356 8.77-1.256 10.365-4.019 2.414-4.181-5.103-9.639-14.778-17.625z\"/></svg>"
},
"$:/core/images/new-journal-button": {
"title": "$:/core/images/new-journal-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-journal-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.545 112.818v11.818c0 1.306 1.086 2.364 2.425 2.364h6.06c1.34 0 2.425-1.058 2.425-2.364v-11.818h12.12c1.34 0 2.425-1.058 2.425-2.363v-5.91c0-1.305-1.085-2.363-2.424-2.363h-12.121V90.364c0-1.306-1.086-2.364-2.425-2.364h-6.06c-1.34 0-2.425 1.058-2.425 2.364v11.818h-12.12c-1.34 0-2.425 1.058-2.425 2.363v5.91c0 1.305 1.085 2.363 2.424 2.363h12.121zM60.016 4.965c-4.781-2.76-10.897-1.118-13.656 3.66L5.553 79.305A9.993 9.993 0 009.21 92.963l51.04 29.468c4.78 2.76 10.897 1.118 13.655-3.66l40.808-70.681a9.993 9.993 0 00-3.658-13.656L60.016 4.965zm-3.567 27.963a6 6 0 106-10.393 6 6 0 00-6 10.393zm31.697 17.928a6 6 0 106-10.392 6 6 0 00-6 10.392z\"/><text class=\"tc-fill-background\" font-family=\"Helvetica\" font-size=\"47.172\" font-weight=\"bold\" transform=\"rotate(30 25.742 95.82)\"><tspan x=\"42\" y=\"77.485\" text-anchor=\"middle\"><<now \"DD\">></tspan></text></g></svg>"
},
"$:/core/images/opacity": {
"title": "$:/core/images/opacity",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-opacity tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.362 65a51.595 51.595 0 01-1.942 6H82.584a35.867 35.867 0 002.997-6h16.78zm.472-2c.423-1.961.734-3.963.929-6H87.656a35.78 35.78 0 01-1.368 6h16.546zm-3.249 10a51.847 51.847 0 01-3.135 6H75.812a36.205 36.205 0 005.432-6h18.341zm-4.416 8c-1.424 2.116-3 4.12-4.71 6H60.46a35.843 35.843 0 0012.874-6h21.834zm-7.513-34h16.107C101.247 20.627 79.033 0 52 0 23.281 0 0 23.281 0 52c0 25.228 17.965 46.26 41.8 51h20.4a51.66 51.66 0 0015.875-6H39v-2h42.25a52.257 52.257 0 007.288-6H39v-2h4.539C27.739 83.194 16 68.968 16 52c0-19.882 16.118-36 36-36 18.186 0 33.222 13.484 35.656 31zm.22 2h16.039a52.823 52.823 0 010 6H87.877a36.483 36.483 0 000-6z\"/><path d=\"M76 128c28.719 0 52-23.281 52-52s-23.281-52-52-52-52 23.281-52 52 23.281 52 52 52zm0-16c19.882 0 36-16.118 36-36S95.882 40 76 40 40 56.118 40 76s16.118 36 36 36z\"/><path d=\"M37 58h53v4H37v-4zm3-8h53v4H40v-4zm0-8h53v4H40v-4zm-8 24h53v4H32v-4zm-2 8h53v4H30v-4zm-3 8h53v4H27v-4z\"/></g></svg>"
},
"$:/core/images/open-window": {
"title": "$:/core/images/open-window",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-open-window tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M16 112h88.994c3.87 0 7.006 3.59 7.006 8 0 4.418-3.142 8-7.006 8H7.006C3.136 128 0 124.41 0 120a9.321 9.321 0 010-.01V24.01C0 19.586 3.59 16 8 16c4.418 0 8 3.584 8 8.01V112z\"/><path d=\"M96 43.196V56a8 8 0 1016 0V24c0-4.41-3.585-8-8.007-8H72.007C67.588 16 64 19.582 64 24c0 4.41 3.585 8 8.007 8H84.57l-36.3 36.299a8 8 0 00-.001 11.316c3.117 3.117 8.19 3.123 11.316-.003L96 43.196zM32 7.999C32 3.581 35.588 0 40 0h80c4.419 0 8 3.588 8 8v80c0 4.419-3.588 8-8 8H40c-4.419 0-8-3.588-8-8V8z\"/></g></svg>"
},
"$:/core/images/options-button": {
"title": "$:/core/images/options-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-options-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M110.488 76a47.712 47.712 0 01-5.134 12.384l6.724 6.724c3.123 3.123 3.132 8.192.011 11.313l-5.668 5.668c-3.12 3.12-8.186 3.117-11.313-.01l-6.724-6.725c-3.82 2.258-7.98 4-12.384 5.134v9.505c0 4.417-3.578 8.007-7.992 8.007h-8.016C55.58 128 52 124.415 52 119.993v-9.505a47.712 47.712 0 01-12.384-5.134l-6.724 6.725c-3.123 3.122-8.192 3.131-11.313.01l-5.668-5.668c-3.12-3.12-3.116-8.186.01-11.313l6.725-6.724c-2.257-3.82-4-7.98-5.134-12.384H8.007C3.591 76 0 72.422 0 68.01v-8.017C0 55.58 3.585 52 8.007 52h9.505a47.712 47.712 0 015.134-12.383l-6.724-6.725c-3.123-3.122-3.132-8.191-.011-11.312l5.668-5.669c3.12-3.12 8.186-3.116 11.313.01l6.724 6.725c3.82-2.257 7.98-4 12.384-5.134V8.007C52 3.591 55.578 0 59.992 0h8.016C72.42 0 76 3.585 76 8.007v9.505a47.712 47.712 0 0112.384 5.134l6.724-6.724c3.123-3.123 8.192-3.132 11.313-.01l5.668 5.668c3.12 3.12 3.116 8.186-.01 11.312l-6.725 6.725c2.257 3.82 4 7.979 5.134 12.383h9.505c4.416 0 8.007 3.578 8.007 7.992v8.017c0 4.411-3.585 7.991-8.007 7.991h-9.505zM64 96c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/></svg>"
},
"$:/core/images/paint": {
"title": "$:/core/images/paint",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-paint tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M83.527 76.19C90.43 69.287 91.892 59 87.91 50.665l37.903-37.902c2.919-2.92 2.913-7.659 0-10.572a7.474 7.474 0 00-10.572 0L77.338 40.093c-8.335-3.982-18.622-2.521-25.526 4.383l31.715 31.715zm-2.643 2.644L49.169 47.119S8.506 81.243 0 80.282c0 0 3.782 5.592 6.827 8.039 14.024-5.69 37.326-24.6 37.326-24.6l.661.66S19.45 90.222 9.18 92.047c1.222 1.44 4.354 4.053 6.247 5.776 5.417-1.488 34.733-28.57 34.733-28.57l.661.66-32.407 31.022 5.285 5.286L56.106 75.2l.662.66s-27.864 30.536-28.684 32.432c0 0 6.032 6.853 7.569 7.824.702-2.836 27.884-33.485 27.884-33.485l.661.66s-20.597 23.755-24.964 36.732c3.21 3.549 7.5 5.137 10.926 6.298-2.19-11.817 30.724-47.487 30.724-47.487z\"/></svg>"
},
"$:/core/images/palette": {
"title": "$:/core/images/palette",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-palette tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.247 39.182a93.52 93.52 0 00-16.228-1.4C28.662 37.781 0 57.131 0 81.002c0 9.642 4.676 18.546 12.58 25.735C23.504 91.19 26.34 72.395 36.89 63.562c15.183-12.713 26.538-7.828 26.538-7.828l16.82-16.552zm26.535 9.655c13.049 7.913 21.257 19.392 21.257 32.166 0 9.35.519 17.411-11.874 25.08-10.797 6.681-3.824-6.536-11.844-10.898s-19.946 1.308-18.213 7.906c3.2 12.181 19.422 11.455 6.314 16.658-13.107 5.202-18.202 4.476-28.403 4.476-7.821 0-15.315-.947-22.243-2.68 9.844-4.197 27.88-12.539 33.354-19.456C82.788 92.409 87.37 80 83.324 72.484c-.194-.359 11.215-11.668 23.458-23.647zM1.134 123.867l-.66.002c33.479-14.94 22.161-64.226 58.818-64.226.317 1.418.644 2.944 1.062 4.494-25.907-4.166-23.567 48.031-59.22 59.73zm.713-.007c38.872-.506 78.152-22.347 78.152-44.813-9.27 0-14.073-3.48-16.816-7.942-16.597-7.003-30.365 45.715-61.336 52.755zm65.351-64.008c-4.45 4.115 4.886 16.433 11.318 11.318l45.27-45.27c11.317-11.318 0-22.635-11.318-11.318-11.317 11.318-33.518 34.405-45.27 45.27z\"/></svg>"
},
"$:/core/images/permalink-button": {
"title": "$:/core/images/permalink-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permalink-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.483 48l-7.387 32h-25.58l7.388-32h25.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L100.598 32h3.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-7.096l-7.387 32H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H85.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L69.402 96h-25.58L38.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L27.402 96h-3.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h7.096l7.387-32H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h18.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L58.598 32h25.58z\"/></svg>"
},
"$:/core/images/permaview-button": {
"title": "$:/core/images/permaview-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permaview-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.483 48l-1.846 8h-5.58l1.847-8h5.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L101.598 32h2.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-6.096l-1.847 8h7.944c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H92.364l-1.846 8H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H86.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L70.402 96h-5.58L59.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L48.402 96h-5.58L37.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L26.402 96h-2.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h6.096l1.847-8h-7.944C19.59 72 16 68.418 16 64c0-4.41 3.581-8 8-8h11.637l1.846-8H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h17.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L57.598 32h5.58L68.8 7.642c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L79.598 32h5.58zM53.904 48l-1.847 8h5.58l1.846-8h-5.579zm22.039 24l-1.847 8h-5.58l1.847-8h5.58zm-27.58 0l-1.846 8h5.579l1.847-8h-5.58z\"/></svg>"
},
"$:/core/images/picture": {
"title": "$:/core/images/picture",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-picture tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112 68.233v-48.23A4.001 4.001 0 00107.997 16H20.003A4.001 4.001 0 0016 20.003v38.31l9.241-14.593c2.8-4.422 9.023-5.008 12.6-1.186l18.247 20.613 13.687-6.407a8 8 0 018.903 1.492 264.97 264.97 0 002.92 2.739 249.44 249.44 0 006.798 6.066 166.5 166.5 0 002.106 1.778c2.108 1.747 3.967 3.188 5.482 4.237.748.518 1.383.92 2.044 1.33.444.117 1.046.144 1.809.05 1.873-.233 4.238-1.144 6.723-2.547a36.016 36.016 0 003.205-2.044c.558-.4.93-.686 1.07-.802.376-.31.765-.577 1.165-.806zM0 8.007A8.01 8.01 0 018.007 0h111.986A8.01 8.01 0 01128 8.007v111.986a8.01 8.01 0 01-8.007 8.007H8.007A8.01 8.01 0 010 119.993V8.007zM95 42a8 8 0 100-16 8 8 0 000 16zM32 76c15.859 4.83 20.035 7.244 20.035 12S32 95.471 32 102.347c0 6.876 1.285 4.99 1.285 9.653H68s-13.685-6.625-13.685-10.8c0-7.665 10.615-8.34 10.615-13.2 0-7.357-14.078-8.833-32.93-12z\"/></svg>"
},
"$:/core/images/plugin-generic-language": {
"title": "$:/core/images/plugin-generic-language",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"
},
"$:/core/images/plugin-generic-plugin": {
"title": "$:/core/images/plugin-generic-plugin",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"
},
"$:/core/images/plugin-generic-theme": {
"title": "$:/core/images/plugin-generic-theme",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z\"/></svg>"
},
"$:/core/images/preview-closed": {
"title": "$:/core/images/preview-closed",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-closed tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M.088 64a7.144 7.144 0 001.378 5.458C16.246 88.818 39.17 100.414 64 100.414c24.83 0 47.753-11.596 62.534-30.956A7.144 7.144 0 00127.912 64C110.582 78.416 88.304 87.086 64 87.086 39.696 87.086 17.418 78.416.088 64z\"/><rect width=\"4\" height=\"16\" x=\"62\" y=\"96\" rx=\"4\"/><rect width=\"4\" height=\"16\" x=\"78\" y=\"93\" rx=\"4\" transform=\"rotate(-5 80 101)\"/><rect width=\"4\" height=\"16\" x=\"46\" y=\"93\" rx=\"4\" transform=\"rotate(5 48 101)\"/><rect width=\"4\" height=\"16\" x=\"30\" y=\"88\" rx=\"4\" transform=\"rotate(10 32 96)\"/><rect width=\"4\" height=\"16\" x=\"94\" y=\"88\" rx=\"4\" transform=\"rotate(-10 96 96)\"/><rect width=\"4\" height=\"16\" x=\"110\" y=\"80\" rx=\"4\" transform=\"rotate(-20 112 88)\"/><rect width=\"4\" height=\"16\" x=\"14\" y=\"80\" rx=\"4\" transform=\"rotate(20 16 88)\"/></g></svg>"
},
"$:/core/images/preview-open": {
"title": "$:/core/images/preview-open",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-open tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.11 99.588c-24.83 0-47.754-11.596-62.534-30.957a7.148 7.148 0 010-8.675C16.356 40.596 39.28 29 64.11 29c24.83 0 47.753 11.596 62.534 30.956a7.148 7.148 0 010 8.675c-14.78 19.36-37.703 30.957-62.534 30.957zm46.104-32.007c1.44-1.524 1.44-3.638 0-5.162C99.326 50.9 82.439 44 64.147 44S28.968 50.9 18.08 62.42c-1.44 1.523-1.44 3.637 0 5.16C28.968 79.1 45.855 86 64.147 86s35.179-6.9 46.067-18.42z\"/><path d=\"M63.5 88C76.479 88 87 77.479 87 64.5S76.479 41 63.5 41 40 51.521 40 64.5 50.521 88 63.5 88z\"/></g></svg>"
},
"$:/core/images/print-button": {
"title": "$:/core/images/print-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-print-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M112 71V30.5h-.032c-.035-2-.816-3.99-2.343-5.516L86.998 2.357A7.978 7.978 0 0081 .02V0H24a8 8 0 00-8 8v63h8V8h57v14.5c0 4.422 3.582 8 8 8h15V71h8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/><path d=\"M0 80.005C0 71.165 7.156 64 16 64h96c8.836 0 16 7.155 16 16.005v31.99c0 8.84-7.156 16.005-16 16.005H16c-8.836 0-16-7.155-16-16.005v-31.99zM104 96a8 8 0 100-16 8 8 0 000 16z\"/></g></svg>"
},
"$:/core/images/quote": {
"title": "$:/core/images/quote",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-quote tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M51.219 117.713V62.199H27.427c0-8.891 1.683-16.401 5.047-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.36 3.184-20.728 6.669-6.368 3.484-11.835 7.87-16.401 13.157C9.524 27.113 5.98 33.241 3.456 40.21.933 47.18-.21 54.63.03 62.56v55.153H51.22zm76.781 0V62.199h-23.791c0-8.891 1.682-16.401 5.046-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.359 3.184-20.727 6.669-6.369 3.484-11.836 7.87-16.402 13.157-4.566 5.287-8.11 11.415-10.634 18.384-2.523 6.97-3.665 14.42-3.424 22.35v55.153H128z\"/></svg>"
},
"$:/core/images/refresh-button": {
"title": "$:/core/images/refresh-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-refresh-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M106.369 39.433c10.16 20.879 6.57 46.764-10.771 64.106-21.87 21.87-57.327 21.87-79.196 0-21.87-21.87-21.87-57.326 0-79.196a8 8 0 1111.314 11.314c-15.621 15.62-15.621 40.947 0 56.568 15.62 15.621 40.947 15.621 56.568 0C97.72 78.79 99.6 58.175 89.924 42.73l-6.44 12.264a8 8 0 11-14.166-7.437L84.435 18.76a8 8 0 0110.838-3.345l28.873 15.345a8 8 0 11-7.51 14.129l-10.267-5.457zm-8.222-12.368c-.167-.19-.336-.38-.506-.57l.96-.296-.454.866z\"/></svg>"
},
"$:/core/images/right-arrow": {
"title": "$:/core/images/right-arrow",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-right-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M99.069 64.173c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></svg>"
},
"$:/core/images/rotate-left": {
"title": "$:/core/images/rotate-left",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-rotate-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"32\" height=\"80\" rx=\"8\"/><rect width=\"80\" height=\"32\" x=\"48\" y=\"96\" rx=\"8\"/><path d=\"M61.32 36.65c19.743 2.45 35.023 19.287 35.023 39.693a4 4 0 01-8 0c0-15.663-11.254-28.698-26.117-31.46l3.916 3.916a4 4 0 11-5.657 5.657L49.172 43.142a4 4 0 010-5.657l11.313-11.313a4 4 0 115.657 5.656l-4.821 4.822z\"/></g></svg>"
},
"$:/core/images/save-button": {
"title": "$:/core/images/save-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z\"/></svg>"
},
"$:/core/images/size": {
"title": "$:/core/images/size",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-size tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M92.343 26l-9.171 9.172a4 4 0 105.656 5.656l16-16a4 4 0 000-5.656l-16-16a4 4 0 10-5.656 5.656L92.343 18H22a4 4 0 00-4 4v70.343l-9.172-9.171a4 4 0 10-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656L26 92.343V22l-4 4h70.343zM112 52v64l4-4H52a4 4 0 100 8h64a4 4 0 004-4V52a4 4 0 10-8 0z\"/></svg>"
},
"$:/core/images/spiral": {
"title": "$:/core/images/spiral",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-spiral tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.534 68.348c3.39 0 6.097-2.62 6.476-5.968l-4.755-.538 4.75.583c.377-3.07-1.194-6.054-3.89-7.78-2.757-1.773-6.34-2.01-9.566-.7-3.46 1.403-6.14 4.392-7.35 8.148l-.01.026c-1.3 4.08-.72 8.64 1.58 12.52 2.5 4.2 6.77 7.2 11.76 8.27 5.37 1.15 11.11-.05 15.83-3.31 5.04-3.51 8.46-9.02 9.45-15.3 1.05-6.7-.72-13.63-4.92-19.19l.02.02c-4.42-5.93-11.2-9.82-18.78-10.78-7.96-1.01-16.13 1.31-22.59 6.43-6.81 5.39-11.18 13.41-12.11 22.26-.98 9.27 1.87 18.65 7.93 26.02 6.32 7.69 15.6 12.56 25.74 13.48 10.54.96 21.15-2.42 29.45-9.4l.01-.01c8.58-7.25 13.94-17.78 14.86-29.21.94-11.84-2.96-23.69-10.86-32.9-8.19-9.5-19.95-15.36-32.69-16.27-13.16-.94-26.24 3.49-36.34 12.34l.01-.01c-10.41 9.08-16.78 22.1-17.68 36.15-.93 14.44 4.03 28.77 13.79 39.78 10.03 11.32 24.28 18.2 39.6 19.09 15.73.92 31.31-4.56 43.24-15.234 12.23-10.954 19.61-26.44 20.5-43.074a4.785 4.785 0 00-4.52-5.03 4.778 4.778 0 00-5.03 4.52c-.75 14.1-7 27.2-17.33 36.45-10.03 8.98-23.11 13.58-36.3 12.81-12.79-.75-24.67-6.48-33-15.89-8.07-9.11-12.17-20.94-11.41-32.827.74-11.52 5.942-22.15 14.43-29.54l.01-.01c8.18-7.17 18.74-10.75 29.35-9.998 10.21.726 19.6 5.41 26.11 12.96 6.24 7.273 9.32 16.61 8.573 25.894-.718 8.9-4.88 17.064-11.504 22.66l.01-.007c-6.36 5.342-14.44 7.92-22.425 7.19-7.604-.68-14.52-4.314-19.21-10.027-4.44-5.4-6.517-12.23-5.806-18.94.67-6.3 3.76-11.977 8.54-15.766 4.46-3.54 10.05-5.128 15.44-4.44 5.03.63 9.46 3.18 12.32 7.01l.02.024c2.65 3.5 3.75 7.814 3.1 11.92-.59 3.71-2.58 6.925-5.45 8.924-2.56 1.767-5.61 2.403-8.38 1.81-2.42-.516-4.42-1.92-5.53-3.79-.93-1.56-1.15-3.3-.69-4.75l-4.56-1.446L59.325 65c.36-1.12 1.068-1.905 1.84-2.22.25-.103.48-.14.668-.13.06.006.11.015.14.025.01 0 .01 0-.01-.01a1.047 1.047 0 01-.264-.332c-.15-.29-.23-.678-.18-1.11l-.005.04c.15-1.332 1.38-2.523 3.035-2.523-2.65 0-4.79 2.144-4.79 4.787s2.14 4.785 4.78 4.785z\"/></svg>"
},
"$:/core/images/stamp": {
"title": "$:/core/images/stamp",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-stamp tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M49.733 64H16.01C11.584 64 8 67.583 8 72.003V97h112V72.003A8 8 0 00111.99 64H78.267A22.813 22.813 0 0175.5 53.077c0-6.475 2.687-12.324 7.009-16.497A22.818 22.818 0 0087 22.952C87 10.276 76.703 0 64 0S41 10.276 41 22.952c0 5.103 1.669 9.817 4.491 13.628 4.322 4.173 7.009 10.022 7.009 16.497 0 3.954-1.002 7.675-2.767 10.923zM8 104h112v8H8v-8z\"/></svg>"
},
"$:/core/images/star-filled": {
"title": "$:/core/images/star-filled",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-star-filled tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M61.836 96.823l37.327 27.287c2.72 1.99 6.379-.69 5.343-3.912L90.29 75.988l-1.26 3.91 37.285-27.345c2.718-1.993 1.32-6.327-2.041-6.33l-46.113-.036 3.3 2.416L67.176 4.416c-1.04-3.221-5.563-3.221-6.604 0L46.29 48.603l3.3-2.416-46.113.036c-3.362.003-4.759 4.337-2.04 6.33L38.72 79.898l-1.26-3.91-14.216 44.21c-1.036 3.223 2.622 5.901 5.343 3.912l37.326-27.287h-4.078z\"/></svg>"
},
"$:/core/images/storyview-classic": {
"title": "$:/core/images/storyview-classic",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-classic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm0 48C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0 32C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
},
"$:/core/images/storyview-pop": {
"title": "$:/core/images/storyview-pop",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-pop tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm-7.99 40C11.587 56 8 59.578 8 63.992v16.016C8 84.422 11.584 88 16.01 88h95.98c4.424 0 8.01-3.578 8.01-7.992V63.992c0-4.414-3.584-7.992-8.01-7.992H16.01zM24 96C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0-32C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
},
"$:/core/images/storyview-zoomin": {
"title": "$:/core/images/storyview-zoomin",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-zoomin tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16A8 8 0 0016 24.009V71.99C16 76.414 19.588 80 24 80h80a8 8 0 008-8.009V24.01c0-4.423-3.588-8.009-8-8.009H24z\"/></svg>"
},
"$:/core/images/strikethrough": {
"title": "$:/core/images/strikethrough",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-strikethrough tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M92.794 38.726h15.422c-.229-6.74-1.514-12.538-3.856-17.393-2.342-4.855-5.54-8.881-9.596-12.08-4.055-3.199-8.767-5.54-14.136-7.025C75.258.743 69.433 0 63.15 0a62.76 62.76 0 00-16.364 2.142C41.474 3.57 36.733 5.74 32.564 8.653c-4.17 2.913-7.511 6.626-10.025 11.138-2.513 4.512-3.77 9.853-3.77 16.022 0 5.597 1.115 10.252 3.342 13.965 2.228 3.712 5.198 6.74 8.91 9.081 3.713 2.342 7.911 4.227 12.595 5.655a194.641 194.641 0 0014.308 3.77c4.855 1.085 9.624 2.142 14.308 3.17 4.683 1.028 8.881 2.37 12.594 4.027 3.713 1.656 6.683 3.798 8.91 6.425 2.228 2.628 3.342 6.055 3.342 10.281 0 4.456-.914 8.111-2.742 10.967a19.953 19.953 0 01-7.197 6.768c-2.97 1.657-6.311 2.828-10.024 3.513a60.771 60.771 0 01-11.052 1.028c-4.57 0-9.025-.571-13.366-1.713-4.34-1.143-8.139-2.913-11.394-5.312-3.256-2.4-5.884-5.455-7.883-9.168-1.999-3.712-2.998-8.139-2.998-13.28H15c0 7.426 1.342 13.852 4.027 19.278 2.684 5.426 6.34 9.881 10.966 13.365 4.627 3.484 9.996 6.083 16.107 7.797 6.112 1.713 12.595 2.57 19.449 2.57 5.597 0 11.223-.657 16.878-1.97 5.655-1.314 10.767-3.428 15.336-6.34 4.57-2.914 8.31-6.683 11.224-11.31 2.913-4.626 4.37-10.195 4.37-16.707 0-6.054-1.115-11.08-3.342-15.079-2.228-3.998-5.198-7.31-8.91-9.938-3.713-2.627-7.911-4.712-12.595-6.254a170.83 170.83 0 00-14.308-4.027 549.669 549.669 0 00-14.308-3.17c-4.683-.971-8.881-2.2-12.594-3.684-3.713-1.485-6.683-3.399-8.91-5.74-2.228-2.342-3.342-5.398-3.342-9.168 0-3.998.771-7.34 2.313-10.024 1.543-2.685 3.599-4.826 6.17-6.426 2.57-1.599 5.51-2.741 8.824-3.427a49.767 49.767 0 0110.11-1.028c8.453 0 15.393 1.97 20.819 5.912 5.426 3.94 8.596 10.31 9.51 19.106z\"/><path d=\"M5 54h118v16H5z\"/></g></svg>"
},
"$:/core/images/subscript": {
"title": "$:/core/images/subscript",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-subscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 128.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
},
"$:/core/images/superscript": {
"title": "$:/core/images/superscript",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-superscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 63.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
},
"$:/core/images/tag-button": {
"title": "$:/core/images/tag-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tag-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M18.164 47.66l.004 4.105c.003 3.823 2.19 9.097 4.885 11.792l61.85 61.85c2.697 2.697 7.068 2.69 9.769-.01L125.767 94.3a6.903 6.903 0 00.01-9.77L63.928 22.683c-2.697-2.697-7.976-4.88-11.796-4.881l-27.076-.007a6.902 6.902 0 00-6.91 6.91l.008 9.96.287.033c3.73.411 8.489-.044 13.365-1.153a9.702 9.702 0 0111.14-3.662l.291-.13.128.285a9.7 9.7 0 013.3 2.17c3.796 3.796 3.801 9.945.012 13.734-3.618 3.618-9.386 3.777-13.204.482-5.365 1.122-10.674 1.596-15.309 1.237z\"/><path d=\"M47.633 39.532l.023.051c-9.689 4.356-21.584 6.799-30.396 5.828C5.273 44.089-1.028 36.43 2.443 24.078 5.562 12.976 14.3 4.361 24.047 1.548c10.68-3.083 19.749 1.968 19.749 13.225h-8.623c0-4.859-3.078-6.573-8.735-4.94-6.91 1.995-13.392 8.383-15.694 16.577-1.915 6.818.417 9.653 7.46 10.43 7.126.785 17.531-1.352 25.917-5.121l.027.06.036-.017c1.76-.758 6.266 6.549 3.524 7.74a2.8 2.8 0 01-.075.03z\"/></g></svg>"
},
"$:/core/images/theme-button": {
"title": "$:/core/images/theme-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-theme-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.854 66.945a122.626 122.626 0 01-3.9-4.819c-11.064-14.548-16.645-6.888-22.96 0-6.315 6.888 1.664 12.47-4.33 17.335-5.993 4.866-5.623 6.552-15.737-2.35-10.115-8.9-10.815-11.351-6.172-16.43 4.644-5.08 8.524 2.918 18.01-6.108 9.485-9.026 1.517-17.026 1.517-17.026S42.03-2.824 68.42.157c26.39 2.982-9.984-3.86-19.031 27.801-3.874 13.556.72 10.362 8.066 16.087 1.707 1.33 6.428 4.732 12.671 9.318-6.129 5.879-11.157 10.669-14.273 13.582zm11.641 12.947c16.013 17.036 37.742 37.726 45.117 40.42 10.432 3.813 15.388-3.141 15.388-14.79 0-7.151-23.83-26.542-43.924-41.769-7.408 7.156-13.376 12.953-16.58 16.139z\"/><path d=\"M11.069 109.828L46.31 74.587a3.56 3.56 0 115.037-5.032l15.098 15.098a3.56 3.56 0 11-5.032 5.037l-35.24 35.241c-4.171 4.17-10.933 4.17-15.104 0-4.17-4.17-4.17-10.933 0-15.103zM124.344 6.622l5.034 5.034-7.49 12.524-7.613 2.58L61.413 79.62l-5.034-5.034 52.861-52.862 2.58-7.614 12.524-7.49z\"/></g></svg>"
},
"$:/core/images/timestamp-off": {
"title": "$:/core/images/timestamp-off",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-off tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M58.25 35.88c-18.777 0-33.998 15.224-33.998 33.998 0 18.773 15.22 34.002 33.998 34.002 18.784 0 34.002-15.23 34.002-34.002 0-18.774-15.218-33.998-34.002-33.998zm-3.03 50.123H44.196v-34H55.22v34zm16.976 0H61.17v-34h11.025v34z\"/></g></svg>"
},
"$:/core/images/timestamp-on": {
"title": "$:/core/images/timestamp-on",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-on tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M13.41 27.178a5.005 5.005 0 01-7.045-.613 5.008 5.008 0 01.616-7.047l9.95-8.348a5 5 0 016.429 7.661l-9.95 8.348zm89.573 0a5.005 5.005 0 007.045-.613 5.008 5.008 0 00-.616-7.047l-9.95-8.348a5 5 0 00-6.428 7.661l9.95 8.348zM65.097 71.072c0 3.826-3.09 6.928-6.897 6.928-3.804.006-6.9-3.102-6.903-6.928 0 0 4.76-39.072 6.903-39.072s6.897 39.072 6.897 39.072z\"/></g></svg>"
},
"$:/core/images/tip": {
"title": "$:/core/images/tip",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tip tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128.242c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64 0 35.346 28.654 64 64 64zm11.936-36.789c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349C54.33 94.05 58.824 95.82 64 95.82c5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.456c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zM64.3 24.242c11.618 0 23.699 7.82 23.699 24.2S75.92 71.754 75.92 83.576c0 5.873-5.868 9.26-11.92 9.26s-12.027-3.006-12.027-9.26C51.973 71.147 40 65.47 40 48.442s12.683-24.2 24.301-24.2z\"/></svg>"
},
"$:/core/images/transcludify": {
"title": "$:/core/images/transcludify",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-transcludify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M0 59.482c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.651-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02C1.36 67.377.591 67.288 0 67.288v-7.806zm24.66 0c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.65-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02c-.946-.177-1.715-.266-2.306-.266v-7.806zm43.965-3.538L80.6 52.041l2.306 7.097-12.063 3.903 7.628 10.378-6.12 4.435-7.63-10.467-7.45 10.201-5.943-4.524 7.628-10.023-12.152-4.17 2.306-7.096 12.064 4.17V43.347h7.451v12.596zm34.425 11.344c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806zm24.66 0c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806z\"/></svg>"
},
"$:/core/images/twitter": {
"title": "$:/core/images/twitter",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-twitter tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.626 115.803A73.376 73.376 0 012 104.235c2.022.238 4.08.36 6.166.36 12.111 0 23.258-4.117 32.105-11.023-11.312-.208-20.859-7.653-24.148-17.883a25.98 25.98 0 0011.674-.441C15.971 72.881 7.061 62.474 7.061 49.997c0-.108 0-.216.002-.323a25.824 25.824 0 0011.709 3.22c-6.936-4.617-11.5-12.5-11.5-21.433 0-4.719 1.274-9.142 3.5-12.945 12.75 15.579 31.797 25.83 53.281 26.904-.44-1.884-.67-3.85-.67-5.868 0-14.22 11.575-25.75 25.852-25.75a25.865 25.865 0 0118.869 8.132 51.892 51.892 0 0016.415-6.248c-1.93 6.012-6.029 11.059-11.366 14.246A51.844 51.844 0 00128 25.878a52.428 52.428 0 01-12.9 13.33c.05 1.104.075 2.214.075 3.33 0 34.028-26 73.265-73.549 73.265\"/></svg>"
},
"$:/core/images/underline": {
"title": "$:/core/images/underline",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-underline tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M7 117.421h114.248V128H7v-10.579zm97.871-18.525V0h-16.26v55.856c0 4.463-.605 8.576-1.816 12.338-1.212 3.762-3.03 7.046-5.452 9.851-2.423 2.806-5.452 4.974-9.086 6.504-3.635 1.53-7.939 2.296-12.912 2.296-6.25 0-11.159-1.786-14.73-5.356-3.57-3.571-5.356-8.417-5.356-14.538V0H23v65.038c0 5.356.542 10.234 1.626 14.633 1.084 4.4 2.965 8.194 5.643 11.382 2.678 3.188 6.185 5.643 10.52 7.365 4.337 1.721 9.756 2.582 16.26 2.582 7.27 0 13.582-1.435 18.938-4.304 5.356-2.87 9.755-7.365 13.199-13.486h.382v15.686h15.303z\"/></svg>"
},
"$:/core/images/unfold-all-button": {
"title": "$:/core/images/unfold-all-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M63.945 60.624c-2.05 0-4.101-.78-5.666-2.345L35.662 35.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 41.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 58.279a7.986 7.986 0 01-5.663 2.346zM64.004 124.565c-2.05 0-4.102-.78-5.666-2.345L35.721 99.603c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 105.255l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.662 122.22a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
},
"$:/core/images/unfold-button": {
"title": "$:/core/images/unfold-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M63.945 63.624c-2.05 0-4.101-.78-5.666-2.345L35.662 38.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 44.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 61.279a7.986 7.986 0 01-5.663 2.346zM64.004 105.682c-2.05.001-4.102-.78-5.666-2.344L35.721 80.721c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 86.373l16.966-16.966c3.124-3.125 8.194-3.13 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319l-22.617 22.617a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
},
"$:/core/images/unlocked-padlock": {
"title": "$:/core/images/unlocked-padlock",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unlocked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M48.627 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h6.136c-10.455-12.651-27.364-35.788-4.3-55.142 24.636-20.672 45.835 4.353 55.777 16.201 9.943 11.85-2.676 22.437-12.457 9.892-9.78-12.545-21.167-24.146-33.207-14.043-12.041 10.104-1.757 22.36 8.813 34.958 2.467 2.94 3.641 5.732 3.865 8.134zm19.105 28.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
},
"$:/core/images/up-arrow": {
"title": "$:/core/images/up-arrow",
"created": "20150316000544368",
"modified": "20150316000831867",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-up-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M63.892.281c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.104 3.092-11.196 0L63.894 19.393 13.513 69.774a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98A7.892 7.892 0 0163.893.28z\"/></svg>"
},
"$:/core/images/video": {
"title": "$:/core/images/video",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-video tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 12c-34.91 0-55.273 2.917-58.182 5.833C2.91 20.75 0 41.167 0 64.5c0 23.333 2.91 43.75 5.818 46.667C8.728 114.083 29.091 117 64 117c34.91 0 55.273-2.917 58.182-5.833C125.09 108.25 128 87.833 128 64.5c0-23.333-2.91-43.75-5.818-46.667C119.272 14.917 98.909 12 64 12zm-9.084 32.618c-3.813-2.542-6.905-.879-6.905 3.698v31.368c0 4.585 3.099 6.235 6.905 3.698l22.168-14.779c3.813-2.542 3.806-6.669 0-9.206L54.916 44.618z\"/></svg>"
},
"$:/core/images/warning": {
"title": "$:/core/images/warning",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-warning tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z\"/></svg>"
},
"$:/language/Buttons/AdvancedSearch/Caption": {
"title": "$:/language/Buttons/AdvancedSearch/Caption",
"text": "advanced search"
},
"$:/language/Buttons/AdvancedSearch/Hint": {
"title": "$:/language/Buttons/AdvancedSearch/Hint",
"text": "Advanced search"
},
"$:/language/Buttons/Cancel/Caption": {
"title": "$:/language/Buttons/Cancel/Caption",
"text": "cancel"
},
"$:/language/Buttons/Cancel/Hint": {
"title": "$:/language/Buttons/Cancel/Hint",
"text": "Discard changes to this tiddler"
},
"$:/language/Buttons/Clone/Caption": {
"title": "$:/language/Buttons/Clone/Caption",
"text": "clone"
},
"$:/language/Buttons/Clone/Hint": {
"title": "$:/language/Buttons/Clone/Hint",
"text": "Clone this tiddler"
},
"$:/language/Buttons/Close/Caption": {
"title": "$:/language/Buttons/Close/Caption",
"text": "close"
},
"$:/language/Buttons/Close/Hint": {
"title": "$:/language/Buttons/Close/Hint",
"text": "Close this tiddler"
},
"$:/language/Buttons/CloseAll/Caption": {
"title": "$:/language/Buttons/CloseAll/Caption",
"text": "close all"
},
"$:/language/Buttons/CloseAll/Hint": {
"title": "$:/language/Buttons/CloseAll/Hint",
"text": "Close all tiddlers"
},
"$:/language/Buttons/CloseOthers/Caption": {
"title": "$:/language/Buttons/CloseOthers/Caption",
"text": "close others"
},
"$:/language/Buttons/CloseOthers/Hint": {
"title": "$:/language/Buttons/CloseOthers/Hint",
"text": "Close other tiddlers"
},
"$:/language/Buttons/ControlPanel/Caption": {
"title": "$:/language/Buttons/ControlPanel/Caption",
"text": "control panel"
},
"$:/language/Buttons/ControlPanel/Hint": {
"title": "$:/language/Buttons/ControlPanel/Hint",
"text": "Open control panel"
},
"$:/language/Buttons/CopyToClipboard/Caption": {
"title": "$:/language/Buttons/CopyToClipboard/Caption",
"text": "copy to clipboard"
},
"$:/language/Buttons/CopyToClipboard/Hint": {
"title": "$:/language/Buttons/CopyToClipboard/Hint",
"text": "Copy this text to the clipboard"
},
"$:/language/Buttons/Delete/Caption": {
"title": "$:/language/Buttons/Delete/Caption",
"text": "delete"
},
"$:/language/Buttons/Delete/Hint": {
"title": "$:/language/Buttons/Delete/Hint",
"text": "Delete this tiddler"
},
"$:/language/Buttons/Edit/Caption": {
"title": "$:/language/Buttons/Edit/Caption",
"text": "edit"
},
"$:/language/Buttons/Edit/Hint": {
"title": "$:/language/Buttons/Edit/Hint",
"text": "Edit this tiddler"
},
"$:/language/Buttons/Encryption/Caption": {
"title": "$:/language/Buttons/Encryption/Caption",
"text": "encryption"
},
"$:/language/Buttons/Encryption/Hint": {
"title": "$:/language/Buttons/Encryption/Hint",
"text": "Set or clear a password for saving this wiki"
},
"$:/language/Buttons/Encryption/ClearPassword/Caption": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Caption",
"text": "clear password"
},
"$:/language/Buttons/Encryption/ClearPassword/Hint": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Hint",
"text": "Clear the password and save this wiki without encryption"
},
"$:/language/Buttons/Encryption/SetPassword/Caption": {
"title": "$:/language/Buttons/Encryption/SetPassword/Caption",
"text": "set password"
},
"$:/language/Buttons/Encryption/SetPassword/Hint": {
"title": "$:/language/Buttons/Encryption/SetPassword/Hint",
"text": "Set a password for saving this wiki with encryption"
},
"$:/language/Buttons/ExportPage/Caption": {
"title": "$:/language/Buttons/ExportPage/Caption",
"text": "export all"
},
"$:/language/Buttons/ExportPage/Hint": {
"title": "$:/language/Buttons/ExportPage/Hint",
"text": "Export all tiddlers"
},
"$:/language/Buttons/ExportTiddler/Caption": {
"title": "$:/language/Buttons/ExportTiddler/Caption",
"text": "export tiddler"
},
"$:/language/Buttons/ExportTiddler/Hint": {
"title": "$:/language/Buttons/ExportTiddler/Hint",
"text": "Export tiddler"
},
"$:/language/Buttons/ExportTiddlers/Caption": {
"title": "$:/language/Buttons/ExportTiddlers/Caption",
"text": "export tiddlers"
},
"$:/language/Buttons/ExportTiddlers/Hint": {
"title": "$:/language/Buttons/ExportTiddlers/Hint",
"text": "Export tiddlers"
},
"$:/language/Buttons/SidebarSearch/Hint": {
"title": "$:/language/Buttons/SidebarSearch/Hint",
"text": "Select the sidebar search field"
},
"$:/language/Buttons/Fold/Caption": {
"title": "$:/language/Buttons/Fold/Caption",
"text": "fold tiddler"
},
"$:/language/Buttons/Fold/Hint": {
"title": "$:/language/Buttons/Fold/Hint",
"text": "Fold the body of this tiddler"
},
"$:/language/Buttons/Fold/FoldBar/Caption": {
"title": "$:/language/Buttons/Fold/FoldBar/Caption",
"text": "fold-bar"
},
"$:/language/Buttons/Fold/FoldBar/Hint": {
"title": "$:/language/Buttons/Fold/FoldBar/Hint",
"text": "Optional bars to fold and unfold tiddlers"
},
"$:/language/Buttons/Unfold/Caption": {
"title": "$:/language/Buttons/Unfold/Caption",
"text": "unfold tiddler"
},
"$:/language/Buttons/Unfold/Hint": {
"title": "$:/language/Buttons/Unfold/Hint",
"text": "Unfold the body of this tiddler"
},
"$:/language/Buttons/FoldOthers/Caption": {
"title": "$:/language/Buttons/FoldOthers/Caption",
"text": "fold other tiddlers"
},
"$:/language/Buttons/FoldOthers/Hint": {
"title": "$:/language/Buttons/FoldOthers/Hint",
"text": "Fold the bodies of other opened tiddlers"
},
"$:/language/Buttons/FoldAll/Caption": {
"title": "$:/language/Buttons/FoldAll/Caption",
"text": "fold all tiddlers"
},
"$:/language/Buttons/FoldAll/Hint": {
"title": "$:/language/Buttons/FoldAll/Hint",
"text": "Fold the bodies of all opened tiddlers"
},
"$:/language/Buttons/UnfoldAll/Caption": {
"title": "$:/language/Buttons/UnfoldAll/Caption",
"text": "unfold all tiddlers"
},
"$:/language/Buttons/UnfoldAll/Hint": {
"title": "$:/language/Buttons/UnfoldAll/Hint",
"text": "Unfold the bodies of all opened tiddlers"
},
"$:/language/Buttons/FullScreen/Caption": {
"title": "$:/language/Buttons/FullScreen/Caption",
"text": "full-screen"
},
"$:/language/Buttons/FullScreen/Hint": {
"title": "$:/language/Buttons/FullScreen/Hint",
"text": "Enter or leave full-screen mode"
},
"$:/language/Buttons/Help/Caption": {
"title": "$:/language/Buttons/Help/Caption",
"text": "help"
},
"$:/language/Buttons/Help/Hint": {
"title": "$:/language/Buttons/Help/Hint",
"text": "Show help panel"
},
"$:/language/Buttons/Import/Caption": {
"title": "$:/language/Buttons/Import/Caption",
"text": "import"
},
"$:/language/Buttons/Import/Hint": {
"title": "$:/language/Buttons/Import/Hint",
"text": "Import many types of file including text, image, TiddlyWiki or JSON"
},
"$:/language/Buttons/Info/Caption": {
"title": "$:/language/Buttons/Info/Caption",
"text": "info"
},
"$:/language/Buttons/Info/Hint": {
"title": "$:/language/Buttons/Info/Hint",
"text": "Show information for this tiddler"
},
"$:/language/Buttons/Home/Caption": {
"title": "$:/language/Buttons/Home/Caption",
"text": "home"
},
"$:/language/Buttons/Home/Hint": {
"title": "$:/language/Buttons/Home/Hint",
"text": "Open the default tiddlers"
},
"$:/language/Buttons/Language/Caption": {
"title": "$:/language/Buttons/Language/Caption",
"text": "language"
},
"$:/language/Buttons/Language/Hint": {
"title": "$:/language/Buttons/Language/Hint",
"text": "Choose the user interface language"
},
"$:/language/Buttons/Manager/Caption": {
"title": "$:/language/Buttons/Manager/Caption",
"text": "tiddler manager"
},
"$:/language/Buttons/Manager/Hint": {
"title": "$:/language/Buttons/Manager/Hint",
"text": "Open tiddler manager"
},
"$:/language/Buttons/More/Caption": {
"title": "$:/language/Buttons/More/Caption",
"text": "more"
},
"$:/language/Buttons/More/Hint": {
"title": "$:/language/Buttons/More/Hint",
"text": "More actions"
},
"$:/language/Buttons/NewHere/Caption": {
"title": "$:/language/Buttons/NewHere/Caption",
"text": "new here"
},
"$:/language/Buttons/NewHere/Hint": {
"title": "$:/language/Buttons/NewHere/Hint",
"text": "Create a new tiddler tagged with this one"
},
"$:/language/Buttons/NewJournal/Caption": {
"title": "$:/language/Buttons/NewJournal/Caption",
"text": "new journal"
},
"$:/language/Buttons/NewJournal/Hint": {
"title": "$:/language/Buttons/NewJournal/Hint",
"text": "Create a new journal tiddler"
},
"$:/language/Buttons/NewJournalHere/Caption": {
"title": "$:/language/Buttons/NewJournalHere/Caption",
"text": "new journal here"
},
"$:/language/Buttons/NewJournalHere/Hint": {
"title": "$:/language/Buttons/NewJournalHere/Hint",
"text": "Create a new journal tiddler tagged with this one"
},
"$:/language/Buttons/NewImage/Caption": {
"title": "$:/language/Buttons/NewImage/Caption",
"text": "new image"
},
"$:/language/Buttons/NewImage/Hint": {
"title": "$:/language/Buttons/NewImage/Hint",
"text": "Create a new image tiddler"
},
"$:/language/Buttons/NewMarkdown/Caption": {
"title": "$:/language/Buttons/NewMarkdown/Caption",
"text": "new Markdown tiddler"
},
"$:/language/Buttons/NewMarkdown/Hint": {
"title": "$:/language/Buttons/NewMarkdown/Hint",
"text": "Create a new Markdown tiddler"
},
"$:/language/Buttons/NewTiddler/Caption": {
"title": "$:/language/Buttons/NewTiddler/Caption",
"text": "new tiddler"
},
"$:/language/Buttons/NewTiddler/Hint": {
"title": "$:/language/Buttons/NewTiddler/Hint",
"text": "Create a new tiddler"
},
"$:/language/Buttons/OpenWindow/Caption": {
"title": "$:/language/Buttons/OpenWindow/Caption",
"text": "open in new window"
},
"$:/language/Buttons/OpenWindow/Hint": {
"title": "$:/language/Buttons/OpenWindow/Hint",
"text": "Open tiddler in new window"
},
"$:/language/Buttons/Palette/Caption": {
"title": "$:/language/Buttons/Palette/Caption",
"text": "palette"
},
"$:/language/Buttons/Palette/Hint": {
"title": "$:/language/Buttons/Palette/Hint",
"text": "Choose the colour palette"
},
"$:/language/Buttons/Permalink/Caption": {
"title": "$:/language/Buttons/Permalink/Caption",
"text": "permalink"
},
"$:/language/Buttons/Permalink/Hint": {
"title": "$:/language/Buttons/Permalink/Hint",
"text": "Set browser address bar to a direct link to this tiddler"
},
"$:/language/Buttons/Permaview/Caption": {
"title": "$:/language/Buttons/Permaview/Caption",
"text": "permaview"
},
"$:/language/Buttons/Permaview/Hint": {
"title": "$:/language/Buttons/Permaview/Hint",
"text": "Set browser address bar to a direct link to all the tiddlers in this story"
},
"$:/language/Buttons/Print/Caption": {
"title": "$:/language/Buttons/Print/Caption",
"text": "print page"
},
"$:/language/Buttons/Print/Hint": {
"title": "$:/language/Buttons/Print/Hint",
"text": "Print the current page"
},
"$:/language/Buttons/Refresh/Caption": {
"title": "$:/language/Buttons/Refresh/Caption",
"text": "refresh"
},
"$:/language/Buttons/Refresh/Hint": {
"title": "$:/language/Buttons/Refresh/Hint",
"text": "Perform a full refresh of the wiki"
},
"$:/language/Buttons/Save/Caption": {
"title": "$:/language/Buttons/Save/Caption",
"text": "ok"
},
"$:/language/Buttons/Save/Hint": {
"title": "$:/language/Buttons/Save/Hint",
"text": "Confirm changes to this tiddler"
},
"$:/language/Buttons/SaveWiki/Caption": {
"title": "$:/language/Buttons/SaveWiki/Caption",
"text": "save changes"
},
"$:/language/Buttons/SaveWiki/Hint": {
"title": "$:/language/Buttons/SaveWiki/Hint",
"text": "Save changes"
},
"$:/language/Buttons/StoryView/Caption": {
"title": "$:/language/Buttons/StoryView/Caption",
"text": "storyview"
},
"$:/language/Buttons/StoryView/Hint": {
"title": "$:/language/Buttons/StoryView/Hint",
"text": "Choose the story visualisation"
},
"$:/language/Buttons/HideSideBar/Caption": {
"title": "$:/language/Buttons/HideSideBar/Caption",
"text": "hide sidebar"
},
"$:/language/Buttons/HideSideBar/Hint": {
"title": "$:/language/Buttons/HideSideBar/Hint",
"text": "Hide sidebar"
},
"$:/language/Buttons/ShowSideBar/Caption": {
"title": "$:/language/Buttons/ShowSideBar/Caption",
"text": "show sidebar"
},
"$:/language/Buttons/ShowSideBar/Hint": {
"title": "$:/language/Buttons/ShowSideBar/Hint",
"text": "Show sidebar"
},
"$:/language/Buttons/TagManager/Caption": {
"title": "$:/language/Buttons/TagManager/Caption",
"text": "tag manager"
},
"$:/language/Buttons/TagManager/Hint": {
"title": "$:/language/Buttons/TagManager/Hint",
"text": "Open tag manager"
},
"$:/language/Buttons/Timestamp/Caption": {
"title": "$:/language/Buttons/Timestamp/Caption",
"text": "timestamps"
},
"$:/language/Buttons/Timestamp/Hint": {
"title": "$:/language/Buttons/Timestamp/Hint",
"text": "Choose whether modifications update timestamps"
},
"$:/language/Buttons/Timestamp/On/Caption": {
"title": "$:/language/Buttons/Timestamp/On/Caption",
"text": "timestamps are on"
},
"$:/language/Buttons/Timestamp/On/Hint": {
"title": "$:/language/Buttons/Timestamp/On/Hint",
"text": "Update timestamps when tiddlers are modified"
},
"$:/language/Buttons/Timestamp/Off/Caption": {
"title": "$:/language/Buttons/Timestamp/Off/Caption",
"text": "timestamps are off"
},
"$:/language/Buttons/Timestamp/Off/Hint": {
"title": "$:/language/Buttons/Timestamp/Off/Hint",
"text": "Don't update timestamps when tiddlers are modified"
},
"$:/language/Buttons/Theme/Caption": {
"title": "$:/language/Buttons/Theme/Caption",
"text": "theme"
},
"$:/language/Buttons/Theme/Hint": {
"title": "$:/language/Buttons/Theme/Hint",
"text": "Choose the display theme"
},
"$:/language/Buttons/Bold/Caption": {
"title": "$:/language/Buttons/Bold/Caption",
"text": "bold"
},
"$:/language/Buttons/Bold/Hint": {
"title": "$:/language/Buttons/Bold/Hint",
"text": "Apply bold formatting to selection"
},
"$:/language/Buttons/Clear/Caption": {
"title": "$:/language/Buttons/Clear/Caption",
"text": "clear"
},
"$:/language/Buttons/Clear/Hint": {
"title": "$:/language/Buttons/Clear/Hint",
"text": "Clear image to solid colour"
},
"$:/language/Buttons/EditorHeight/Caption": {
"title": "$:/language/Buttons/EditorHeight/Caption",
"text": "editor height"
},
"$:/language/Buttons/EditorHeight/Caption/Auto": {
"title": "$:/language/Buttons/EditorHeight/Caption/Auto",
"text": "Automatically adjust height to fit content"
},
"$:/language/Buttons/EditorHeight/Caption/Fixed": {
"title": "$:/language/Buttons/EditorHeight/Caption/Fixed",
"text": "Fixed height:"
},
"$:/language/Buttons/EditorHeight/Hint": {
"title": "$:/language/Buttons/EditorHeight/Hint",
"text": "Choose the height of the text editor"
},
"$:/language/Buttons/Excise/Caption": {
"title": "$:/language/Buttons/Excise/Caption",
"text": "excise"
},
"$:/language/Buttons/Excise/Caption/Excise": {
"title": "$:/language/Buttons/Excise/Caption/Excise",
"text": "Perform excision"
},
"$:/language/Buttons/Excise/Caption/MacroName": {
"title": "$:/language/Buttons/Excise/Caption/MacroName",
"text": "Macro name:"
},
"$:/language/Buttons/Excise/Caption/NewTitle": {
"title": "$:/language/Buttons/Excise/Caption/NewTitle",
"text": "Title of new tiddler:"
},
"$:/language/Buttons/Excise/Caption/Replace": {
"title": "$:/language/Buttons/Excise/Caption/Replace",
"text": "Replace excised text with:"
},
"$:/language/Buttons/Excise/Caption/Replace/Macro": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Macro",
"text": "macro"
},
"$:/language/Buttons/Excise/Caption/Replace/Link": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Link",
"text": "link"
},
"$:/language/Buttons/Excise/Caption/Replace/Transclusion": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Transclusion",
"text": "transclusion"
},
"$:/language/Buttons/Excise/Caption/Tag": {
"title": "$:/language/Buttons/Excise/Caption/Tag",
"text": "Tag new tiddler with the title of this tiddler"
},
"$:/language/Buttons/Excise/Caption/TiddlerExists": {
"title": "$:/language/Buttons/Excise/Caption/TiddlerExists",
"text": "Warning: tiddler already exists"
},
"$:/language/Buttons/Excise/Hint": {
"title": "$:/language/Buttons/Excise/Hint",
"text": "Excise the selected text into a new tiddler"
},
"$:/language/Buttons/Heading1/Caption": {
"title": "$:/language/Buttons/Heading1/Caption",
"text": "heading 1"
},
"$:/language/Buttons/Heading1/Hint": {
"title": "$:/language/Buttons/Heading1/Hint",
"text": "Apply heading level 1 formatting to lines containing selection"
},
"$:/language/Buttons/Heading2/Caption": {
"title": "$:/language/Buttons/Heading2/Caption",
"text": "heading 2"
},
"$:/language/Buttons/Heading2/Hint": {
"title": "$:/language/Buttons/Heading2/Hint",
"text": "Apply heading level 2 formatting to lines containing selection"
},
"$:/language/Buttons/Heading3/Caption": {
"title": "$:/language/Buttons/Heading3/Caption",
"text": "heading 3"
},
"$:/language/Buttons/Heading3/Hint": {
"title": "$:/language/Buttons/Heading3/Hint",
"text": "Apply heading level 3 formatting to lines containing selection"
},
"$:/language/Buttons/Heading4/Caption": {
"title": "$:/language/Buttons/Heading4/Caption",
"text": "heading 4"
},
"$:/language/Buttons/Heading4/Hint": {
"title": "$:/language/Buttons/Heading4/Hint",
"text": "Apply heading level 4 formatting to lines containing selection"
},
"$:/language/Buttons/Heading5/Caption": {
"title": "$:/language/Buttons/Heading5/Caption",
"text": "heading 5"
},
"$:/language/Buttons/Heading5/Hint": {
"title": "$:/language/Buttons/Heading5/Hint",
"text": "Apply heading level 5 formatting to lines containing selection"
},
"$:/language/Buttons/Heading6/Caption": {
"title": "$:/language/Buttons/Heading6/Caption",
"text": "heading 6"
},
"$:/language/Buttons/Heading6/Hint": {
"title": "$:/language/Buttons/Heading6/Hint",
"text": "Apply heading level 6 formatting to lines containing selection"
},
"$:/language/Buttons/Italic/Caption": {
"title": "$:/language/Buttons/Italic/Caption",
"text": "italic"
},
"$:/language/Buttons/Italic/Hint": {
"title": "$:/language/Buttons/Italic/Hint",
"text": "Apply italic formatting to selection"
},
"$:/language/Buttons/LineWidth/Caption": {
"title": "$:/language/Buttons/LineWidth/Caption",
"text": "line width"
},
"$:/language/Buttons/LineWidth/Hint": {
"title": "$:/language/Buttons/LineWidth/Hint",
"text": "Set line width for painting"
},
"$:/language/Buttons/Link/Caption": {
"title": "$:/language/Buttons/Link/Caption",
"text": "link"
},
"$:/language/Buttons/Link/Hint": {
"title": "$:/language/Buttons/Link/Hint",
"text": "Create wikitext link"
},
"$:/language/Buttons/Linkify/Caption": {
"title": "$:/language/Buttons/Linkify/Caption",
"text": "wikilink"
},
"$:/language/Buttons/Linkify/Hint": {
"title": "$:/language/Buttons/Linkify/Hint",
"text": "Wrap selection in square brackets"
},
"$:/language/Buttons/ListBullet/Caption": {
"title": "$:/language/Buttons/ListBullet/Caption",
"text": "bulleted list"
},
"$:/language/Buttons/ListBullet/Hint": {
"title": "$:/language/Buttons/ListBullet/Hint",
"text": "Apply bulleted list formatting to lines containing selection"
},
"$:/language/Buttons/ListNumber/Caption": {
"title": "$:/language/Buttons/ListNumber/Caption",
"text": "numbered list"
},
"$:/language/Buttons/ListNumber/Hint": {
"title": "$:/language/Buttons/ListNumber/Hint",
"text": "Apply numbered list formatting to lines containing selection"
},
"$:/language/Buttons/MonoBlock/Caption": {
"title": "$:/language/Buttons/MonoBlock/Caption",
"text": "monospaced block"
},
"$:/language/Buttons/MonoBlock/Hint": {
"title": "$:/language/Buttons/MonoBlock/Hint",
"text": "Apply monospaced block formatting to lines containing selection"
},
"$:/language/Buttons/MonoLine/Caption": {
"title": "$:/language/Buttons/MonoLine/Caption",
"text": "monospaced"
},
"$:/language/Buttons/MonoLine/Hint": {
"title": "$:/language/Buttons/MonoLine/Hint",
"text": "Apply monospaced character formatting to selection"
},
"$:/language/Buttons/Opacity/Caption": {
"title": "$:/language/Buttons/Opacity/Caption",
"text": "opacity"
},
"$:/language/Buttons/Opacity/Hint": {
"title": "$:/language/Buttons/Opacity/Hint",
"text": "Set painting opacity"
},
"$:/language/Buttons/Paint/Caption": {
"title": "$:/language/Buttons/Paint/Caption",
"text": "paint colour"
},
"$:/language/Buttons/Paint/Hint": {
"title": "$:/language/Buttons/Paint/Hint",
"text": "Set painting colour"
},
"$:/language/Buttons/Picture/Caption": {
"title": "$:/language/Buttons/Picture/Caption",
"text": "picture"
},
"$:/language/Buttons/Picture/Hint": {
"title": "$:/language/Buttons/Picture/Hint",
"text": "Insert picture"
},
"$:/language/Buttons/Preview/Caption": {
"title": "$:/language/Buttons/Preview/Caption",
"text": "preview"
},
"$:/language/Buttons/Preview/Hint": {
"title": "$:/language/Buttons/Preview/Hint",
"text": "Show preview pane"
},
"$:/language/Buttons/PreviewType/Caption": {
"title": "$:/language/Buttons/PreviewType/Caption",
"text": "preview type"
},
"$:/language/Buttons/PreviewType/Hint": {
"title": "$:/language/Buttons/PreviewType/Hint",
"text": "Choose preview type"
},
"$:/language/Buttons/Quote/Caption": {
"title": "$:/language/Buttons/Quote/Caption",
"text": "quote"
},
"$:/language/Buttons/Quote/Hint": {
"title": "$:/language/Buttons/Quote/Hint",
"text": "Apply quoted text formatting to lines containing selection"
},
"$:/language/Buttons/RotateLeft/Caption": {
"title": "$:/language/Buttons/RotateLeft/Caption",
"text": "rotate left"
},
"$:/language/Buttons/RotateLeft/Hint": {
"title": "$:/language/Buttons/RotateLeft/Hint",
"text": "Rotate image left by 90 degrees"
},
"$:/language/Buttons/Size/Caption": {
"title": "$:/language/Buttons/Size/Caption",
"text": "image size"
},
"$:/language/Buttons/Size/Caption/Height": {
"title": "$:/language/Buttons/Size/Caption/Height",
"text": "Height:"
},
"$:/language/Buttons/Size/Caption/Resize": {
"title": "$:/language/Buttons/Size/Caption/Resize",
"text": "Resize image"
},
"$:/language/Buttons/Size/Caption/Width": {
"title": "$:/language/Buttons/Size/Caption/Width",
"text": "Width:"
},
"$:/language/Buttons/Size/Hint": {
"title": "$:/language/Buttons/Size/Hint",
"text": "Set image size"
},
"$:/language/Buttons/Stamp/Caption": {
"title": "$:/language/Buttons/Stamp/Caption",
"text": "stamp"
},
"$:/language/Buttons/Stamp/Caption/New": {
"title": "$:/language/Buttons/Stamp/Caption/New",
"text": "Add your own"
},
"$:/language/Buttons/Stamp/Hint": {
"title": "$:/language/Buttons/Stamp/Hint",
"text": "Insert a preconfigured snippet of text"
},
"$:/language/Buttons/Stamp/New/Title": {
"title": "$:/language/Buttons/Stamp/New/Title",
"text": "Name as shown in menu"
},
"$:/language/Buttons/Stamp/New/Text": {
"title": "$:/language/Buttons/Stamp/New/Text",
"text": "Text of snippet. (Remember to add a descriptive title in the caption field)."
},
"$:/language/Buttons/Strikethrough/Caption": {
"title": "$:/language/Buttons/Strikethrough/Caption",
"text": "strikethrough"
},
"$:/language/Buttons/Strikethrough/Hint": {
"title": "$:/language/Buttons/Strikethrough/Hint",
"text": "Apply strikethrough formatting to selection"
},
"$:/language/Buttons/Subscript/Caption": {
"title": "$:/language/Buttons/Subscript/Caption",
"text": "subscript"
},
"$:/language/Buttons/Subscript/Hint": {
"title": "$:/language/Buttons/Subscript/Hint",
"text": "Apply subscript formatting to selection"
},
"$:/language/Buttons/Superscript/Caption": {
"title": "$:/language/Buttons/Superscript/Caption",
"text": "superscript"
},
"$:/language/Buttons/Superscript/Hint": {
"title": "$:/language/Buttons/Superscript/Hint",
"text": "Apply superscript formatting to selection"
},
"$:/language/Buttons/ToggleSidebar/Hint": {
"title": "$:/language/Buttons/ToggleSidebar/Hint",
"text": "Toggle the sidebar visibility"
},
"$:/language/Buttons/Transcludify/Caption": {
"title": "$:/language/Buttons/Transcludify/Caption",
"text": "transclusion"
},
"$:/language/Buttons/Transcludify/Hint": {
"title": "$:/language/Buttons/Transcludify/Hint",
"text": "Wrap selection in curly brackets"
},
"$:/language/Buttons/Underline/Caption": {
"title": "$:/language/Buttons/Underline/Caption",
"text": "underline"
},
"$:/language/Buttons/Underline/Hint": {
"title": "$:/language/Buttons/Underline/Hint",
"text": "Apply underline formatting to selection"
},
"$:/language/ControlPanel/Advanced/Caption": {
"title": "$:/language/ControlPanel/Advanced/Caption",
"text": "Advanced"
},
"$:/language/ControlPanel/Advanced/Hint": {
"title": "$:/language/ControlPanel/Advanced/Hint",
"text": "Internal information about this TiddlyWiki"
},
"$:/language/ControlPanel/Appearance/Caption": {
"title": "$:/language/ControlPanel/Appearance/Caption",
"text": "Appearance"
},
"$:/language/ControlPanel/Appearance/Hint": {
"title": "$:/language/ControlPanel/Appearance/Hint",
"text": "Ways to customise the appearance of your TiddlyWiki."
},
"$:/language/ControlPanel/Basics/AnimDuration/Prompt": {
"title": "$:/language/ControlPanel/Basics/AnimDuration/Prompt",
"text": "Animation duration"
},
"$:/language/ControlPanel/Basics/AutoFocus/Prompt": {
"title": "$:/language/ControlPanel/Basics/AutoFocus/Prompt",
"text": "Default focus field for new tiddlers"
},
"$:/language/ControlPanel/Basics/Caption": {
"title": "$:/language/ControlPanel/Basics/Caption",
"text": "Basics"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint",
"text": "Use [[double square brackets]] for titles with spaces. Or you can choose to <$button set=\"$:/DefaultTiddlers\" setTo=\"[list[$:/StoryList]]\">retain story ordering</$button>"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt",
"text": "Default tiddlers"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint",
"text": "Choose which tiddlers are displayed at startup"
},
"$:/language/ControlPanel/Basics/Language/Prompt": {
"title": "$:/language/ControlPanel/Basics/Language/Prompt",
"text": "Hello! Current language:"
},
"$:/language/ControlPanel/Basics/NewJournal/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt",
"text": "Title of new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewJournal/Text/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Text/Prompt",
"text": "Text for new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt",
"text": "Tags for new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt",
"text": "Title of new tiddlers"
},
"$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt",
"text": "Tags for new tiddlers"
},
"$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt",
"text": "Number of overridden shadow tiddlers"
},
"$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt",
"text": "Number of shadow tiddlers"
},
"$:/language/ControlPanel/Basics/Subtitle/Prompt": {
"title": "$:/language/ControlPanel/Basics/Subtitle/Prompt",
"text": "Subtitle"
},
"$:/language/ControlPanel/Basics/SystemTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt",
"text": "Number of system tiddlers"
},
"$:/language/ControlPanel/Basics/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tags/Prompt",
"text": "Number of tags"
},
"$:/language/ControlPanel/Basics/Tiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tiddlers/Prompt",
"text": "Number of tiddlers"
},
"$:/language/ControlPanel/Basics/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/Title/Prompt",
"text": "Title of this ~TiddlyWiki"
},
"$:/language/ControlPanel/Basics/Username/Prompt": {
"title": "$:/language/ControlPanel/Basics/Username/Prompt",
"text": "Username for signing edits"
},
"$:/language/ControlPanel/Basics/Version/Prompt": {
"title": "$:/language/ControlPanel/Basics/Version/Prompt",
"text": "~TiddlyWiki version"
},
"$:/language/ControlPanel/EditorTypes/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Caption",
"text": "Editor Types"
},
"$:/language/ControlPanel/EditorTypes/Editor/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Editor/Caption",
"text": "Editor"
},
"$:/language/ControlPanel/EditorTypes/Hint": {
"title": "$:/language/ControlPanel/EditorTypes/Hint",
"text": "These tiddlers determine which editor is used to edit specific tiddler types."
},
"$:/language/ControlPanel/EditorTypes/Type/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Type/Caption",
"text": "Type"
},
"$:/language/ControlPanel/Info/Caption": {
"title": "$:/language/ControlPanel/Info/Caption",
"text": "Info"
},
"$:/language/ControlPanel/Info/Hint": {
"title": "$:/language/ControlPanel/Info/Hint",
"text": "Information about this TiddlyWiki"
},
"$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt",
"text": "Type shortcut here"
},
"$:/language/ControlPanel/KeyboardShortcuts/Add/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption",
"text": "add shortcut"
},
"$:/language/ControlPanel/KeyboardShortcuts/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Caption",
"text": "Keyboard Shortcuts"
},
"$:/language/ControlPanel/KeyboardShortcuts/Hint": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Hint",
"text": "Manage keyboard shortcut assignments"
},
"$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption",
"text": "No keyboard shortcuts assigned"
},
"$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint",
"text": "remove keyboard shortcut"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/All": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/All",
"text": "All platforms"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac",
"text": "Macintosh platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac",
"text": "Non-Macintosh platforms only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux",
"text": "Linux platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux",
"text": "Non-Linux platforms only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows",
"text": "Windows platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows",
"text": "Non-Windows platforms only"
},
"$:/language/ControlPanel/LoadedModules/Caption": {
"title": "$:/language/ControlPanel/LoadedModules/Caption",
"text": "Loaded Modules"
},
"$:/language/ControlPanel/LoadedModules/Hint": {
"title": "$:/language/ControlPanel/LoadedModules/Hint",
"text": "These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process."
},
"$:/language/ControlPanel/Palette/Caption": {
"title": "$:/language/ControlPanel/Palette/Caption",
"text": "Palette"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Caption",
"text": "clone"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Prompt",
"text": "It is recommended that you clone this shadow palette before editing it"
},
"$:/language/ControlPanel/Palette/Editor/Delete/Hint": {
"title": "$:/language/ControlPanel/Palette/Editor/Delete/Hint",
"text": "delete this entry from the current palette"
},
"$:/language/ControlPanel/Palette/Editor/Names/External/Show": {
"title": "$:/language/ControlPanel/Palette/Editor/Names/External/Show",
"text": "Show color names that are not part of the current palette"
},
"$:/language/ControlPanel/Palette/Editor/Prompt/Modified": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt/Modified",
"text": "This shadow palette has been modified"
},
"$:/language/ControlPanel/Palette/Editor/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt",
"text": "Editing"
},
"$:/language/ControlPanel/Palette/Editor/Reset/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Reset/Caption",
"text": "reset"
},
"$:/language/ControlPanel/Palette/HideEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/HideEditor/Caption",
"text": "hide editor"
},
"$:/language/ControlPanel/Palette/Prompt": {
"title": "$:/language/ControlPanel/Palette/Prompt",
"text": "Current palette:"
},
"$:/language/ControlPanel/Palette/ShowEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/ShowEditor/Caption",
"text": "show editor"
},
"$:/language/ControlPanel/Parsing/Caption": {
"title": "$:/language/ControlPanel/Parsing/Caption",
"text": "Parsing"
},
"$:/language/ControlPanel/Parsing/Hint": {
"title": "$:/language/ControlPanel/Parsing/Hint",
"text": "Here you can globally disable/enable wiki parser rules. For changes to take effect, save and reload your wiki. Disabling certain parser rules can prevent <$text text=\"TiddlyWiki\"/> from functioning correctly. Use [[safe mode|https://tiddlywiki.com/#SafeMode]] to restore normal operation."
},
"$:/language/ControlPanel/Parsing/Block/Caption": {
"title": "$:/language/ControlPanel/Parsing/Block/Caption",
"text": "Block Parse Rules"
},
"$:/language/ControlPanel/Parsing/Inline/Caption": {
"title": "$:/language/ControlPanel/Parsing/Inline/Caption",
"text": "Inline Parse Rules"
},
"$:/language/ControlPanel/Parsing/Pragma/Caption": {
"title": "$:/language/ControlPanel/Parsing/Pragma/Caption",
"text": "Pragma Parse Rules"
},
"$:/language/ControlPanel/Plugins/Add/Caption": {
"title": "$:/language/ControlPanel/Plugins/Add/Caption",
"text": "Get more plugins"
},
"$:/language/ControlPanel/Plugins/Add/Hint": {
"title": "$:/language/ControlPanel/Plugins/Add/Hint",
"text": "Install plugins from the official library"
},
"$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint": {
"title": "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint",
"text": "This plugin is already installed at version <$text text=<<installedVersion>>/>"
},
"$:/language/ControlPanel/Plugins/AlsoRequires": {
"title": "$:/language/ControlPanel/Plugins/AlsoRequires",
"text": "Also requires:"
},
"$:/language/ControlPanel/Plugins/Caption": {
"title": "$:/language/ControlPanel/Plugins/Caption",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Disable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Disable/Caption",
"text": "disable"
},
"$:/language/ControlPanel/Plugins/Disable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Disable/Hint",
"text": "Disable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Disabled/Status": {
"title": "$:/language/ControlPanel/Plugins/Disabled/Status",
"text": "(disabled)"
},
"$:/language/ControlPanel/Plugins/Downgrade/Caption": {
"title": "$:/language/ControlPanel/Plugins/Downgrade/Caption",
"text": "downgrade"
},
"$:/language/ControlPanel/Plugins/Empty/Hint": {
"title": "$:/language/ControlPanel/Plugins/Empty/Hint",
"text": "None"
},
"$:/language/ControlPanel/Plugins/Enable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Enable/Caption",
"text": "enable"
},
"$:/language/ControlPanel/Plugins/Enable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Enable/Hint",
"text": "Enable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Install/Caption": {
"title": "$:/language/ControlPanel/Plugins/Install/Caption",
"text": "install"
},
"$:/language/ControlPanel/Plugins/Installed/Hint": {
"title": "$:/language/ControlPanel/Plugins/Installed/Hint",
"text": "Currently installed plugins:"
},
"$:/language/ControlPanel/Plugins/Languages/Caption": {
"title": "$:/language/ControlPanel/Plugins/Languages/Caption",
"text": "Languages"
},
"$:/language/ControlPanel/Plugins/Languages/Hint": {
"title": "$:/language/ControlPanel/Plugins/Languages/Hint",
"text": "Language pack plugins"
},
"$:/language/ControlPanel/Plugins/NoInfoFound/Hint": {
"title": "$:/language/ControlPanel/Plugins/NoInfoFound/Hint",
"text": "No ''\"<$text text=<<currentTab>>/>\"'' found"
},
"$:/language/ControlPanel/Plugins/NotInstalled/Hint": {
"title": "$:/language/ControlPanel/Plugins/NotInstalled/Hint",
"text": "This plugin is not currently installed"
},
"$:/language/ControlPanel/Plugins/OpenPluginLibrary": {
"title": "$:/language/ControlPanel/Plugins/OpenPluginLibrary",
"text": "open plugin library"
},
"$:/language/ControlPanel/Plugins/ClosePluginLibrary": {
"title": "$:/language/ControlPanel/Plugins/ClosePluginLibrary",
"text": "close plugin library"
},
"$:/language/ControlPanel/Plugins/PluginWillRequireReload": {
"title": "$:/language/ControlPanel/Plugins/PluginWillRequireReload",
"text": "(requires reload)"
},
"$:/language/ControlPanel/Plugins/Plugins/Caption": {
"title": "$:/language/ControlPanel/Plugins/Plugins/Caption",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Plugins/Hint": {
"title": "$:/language/ControlPanel/Plugins/Plugins/Hint",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Reinstall/Caption": {
"title": "$:/language/ControlPanel/Plugins/Reinstall/Caption",
"text": "reinstall"
},
"$:/language/ControlPanel/Plugins/Themes/Caption": {
"title": "$:/language/ControlPanel/Plugins/Themes/Caption",
"text": "Themes"
},
"$:/language/ControlPanel/Plugins/Themes/Hint": {
"title": "$:/language/ControlPanel/Plugins/Themes/Hint",
"text": "Theme plugins"
},
"$:/language/ControlPanel/Plugins/Update/Caption": {
"title": "$:/language/ControlPanel/Plugins/Update/Caption",
"text": "update"
},
"$:/language/ControlPanel/Plugins/Updates/Caption": {
"title": "$:/language/ControlPanel/Plugins/Updates/Caption",
"text": "Updates"
},
"$:/language/ControlPanel/Plugins/Updates/Hint": {
"title": "$:/language/ControlPanel/Plugins/Updates/Hint",
"text": "Available updates to installed plugins"
},
"$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption": {
"title": "$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption",
"text": "Update <<update-count>> plugins"
},
"$:/language/ControlPanel/Plugins/SubPluginPrompt": {
"title": "$:/language/ControlPanel/Plugins/SubPluginPrompt",
"text": "With <<count>> sub-plugins available"
},
"$:/language/ControlPanel/Saving/Caption": {
"title": "$:/language/ControlPanel/Saving/Caption",
"text": "Saving"
},
"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description",
"text": "Permit automatic saving for the download saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint",
"text": "Enable Autosave for Download Saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/Caption": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/Caption",
"text": "Download Saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/Hint": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/Hint",
"text": "These settings apply to the HTML5-compatible download saver"
},
"$:/language/ControlPanel/Saving/General/Caption": {
"title": "$:/language/ControlPanel/Saving/General/Caption",
"text": "General"
},
"$:/language/ControlPanel/Saving/General/Hint": {
"title": "$:/language/ControlPanel/Saving/General/Hint",
"text": "These settings apply to all the loaded savers"
},
"$:/language/ControlPanel/Saving/Hint": {
"title": "$:/language/ControlPanel/Saving/Hint",
"text": "Settings used for saving the entire TiddlyWiki as a single file via a saver module"
},
"$:/language/ControlPanel/Saving/GitService/Branch": {
"title": "$:/language/ControlPanel/Saving/GitService/Branch",
"text": "Target branch for saving"
},
"$:/language/ControlPanel/Saving/GitService/CommitMessage": {
"title": "$:/language/ControlPanel/Saving/GitService/CommitMessage",
"text": "Saved by TiddlyWiki"
},
"$:/language/ControlPanel/Saving/GitService/Description": {
"title": "$:/language/ControlPanel/Saving/GitService/Description",
"text": "These settings are only used when saving to <<service-name>>"
},
"$:/language/ControlPanel/Saving/GitService/Filename": {
"title": "$:/language/ControlPanel/Saving/GitService/Filename",
"text": "Filename of target file (e.g. `index.html`)"
},
"$:/language/ControlPanel/Saving/GitService/Path": {
"title": "$:/language/ControlPanel/Saving/GitService/Path",
"text": "Path to target file (e.g. `/wiki/`)"
},
"$:/language/ControlPanel/Saving/GitService/Repo": {
"title": "$:/language/ControlPanel/Saving/GitService/Repo",
"text": "Target repository (e.g. `Jermolene/TiddlyWiki5`)"
},
"$:/language/ControlPanel/Saving/GitService/ServerURL": {
"title": "$:/language/ControlPanel/Saving/GitService/ServerURL",
"text": "Server API URL"
},
"$:/language/ControlPanel/Saving/GitService/UserName": {
"title": "$:/language/ControlPanel/Saving/GitService/UserName",
"text": "Username"
},
"$:/language/ControlPanel/Saving/GitService/GitHub/Caption": {
"title": "$:/language/ControlPanel/Saving/GitService/GitHub/Caption",
"text": "~GitHub Saver"
},
"$:/language/ControlPanel/Saving/GitService/GitHub/Password": {
"title": "$:/language/ControlPanel/Saving/GitService/GitHub/Password",
"text": "Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details)"
},
"$:/language/ControlPanel/Saving/GitService/GitLab/Caption": {
"title": "$:/language/ControlPanel/Saving/GitService/GitLab/Caption",
"text": "~GitLab Saver"
},
"$:/language/ControlPanel/Saving/GitService/GitLab/Password": {
"title": "$:/language/ControlPanel/Saving/GitService/GitLab/Password",
"text": "Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details)"
},
"$:/language/ControlPanel/Saving/GitService/Gitea/Caption": {
"title": "$:/language/ControlPanel/Saving/GitService/Gitea/Caption",
"text": "Gitea Saver"
},
"$:/language/ControlPanel/Saving/GitService/Gitea/Password": {
"title": "$:/language/ControlPanel/Saving/GitService/Gitea/Password",
"text": "Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`)"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading",
"text": "Advanced Settings"
},
"$:/language/ControlPanel/Saving/TiddlySpot/BackupDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir",
"text": "Backup Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Backups": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Backups",
"text": "Backups"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Caption": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Caption",
"text": "~TiddlySpot Saver"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Description": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Description",
"text": "These settings are only used when saving to http://tiddlyspot.com or a compatible remote server"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Filename": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Filename",
"text": "Upload Filename"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Heading",
"text": "~TiddlySpot"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Hint": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Hint",
"text": "//The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.//"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Password": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Password",
"text": "Password"
},
"$:/language/ControlPanel/Saving/TiddlySpot/ServerURL": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL",
"text": "Server URL"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UploadDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir",
"text": "Upload Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UserName": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UserName",
"text": "Wiki Name"
},
"$:/language/ControlPanel/Settings/AutoSave/Caption": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Caption",
"text": "Autosave"
},
"$:/language/ControlPanel/Settings/AutoSave/Disabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description",
"text": "Do not save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Enabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description",
"text": "Save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Hint": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Hint",
"text": "Attempt to automatically save changes during editing when using a supporting saver"
},
"$:/language/ControlPanel/Settings/CamelCase/Caption": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Caption",
"text": "Camel Case Wiki Links"
},
"$:/language/ControlPanel/Settings/CamelCase/Hint": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Hint",
"text": "You can globally disable automatic linking of ~CamelCase phrases. Requires reload to take effect"
},
"$:/language/ControlPanel/Settings/CamelCase/Description": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Description",
"text": "Enable automatic ~CamelCase linking"
},
"$:/language/ControlPanel/Settings/Caption": {
"title": "$:/language/ControlPanel/Settings/Caption",
"text": "Settings"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Caption": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Caption",
"text": "Editor Toolbar"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Hint": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Hint",
"text": "Enable or disable the editor toolbar:"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Description": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Description",
"text": "Show editor toolbar"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Caption": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Caption",
"text": "Tiddler Info Panel Mode"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Hint": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Hint",
"text": "Control when the tiddler info panel closes:"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description",
"text": "Tiddler info panel closes automatically"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description",
"text": "Tiddler info panel stays open until explicitly closed"
},
"$:/language/ControlPanel/Settings/Hint": {
"title": "$:/language/ControlPanel/Settings/Hint",
"text": "These settings let you customise the behaviour of TiddlyWiki."
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption",
"text": "Navigation Address Bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint",
"text": "Behaviour of the browser address bar when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description",
"text": "Do not update the address bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description",
"text": "Include the target tiddler"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description",
"text": "Include the target tiddler and the current story sequence"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Caption",
"text": "Navigation History"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Hint",
"text": "Update browser history when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationHistory/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/No/Description",
"text": "Do not update history"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description",
"text": "Update history"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption",
"text": "Permalink/permaview Mode"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint",
"text": "Choose how permalink/permaview is handled:"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description",
"text": "Copy permalink/permaview URL to clipboard"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description",
"text": "Update address bar with permalink/permaview URL"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption",
"text": "Performance Instrumentation"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint",
"text": "Displays performance statistics in the browser developer console. Requires reload to take effect"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description",
"text": "Enable performance instrumentation"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption",
"text": "Toolbar Button Style"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint",
"text": "Choose the style for toolbar buttons:"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless",
"text": "Borderless"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed",
"text": "Boxed"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded",
"text": "Rounded"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Caption": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Caption",
"text": "Toolbar Buttons"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Hint": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Hint",
"text": "Default toolbar button appearance:"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description",
"text": "Include icon"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description",
"text": "Include text"
},
"$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption": {
"title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption",
"text": "Default Sidebar Tab"
},
"$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint": {
"title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint",
"text": "Specify which sidebar tab is displayed by default"
},
"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption": {
"title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption",
"text": "Default More Sidebar Tab"
},
"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint": {
"title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint",
"text": "Specify which More sidebar tab is displayed by default"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/Caption": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption",
"text": "Tiddler Opening Behaviour"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint",
"text": "Navigation from //within// the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint",
"text": "Navigation from //outside// the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove",
"text": "Open above the current tiddler"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow",
"text": "Open below the current tiddler"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop",
"text": "Open at the top of the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom",
"text": "Open at the bottom of the story river"
},
"$:/language/ControlPanel/Settings/TitleLinks/Caption": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Caption",
"text": "Tiddler Titles"
},
"$:/language/ControlPanel/Settings/TitleLinks/Hint": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Hint",
"text": "Optionally display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/TitleLinks/No/Description": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/No/Description",
"text": "Do not display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/TitleLinks/Yes/Description": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description",
"text": "Display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/MissingLinks/Caption": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Caption",
"text": "Wiki Links"
},
"$:/language/ControlPanel/Settings/MissingLinks/Hint": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Hint",
"text": "Choose whether to link to tiddlers that do not exist yet"
},
"$:/language/ControlPanel/Settings/MissingLinks/Description": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Description",
"text": "Enable links to missing tiddlers"
},
"$:/language/ControlPanel/StoryView/Caption": {
"title": "$:/language/ControlPanel/StoryView/Caption",
"text": "Story View"
},
"$:/language/ControlPanel/StoryView/Prompt": {
"title": "$:/language/ControlPanel/StoryView/Prompt",
"text": "Current view:"
},
"$:/language/ControlPanel/Stylesheets/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Caption",
"text": "Stylesheets"
},
"$:/language/ControlPanel/Stylesheets/Expand/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Expand/Caption",
"text": "Expand All"
},
"$:/language/ControlPanel/Stylesheets/Hint": {
"title": "$:/language/ControlPanel/Stylesheets/Hint",
"text": "This is the rendered CSS of the current stylesheet tiddlers tagged with <<tag \"$:/tags/Stylesheet\">>"
},
"$:/language/ControlPanel/Stylesheets/Restore/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Restore/Caption",
"text": "Restore"
},
"$:/language/ControlPanel/Theme/Caption": {
"title": "$:/language/ControlPanel/Theme/Caption",
"text": "Theme"
},
"$:/language/ControlPanel/Theme/Prompt": {
"title": "$:/language/ControlPanel/Theme/Prompt",
"text": "Current theme:"
},
"$:/language/ControlPanel/TiddlerFields/Caption": {
"title": "$:/language/ControlPanel/TiddlerFields/Caption",
"text": "Tiddler Fields"
},
"$:/language/ControlPanel/TiddlerFields/Hint": {
"title": "$:/language/ControlPanel/TiddlerFields/Hint",
"text": "This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers)."
},
"$:/language/ControlPanel/Toolbars/Caption": {
"title": "$:/language/ControlPanel/Toolbars/Caption",
"text": "Toolbars"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Caption",
"text": "Edit Toolbar"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in edit mode. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/Hint": {
"title": "$:/language/ControlPanel/Toolbars/Hint",
"text": "Select which toolbar buttons are displayed"
},
"$:/language/ControlPanel/Toolbars/PageControls/Caption": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Caption",
"text": "Page Toolbar"
},
"$:/language/ControlPanel/Toolbars/PageControls/Hint": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Hint",
"text": "Choose which buttons are displayed on the main page toolbar. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/EditorToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption",
"text": "Editor Toolbar"
},
"$:/language/ControlPanel/Toolbars/EditorToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint",
"text": "Choose which buttons are displayed in the editor toolbar. Note that some buttons will only appear when editing tiddlers of a certain type. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption",
"text": "View Toolbar"
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in view mode. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Tools/Download/Full/Caption": {
"title": "$:/language/ControlPanel/Tools/Download/Full/Caption",
"text": "Download full wiki"
},
"$:/language/Date/DaySuffix/1": {
"title": "$:/language/Date/DaySuffix/1",
"text": "st"
},
"$:/language/Date/DaySuffix/2": {
"title": "$:/language/Date/DaySuffix/2",
"text": "nd"
},
"$:/language/Date/DaySuffix/3": {
"title": "$:/language/Date/DaySuffix/3",
"text": "rd"
},
"$:/language/Date/DaySuffix/4": {
"title": "$:/language/Date/DaySuffix/4",
"text": "th"
},
"$:/language/Date/DaySuffix/5": {
"title": "$:/language/Date/DaySuffix/5",
"text": "th"
},
"$:/language/Date/DaySuffix/6": {
"title": "$:/language/Date/DaySuffix/6",
"text": "th"
},
"$:/language/Date/DaySuffix/7": {
"title": "$:/language/Date/DaySuffix/7",
"text": "th"
},
"$:/language/Date/DaySuffix/8": {
"title": "$:/language/Date/DaySuffix/8",
"text": "th"
},
"$:/language/Date/DaySuffix/9": {
"title": "$:/language/Date/DaySuffix/9",
"text": "th"
},
"$:/language/Date/DaySuffix/10": {
"title": "$:/language/Date/DaySuffix/10",
"text": "th"
},
"$:/language/Date/DaySuffix/11": {
"title": "$:/language/Date/DaySuffix/11",
"text": "th"
},
"$:/language/Date/DaySuffix/12": {
"title": "$:/language/Date/DaySuffix/12",
"text": "th"
},
"$:/language/Date/DaySuffix/13": {
"title": "$:/language/Date/DaySuffix/13",
"text": "th"
},
"$:/language/Date/DaySuffix/14": {
"title": "$:/language/Date/DaySuffix/14",
"text": "th"
},
"$:/language/Date/DaySuffix/15": {
"title": "$:/language/Date/DaySuffix/15",
"text": "th"
},
"$:/language/Date/DaySuffix/16": {
"title": "$:/language/Date/DaySuffix/16",
"text": "th"
},
"$:/language/Date/DaySuffix/17": {
"title": "$:/language/Date/DaySuffix/17",
"text": "th"
},
"$:/language/Date/DaySuffix/18": {
"title": "$:/language/Date/DaySuffix/18",
"text": "th"
},
"$:/language/Date/DaySuffix/19": {
"title": "$:/language/Date/DaySuffix/19",
"text": "th"
},
"$:/language/Date/DaySuffix/20": {
"title": "$:/language/Date/DaySuffix/20",
"text": "th"
},
"$:/language/Date/DaySuffix/21": {
"title": "$:/language/Date/DaySuffix/21",
"text": "st"
},
"$:/language/Date/DaySuffix/22": {
"title": "$:/language/Date/DaySuffix/22",
"text": "nd"
},
"$:/language/Date/DaySuffix/23": {
"title": "$:/language/Date/DaySuffix/23",
"text": "rd"
},
"$:/language/Date/DaySuffix/24": {
"title": "$:/language/Date/DaySuffix/24",
"text": "th"
},
"$:/language/Date/DaySuffix/25": {
"title": "$:/language/Date/DaySuffix/25",
"text": "th"
},
"$:/language/Date/DaySuffix/26": {
"title": "$:/language/Date/DaySuffix/26",
"text": "th"
},
"$:/language/Date/DaySuffix/27": {
"title": "$:/language/Date/DaySuffix/27",
"text": "th"
},
"$:/language/Date/DaySuffix/28": {
"title": "$:/language/Date/DaySuffix/28",
"text": "th"
},
"$:/language/Date/DaySuffix/29": {
"title": "$:/language/Date/DaySuffix/29",
"text": "th"
},
"$:/language/Date/DaySuffix/30": {
"title": "$:/language/Date/DaySuffix/30",
"text": "th"
},
"$:/language/Date/DaySuffix/31": {
"title": "$:/language/Date/DaySuffix/31",
"text": "st"
},
"$:/language/Date/Long/Day/0": {
"title": "$:/language/Date/Long/Day/0",
"text": "Sunday"
},
"$:/language/Date/Long/Day/1": {
"title": "$:/language/Date/Long/Day/1",
"text": "Monday"
},
"$:/language/Date/Long/Day/2": {
"title": "$:/language/Date/Long/Day/2",
"text": "Tuesday"
},
"$:/language/Date/Long/Day/3": {
"title": "$:/language/Date/Long/Day/3",
"text": "Wednesday"
},
"$:/language/Date/Long/Day/4": {
"title": "$:/language/Date/Long/Day/4",
"text": "Thursday"
},
"$:/language/Date/Long/Day/5": {
"title": "$:/language/Date/Long/Day/5",
"text": "Friday"
},
"$:/language/Date/Long/Day/6": {
"title": "$:/language/Date/Long/Day/6",
"text": "Saturday"
},
"$:/language/Date/Long/Month/1": {
"title": "$:/language/Date/Long/Month/1",
"text": "January"
},
"$:/language/Date/Long/Month/2": {
"title": "$:/language/Date/Long/Month/2",
"text": "February"
},
"$:/language/Date/Long/Month/3": {
"title": "$:/language/Date/Long/Month/3",
"text": "March"
},
"$:/language/Date/Long/Month/4": {
"title": "$:/language/Date/Long/Month/4",
"text": "April"
},
"$:/language/Date/Long/Month/5": {
"title": "$:/language/Date/Long/Month/5",
"text": "May"
},
"$:/language/Date/Long/Month/6": {
"title": "$:/language/Date/Long/Month/6",
"text": "June"
},
"$:/language/Date/Long/Month/7": {
"title": "$:/language/Date/Long/Month/7",
"text": "July"
},
"$:/language/Date/Long/Month/8": {
"title": "$:/language/Date/Long/Month/8",
"text": "August"
},
"$:/language/Date/Long/Month/9": {
"title": "$:/language/Date/Long/Month/9",
"text": "September"
},
"$:/language/Date/Long/Month/10": {
"title": "$:/language/Date/Long/Month/10",
"text": "October"
},
"$:/language/Date/Long/Month/11": {
"title": "$:/language/Date/Long/Month/11",
"text": "November"
},
"$:/language/Date/Long/Month/12": {
"title": "$:/language/Date/Long/Month/12",
"text": "December"
},
"$:/language/Date/Period/am": {
"title": "$:/language/Date/Period/am",
"text": "am"
},
"$:/language/Date/Period/pm": {
"title": "$:/language/Date/Period/pm",
"text": "pm"
},
"$:/language/Date/Short/Day/0": {
"title": "$:/language/Date/Short/Day/0",
"text": "Sun"
},
"$:/language/Date/Short/Day/1": {
"title": "$:/language/Date/Short/Day/1",
"text": "Mon"
},
"$:/language/Date/Short/Day/2": {
"title": "$:/language/Date/Short/Day/2",
"text": "Tue"
},
"$:/language/Date/Short/Day/3": {
"title": "$:/language/Date/Short/Day/3",
"text": "Wed"
},
"$:/language/Date/Short/Day/4": {
"title": "$:/language/Date/Short/Day/4",
"text": "Thu"
},
"$:/language/Date/Short/Day/5": {
"title": "$:/language/Date/Short/Day/5",
"text": "Fri"
},
"$:/language/Date/Short/Day/6": {
"title": "$:/language/Date/Short/Day/6",
"text": "Sat"
},
"$:/language/Date/Short/Month/1": {
"title": "$:/language/Date/Short/Month/1",
"text": "Jan"
},
"$:/language/Date/Short/Month/2": {
"title": "$:/language/Date/Short/Month/2",
"text": "Feb"
},
"$:/language/Date/Short/Month/3": {
"title": "$:/language/Date/Short/Month/3",
"text": "Mar"
},
"$:/language/Date/Short/Month/4": {
"title": "$:/language/Date/Short/Month/4",
"text": "Apr"
},
"$:/language/Date/Short/Month/5": {
"title": "$:/language/Date/Short/Month/5",
"text": "May"
},
"$:/language/Date/Short/Month/6": {
"title": "$:/language/Date/Short/Month/6",
"text": "Jun"
},
"$:/language/Date/Short/Month/7": {
"title": "$:/language/Date/Short/Month/7",
"text": "Jul"
},
"$:/language/Date/Short/Month/8": {
"title": "$:/language/Date/Short/Month/8",
"text": "Aug"
},
"$:/language/Date/Short/Month/9": {
"title": "$:/language/Date/Short/Month/9",
"text": "Sep"
},
"$:/language/Date/Short/Month/10": {
"title": "$:/language/Date/Short/Month/10",
"text": "Oct"
},
"$:/language/Date/Short/Month/11": {
"title": "$:/language/Date/Short/Month/11",
"text": "Nov"
},
"$:/language/Date/Short/Month/12": {
"title": "$:/language/Date/Short/Month/12",
"text": "Dec"
},
"$:/language/RelativeDate/Future/Days": {
"title": "$:/language/RelativeDate/Future/Days",
"text": "<<period>> days from now"
},
"$:/language/RelativeDate/Future/Hours": {
"title": "$:/language/RelativeDate/Future/Hours",
"text": "<<period>> hours from now"
},
"$:/language/RelativeDate/Future/Minutes": {
"title": "$:/language/RelativeDate/Future/Minutes",
"text": "<<period>> minutes from now"
},
"$:/language/RelativeDate/Future/Months": {
"title": "$:/language/RelativeDate/Future/Months",
"text": "<<period>> months from now"
},
"$:/language/RelativeDate/Future/Second": {
"title": "$:/language/RelativeDate/Future/Second",
"text": "1 second from now"
},
"$:/language/RelativeDate/Future/Seconds": {
"title": "$:/language/RelativeDate/Future/Seconds",
"text": "<<period>> seconds from now"
},
"$:/language/RelativeDate/Future/Years": {
"title": "$:/language/RelativeDate/Future/Years",
"text": "<<period>> years from now"
},
"$:/language/RelativeDate/Past/Days": {
"title": "$:/language/RelativeDate/Past/Days",
"text": "<<period>> days ago"
},
"$:/language/RelativeDate/Past/Hours": {
"title": "$:/language/RelativeDate/Past/Hours",
"text": "<<period>> hours ago"
},
"$:/language/RelativeDate/Past/Minutes": {
"title": "$:/language/RelativeDate/Past/Minutes",
"text": "<<period>> minutes ago"
},
"$:/language/RelativeDate/Past/Months": {
"title": "$:/language/RelativeDate/Past/Months",
"text": "<<period>> months ago"
},
"$:/language/RelativeDate/Past/Second": {
"title": "$:/language/RelativeDate/Past/Second",
"text": "1 second ago"
},
"$:/language/RelativeDate/Past/Seconds": {
"title": "$:/language/RelativeDate/Past/Seconds",
"text": "<<period>> seconds ago"
},
"$:/language/RelativeDate/Past/Years": {
"title": "$:/language/RelativeDate/Past/Years",
"text": "<<period>> years ago"
},
"$:/language/Docs/ModuleTypes/allfilteroperator": {
"title": "$:/language/Docs/ModuleTypes/allfilteroperator",
"text": "A sub-operator for the ''all'' filter operator."
},
"$:/language/Docs/ModuleTypes/animation": {
"title": "$:/language/Docs/ModuleTypes/animation",
"text": "Animations that may be used with the RevealWidget."
},
"$:/language/Docs/ModuleTypes/authenticator": {
"title": "$:/language/Docs/ModuleTypes/authenticator",
"text": "Defines how requests are authenticated by the built-in HTTP server."
},
"$:/language/Docs/ModuleTypes/bitmapeditoroperation": {
"title": "$:/language/Docs/ModuleTypes/bitmapeditoroperation",
"text": "A bitmap editor toolbar operation."
},
"$:/language/Docs/ModuleTypes/command": {
"title": "$:/language/Docs/ModuleTypes/command",
"text": "Commands that can be executed under Node.js."
},
"$:/language/Docs/ModuleTypes/config": {
"title": "$:/language/Docs/ModuleTypes/config",
"text": "Data to be inserted into `$tw.config`."
},
"$:/language/Docs/ModuleTypes/filteroperator": {
"title": "$:/language/Docs/ModuleTypes/filteroperator",
"text": "Individual filter operator methods."
},
"$:/language/Docs/ModuleTypes/global": {
"title": "$:/language/Docs/ModuleTypes/global",
"text": "Global data to be inserted into `$tw`."
},
"$:/language/Docs/ModuleTypes/info": {
"title": "$:/language/Docs/ModuleTypes/info",
"text": "Publishes system information via the [[$:/temp/info-plugin]] pseudo-plugin."
},
"$:/language/Docs/ModuleTypes/isfilteroperator": {
"title": "$:/language/Docs/ModuleTypes/isfilteroperator",
"text": "Operands for the ''is'' filter operator."
},
"$:/language/Docs/ModuleTypes/library": {
"title": "$:/language/Docs/ModuleTypes/library",
"text": "Generic module type for general purpose JavaScript modules."
},
"$:/language/Docs/ModuleTypes/macro": {
"title": "$:/language/Docs/ModuleTypes/macro",
"text": "JavaScript macro definitions."
},
"$:/language/Docs/ModuleTypes/parser": {
"title": "$:/language/Docs/ModuleTypes/parser",
"text": "Parsers for different content types."
},
"$:/language/Docs/ModuleTypes/route": {
"title": "$:/language/Docs/ModuleTypes/route",
"text": "Defines how individual URL patterns are handled by the built-in HTTP server."
},
"$:/language/Docs/ModuleTypes/saver": {
"title": "$:/language/Docs/ModuleTypes/saver",
"text": "Savers handle different methods for saving files from the browser."
},
"$:/language/Docs/ModuleTypes/startup": {
"title": "$:/language/Docs/ModuleTypes/startup",
"text": "Startup functions."
},
"$:/language/Docs/ModuleTypes/storyview": {
"title": "$:/language/Docs/ModuleTypes/storyview",
"text": "Story views customise the animation and behaviour of list widgets."
},
"$:/language/Docs/ModuleTypes/texteditoroperation": {
"title": "$:/language/Docs/ModuleTypes/texteditoroperation",
"text": "A text editor toolbar operation."
},
"$:/language/Docs/ModuleTypes/tiddlerdeserializer": {
"title": "$:/language/Docs/ModuleTypes/tiddlerdeserializer",
"text": "Converts different content types into tiddlers."
},
"$:/language/Docs/ModuleTypes/tiddlerfield": {
"title": "$:/language/Docs/ModuleTypes/tiddlerfield",
"text": "Defines the behaviour of an individual tiddler field."
},
"$:/language/Docs/ModuleTypes/tiddlermethod": {
"title": "$:/language/Docs/ModuleTypes/tiddlermethod",
"text": "Adds methods to the `$tw.Tiddler` prototype."
},
"$:/language/Docs/ModuleTypes/upgrader": {
"title": "$:/language/Docs/ModuleTypes/upgrader",
"text": "Applies upgrade processing to tiddlers during an upgrade/import."
},
"$:/language/Docs/ModuleTypes/utils": {
"title": "$:/language/Docs/ModuleTypes/utils",
"text": "Adds methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/utils-node": {
"title": "$:/language/Docs/ModuleTypes/utils-node",
"text": "Adds Node.js-specific methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/widget": {
"title": "$:/language/Docs/ModuleTypes/widget",
"text": "Widgets encapsulate DOM rendering and refreshing."
},
"$:/language/Docs/ModuleTypes/wikimethod": {
"title": "$:/language/Docs/ModuleTypes/wikimethod",
"text": "Adds methods to `$tw.Wiki`."
},
"$:/language/Docs/ModuleTypes/wikirule": {
"title": "$:/language/Docs/ModuleTypes/wikirule",
"text": "Individual parser rules for the main WikiText parser."
},
"$:/language/Docs/PaletteColours/alert-background": {
"title": "$:/language/Docs/PaletteColours/alert-background",
"text": "Alert background"
},
"$:/language/Docs/PaletteColours/alert-border": {
"title": "$:/language/Docs/PaletteColours/alert-border",
"text": "Alert border"
},
"$:/language/Docs/PaletteColours/alert-highlight": {
"title": "$:/language/Docs/PaletteColours/alert-highlight",
"text": "Alert highlight"
},
"$:/language/Docs/PaletteColours/alert-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/alert-muted-foreground",
"text": "Alert muted foreground"
},
"$:/language/Docs/PaletteColours/background": {
"title": "$:/language/Docs/PaletteColours/background",
"text": "General background"
},
"$:/language/Docs/PaletteColours/blockquote-bar": {
"title": "$:/language/Docs/PaletteColours/blockquote-bar",
"text": "Blockquote bar"
},
"$:/language/Docs/PaletteColours/button-background": {
"title": "$:/language/Docs/PaletteColours/button-background",
"text": "Default button background"
},
"$:/language/Docs/PaletteColours/button-border": {
"title": "$:/language/Docs/PaletteColours/button-border",
"text": "Default button border"
},
"$:/language/Docs/PaletteColours/button-foreground": {
"title": "$:/language/Docs/PaletteColours/button-foreground",
"text": "Default button foreground"
},
"$:/language/Docs/PaletteColours/dirty-indicator": {
"title": "$:/language/Docs/PaletteColours/dirty-indicator",
"text": "Unsaved changes indicator"
},
"$:/language/Docs/PaletteColours/code-background": {
"title": "$:/language/Docs/PaletteColours/code-background",
"text": "Code background"
},
"$:/language/Docs/PaletteColours/code-border": {
"title": "$:/language/Docs/PaletteColours/code-border",
"text": "Code border"
},
"$:/language/Docs/PaletteColours/code-foreground": {
"title": "$:/language/Docs/PaletteColours/code-foreground",
"text": "Code foreground"
},
"$:/language/Docs/PaletteColours/download-background": {
"title": "$:/language/Docs/PaletteColours/download-background",
"text": "Download button background"
},
"$:/language/Docs/PaletteColours/download-foreground": {
"title": "$:/language/Docs/PaletteColours/download-foreground",
"text": "Download button foreground"
},
"$:/language/Docs/PaletteColours/dragger-background": {
"title": "$:/language/Docs/PaletteColours/dragger-background",
"text": "Dragger background"
},
"$:/language/Docs/PaletteColours/dragger-foreground": {
"title": "$:/language/Docs/PaletteColours/dragger-foreground",
"text": "Dragger foreground"
},
"$:/language/Docs/PaletteColours/dropdown-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-background",
"text": "Dropdown background"
},
"$:/language/Docs/PaletteColours/dropdown-border": {
"title": "$:/language/Docs/PaletteColours/dropdown-border",
"text": "Dropdown border"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background-selected",
"text": "Dropdown tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background",
"text": "Dropdown tab background"
},
"$:/language/Docs/PaletteColours/dropzone-background": {
"title": "$:/language/Docs/PaletteColours/dropzone-background",
"text": "Dropzone background"
},
"$:/language/Docs/PaletteColours/external-link-background-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-background-hover",
"text": "External link background hover"
},
"$:/language/Docs/PaletteColours/external-link-background-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-background-visited",
"text": "External link background visited"
},
"$:/language/Docs/PaletteColours/external-link-background": {
"title": "$:/language/Docs/PaletteColours/external-link-background",
"text": "External link background"
},
"$:/language/Docs/PaletteColours/external-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-hover",
"text": "External link foreground hover"
},
"$:/language/Docs/PaletteColours/external-link-foreground-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-visited",
"text": "External link foreground visited"
},
"$:/language/Docs/PaletteColours/external-link-foreground": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground",
"text": "External link foreground"
},
"$:/language/Docs/PaletteColours/foreground": {
"title": "$:/language/Docs/PaletteColours/foreground",
"text": "General foreground"
},
"$:/language/Docs/PaletteColours/menubar-background": {
"title": "$:/language/Docs/PaletteColours/menubar-background",
"text": "Menu bar background"
},
"$:/language/Docs/PaletteColours/menubar-foreground": {
"title": "$:/language/Docs/PaletteColours/menubar-foreground",
"text": "Menu bar foreground"
},
"$:/language/Docs/PaletteColours/message-background": {
"title": "$:/language/Docs/PaletteColours/message-background",
"text": "Message box background"
},
"$:/language/Docs/PaletteColours/message-border": {
"title": "$:/language/Docs/PaletteColours/message-border",
"text": "Message box border"
},
"$:/language/Docs/PaletteColours/message-foreground": {
"title": "$:/language/Docs/PaletteColours/message-foreground",
"text": "Message box foreground"
},
"$:/language/Docs/PaletteColours/modal-backdrop": {
"title": "$:/language/Docs/PaletteColours/modal-backdrop",
"text": "Modal backdrop"
},
"$:/language/Docs/PaletteColours/modal-background": {
"title": "$:/language/Docs/PaletteColours/modal-background",
"text": "Modal background"
},
"$:/language/Docs/PaletteColours/modal-border": {
"title": "$:/language/Docs/PaletteColours/modal-border",
"text": "Modal border"
},
"$:/language/Docs/PaletteColours/modal-footer-background": {
"title": "$:/language/Docs/PaletteColours/modal-footer-background",
"text": "Modal footer background"
},
"$:/language/Docs/PaletteColours/modal-footer-border": {
"title": "$:/language/Docs/PaletteColours/modal-footer-border",
"text": "Modal footer border"
},
"$:/language/Docs/PaletteColours/modal-header-border": {
"title": "$:/language/Docs/PaletteColours/modal-header-border",
"text": "Modal header border"
},
"$:/language/Docs/PaletteColours/muted-foreground": {
"title": "$:/language/Docs/PaletteColours/muted-foreground",
"text": "General muted foreground"
},
"$:/language/Docs/PaletteColours/notification-background": {
"title": "$:/language/Docs/PaletteColours/notification-background",
"text": "Notification background"
},
"$:/language/Docs/PaletteColours/notification-border": {
"title": "$:/language/Docs/PaletteColours/notification-border",
"text": "Notification border"
},
"$:/language/Docs/PaletteColours/page-background": {
"title": "$:/language/Docs/PaletteColours/page-background",
"text": "Page background"
},
"$:/language/Docs/PaletteColours/pre-background": {
"title": "$:/language/Docs/PaletteColours/pre-background",
"text": "Preformatted code background"
},
"$:/language/Docs/PaletteColours/pre-border": {
"title": "$:/language/Docs/PaletteColours/pre-border",
"text": "Preformatted code border"
},
"$:/language/Docs/PaletteColours/primary": {
"title": "$:/language/Docs/PaletteColours/primary",
"text": "General primary"
},
"$:/language/Docs/PaletteColours/select-tag-background": {
"title": "$:/language/Docs/PaletteColours/select-tag-background",
"text": "`<select>` element background"
},
"$:/language/Docs/PaletteColours/select-tag-foreground": {
"title": "$:/language/Docs/PaletteColours/select-tag-foreground",
"text": "`<select>` element text"
},
"$:/language/Docs/PaletteColours/sidebar-button-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-button-foreground",
"text": "Sidebar button foreground"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover",
"text": "Sidebar controls foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground",
"text": "Sidebar controls foreground"
},
"$:/language/Docs/PaletteColours/sidebar-foreground-shadow": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground-shadow",
"text": "Sidebar foreground shadow"
},
"$:/language/Docs/PaletteColours/sidebar-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground",
"text": "Sidebar foreground"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover",
"text": "Sidebar muted foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground",
"text": "Sidebar muted foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background-selected",
"text": "Sidebar tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background",
"text": "Sidebar tab background"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border-selected",
"text": "Sidebar tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border",
"text": "Sidebar tab border"
},
"$:/language/Docs/PaletteColours/sidebar-tab-divider": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-divider",
"text": "Sidebar tab divider"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected",
"text": "Sidebar tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground",
"text": "Sidebar tab foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover",
"text": "Sidebar tiddler link foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground",
"text": "Sidebar tiddler link foreground"
},
"$:/language/Docs/PaletteColours/site-title-foreground": {
"title": "$:/language/Docs/PaletteColours/site-title-foreground",
"text": "Site title foreground"
},
"$:/language/Docs/PaletteColours/static-alert-foreground": {
"title": "$:/language/Docs/PaletteColours/static-alert-foreground",
"text": "Static alert foreground"
},
"$:/language/Docs/PaletteColours/tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/tab-background-selected",
"text": "Tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-background": {
"title": "$:/language/Docs/PaletteColours/tab-background",
"text": "Tab background"
},
"$:/language/Docs/PaletteColours/tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/tab-border-selected",
"text": "Tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-border": {
"title": "$:/language/Docs/PaletteColours/tab-border",
"text": "Tab border"
},
"$:/language/Docs/PaletteColours/tab-divider": {
"title": "$:/language/Docs/PaletteColours/tab-divider",
"text": "Tab divider"
},
"$:/language/Docs/PaletteColours/tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tab-foreground-selected",
"text": "Tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-foreground": {
"title": "$:/language/Docs/PaletteColours/tab-foreground",
"text": "Tab foreground"
},
"$:/language/Docs/PaletteColours/table-border": {
"title": "$:/language/Docs/PaletteColours/table-border",
"text": "Table border"
},
"$:/language/Docs/PaletteColours/table-footer-background": {
"title": "$:/language/Docs/PaletteColours/table-footer-background",
"text": "Table footer background"
},
"$:/language/Docs/PaletteColours/table-header-background": {
"title": "$:/language/Docs/PaletteColours/table-header-background",
"text": "Table header background"
},
"$:/language/Docs/PaletteColours/tag-background": {
"title": "$:/language/Docs/PaletteColours/tag-background",
"text": "Tag background"
},
"$:/language/Docs/PaletteColours/tag-foreground": {
"title": "$:/language/Docs/PaletteColours/tag-foreground",
"text": "Tag foreground"
},
"$:/language/Docs/PaletteColours/tiddler-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-background",
"text": "Tiddler background"
},
"$:/language/Docs/PaletteColours/tiddler-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-border",
"text": "Tiddler border"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover",
"text": "Tiddler controls foreground hover"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected",
"text": "Tiddler controls foreground for selected controls"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground",
"text": "Tiddler controls foreground"
},
"$:/language/Docs/PaletteColours/tiddler-editor-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-background",
"text": "Tiddler editor background"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border-image": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border-image",
"text": "Tiddler editor border image"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border",
"text": "Tiddler editor border"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-even": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-even",
"text": "Tiddler editor background for even fields"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-odd": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd",
"text": "Tiddler editor background for odd fields"
},
"$:/language/Docs/PaletteColours/tiddler-info-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-background",
"text": "Tiddler info panel background"
},
"$:/language/Docs/PaletteColours/tiddler-info-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-border",
"text": "Tiddler info panel border"
},
"$:/language/Docs/PaletteColours/tiddler-info-tab-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-tab-background",
"text": "Tiddler info panel tab background"
},
"$:/language/Docs/PaletteColours/tiddler-link-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-background",
"text": "Tiddler link background"
},
"$:/language/Docs/PaletteColours/tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-foreground",
"text": "Tiddler link foreground"
},
"$:/language/Docs/PaletteColours/tiddler-subtitle-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground",
"text": "Tiddler subtitle foreground"
},
"$:/language/Docs/PaletteColours/tiddler-title-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-title-foreground",
"text": "Tiddler title foreground"
},
"$:/language/Docs/PaletteColours/toolbar-new-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-new-button",
"text": "Toolbar 'new tiddler' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-options-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-options-button",
"text": "Toolbar 'options' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-save-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-save-button",
"text": "Toolbar 'save' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-info-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-info-button",
"text": "Toolbar 'info' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-edit-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-edit-button",
"text": "Toolbar 'edit' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-close-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-close-button",
"text": "Toolbar 'close' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-delete-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-delete-button",
"text": "Toolbar 'delete' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-cancel-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-cancel-button",
"text": "Toolbar 'cancel' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-done-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-done-button",
"text": "Toolbar 'done' button foreground"
},
"$:/language/Docs/PaletteColours/untagged-background": {
"title": "$:/language/Docs/PaletteColours/untagged-background",
"text": "Untagged pill background"
},
"$:/language/Docs/PaletteColours/very-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/very-muted-foreground",
"text": "Very muted foreground"
},
"$:/language/EditTemplate/Body/External/Hint": {
"title": "$:/language/EditTemplate/Body/External/Hint",
"text": "This tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself"
},
"$:/language/EditTemplate/Body/Placeholder": {
"title": "$:/language/EditTemplate/Body/Placeholder",
"text": "Type the text for this tiddler"
},
"$:/language/EditTemplate/Body/Preview/Type/Output": {
"title": "$:/language/EditTemplate/Body/Preview/Type/Output",
"text": "output"
},
"$:/language/EditTemplate/Field/Remove/Caption": {
"title": "$:/language/EditTemplate/Field/Remove/Caption",
"text": "remove field"
},
"$:/language/EditTemplate/Field/Remove/Hint": {
"title": "$:/language/EditTemplate/Field/Remove/Hint",
"text": "Remove field"
},
"$:/language/EditTemplate/Field/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Field/Dropdown/Caption",
"text": "field list"
},
"$:/language/EditTemplate/Field/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Field/Dropdown/Hint",
"text": "Show field list"
},
"$:/language/EditTemplate/Fields/Add/Button": {
"title": "$:/language/EditTemplate/Fields/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Fields/Add/Button/Hint": {
"title": "$:/language/EditTemplate/Fields/Add/Button/Hint",
"text": "Add the new field to the tiddler"
},
"$:/language/EditTemplate/Fields/Add/Name/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Name/Placeholder",
"text": "field name"
},
"$:/language/EditTemplate/Fields/Add/Prompt": {
"title": "$:/language/EditTemplate/Fields/Add/Prompt",
"text": "Add a new field:"
},
"$:/language/EditTemplate/Fields/Add/Value/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Value/Placeholder",
"text": "field value"
},
"$:/language/EditTemplate/Fields/Add/Dropdown/System": {
"title": "$:/language/EditTemplate/Fields/Add/Dropdown/System",
"text": "System fields"
},
"$:/language/EditTemplate/Fields/Add/Dropdown/User": {
"title": "$:/language/EditTemplate/Fields/Add/Dropdown/User",
"text": "User fields"
},
"$:/language/EditTemplate/Shadow/Warning": {
"title": "$:/language/EditTemplate/Shadow/Warning",
"text": "This is a shadow tiddler. Any changes you make will override the default version from the plugin <<pluginLink>>"
},
"$:/language/EditTemplate/Shadow/OverriddenWarning": {
"title": "$:/language/EditTemplate/Shadow/OverriddenWarning",
"text": "This is a modified shadow tiddler. You can revert to the default version in the plugin <<pluginLink>> by deleting this tiddler"
},
"$:/language/EditTemplate/Tags/Add/Button": {
"title": "$:/language/EditTemplate/Tags/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Tags/Add/Button/Hint": {
"title": "$:/language/EditTemplate/Tags/Add/Button/Hint",
"text": "add tag"
},
"$:/language/EditTemplate/Tags/Add/Placeholder": {
"title": "$:/language/EditTemplate/Tags/Add/Placeholder",
"text": "tag name"
},
"$:/language/EditTemplate/Tags/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Caption",
"text": "tag list"
},
"$:/language/EditTemplate/Tags/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Hint",
"text": "Show tag list"
},
"$:/language/EditTemplate/Title/BadCharacterWarning": {
"title": "$:/language/EditTemplate/Title/BadCharacterWarning",
"text": "Warning: avoid using any of the characters <<bad-chars>> in tiddler titles"
},
"$:/language/EditTemplate/Title/Exists/Prompt": {
"title": "$:/language/EditTemplate/Title/Exists/Prompt",
"text": "Target tiddler already exists"
},
"$:/language/EditTemplate/Title/Relink/Prompt": {
"title": "$:/language/EditTemplate/Title/Relink/Prompt",
"text": "Update ''<$text text=<<fromTitle>>/>'' to ''<$text text=<<toTitle>>/>'' in the //tags// and //list// fields of other tiddlers"
},
"$:/language/EditTemplate/Title/References/Prompt": {
"title": "$:/language/EditTemplate/Title/References/Prompt",
"text": "The following references to this tiddler will not be automatically updated:"
},
"$:/language/EditTemplate/Type/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Type/Dropdown/Caption",
"text": "content type list"
},
"$:/language/EditTemplate/Type/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Type/Dropdown/Hint",
"text": "Show content type list"
},
"$:/language/EditTemplate/Type/Delete/Caption": {
"title": "$:/language/EditTemplate/Type/Delete/Caption",
"text": "delete content type"
},
"$:/language/EditTemplate/Type/Delete/Hint": {
"title": "$:/language/EditTemplate/Type/Delete/Hint",
"text": "Delete content type"
},
"$:/language/EditTemplate/Type/Placeholder": {
"title": "$:/language/EditTemplate/Type/Placeholder",
"text": "content type"
},
"$:/language/EditTemplate/Type/Prompt": {
"title": "$:/language/EditTemplate/Type/Prompt",
"text": "Type:"
},
"$:/language/Exporters/StaticRiver": {
"title": "$:/language/Exporters/StaticRiver",
"text": "Static HTML"
},
"$:/language/Exporters/JsonFile": {
"title": "$:/language/Exporters/JsonFile",
"text": "JSON file"
},
"$:/language/Exporters/CsvFile": {
"title": "$:/language/Exporters/CsvFile",
"text": "CSV file"
},
"$:/language/Exporters/TidFile": {
"title": "$:/language/Exporters/TidFile",
"text": "\".tid\" file"
},
"$:/language/Docs/Fields/_canonical_uri": {
"title": "$:/language/Docs/Fields/_canonical_uri",
"text": "The full URI of an external image tiddler"
},
"$:/language/Docs/Fields/bag": {
"title": "$:/language/Docs/Fields/bag",
"text": "The name of the bag from which a tiddler came"
},
"$:/language/Docs/Fields/caption": {
"title": "$:/language/Docs/Fields/caption",
"text": "The text to be displayed on a tab or button"
},
"$:/language/Docs/Fields/color": {
"title": "$:/language/Docs/Fields/color",
"text": "The CSS color value associated with a tiddler"
},
"$:/language/Docs/Fields/component": {
"title": "$:/language/Docs/Fields/component",
"text": "The name of the component responsible for an [[alert tiddler|AlertMechanism]]"
},
"$:/language/Docs/Fields/current-tiddler": {
"title": "$:/language/Docs/Fields/current-tiddler",
"text": "Used to cache the top tiddler in a [[history list|HistoryMechanism]]"
},
"$:/language/Docs/Fields/created": {
"title": "$:/language/Docs/Fields/created",
"text": "The date a tiddler was created"
},
"$:/language/Docs/Fields/creator": {
"title": "$:/language/Docs/Fields/creator",
"text": "The name of the person who created a tiddler"
},
"$:/language/Docs/Fields/dependents": {
"title": "$:/language/Docs/Fields/dependents",
"text": "For a plugin, lists the dependent plugin titles"
},
"$:/language/Docs/Fields/description": {
"title": "$:/language/Docs/Fields/description",
"text": "The descriptive text for a plugin, or a modal dialogue"
},
"$:/language/Docs/Fields/draft.of": {
"title": "$:/language/Docs/Fields/draft.of",
"text": "For draft tiddlers, contains the title of the tiddler of which this is a draft"
},
"$:/language/Docs/Fields/draft.title": {
"title": "$:/language/Docs/Fields/draft.title",
"text": "For draft tiddlers, contains the proposed new title of the tiddler"
},
"$:/language/Docs/Fields/footer": {
"title": "$:/language/Docs/Fields/footer",
"text": "The footer text for a wizard"
},
"$:/language/Docs/Fields/hide-body": {
"title": "$:/language/Docs/Fields/hide-body",
"text": "The view template will hide bodies of tiddlers if set to: ''yes''"
},
"$:/language/Docs/Fields/icon": {
"title": "$:/language/Docs/Fields/icon",
"text": "The title of the tiddler containing the icon associated with a tiddler"
},
"$:/language/Docs/Fields/library": {
"title": "$:/language/Docs/Fields/library",
"text": "Indicates that a tiddler should be saved as a JavaScript library if set to: ''yes''"
},
"$:/language/Docs/Fields/list": {
"title": "$:/language/Docs/Fields/list",
"text": "An ordered list of tiddler titles associated with a tiddler"
},
"$:/language/Docs/Fields/list-before": {
"title": "$:/language/Docs/Fields/list-before",
"text": "If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty"
},
"$:/language/Docs/Fields/list-after": {
"title": "$:/language/Docs/Fields/list-after",
"text": "If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles, or at the end of the list if this field is present but empty"
},
"$:/language/Docs/Fields/modified": {
"title": "$:/language/Docs/Fields/modified",
"text": "The date and time at which a tiddler was last modified"
},
"$:/language/Docs/Fields/modifier": {
"title": "$:/language/Docs/Fields/modifier",
"text": "The tiddler title associated with the person who last modified a tiddler"
},
"$:/language/Docs/Fields/name": {
"title": "$:/language/Docs/Fields/name",
"text": "The human readable name associated with a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-priority": {
"title": "$:/language/Docs/Fields/plugin-priority",
"text": "A numerical value indicating the priority of a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-type": {
"title": "$:/language/Docs/Fields/plugin-type",
"text": "The type of plugin in a plugin tiddler"
},
"$:/language/Docs/Fields/revision": {
"title": "$:/language/Docs/Fields/revision",
"text": "The revision of the tiddler held at the server"
},
"$:/language/Docs/Fields/released": {
"title": "$:/language/Docs/Fields/released",
"text": "Date of a TiddlyWiki release"
},
"$:/language/Docs/Fields/source": {
"title": "$:/language/Docs/Fields/source",
"text": "The source URL associated with a tiddler"
},
"$:/language/Docs/Fields/subtitle": {
"title": "$:/language/Docs/Fields/subtitle",
"text": "The subtitle text for a wizard"
},
"$:/language/Docs/Fields/tags": {
"title": "$:/language/Docs/Fields/tags",
"text": "A list of tags associated with a tiddler"
},
"$:/language/Docs/Fields/text": {
"title": "$:/language/Docs/Fields/text",
"text": "The body text of a tiddler"
},
"$:/language/Docs/Fields/throttle.refresh": {
"title": "$:/language/Docs/Fields/throttle.refresh",
"text": "If present, throttles refreshes of this tiddler"
},
"$:/language/Docs/Fields/title": {
"title": "$:/language/Docs/Fields/title",
"text": "The unique name of a tiddler"
},
"$:/language/Docs/Fields/toc-link": {
"title": "$:/language/Docs/Fields/toc-link",
"text": "Suppresses the tiddler's link in a Table of Contents tree if set to: ''no''"
},
"$:/language/Docs/Fields/type": {
"title": "$:/language/Docs/Fields/type",
"text": "The content type of a tiddler"
},
"$:/language/Docs/Fields/version": {
"title": "$:/language/Docs/Fields/version",
"text": "Version information for a plugin"
},
"$:/language/Docs/Fields/_is_skinny": {
"title": "$:/language/Docs/Fields/_is_skinny",
"text": "If present, indicates that the tiddler text field must be loaded from the server"
},
"$:/language/Filters/AllTiddlers": {
"title": "$:/language/Filters/AllTiddlers",
"text": "All tiddlers except system tiddlers"
},
"$:/language/Filters/RecentSystemTiddlers": {
"title": "$:/language/Filters/RecentSystemTiddlers",
"text": "Recently modified tiddlers, including system tiddlers"
},
"$:/language/Filters/RecentTiddlers": {
"title": "$:/language/Filters/RecentTiddlers",
"text": "Recently modified tiddlers"
},
"$:/language/Filters/AllTags": {
"title": "$:/language/Filters/AllTags",
"text": "All tags except system tags"
},
"$:/language/Filters/Missing": {
"title": "$:/language/Filters/Missing",
"text": "Missing tiddlers"
},
"$:/language/Filters/Drafts": {
"title": "$:/language/Filters/Drafts",
"text": "Draft tiddlers"
},
"$:/language/Filters/Orphans": {
"title": "$:/language/Filters/Orphans",
"text": "Orphan tiddlers"
},
"$:/language/Filters/SystemTiddlers": {
"title": "$:/language/Filters/SystemTiddlers",
"text": "System tiddlers"
},
"$:/language/Filters/ShadowTiddlers": {
"title": "$:/language/Filters/ShadowTiddlers",
"text": "Shadow tiddlers"
},
"$:/language/Filters/OverriddenShadowTiddlers": {
"title": "$:/language/Filters/OverriddenShadowTiddlers",
"text": "Overridden shadow tiddlers"
},
"$:/language/Filters/SessionTiddlers": {
"title": "$:/language/Filters/SessionTiddlers",
"text": "Tiddlers modified since the wiki was loaded"
},
"$:/language/Filters/SystemTags": {
"title": "$:/language/Filters/SystemTags",
"text": "System tags"
},
"$:/language/Filters/StoryList": {
"title": "$:/language/Filters/StoryList",
"text": "Tiddlers in the story river, excluding <$text text=\"$:/AdvancedSearch\"/>"
},
"$:/language/Filters/TypedTiddlers": {
"title": "$:/language/Filters/TypedTiddlers",
"text": "Non wiki-text tiddlers"
},
"GettingStarted": {
"title": "GettingStarted",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nBefore you start storing important information in ~TiddlyWiki it is vital to make sure that you can reliably save changes. See https://tiddlywiki.com/#GettingStarted for details\n\n!! Set up this ~TiddlyWiki\n\n<div class=\"tc-control-panel\">\n\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n</div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n"
},
"$:/language/Help/build": {
"title": "$:/language/Help/build",
"description": "Automatically run configured commands",
"text": "Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\n\n```\n--build <target> [<target> ...]\n```\n\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\n\n"
},
"$:/language/Help/clearpassword": {
"title": "$:/language/Help/clearpassword",
"description": "Clear a password for subsequent crypto operations",
"text": "Clear the password for subsequent crypto operations\n\n```\n--clearpassword\n```\n"
},
"$:/language/Help/default": {
"title": "$:/language/Help/default",
"text": "\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n```\nusage: tiddlywiki [<wikifolder>] [--<command> [<args>...]...]\n```\n\nAvailable commands:\n\n<ul>\n<$list filter=\"[commands[]sort[title]]\" variable=\"command\">\n<li><$link to=<<commandTitle>>><$macrocall $name=\"command\" $type=\"text/plain\" $output=\"text/plain\"/></$link>: <$transclude tiddler=<<commandTitle>> field=\"description\"/></li>\n</$list>\n</ul>\n\nTo get detailed help on a command:\n\n```\ntiddlywiki --help <command>\n```\n"
},
"$:/language/Help/deletetiddlers": {
"title": "$:/language/Help/deletetiddlers",
"description": "Deletes a group of tiddlers",
"text": "<<.from-version \"5.1.20\">> Deletes a group of tiddlers identified by a filter.\n\n```\n--deletetiddlers <filter>\n```\n"
},
"$:/language/Help/editions": {
"title": "$:/language/Help/editions",
"description": "Lists the available editions of TiddlyWiki",
"text": "Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\n\n```\n--editions\n```\n"
},
"$:/language/Help/fetch": {
"title": "$:/language/Help/fetch",
"description": "Fetch tiddlers from wiki by URL",
"text": "Fetch one or more files over HTTP/HTTPS, and import the tiddlers matching a filter, optionally transforming the incoming titles.\n\n```\n--fetch file <url> <import-filter> <transform-filter>\n--fetch files <url-filter> <import-filter> <transform-filter>\n--fetch raw-file <url> <transform-filter>\n--fetch raw-files <url-filter> <transform-filter>\n```\n\nThe \"file\" and \"files\" variants fetch the specified files and attempt to import the tiddlers within them (the same processing as if the files were dragged into the browser window). The \"raw-file\" and \"raw-files\" variants fetch the specified files and then store the raw file data in tiddlers, without applying the import logic.\n\nWith the \"file\" and \"raw-file\" variants only a single file is fetched and the first parameter is the URL of the file to read.\n\nWith the \"files\" and \"raw-files\" variants, multiple files are fetched and the first parameter is a filter yielding a list of URLs of the files to read. For example, given a set of tiddlers tagged \"remote-server\" that have a field \"url\" the filter `[tag[remote-server]get[url]]` will retrieve all the available URLs.\n\nFor the \"file\" and \"files\" variants, the `<import-filter>` parameter specifies a filter determining which tiddlers are imported. It defaults to `[all[tiddlers]]` if not provided.\n\nFor all variants, the `<transform-filter>` parameter specifies an optional filter that transforms the titles of the imported tiddlers. For example, `[addprefix[$:/myimports/]]` would add the prefix `$:/myimports/` to each title.\n\nPreceding the `--fetch` command with `--verbose` will output progress information during the import.\n\nNote that TiddlyWiki will not fetch an older version of an already loaded plugin.\n\nThe following example retrieves all the non-system tiddlers from https://tiddlywiki.com and saves them to a JSON file:\n\n```\ntiddlywiki --verbose --fetch file \"https://tiddlywiki.com/\" \"[!is[system]]\" \"\" --rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[!is[system]]\"\n```\n\nThe following example retrieves the \"favicon\" file from tiddlywiki.com and saves it in a file called \"output.ico\". Note that the intermediate tiddler \"Icon Tiddler\" is quoted in the \"--fetch\" command because it is being used as a transformation filter to replace the default title, while there are no quotes for the \"--savetiddler\" command because it is being used directly as a title.\n\n```\ntiddlywiki --verbose --fetch raw-file \"https://tiddlywiki.com/favicon.ico\" \"[[Icon Tiddler]]\" --savetiddler \"Icon Tiddler\" output.ico\n```\n\n"
},
"$:/language/Help/help": {
"title": "$:/language/Help/help",
"description": "Display help for TiddlyWiki commands",
"text": "Displays help text for a command:\n\n```\n--help [<command>]\n```\n\nIf the command name is omitted then a list of available commands is displayed.\n"
},
"$:/language/Help/import": {
"title": "$:/language/Help/import",
"description": "Import tiddlers from a file",
"text": "Import tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The deserializer must be explicitly specified, unlike the `load` command which infers the deserializer from the file extension.\n\n```\n--import <filepath> <deserializer> [<title>] [<encoding>]\n```\n\nThe deserializers in the core include:\n\n* application/javascript\n* application/json\n* application/x-tiddler\n* application/x-tiddler-html-div\n* application/x-tiddlers\n* text/html\n* text/plain\n\nThe title of the imported tiddler defaults to the filename.\n\nThe encoding defaults to \"utf8\", but can be \"base64\" for importing binary files.\n\nNote that TiddlyWiki will not import an older version of an already loaded plugin.\n"
},
"$:/language/Help/init": {
"title": "$:/language/Help/init",
"description": "Initialise a new wiki folder",
"text": "Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\n\n```\n--init <edition> [<edition> ...]\n```\n\nFor example:\n\n```\ntiddlywiki ./MyWikiFolder --init empty\n```\n\nNote:\n\n* The wiki folder directory will be created if necessary\n* The \"edition\" defaults to ''empty''\n* The init command will fail if the wiki folder is not empty\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\n* When multiple editions are specified, editions initialised later will overwrite any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\n* `--editions` returns a list of available editions\n"
},
"$:/language/Help/listen": {
"title": "$:/language/Help/listen",
"description": "Provides an HTTP server interface to TiddlyWiki",
"text": "Serves a wiki over HTTP.\n\nThe listen command uses NamedCommandParameters:\n\n```\n--listen [<name>=<value>]...\n```\n\nAll parameters are optional with safe defaults, and can be specified in any order. The recognised parameters are:\n\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''credentials'' - pathname of credentials CSV file (relative to wiki folder)\n* ''anon-username'' - the username for signing edits for anonymous users\n* ''username'' - optional username for basic authentication\n* ''password'' - optional password for basic authentication\n* ''authenticated-user-header'' - optional name of header to be used for trusted authentication\n* ''readers'' - comma separated list of principals allowed to read from this wiki\n* ''writers'' - comma separated list of principals allowed to write to this wiki\n* ''csrf-disable'' - set to \"yes\" to disable CSRF checks (defaults to \"no\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''tls-cert'' - pathname of TLS certificate file (relative to wiki folder)\n* ''tls-key'' - pathname of TLS key file (relative to wiki folder)\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n* ''gzip'' - set to \"yes\" to enable gzip compression for some http endpoints (defaults to \"no\")\n\nFor information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\n"
},
"$:/language/Help/load": {
"title": "$:/language/Help/load",
"description": "Load tiddlers from a file",
"text": "Load tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The processing applied to incoming files is determined by the file extension. Use the alternative `import` command if you need to specify the deserializer and encoding explicitly.\n\n```\n--load <filepath> [noerror]\n--load <dirpath> [noerror]\n```\n\nBy default, the load command raises an error if no tiddlers are found. The error can be suppressed by providing the optional \"noerror\" parameter.\n\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\n\n```\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\n```\n\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\n"
},
"$:/language/Help/makelibrary": {
"title": "$:/language/Help/makelibrary",
"description": "Construct library plugin required by upgrade process",
"text": "Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\n\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\n\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\n\n```\n--makelibrary <title>\n```\n\nThe title argument defaults to `$:/UpgradeLibrary`.\n"
},
"$:/language/Help/notfound": {
"title": "$:/language/Help/notfound",
"text": "No such help item"
},
"$:/language/Help/output": {
"title": "$:/language/Help/output",
"description": "Set the base output directory for subsequent commands",
"text": "Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\n\n```\n--output <pathname>\n```\n\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\n\n"
},
"$:/language/Help/password": {
"title": "$:/language/Help/password",
"description": "Set a password for subsequent crypto operations",
"text": "Set a password for subsequent crypto operations\n\n```\n--password <password>\n```\n\n''Note'': This should not be used for serving TiddlyWiki with password protection. Instead, see the password option under the [[ServerCommand]].\n"
},
"$:/language/Help/render": {
"title": "$:/language/Help/render",
"description": "Renders individual tiddlers to files",
"text": "Render individual tiddlers identified by a filter and save the results to the specified files.\n\nOptionally, the title of a template tiddler can be specified. In this case, instead of directly rendering each tiddler, the template tiddler is rendered with the \"currentTiddler\" variable set to the title of the tiddler that is being rendered.\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [<name>] [<value>]\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename\n* ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material)\n* ''template'': Optional template through which each tiddler is rendered\n* ''name'': Name of optional variable\n* ''value'': Value of optional variable\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--render \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated\n\nExamples:\n\n* `--render \"[!is[system]]\" \"[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]\"` -- renders all non-system tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles and the extension HTML\n\n"
},
"$:/language/Help/rendertiddler": {
"title": "$:/language/Help/rendertiddler",
"description": "Render an individual tiddler as a specified ContentType",
"text": "(Note: The `--rendertiddler` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender an individual tiddler as a specified ContentType, defaulting to `text/html` and save it to the specified filename.\n\nOptionally the title of a template tiddler can be specified, in which case the template tiddler is rendered with the \"currentTiddler\" variable set to the tiddler that is being rendered (the first parameter value).\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--rendertiddler <title> <filename> [<type>] [<template>] [<name>] [<value>]\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n\nFor example, the following command saves all tiddlers matching the filter `[tag[done]]` to a JSON file titled `output.json` by employing the core template `$:/core/templates/exporters/JsonFile`.\n\n```\n--rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[tag[done]]\"\n```\n"
},
"$:/language/Help/rendertiddlers": {
"title": "$:/language/Help/rendertiddlers",
"description": "Render tiddlers matching a filter to a specified ContentType",
"text": "(Note: The `--rendertiddlers` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\n\n```\n--rendertiddlers <filter> <template> <pathname> [<type>] [<extension>] [\"noclean\"]\n```\n\nFor example:\n\n```\n--rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html ./static text/plain\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny files in the target directory are deleted unless the ''noclean'' flag is specified. The target directory is recursively created if it is missing.\n"
},
"$:/language/Help/save": {
"title": "$:/language/Help/save",
"description": "Saves individual raw tiddlers to files",
"text": "Saves individual tiddlers identified by a filter in their raw text or binary format to the specified files.\n\n```\n--save <tiddler-filter> <filename-filter>\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be saved\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]]`, which uses the unchanged tiddler title as the filename\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--save \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being saved, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--save` command is a more flexible replacement for both the `--savetiddler` and `--savetiddlers` commands, which are deprecated\n\nExamples:\n\n* `--save \"[!is[system]is[image]]\" \"[encodeuricomponent[]addprefix[tiddlers/]]\"` -- saves all non-system image tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles\n"
},
"$:/language/Help/savetiddler": {
"title": "$:/language/Help/savetiddler",
"description": "Saves a raw tiddler to a file",
"text": "(Note: The `--savetiddler` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves an individual tiddler in its raw text or binary format to the specified filename.\n\n```\n--savetiddler <title> <filename>\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"
},
"$:/language/Help/savetiddlers": {
"title": "$:/language/Help/savetiddlers",
"description": "Saves a group of raw tiddlers to a directory",
"text": "(Note: The `--savetiddlers` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves a group of tiddlers in their raw text or binary format to the specified directory.\n\n```\n--savetiddlers <filter> <pathname> [\"noclean\"]\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nThe output directory is cleared of existing files before saving the specified files. The deletion can be disabled by specifying the ''noclean'' flag.\n\nAny missing directories in the pathname are automatically created.\n"
},
"$:/language/Help/savewikifolder": {
"title": "$:/language/Help/savewikifolder",
"description": "Saves a wiki to a new wiki folder",
"text": "<<.from-version \"5.1.20\">> Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration:\n\n```\n--savewikifolder <wikifolderpath> [<filter>]\n```\n\n* The target wiki folder must be empty or non-existent\n* The filter specifies which tiddlers should be included. It is optional, defaulting to `[all[tiddlers]]`\n* Plugins from the official plugin library are replaced with references to those plugins in the `tiddlywiki.info` file\n* Custom plugins are unpacked into their own folder\n\nA common usage is to convert a TiddlyWiki HTML file into a wiki folder:\n\n```\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder\n```\n"
},
"$:/language/Help/server": {
"title": "$:/language/Help/server",
"description": "Provides an HTTP server interface to TiddlyWiki (deprecated in favour of the new listen command)",
"text": "Legacy command to serve a wiki over HTTP.\n\n```\n--server <port> <root-tiddler> <root-render-type> <root-serve-type> <username> <password> <host> <path-prefix> <debug-level>\n```\n\nThe parameters are:\n\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''username'' - the default username for signing edits\n* ''password'' - optional password for basic authentication\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation should only be used on a trusted network or over HTTPS.\n\nFor example:\n\n```\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password.\n\n\n```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nUsing an address like this exposes your system to the local network. For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port. It can be useful to use an environment variable to pass the port number to the Node.js process. This example references an environment variable called \"MY_PORT_NUMBER\":\n\n```\n--server MY_PORT_NUMBER $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n"
},
"$:/language/Help/setfield": {
"title": "$:/language/Help/setfield",
"description": "Prepares external tiddlers for use",
"text": "//Note that this command is experimental and may change or be replaced before being finalised//\n\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\n\n```\n--setfield <filter> <fieldname> <templatetitle> <rendertype>\n```\n\nThe parameters are:\n\n* ''filter'' - filter identifying the tiddlers to be affected\n* ''fieldname'' - the field to modify (defaults to \"text\")\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\n* ''rendertype'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\n"
},
"$:/language/Help/unpackplugin": {
"title": "$:/language/Help/unpackplugin",
"description": "Unpack the payload tiddlers from a plugin",
"text": "Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\n\n```\n--unpackplugin <title>\n```\n"
},
"$:/language/Help/verbose": {
"title": "$:/language/Help/verbose",
"description": "Triggers verbose output mode",
"text": "Triggers verbose output, useful for debugging\n\n```\n--verbose\n```\n"
},
"$:/language/Help/version": {
"title": "$:/language/Help/version",
"description": "Displays the version number of TiddlyWiki",
"text": "Displays the version number of TiddlyWiki.\n\n```\n--version\n```\n"
},
"$:/language/Import/Imported/Hint": {
"title": "$:/language/Import/Imported/Hint",
"text": "The following tiddlers were imported:"
},
"$:/language/Import/Listing/Cancel/Caption": {
"title": "$:/language/Import/Listing/Cancel/Caption",
"text": "Cancel"
},
"$:/language/Import/Listing/Hint": {
"title": "$:/language/Import/Listing/Hint",
"text": "These tiddlers are ready to import:"
},
"$:/language/Import/Listing/Import/Caption": {
"title": "$:/language/Import/Listing/Import/Caption",
"text": "Import"
},
"$:/language/Import/Listing/Select/Caption": {
"title": "$:/language/Import/Listing/Select/Caption",
"text": "Select"
},
"$:/language/Import/Listing/Status/Caption": {
"title": "$:/language/Import/Listing/Status/Caption",
"text": "Status"
},
"$:/language/Import/Listing/Title/Caption": {
"title": "$:/language/Import/Listing/Title/Caption",
"text": "Title"
},
"$:/language/Import/Listing/Preview": {
"title": "$:/language/Import/Listing/Preview",
"text": "Preview:"
},
"$:/language/Import/Listing/Preview/Text": {
"title": "$:/language/Import/Listing/Preview/Text",
"text": "Text"
},
"$:/language/Import/Listing/Preview/TextRaw": {
"title": "$:/language/Import/Listing/Preview/TextRaw",
"text": "Text (Raw)"
},
"$:/language/Import/Listing/Preview/Fields": {
"title": "$:/language/Import/Listing/Preview/Fields",
"text": "Fields"
},
"$:/language/Import/Listing/Preview/Diff": {
"title": "$:/language/Import/Listing/Preview/Diff",
"text": "Diff"
},
"$:/language/Import/Listing/Preview/DiffFields": {
"title": "$:/language/Import/Listing/Preview/DiffFields",
"text": "Diff (Fields)"
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible",
"text": "Blocked incompatible or obsolete plugin"
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Version": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Version",
"text": "Blocked plugin (due to incoming <<incoming>> being older than existing <<existing>>)"
},
"$:/language/Import/Upgrader/Plugins/Upgraded": {
"title": "$:/language/Import/Upgrader/Plugins/Upgraded",
"text": "Upgraded plugin from <<incoming>> to <<upgraded>>"
},
"$:/language/Import/Upgrader/State/Suppressed": {
"title": "$:/language/Import/Upgrader/State/Suppressed",
"text": "Blocked temporary state tiddler"
},
"$:/language/Import/Upgrader/System/Suppressed": {
"title": "$:/language/Import/Upgrader/System/Suppressed",
"text": "Blocked system tiddler"
},
"$:/language/Import/Upgrader/System/Warning": {
"title": "$:/language/Import/Upgrader/System/Warning",
"text": "Core module tiddler"
},
"$:/language/Import/Upgrader/System/Alert": {
"title": "$:/language/Import/Upgrader/System/Alert",
"text": "You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable"
},
"$:/language/Import/Upgrader/ThemeTweaks/Created": {
"title": "$:/language/Import/Upgrader/ThemeTweaks/Created",
"text": "Migrated theme tweak from <$text text=<<from>>/>"
},
"$:/language/AboveStory/ClassicPlugin/Warning": {
"title": "$:/language/AboveStory/ClassicPlugin/Warning",
"text": "It looks like you are trying to load a plugin designed for ~TiddlyWiki Classic. Please note that [[these plugins do not work with TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]. ~TiddlyWiki Classic plugins detected:"
},
"$:/language/BinaryWarning/Prompt": {
"title": "$:/language/BinaryWarning/Prompt",
"text": "This tiddler contains binary data"
},
"$:/language/ClassicWarning/Hint": {
"title": "$:/language/ClassicWarning/Hint",
"text": "This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See https://tiddlywiki.com/static/Upgrading.html for more details."
},
"$:/language/ClassicWarning/Upgrade/Caption": {
"title": "$:/language/ClassicWarning/Upgrade/Caption",
"text": "upgrade"
},
"$:/language/CloseAll/Button": {
"title": "$:/language/CloseAll/Button",
"text": "close all"
},
"$:/language/ColourPicker/Recent": {
"title": "$:/language/ColourPicker/Recent",
"text": "Recent:"
},
"$:/language/ConfirmCancelTiddler": {
"title": "$:/language/ConfirmCancelTiddler",
"text": "Do you wish to discard changes to the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmDeleteTiddler": {
"title": "$:/language/ConfirmDeleteTiddler",
"text": "Do you wish to delete the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmOverwriteTiddler": {
"title": "$:/language/ConfirmOverwriteTiddler",
"text": "Do you wish to overwrite the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmEditShadowTiddler": {
"title": "$:/language/ConfirmEditShadowTiddler",
"text": "You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \"<$text text=<<title>>/>\"?"
},
"$:/language/Count": {
"title": "$:/language/Count",
"text": "count"
},
"$:/language/DefaultNewTiddlerTitle": {
"title": "$:/language/DefaultNewTiddlerTitle",
"text": "New Tiddler"
},
"$:/language/Diffs/CountMessage": {
"title": "$:/language/Diffs/CountMessage",
"text": "<<diff-count>> differences"
},
"$:/language/DropMessage": {
"title": "$:/language/DropMessage",
"text": "Drop here (or use the 'Escape' key to cancel)"
},
"$:/language/Encryption/Cancel": {
"title": "$:/language/Encryption/Cancel",
"text": "Cancel"
},
"$:/language/Encryption/ConfirmClearPassword": {
"title": "$:/language/Encryption/ConfirmClearPassword",
"text": "Do you wish to clear the password? This will remove the encryption applied when saving this wiki"
},
"$:/language/Encryption/PromptSetPassword": {
"title": "$:/language/Encryption/PromptSetPassword",
"text": "Set a new password for this TiddlyWiki"
},
"$:/language/Encryption/Username": {
"title": "$:/language/Encryption/Username",
"text": "Username"
},
"$:/language/Encryption/Password": {
"title": "$:/language/Encryption/Password",
"text": "Password"
},
"$:/language/Encryption/RepeatPassword": {
"title": "$:/language/Encryption/RepeatPassword",
"text": "Repeat password"
},
"$:/language/Encryption/PasswordNoMatch": {
"title": "$:/language/Encryption/PasswordNoMatch",
"text": "Passwords do not match"
},
"$:/language/Encryption/SetPassword": {
"title": "$:/language/Encryption/SetPassword",
"text": "Set password"
},
"$:/language/Error/Caption": {
"title": "$:/language/Error/Caption",
"text": "Error"
},
"$:/language/Error/EditConflict": {
"title": "$:/language/Error/EditConflict",
"text": "File changed on server"
},
"$:/language/Error/Filter": {
"title": "$:/language/Error/Filter",
"text": "Filter error"
},
"$:/language/Error/FilterSyntax": {
"title": "$:/language/Error/FilterSyntax",
"text": "Syntax error in filter expression"
},
"$:/language/Error/IsFilterOperator": {
"title": "$:/language/Error/IsFilterOperator",
"text": "Filter Error: Unknown operand for the 'is' filter operator"
},
"$:/language/Error/LoadingPluginLibrary": {
"title": "$:/language/Error/LoadingPluginLibrary",
"text": "Error loading plugin library"
},
"$:/language/Error/NetworkErrorAlert": {
"title": "$:/language/Error/NetworkErrorAlert",
"text": "`<h2>''Network Error''</h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.<br><br>''Any unsaved changes will be automatically synchronised when connectivity is restored''.`"
},
"$:/language/Error/RecursiveTransclusion": {
"title": "$:/language/Error/RecursiveTransclusion",
"text": "Recursive transclusion error in transclude widget"
},
"$:/language/Error/RetrievingSkinny": {
"title": "$:/language/Error/RetrievingSkinny",
"text": "Error retrieving skinny tiddler list"
},
"$:/language/Error/SavingToTWEdit": {
"title": "$:/language/Error/SavingToTWEdit",
"text": "Error saving to TWEdit"
},
"$:/language/Error/WhileSaving": {
"title": "$:/language/Error/WhileSaving",
"text": "Error while saving"
},
"$:/language/Error/XMLHttpRequest": {
"title": "$:/language/Error/XMLHttpRequest",
"text": "XMLHttpRequest error code"
},
"$:/language/InternalJavaScriptError/Title": {
"title": "$:/language/InternalJavaScriptError/Title",
"text": "Internal JavaScript Error"
},
"$:/language/InternalJavaScriptError/Hint": {
"title": "$:/language/InternalJavaScriptError/Hint",
"text": "Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser"
},
"$:/language/InvalidFieldName": {
"title": "$:/language/InvalidFieldName",
"text": "Illegal characters in field name \"<$text text=<<fieldName>>/>\". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`)"
},
"$:/language/LazyLoadingWarning": {
"title": "$:/language/LazyLoadingWarning",
"text": "<p>Trying to load external content from ''<$text text={{!!_canonical_uri}}/>''</p><p>If this message doesn't disappear, either the tiddler content type doesn't match the type of the external content, or you may be using a browser that doesn't support external content for wikis loaded as standalone files. See https://tiddlywiki.com/#ExternalText</p>"
},
"$:/language/LoginToTiddlySpace": {
"title": "$:/language/LoginToTiddlySpace",
"text": "Login to TiddlySpace"
},
"$:/language/Manager/Controls/FilterByTag/None": {
"title": "$:/language/Manager/Controls/FilterByTag/None",
"text": "(none)"
},
"$:/language/Manager/Controls/FilterByTag/Prompt": {
"title": "$:/language/Manager/Controls/FilterByTag/Prompt",
"text": "Filter by tag:"
},
"$:/language/Manager/Controls/Order/Prompt": {
"title": "$:/language/Manager/Controls/Order/Prompt",
"text": "Reverse order"
},
"$:/language/Manager/Controls/Search/Placeholder": {
"title": "$:/language/Manager/Controls/Search/Placeholder",
"text": "Search"
},
"$:/language/Manager/Controls/Search/Prompt": {
"title": "$:/language/Manager/Controls/Search/Prompt",
"text": "Search:"
},
"$:/language/Manager/Controls/Show/Option/Tags": {
"title": "$:/language/Manager/Controls/Show/Option/Tags",
"text": "tags"
},
"$:/language/Manager/Controls/Show/Option/Tiddlers": {
"title": "$:/language/Manager/Controls/Show/Option/Tiddlers",
"text": "tiddlers"
},
"$:/language/Manager/Controls/Show/Prompt": {
"title": "$:/language/Manager/Controls/Show/Prompt",
"text": "Show:"
},
"$:/language/Manager/Controls/Sort/Prompt": {
"title": "$:/language/Manager/Controls/Sort/Prompt",
"text": "Sort by:"
},
"$:/language/Manager/Item/Colour": {
"title": "$:/language/Manager/Item/Colour",
"text": "Colour"
},
"$:/language/Manager/Item/Fields": {
"title": "$:/language/Manager/Item/Fields",
"text": "Fields"
},
"$:/language/Manager/Item/Icon/None": {
"title": "$:/language/Manager/Item/Icon/None",
"text": "(none)"
},
"$:/language/Manager/Item/Icon": {
"title": "$:/language/Manager/Item/Icon",
"text": "Icon"
},
"$:/language/Manager/Item/RawText": {
"title": "$:/language/Manager/Item/RawText",
"text": "Raw text"
},
"$:/language/Manager/Item/Tags": {
"title": "$:/language/Manager/Item/Tags",
"text": "Tags"
},
"$:/language/Manager/Item/Tools": {
"title": "$:/language/Manager/Item/Tools",
"text": "Tools"
},
"$:/language/Manager/Item/WikifiedText": {
"title": "$:/language/Manager/Item/WikifiedText",
"text": "Wikified text"
},
"$:/language/MissingTiddler/Hint": {
"title": "$:/language/MissingTiddler/Hint",
"text": "Missing tiddler \"<$text text=<<currentTiddler>>/>\" -- click {{||$:/core/ui/Buttons/edit}} to create"
},
"$:/language/No": {
"title": "$:/language/No",
"text": "No"
},
"$:/language/OfficialPluginLibrary": {
"title": "$:/language/OfficialPluginLibrary",
"text": "Official ~TiddlyWiki Plugin Library"
},
"$:/language/OfficialPluginLibrary/Hint": {
"title": "$:/language/OfficialPluginLibrary/Hint",
"text": "The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team."
},
"$:/language/PluginReloadWarning": {
"title": "$:/language/PluginReloadWarning",
"text": "Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect"
},
"$:/language/RecentChanges/DateFormat": {
"title": "$:/language/RecentChanges/DateFormat",
"text": "DDth MMM YYYY"
},
"$:/language/SystemTiddler/Tooltip": {
"title": "$:/language/SystemTiddler/Tooltip",
"text": "This is a system tiddler"
},
"$:/language/SystemTiddlers/Include/Prompt": {
"title": "$:/language/SystemTiddlers/Include/Prompt",
"text": "Include system tiddlers"
},
"$:/language/TagManager/Colour/Heading": {
"title": "$:/language/TagManager/Colour/Heading",
"text": "Colour"
},
"$:/language/TagManager/Count/Heading": {
"title": "$:/language/TagManager/Count/Heading",
"text": "Count"
},
"$:/language/TagManager/Icon/Heading": {
"title": "$:/language/TagManager/Icon/Heading",
"text": "Icon"
},
"$:/language/TagManager/Icons/None": {
"title": "$:/language/TagManager/Icons/None",
"text": "None"
},
"$:/language/TagManager/Info/Heading": {
"title": "$:/language/TagManager/Info/Heading",
"text": "Info"
},
"$:/language/TagManager/Tag/Heading": {
"title": "$:/language/TagManager/Tag/Heading",
"text": "Tag"
},
"$:/language/Tiddler/DateFormat": {
"title": "$:/language/Tiddler/DateFormat",
"text": "DDth MMM YYYY at hh12:0mmam"
},
"$:/language/UnsavedChangesWarning": {
"title": "$:/language/UnsavedChangesWarning",
"text": "You have unsaved changes in TiddlyWiki"
},
"$:/language/Yes": {
"title": "$:/language/Yes",
"text": "Yes"
},
"$:/language/Modals/Download": {
"title": "$:/language/Modals/Download",
"subtitle": "Download changes",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "https://tiddlywiki.com/static/DownloadingChanges.html",
"text": "Your browser only supports manual saving.\n\nTo save your modified wiki, right click on the download link below and select \"Download file\" or \"Save file\", and then choose the folder and filename.\n\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\n\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\n"
},
"$:/language/Modals/SaveInstructions": {
"title": "$:/language/Modals/SaveInstructions",
"subtitle": "Save your work",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "https://tiddlywiki.com/static/SavingChanges.html",
"text": "Your changes to this wiki need to be saved as a ~TiddlyWiki HTML file.\n\n!!! Desktop browsers\n\n# Select ''Save As'' from the ''File'' menu\n# Choose a filename and location\n#* Some browsers also require you to explicitly specify the file saving format as ''Webpage, HTML only'' or similar\n# Close this tab\n\n!!! Smartphone browsers\n\n# Create a bookmark to this page\n#* If you've got iCloud or Google Sync set up then the bookmark will automatically sync to your desktop where you can open it and save it as above\n# Close this tab\n\n//If you open the bookmark again in Mobile Safari you will see this message again. If you want to go ahead and use the file, just click the ''close'' button below//\n"
},
"$:/config/NewJournal/Title": {
"title": "$:/config/NewJournal/Title",
"text": "DDth MMM YYYY"
},
"$:/config/NewJournal/Text": {
"title": "$:/config/NewJournal/Text",
"text": ""
},
"$:/config/NewJournal/Tags": {
"title": "$:/config/NewJournal/Tags",
"tags": "Journal"
},
"$:/language/Notifications/Save/Done": {
"title": "$:/language/Notifications/Save/Done",
"text": "Saved wiki"
},
"$:/language/Notifications/Save/Starting": {
"title": "$:/language/Notifications/Save/Starting",
"text": "Starting to save wiki"
},
"$:/language/Notifications/CopiedToClipboard/Succeeded": {
"title": "$:/language/Notifications/CopiedToClipboard/Succeeded",
"text": "Copied to clipboard!"
},
"$:/language/Notifications/CopiedToClipboard/Failed": {
"title": "$:/language/Notifications/CopiedToClipboard/Failed",
"text": "Failed to copy to clipboard!"
},
"$:/language/Search/DefaultResults/Caption": {
"title": "$:/language/Search/DefaultResults/Caption",
"text": "List"
},
"$:/language/Search/Filter/Caption": {
"title": "$:/language/Search/Filter/Caption",
"text": "Filter"
},
"$:/language/Search/Filter/Hint": {
"title": "$:/language/Search/Filter/Hint",
"text": "Search via a [[filter expression|https://tiddlywiki.com/static/Filters.html]]"
},
"$:/language/Search/Filter/Matches": {
"title": "$:/language/Search/Filter/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Matches": {
"title": "$:/language/Search/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Matches/All": {
"title": "$:/language/Search/Matches/All",
"text": "All matches:"
},
"$:/language/Search/Matches/Title": {
"title": "$:/language/Search/Matches/Title",
"text": "Title matches:"
},
"$:/language/Search/Search": {
"title": "$:/language/Search/Search",
"text": "Search"
},
"$:/language/Search/Search/TooShort": {
"title": "$:/language/Search/Search/TooShort",
"text": "Search text too short"
},
"$:/language/Search/Shadows/Caption": {
"title": "$:/language/Search/Shadows/Caption",
"text": "Shadows"
},
"$:/language/Search/Shadows/Hint": {
"title": "$:/language/Search/Shadows/Hint",
"text": "Search for shadow tiddlers"
},
"$:/language/Search/Shadows/Matches": {
"title": "$:/language/Search/Shadows/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Standard/Caption": {
"title": "$:/language/Search/Standard/Caption",
"text": "Standard"
},
"$:/language/Search/Standard/Hint": {
"title": "$:/language/Search/Standard/Hint",
"text": "Search for standard tiddlers"
},
"$:/language/Search/Standard/Matches": {
"title": "$:/language/Search/Standard/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/System/Caption": {
"title": "$:/language/Search/System/Caption",
"text": "System"
},
"$:/language/Search/System/Hint": {
"title": "$:/language/Search/System/Hint",
"text": "Search for system tiddlers"
},
"$:/language/Search/System/Matches": {
"title": "$:/language/Search/System/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/SideBar/All/Caption": {
"title": "$:/language/SideBar/All/Caption",
"text": "All"
},
"$:/language/SideBar/Contents/Caption": {
"title": "$:/language/SideBar/Contents/Caption",
"text": "Contents"
},
"$:/language/SideBar/Drafts/Caption": {
"title": "$:/language/SideBar/Drafts/Caption",
"text": "Drafts"
},
"$:/language/SideBar/Explorer/Caption": {
"title": "$:/language/SideBar/Explorer/Caption",
"text": "Explorer"
},
"$:/language/SideBar/Missing/Caption": {
"title": "$:/language/SideBar/Missing/Caption",
"text": "Missing"
},
"$:/language/SideBar/More/Caption": {
"title": "$:/language/SideBar/More/Caption",
"text": "More"
},
"$:/language/SideBar/Open/Caption": {
"title": "$:/language/SideBar/Open/Caption",
"text": "Open"
},
"$:/language/SideBar/Orphans/Caption": {
"title": "$:/language/SideBar/Orphans/Caption",
"text": "Orphans"
},
"$:/language/SideBar/Recent/Caption": {
"title": "$:/language/SideBar/Recent/Caption",
"text": "Recent"
},
"$:/language/SideBar/Shadows/Caption": {
"title": "$:/language/SideBar/Shadows/Caption",
"text": "Shadows"
},
"$:/language/SideBar/System/Caption": {
"title": "$:/language/SideBar/System/Caption",
"text": "System"
},
"$:/language/SideBar/Tags/Caption": {
"title": "$:/language/SideBar/Tags/Caption",
"text": "Tags"
},
"$:/language/SideBar/Tags/Untagged/Caption": {
"title": "$:/language/SideBar/Tags/Untagged/Caption",
"text": "untagged"
},
"$:/language/SideBar/Tools/Caption": {
"title": "$:/language/SideBar/Tools/Caption",
"text": "Tools"
},
"$:/language/SideBar/Types/Caption": {
"title": "$:/language/SideBar/Types/Caption",
"text": "Types"
},
"$:/SiteSubtitle": {
"title": "$:/SiteSubtitle",
"text": "a non-linear personal web notebook"
},
"$:/SiteTitle": {
"title": "$:/SiteTitle",
"text": "My ~TiddlyWiki"
},
"$:/language/Snippets/ListByTag": {
"title": "$:/language/Snippets/ListByTag",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "List of tiddlers by tag",
"text": "<<list-links \"[tag[task]sort[title]]\">>\n"
},
"$:/language/Snippets/MacroDefinition": {
"title": "$:/language/Snippets/MacroDefinition",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Macro definition",
"text": "\\define macroName(param1:\"default value\",param2)\nText of the macro\n\\end\n"
},
"$:/language/Snippets/Table4x3": {
"title": "$:/language/Snippets/Table4x3",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Table with 4 columns by 3 rows",
"text": "|! |!Alpha |!Beta |!Gamma |!Delta |\n|!One | | | | |\n|!Two | | | | |\n|!Three | | | | |\n"
},
"$:/language/Snippets/TableOfContents": {
"title": "$:/language/Snippets/TableOfContents",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Table of Contents",
"text": "<div class=\"tc-table-of-contents\">\n\n<<toc-selective-expandable 'TableOfContents'>>\n\n</div>"
},
"$:/language/ThemeTweaks/ThemeTweaks": {
"title": "$:/language/ThemeTweaks/ThemeTweaks",
"text": "Theme Tweaks"
},
"$:/language/ThemeTweaks/ThemeTweaks/Hint": {
"title": "$:/language/ThemeTweaks/ThemeTweaks/Hint",
"text": "You can tweak certain aspects of the ''Vanilla'' theme."
},
"$:/language/ThemeTweaks/Options": {
"title": "$:/language/ThemeTweaks/Options",
"text": "Options"
},
"$:/language/ThemeTweaks/Options/SidebarLayout": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout",
"text": "Sidebar layout"
},
"$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid",
"text": "Fixed story, fluid sidebar"
},
"$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed",
"text": "Fluid story, fixed sidebar"
},
"$:/language/ThemeTweaks/Options/StickyTitles": {
"title": "$:/language/ThemeTweaks/Options/StickyTitles",
"text": "Sticky titles"
},
"$:/language/ThemeTweaks/Options/StickyTitles/Hint": {
"title": "$:/language/ThemeTweaks/Options/StickyTitles/Hint",
"text": "Causes tiddler titles to \"stick\" to the top of the browser window"
},
"$:/language/ThemeTweaks/Options/CodeWrapping": {
"title": "$:/language/ThemeTweaks/Options/CodeWrapping",
"text": "Wrap long lines in code blocks"
},
"$:/language/ThemeTweaks/Settings": {
"title": "$:/language/ThemeTweaks/Settings",
"text": "Settings"
},
"$:/language/ThemeTweaks/Settings/FontFamily": {
"title": "$:/language/ThemeTweaks/Settings/FontFamily",
"text": "Font family"
},
"$:/language/ThemeTweaks/Settings/CodeFontFamily": {
"title": "$:/language/ThemeTweaks/Settings/CodeFontFamily",
"text": "Code font family"
},
"$:/language/ThemeTweaks/Settings/EditorFontFamily": {
"title": "$:/language/ThemeTweaks/Settings/EditorFontFamily",
"text": "Editor font family"
},
"$:/language/ThemeTweaks/Settings/BackgroundImage": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImage",
"text": "Page background image"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment",
"text": "Page background image attachment"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll",
"text": "Scroll with tiddlers"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed",
"text": "Fixed to window"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize",
"text": "Page background image size"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto",
"text": "Auto"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover",
"text": "Cover"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain",
"text": "Contain"
},
"$:/language/ThemeTweaks/Metrics": {
"title": "$:/language/ThemeTweaks/Metrics",
"text": "Sizes"
},
"$:/language/ThemeTweaks/Metrics/FontSize": {
"title": "$:/language/ThemeTweaks/Metrics/FontSize",
"text": "Font size"
},
"$:/language/ThemeTweaks/Metrics/LineHeight": {
"title": "$:/language/ThemeTweaks/Metrics/LineHeight",
"text": "Line height"
},
"$:/language/ThemeTweaks/Metrics/BodyFontSize": {
"title": "$:/language/ThemeTweaks/Metrics/BodyFontSize",
"text": "Font size for tiddler body"
},
"$:/language/ThemeTweaks/Metrics/BodyLineHeight": {
"title": "$:/language/ThemeTweaks/Metrics/BodyLineHeight",
"text": "Line height for tiddler body"
},
"$:/language/ThemeTweaks/Metrics/StoryLeft": {
"title": "$:/language/ThemeTweaks/Metrics/StoryLeft",
"text": "Story left position"
},
"$:/language/ThemeTweaks/Metrics/StoryLeft/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint",
"text": "how far the left margin of the story river<br>(tiddler area) is from the left of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryTop": {
"title": "$:/language/ThemeTweaks/Metrics/StoryTop",
"text": "Story top position"
},
"$:/language/ThemeTweaks/Metrics/StoryTop/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryTop/Hint",
"text": "how far the top margin of the story river<br>is from the top of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryRight": {
"title": "$:/language/ThemeTweaks/Metrics/StoryRight",
"text": "Story right"
},
"$:/language/ThemeTweaks/Metrics/StoryRight/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryRight/Hint",
"text": "how far the left margin of the sidebar <br>is from the left of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryWidth": {
"title": "$:/language/ThemeTweaks/Metrics/StoryWidth",
"text": "Story width"
},
"$:/language/ThemeTweaks/Metrics/StoryWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint",
"text": "the overall width of the story river"
},
"$:/language/ThemeTweaks/Metrics/TiddlerWidth": {
"title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth",
"text": "Tiddler width"
},
"$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint",
"text": "within the story river"
},
"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint",
"text": "Sidebar breakpoint"
},
"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint",
"text": "the minimum page width at which the story<br>river and sidebar will appear side by side"
},
"$:/language/ThemeTweaks/Metrics/SidebarWidth": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarWidth",
"text": "Sidebar width"
},
"$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint",
"text": "the width of the sidebar in fluid-fixed layout"
},
"$:/language/TiddlerInfo/Advanced/Caption": {
"title": "$:/language/TiddlerInfo/Advanced/Caption",
"text": "Advanced"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint",
"text": "none"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading",
"text": "Plugin Details"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint",
"text": "This plugin contains the following shadow tiddlers:"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading",
"text": "Shadow Status"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is not a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source",
"text": "It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint",
"text": "It is overridden by an ordinary tiddler"
},
"$:/language/TiddlerInfo/Fields/Caption": {
"title": "$:/language/TiddlerInfo/Fields/Caption",
"text": "Fields"
},
"$:/language/TiddlerInfo/List/Caption": {
"title": "$:/language/TiddlerInfo/List/Caption",
"text": "List"
},
"$:/language/TiddlerInfo/List/Empty": {
"title": "$:/language/TiddlerInfo/List/Empty",
"text": "This tiddler does not have a list"
},
"$:/language/TiddlerInfo/Listed/Caption": {
"title": "$:/language/TiddlerInfo/Listed/Caption",
"text": "Listed"
},
"$:/language/TiddlerInfo/Listed/Empty": {
"title": "$:/language/TiddlerInfo/Listed/Empty",
"text": "This tiddler is not listed by any others"
},
"$:/language/TiddlerInfo/References/Caption": {
"title": "$:/language/TiddlerInfo/References/Caption",
"text": "References"
},
"$:/language/TiddlerInfo/References/Empty": {
"title": "$:/language/TiddlerInfo/References/Empty",
"text": "No tiddlers link to this one"
},
"$:/language/TiddlerInfo/Tagging/Caption": {
"title": "$:/language/TiddlerInfo/Tagging/Caption",
"text": "Tagging"
},
"$:/language/TiddlerInfo/Tagging/Empty": {
"title": "$:/language/TiddlerInfo/Tagging/Empty",
"text": "No tiddlers are tagged with this one"
},
"$:/language/TiddlerInfo/Tools/Caption": {
"title": "$:/language/TiddlerInfo/Tools/Caption",
"text": "Tools"
},
"$:/language/Docs/Types/application/javascript": {
"title": "$:/language/Docs/Types/application/javascript",
"description": "JavaScript code",
"name": "application/javascript",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/application/json": {
"title": "$:/language/Docs/Types/application/json",
"description": "JSON data",
"name": "application/json",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/application/x-tiddler-dictionary": {
"title": "$:/language/Docs/Types/application/x-tiddler-dictionary",
"description": "Data dictionary",
"name": "application/x-tiddler-dictionary",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/image/gif": {
"title": "$:/language/Docs/Types/image/gif",
"description": "GIF image",
"name": "image/gif",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/jpeg": {
"title": "$:/language/Docs/Types/image/jpeg",
"description": "JPEG image",
"name": "image/jpeg",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/png": {
"title": "$:/language/Docs/Types/image/png",
"description": "PNG image",
"name": "image/png",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/svg+xml": {
"title": "$:/language/Docs/Types/image/svg+xml",
"description": "Structured Vector Graphics image",
"name": "image/svg+xml",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/x-icon": {
"title": "$:/language/Docs/Types/image/x-icon",
"description": "ICO format icon file",
"name": "image/x-icon",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/text/css": {
"title": "$:/language/Docs/Types/text/css",
"description": "Static stylesheet",
"name": "text/css",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/text/html": {
"title": "$:/language/Docs/Types/text/html",
"description": "HTML markup",
"name": "text/html",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/plain": {
"title": "$:/language/Docs/Types/text/plain",
"description": "Plain text",
"name": "text/plain",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/vnd.tiddlywiki": {
"title": "$:/language/Docs/Types/text/vnd.tiddlywiki",
"description": "TiddlyWiki 5",
"name": "text/vnd.tiddlywiki",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/x-tiddlywiki": {
"title": "$:/language/Docs/Types/text/x-tiddlywiki",
"description": "TiddlyWiki Classic",
"name": "text/x-tiddlywiki",
"group": "Text",
"group-sort": "0"
},
"$:/languages/en-GB/icon": {
"title": "$:/languages/en-GB/icon",
"type": "image/svg+xml",
"text": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 30\" width=\"1200\" height=\"600\">\n<clipPath id=\"t\">\n\t<path d=\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\"/>\n</clipPath>\n<path d=\"M0,0 v30 h60 v-30 z\" fill=\"#00247d\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" clip-path=\"url(#t)\" stroke=\"#cf142b\" stroke-width=\"4\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#fff\" stroke-width=\"10\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#cf142b\" stroke-width=\"6\"/>\n</svg>\n"
},
"$:/languages/en-GB": {
"title": "$:/languages/en-GB",
"name": "en-GB",
"description": "English (British)",
"author": "JeremyRuston",
"core-version": ">=5.0.0\"",
"text": "Stub pseudo-plugin for the default language"
},
"$:/core/modules/commander.js": {
"title": "$:/core/modules/commander.js",
"text": "/*\\\ntitle: $:/core/modules/commander.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Commander class is a command interpreter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a sequence of commands\n\tcommandTokens: an array of command string tokens\n\twiki: reference to the wiki store object\n\tstreams: {output:, error:}, each of which has a write(string) method\n\tcallback: a callback invoked as callback(err) where err is null if there was no error\n*/\nvar Commander = function(commandTokens,callback,wiki,streams) {\n\tvar path = require(\"path\");\n\tthis.commandTokens = commandTokens;\n\tthis.nextToken = 0;\n\tthis.callback = callback;\n\tthis.wiki = wiki;\n\tthis.streams = streams;\n\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\n};\n\n/*\nLog a string if verbose flag is set\n*/\nCommander.prototype.log = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str + \"\\n\");\n\t}\n};\n\n/*\nWrite a string if verbose flag is set\n*/\nCommander.prototype.write = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str);\n\t}\n};\n\n/*\nAdd a string of tokens to the command queue\n*/\nCommander.prototype.addCommandTokens = function(commandTokens) {\n\tvar params = commandTokens.slice(0);\n\tparams.unshift(0);\n\tparams.unshift(this.nextToken);\n\tArray.prototype.splice.apply(this.commandTokens,params);\n};\n\n/*\nExecute the sequence of commands and invoke a callback on completion\n*/\nCommander.prototype.execute = function() {\n\tthis.executeNextCommand();\n};\n\n/*\nExecute the next command in the sequence\n*/\nCommander.prototype.executeNextCommand = function() {\n\tvar self = this;\n\t// Invoke the callback if there are no more commands\n\tif(this.nextToken >= this.commandTokens.length) {\n\t\tthis.callback(null);\n\t} else {\n\t\t// Get and check the command token\n\t\tvar commandName = this.commandTokens[this.nextToken++];\n\t\tif(commandName.substr(0,2) !== \"--\") {\n\t\t\tthis.callback(\"Missing command: \" + commandName);\n\t\t} else {\n\t\t\tcommandName = commandName.substr(2); // Trim off the --\n\t\t\t// Accumulate the parameters to the command\n\t\t\tvar params = [];\n\t\t\twhile(this.nextToken < this.commandTokens.length && \n\t\t\t\tthis.commandTokens[this.nextToken].substr(0,2) !== \"--\") {\n\t\t\t\tparams.push(this.commandTokens[this.nextToken++]);\n\t\t\t}\n\t\t\t// Get the command info\n\t\t\tvar command = $tw.commands[commandName],\n\t\t\t\tc,err;\n\t\t\tif(!command) {\n\t\t\t\tthis.callback(\"Unknown command: \" + commandName);\n\t\t\t} else {\n\t\t\t\tif(this.verbose) {\n\t\t\t\t\tthis.streams.output.write(\"Executing command: \" + commandName + \" \" + params.join(\" \") + \"\\n\");\n\t\t\t\t}\n\t\t\t\t// Parse named parameters if required\n\t\t\t\tif(command.info.namedParameterMode) {\n\t\t\t\t\tparams = this.extractNamedParameters(params,command.info.mandatoryParameters);\n\t\t\t\t\tif(typeof params === \"string\") {\n\t\t\t\t\t\treturn this.callback(params);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(command.info.synchronous) {\n\t\t\t\t\t// Synchronous command\n\t\t\t\t\tc = new command.Command(params,this);\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.executeNextCommand();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Asynchronous command\n\t\t\t\t\tc = new command.Command(params,this,function(err) {\n\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\tself.callback(err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.executeNextCommand();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nGiven an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, returns a hashmap of values or a string if error\n*/\nCommander.prototype.extractNamedParameters = function(params,mandatoryParameters) {\n\tmandatoryParameters = mandatoryParameters || [];\n\tvar errors = [],\n\t\tparamsByName = Object.create(null);\n\t// Extract the parameters\n\t$tw.utils.each(params,function(param) {\n\t\tvar index = param.indexOf(\"=\");\n\t\tif(index < 1) {\n\t\t\terrors.push(\"malformed named parameter: '\" + param + \"'\");\n\t\t}\n\t\tparamsByName[param.slice(0,index)] = $tw.utils.trim(param.slice(index+1));\n\t});\n\t// Check the mandatory parameters are present\n\t$tw.utils.each(mandatoryParameters,function(mandatoryParameter) {\n\t\tif(!$tw.utils.hop(paramsByName,mandatoryParameter)) {\n\t\t\terrors.push(\"missing mandatory parameter: '\" + mandatoryParameter + \"'\");\n\t\t}\n\t});\n\t// Return any errors\n\tif(errors.length > 0) {\n\t\treturn errors.join(\" and\\n\");\n\t} else {\n\t\treturn paramsByName;\t\t\n\t}\n};\n\nCommander.initCommands = function(moduleType) {\n\tmoduleType = moduleType || \"command\";\n\t$tw.commands = {};\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tvar c = $tw.commands[module.info.name] = {};\n\t\t// Add the methods defined by the module\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\tc[f] = module[f];\n\t\t\t}\n\t\t}\n\t});\n};\n\nexports.Commander = Commander;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/commands/build.js": {
"title": "$:/core/modules/commands/build.js",
"text": "/*\\\ntitle: $:/core/modules/commands/build.js\ntype: application/javascript\nmodule-type: command\n\nCommand to build a build target\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"build\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Get the build targets defined in the wiki\n\tvar buildTargets = $tw.boot.wikiInfo.build;\n\tif(!buildTargets) {\n\t\treturn \"No build targets defined\";\n\t}\n\t// Loop through each of the specified targets\n\tvar targets;\n\tif(this.params.length > 0) {\n\t\ttargets = this.params;\n\t} else {\n\t\ttargets = Object.keys(buildTargets);\n\t}\n\tfor(var targetIndex=0; targetIndex<targets.length; targetIndex++) {\n\t\tvar target = targets[targetIndex],\n\t\t\tcommands = buildTargets[target];\n\t\tif(!commands) {\n\t\t\treturn \"Build target '\" + target + \"' not found\";\n\t\t}\n\t\t// Add the commands to the queue\n\t\tthis.commander.addCommandTokens(commands);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/clearpassword.js": {
"title": "$:/core/modules/commands/clearpassword.js",
"text": "/*\\\ntitle: $:/core/modules/commands/clearpassword.js\ntype: application/javascript\nmodule-type: command\n\nClear password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"clearpassword\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\t$tw.crypto.setPassword(null);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/deletetiddlers.js": {
"title": "$:/core/modules/commands/deletetiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/deletetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to delete tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"deletetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filter\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\twiki.deleteTiddler(title);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/editions.js": {
"title": "$:/core/modules/commands/editions.js",
"text": "/*\\\ntitle: $:/core/modules/commands/editions.js\ntype: application/javascript\nmodule-type: command\n\nCommand to list the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"editions\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\t// Output the list\n\tthis.commander.streams.output.write(\"Available editions:\\n\\n\");\n\tvar editionInfo = $tw.utils.getEditionInfo();\n\t$tw.utils.each(editionInfo,function(info,name) {\n\t\tself.commander.streams.output.write(\" \" + name + \": \" + info.description + \"\\n\");\n\t});\n\tthis.commander.streams.output.write(\"\\n\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/fetch.js": {
"title": "$:/core/modules/commands/fetch.js",
"text": "/*\\\ntitle: $:/core/modules/commands/fetch.js\ntype: application/javascript\nmodule-type: command\n\nCommands to fetch external tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"fetch\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing subcommand and url\";\n\t}\n\tswitch(this.params[0]) {\n\t\tcase \"raw-file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turl: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turl: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"raw-files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t}\n\treturn null;\n};\n\nCommand.prototype.fetchFiles = function(options) {\n\tvar self = this;\n\t// Get the list of URLs\n\tvar urls;\n\tif(options.url) {\n\t\turls = [options.url]\n\t} else if(options.urlFilter) {\n\t\turls = $tw.wiki.filterTiddlers(options.urlFilter);\n\t} else {\n\t\treturn \"Missing URL\";\n\t}\n\t// Process each URL in turn\n\tvar next = 0;\n\tvar getNextFile = function(err) {\n\t\tif(err) {\n\t\t\treturn options.callback(err);\n\t\t}\n\t\tif(next < urls.length) {\n\t\t\tself.fetchFile(urls[next++],options,getNextFile);\n\t\t} else {\n\t\t\toptions.callback(null);\n\t\t}\n\t};\n\tgetNextFile(null);\n\t// Success\n\treturn null;\n};\n\nCommand.prototype.fetchFile = function(url,options,callback,redirectCount) {\n\tif(redirectCount > 10) {\n\t\treturn callback(\"Error too many redirects retrieving \" + url);\n\t}\n\tvar self = this,\n\t\tlib = url.substr(0,8) === \"https://\" ? require(\"https\") : require(\"http\");\n\tlib.get(url).on(\"response\",function(response) {\n\t var type = (response.headers[\"content-type\"] || \"\").split(\";\")[0],\n\t \tdata = [];\n\t self.commander.write(\"Reading \" + url + \": \");\n\t response.on(\"data\",function(chunk) {\n\t data.push(chunk);\n\t self.commander.write(\".\");\n\t });\n\t response.on(\"end\",function() {\n\t self.commander.write(\"\\n\");\n\t if(response.statusCode === 200) {\n\t\t self.processBody(Buffer.concat(data),type,options,url);\n\t\t callback(null);\n\t } else {\n\t \tif(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {\n\t \t\treturn self.fetchFile(response.headers.location,options,callback,redirectCount + 1);\n\t \t} else {\n\t\t \treturn callback(\"Error \" + response.statusCode + \" retrieving \" + url)\t \t\t\n\t \t}\n\t }\n\t \t});\n\t \tresponse.on(\"error\",function(e) {\n\t\t\tconsole.log(\"Error on GET request: \" + e);\n\t\t\tcallback(e);\n\t \t});\n\t});\n\treturn null;\n};\n\nCommand.prototype.processBody = function(body,type,options,url) {\n\tvar self = this;\n\t// Collect the tiddlers in a wiki\n\tvar incomingWiki = new $tw.Wiki();\n\tif(options.raw) {\n\t\tvar typeInfo = type ? $tw.config.contentTypeInfo[type] : null,\n\t\t\tencoding = typeInfo ? typeInfo.encoding : \"utf8\";\n\t\tincomingWiki.addTiddler(new $tw.Tiddler({\n\t\t\ttitle: url,\n\t\t\ttype: type,\n\t\t\ttext: body.toString(encoding)\n\t\t}));\n\t} else {\n\t\t// Deserialise the file to extract the tiddlers\n\t\tvar tiddlers = this.commander.wiki.deserializeTiddlers(type || \"text/html\",body.toString(\"utf8\"),{});\n\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\tincomingWiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t});\n\t}\n\t// Filter the tiddlers to select the ones we want\n\tvar filteredTitles = incomingWiki.filterTiddlers(options.importFilter || \"[all[tiddlers]]\");\n\t// Import the selected tiddlers\n\tvar count = 0;\n\tincomingWiki.each(function(tiddler,title) {\n\t\tif(filteredTitles.indexOf(title) !== -1) {\n\t\t\tvar newTiddler;\n\t\t\tif(options.transformFilter) {\n\t\t\t\tvar transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [\"\"])[0];\n\t\t\t\tif(transformedTitle) {\n\t\t\t\t\tself.commander.log(\"Importing \" + title + \" as \" + transformedTitle)\n\t\t\t\t\tnewTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.commander.log(\"Importing \" + title)\n\t\t\t\tnewTiddler = tiddler;\n\t\t\t}\n\t\t\tself.commander.wiki.importTiddler(newTiddler);\n\t\t\tcount++;\n\t\t}\n\t});\n\tself.commander.log(\"Imported \" + count + \" tiddlers\")\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/help.js": {
"title": "$:/core/modules/commands/help.js",
"text": "/*\\\ntitle: $:/core/modules/commands/help.js\ntype: application/javascript\nmodule-type: command\n\nHelp command\n\n\\*/\n(function(){\n\n/*jshint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"help\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar subhelp = this.params[0] || \"default\",\n\t\thelpBase = \"$:/language/Help/\",\n\t\ttext;\n\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\n\t\tsubhelp = \"notfound\";\n\t}\n\t// Wikify the help as formatted text (ie block elements generate newlines)\n\ttext = this.commander.wiki.renderTiddler(\"text/plain-formatted\",helpBase + subhelp);\n\t// Remove any leading linebreaks\n\ttext = text.replace(/^(\\r?\\n)*/g,\"\");\n\tthis.commander.streams.output.write(text);\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/import.js": {
"title": "$:/core/modules/commands/import.js",
"text": "/*\\\ntitle: $:/core/modules/commands/import.js\ntype: application/javascript\nmodule-type: command\n\nCommand to import tiddlers from a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"import\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 2) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar filename = self.params[0],\n\t\tdeserializer = self.params[1],\n\t\ttitle = self.params[2] || filename,\n\t\tencoding = self.params[3] || \"utf8\",\n\t\ttext = fs.readFileSync(filename,encoding),\n\t\ttiddlers = this.commander.wiki.deserializeTiddlers(null,text,{title: title},{deserializer: deserializer});\n\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t});\n\tthis.commander.log(tiddlers.length + \" tiddler(s) imported\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/init.js": {
"title": "$:/core/modules/commands/init.js",
"text": "/*\\\ntitle: $:/core/modules/commands/init.js\ntype: application/javascript\nmodule-type: command\n\nCommand to initialise an empty wiki folder\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"init\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\t// Check that we don't already have a valid wiki folder\n\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\n\t\treturn \"Wiki folder is not empty\";\n\t}\n\t// Loop through each of the specified editions\n\tvar editions = this.params.length > 0 ? this.params : [\"empty\"];\n\tfor(var editionIndex=0; editionIndex<editions.length; editionIndex++) {\n\t\tvar editionName = editions[editionIndex];\n\t\t// Check the edition exists\n\t\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\n\t\tif(!$tw.utils.isDirectory(editionPath)) {\n\t\t\treturn \"Edition '\" + editionName + \"' not found\";\n\t\t}\n\t\t// Copy the edition content\n\t\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\n\t\tif(!err) {\n\t\t\tthis.commander.streams.output.write(\"Copied edition '\" + editionName + \"' to \" + $tw.boot.wikiPath + \"\\n\");\n\t\t} else {\n\t\t\treturn err;\n\t\t}\n\t}\n\t// Tweak the tiddlywiki.info to remove any included wikis\n\tvar packagePath = $tw.boot.wikiPath + \"/tiddlywiki.info\",\n\t\tpackageJson = JSON.parse(fs.readFileSync(packagePath));\n\tdelete packageJson.includeWikis;\n\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/listen.js": {
"title": "$:/core/modules/commands/listen.js",
"text": "/*\\\ntitle: $:/core/modules/commands/listen.js\ntype: application/javascript\nmodule-type: command\n\nListen for HTTP requests and serve tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"listen\",\n\tsynchronous: true,\n\tnamedParameterMode: true,\n\tmandatoryParameters: [],\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: self.params\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/load.js": {
"title": "$:/core/modules/commands/load.js",
"text": "/*\\\ntitle: $:/core/modules/commands/load.js\ntype: application/javascript\nmodule-type: command\n\nCommand to load tiddlers from a file or directory\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"load\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar tiddlers = $tw.loadTiddlersFromPath(self.params[0]),\n\t\tcount = 0;\n\t$tw.utils.each(tiddlers,function(tiddlerInfo) {\n\t\t$tw.utils.each(tiddlerInfo.tiddlers,function(tiddler) {\n\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t\t\tcount++;\n\t\t});\n\t});\n\tif(!count && self.params[1] !== \"noerror\") {\n\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t} else {\n\t\tself.callback(null);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/makelibrary.js": {
"title": "$:/core/modules/commands/makelibrary.js",
"text": "/*\\\ntitle: $:/core/modules/commands/makelibrary.js\ntype: application/javascript\nmodule-type: command\n\nCommand to pack all of the plugins in the library into a plugin tiddler of type \"library\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"makelibrary\",\n\tsynchronous: true\n};\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar wiki = this.commander.wiki,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = fs.readdirSync(folder);\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = fs.readdirSync(folder);\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.pluginsPath,$tw.config.pluginsEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.themesPath,$tw.config.themesEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,$tw.config.languagesEnvVar),collectPlugins);\n\t// Save the upgrade library tiddler\n\tvar pluginFields = {\n\t\ttitle: upgradeLibraryTitle,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"library\",\n\t\t\"text\": JSON.stringify({tiddlers: tiddlers})\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/output.js": {
"title": "$:/core/modules/commands/output.js",
"text": "/*\\\ntitle: $:/core/modules/commands/output.js\ntype: application/javascript\nmodule-type: command\n\nCommand to set the default output location (defaults to current working directory)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"output\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing output path\";\n\t}\n\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/password.js": {
"title": "$:/core/modules/commands/password.js",
"text": "/*\\\ntitle: $:/core/modules/commands/password.js\ntype: application/javascript\nmodule-type: command\n\nSave password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"password\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing password\";\n\t}\n\t$tw.crypto.setPassword(this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/render.js": {
"title": "$:/core/modules/commands/render.js",
"text": "/*\\\ntitle: $:/core/modules/commands/render.js\ntype: application/javascript\nmodule-type: command\n\nRender individual tiddlers and save the results to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"render\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing tiddler filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]addsuffix[.html]]\",\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tvarName = this.params[4],\n\t\tvarValue = this.params[5],\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template || title),\n\t\t\tvariables = {currentTiddler: title};\n\t\tif(varName) {\n\t\t\tvariables[varName] = varValue || \"\";\n\t\t}\n\t\tvar widgetNode = wiki.makeWidget(parser,{variables: variables}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Rendering \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddler.js": {
"title": "$:/core/modules/commands/rendertiddler.js",
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render a tiddler and save it to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"rendertiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tname = this.params[4],\n\t\tvalue = this.params[5],\n\t\tvariables = {};\n\t$tw.utils.createFileDirectories(filename);\n\tif(template) {\n\t\tvariables.currentTiddler = title;\n\t\ttitle = template;\n\t}\n\tif(name && value) {\n\t\tvariables[name] = value;\n\t}\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title,{variables: variables}),\"utf8\",function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddlers.js": {
"title": "$:/core/modules/commands/rendertiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"rendertiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttemplate = this.params[1],\n\t\toutputPath = this.commander.outputPath,\n\t\tpathname = path.resolve(outputPath,this.params[2]),\t\t\n\t\ttype = this.params[3] || \"text/html\",\n\t\textension = this.params[4] || \".html\",\n\t\tdeleteDirectory = (this.params[5] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template),\n\t\t\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\texportPath = null;\n\t\tif($tw.utils.hop($tw.macros,\"tv-get-export-path\")) {\n\t\t\tvar macroPath = $tw.macros[\"tv-get-export-path\"].run.apply(self,[title]);\n\t\t\tif(macroPath) {\n\t\t\t\texportPath = path.resolve(outputPath,macroPath + extension);\n\t\t\t}\n\t\t}\n\t\tvar finalPath = exportPath || path.resolve(pathname,encodeURIComponent(title) + extension);\n\t\t$tw.utils.createFileDirectories(finalPath);\n\t\tfs.writeFileSync(finalPath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/save.js": {
"title": "$:/core/modules/commands/save.js",
"text": "/*\\\ntitle: $:/core/modules/commands/save.js\ntype: application/javascript\nmodule-type: command\n\nSaves individual tiddlers in their raw text or binary format to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"save\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]]\",\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Saving \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savelibrarytiddlers.js": {
"title": "$:/core/modules/commands/savelibrarytiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savelibrarytiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the subtiddlers of a bundle tiddler as a series of JSON files\n\n--savelibrarytiddlers <tiddler> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\n\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savelibrarytiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tcontainerTitle = this.params[0],\n\t\tfilter = this.params[1],\n\t\tbasepath = this.params[2],\n\t\tskinnyListTitle = this.params[3];\n\t// Get the container tiddler as data\n\tvar containerData = self.commander.wiki.getTiddlerDataCached(containerTitle,undefined);\n\tif(!containerData) {\n\t\treturn \"'\" + containerTitle + \"' is not a tiddler bundle\";\n\t}\n\t// Filter the list of plugins\n\tvar pluginList = [];\n\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\n\t\tpluginList.push(title);\n\t});\n\tvar filteredPluginList;\n\tif(filter) {\n\t\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\n\t} else {\n\t\tfilteredPluginList = pluginList;\n\t}\n\t// Iterate through the plugins\n\tvar skinnyList = [];\n\t$tw.utils.each(filteredPluginList,function(title) {\n\t\tvar tiddler = containerData.tiddlers[title];\n\t\t// Save each JSON file and collect the skinny data\n\t\tvar pathname = path.resolve(self.commander.outputPath,basepath + encodeURIComponent(title) + \".json\");\n\t\t$tw.utils.createFileDirectories(pathname);\n\t\tfs.writeFileSync(pathname,JSON.stringify(tiddler),\"utf8\");\n\t\t// Collect the skinny list data\n\t\tvar pluginTiddlers = JSON.parse(tiddler.text),\n\t\t\treadmeContent = (pluginTiddlers.tiddlers[title + \"/readme\"] || {}).text,\n\t\t\tdoesRequireReload = !!$tw.wiki.doesPluginInfoRequireReload(pluginTiddlers),\n\t\t\ticonTiddler = pluginTiddlers.tiddlers[title + \"/icon\"] || {},\n\t\t\ticonType = iconTiddler.type,\n\t\t\ticonText = iconTiddler.text,\n\t\t\ticonContent;\n\t\tif(iconType && iconText) {\n\t\t\ticonContent = $tw.utils.makeDataUri(iconText,iconType);\n\t\t}\n\t\tskinnyList.push($tw.utils.extend({},tiddler,{\n\t\t\ttext: undefined,\n\t\t\treadme: readmeContent,\n\t\t\t\"requires-reload\": doesRequireReload ? \"yes\" : \"no\",\n\t\t\ticon: iconContent\n\t\t}));\n\t});\n\t// Save the catalogue tiddler\n\tif(skinnyListTitle) {\n\t\tself.commander.wiki.setTiddlerData(skinnyListTitle,skinnyList);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddler.js": {
"title": "$:/core/modules/commands/savetiddler.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the content of a tiddler to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savetiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddler = this.commander.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t\t$tw.utils.createFileDirectories(filename);\n\t\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\t\tself.callback(err);\n\t\t});\n\t} else {\n\t\treturn \"Missing tiddler: \" + title;\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddlers.js": {
"title": "$:/core/modules/commands/savetiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"savetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\n\t\tdeleteDirectory = (this.params[2] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilename = path.resolve(pathname,encodeURIComponent(title));\n\t\tfs.writeFileSync(filename,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savewikifolder.js": {
"title": "$:/core/modules/commands/savewikifolder.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savewikifolder.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the current wiki as a wiki folder\n\n--savewikifolder <wikifolderpath> [<filter>]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savewikifolder\",\n\tsynchronous: true\n};\n\nvar fs,path;\nif($tw.node) {\n\tfs = require(\"fs\");\n\tpath = require(\"path\");\n}\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing wiki folder path\";\n\t}\n\tvar wikifoldermaker = new WikiFolderMaker(this.params[0],this.params[1],this.commander);\n\treturn wikifoldermaker.save();\n};\n\nfunction WikiFolderMaker(wikiFolderPath,wikiFilter,commander) {\n\tthis.wikiFolderPath = wikiFolderPath;\n\tthis.wikiFilter = wikiFilter || \"[all[tiddlers]]\";\n\tthis.commander = commander;\n\tthis.wiki = commander.wiki;\n\tthis.savedPaths = []; // So that we can detect filename clashes\n}\n\nWikiFolderMaker.prototype.log = function(str) {\n\tif(this.commander.verbose) {\n\t\tconsole.log(str);\n\t}\n};\n\nWikiFolderMaker.prototype.tiddlersToIgnore = [\n\t\"$:/boot/boot.css\",\n\t\"$:/boot/boot.js\",\n\t\"$:/boot/bootprefix.js\",\n\t\"$:/core\",\n\t\"$:/library/sjcl.js\",\n\t\"$:/temp/info-plugin\"\n];\n\n/*\nReturns null if successful, or an error string if there was an error\n*/\nWikiFolderMaker.prototype.save = function() {\n\tvar self = this;\n\t// Check that the output directory doesn't exist\n\tif(fs.existsSync(this.wikiFolderPath) && !$tw.utils.isDirectoryEmpty(this.wikiFolderPath)) {\n\t\treturn \"The unpackwiki command requires that the output wiki folder be empty\";\n\t}\n\t// Get the tiddlers from the source wiki\n\tvar tiddlerTitles = this.wiki.filterTiddlers(this.wikiFilter);\n\t// Initialise a new tiddlwiki.info file\n\tvar newWikiInfo = {};\n\t// Process each incoming tiddler in turn\n\t$tw.utils.each(tiddlerTitles,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tif(self.tiddlersToIgnore.indexOf(title) !== -1) {\n\t\t\t\t// Ignore the core plugin and the ephemeral info plugin\n\t\t\t\tself.log(\"Ignoring tiddler: \" + title);\n\t\t\t} else {\n\t\t\t\tvar type = tiddler.fields.type,\n\t\t\t\t\tpluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif(type === \"application/json\" && pluginType) {\n\t\t\t\t\t// Plugin tiddler\n\t\t\t\t\tvar libraryDetails = self.findPluginInLibrary(title);\n\t\t\t\t\tif(libraryDetails) {\n\t\t\t\t\t\t// A plugin from the core library\n\t\t\t\t\t\tself.log(\"Adding built-in plugin: \" + libraryDetails.name);\n\t\t\t\t\t\tnewWikiInfo[libraryDetails.type] = newWikiInfo[libraryDetails.type] || [];\n\t\t\t\t\t\t$tw.utils.pushTop(newWikiInfo[libraryDetails.type],libraryDetails.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// A custom plugin\n\t\t\t\t\t\tself.log(\"Processing custom plugin: \" + title);\n\t\t\t\t\t\tself.saveCustomPlugin(tiddler);\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\t// Ordinary tiddler\n\t\t\t\t\tself.saveTiddler(\"tiddlers\",tiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Save the tiddlywiki.info file\n\tthis.saveJSONFile(\"tiddlywiki.info\",newWikiInfo);\n\tself.log(\"Writing tiddlywiki.info: \" + JSON.stringify(newWikiInfo,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\n/*\nTest whether the specified tiddler is a plugin in the plugin library\n*/\nWikiFolderMaker.prototype.findPluginInLibrary = function(title) {\n\tvar parts = title.split(\"/\"),\n\t\tpluginPath, type, name;\n\tif(parts[0] === \"$:\") {\n\t\tif(parts[1] === \"languages\" && parts.length === 3) {\n\t\t\tpluginPath = \"languages\" + path.sep + parts[2];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2];\n\t\t} else if(parts[1] === \"plugins\" || parts[1] === \"themes\" && parts.length === 4) {\n\t\t\tpluginPath = parts[1] + path.sep + parts[2] + path.sep + parts[3];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2] + \"/\" + parts[3];\n\t\t}\n\t}\n\tif(pluginPath && type && name) {\n\t\tpluginPath = path.resolve($tw.boot.bootPath,\"..\",pluginPath);\n\t\tif(fs.existsSync(pluginPath)) {\n\t\t\treturn {\n\t\t\t\tpluginPath: pluginPath,\n\t\t\t\ttype: type,\n\t\t\t\tname: name\n\t\t\t};\n\t\t}\n\t}\n\treturn false;\n};\n\nWikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {\n\tvar self = this,\n\t\tpluginTitle = pluginTiddler.fields.title,\n\t\ttitleParts = pluginTitle.split(\"/\"),\n\t\tdirectory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{\n\t\t\tdirectory: path.resolve(this.wikiFolderPath,pluginTiddler.fields[\"plugin-type\"] + \"s\")\n\t\t}),\n\t\tpluginInfo = pluginTiddler.getFieldStrings({exclude: [\"text\",\"type\"]});\n\tthis.saveJSONFile(directory + path.sep + \"plugin.info\",pluginInfo);\n\tself.log(\"Writing \" + directory + path.sep + \"plugin.info: \" + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces));\n\tvar pluginTiddlers = JSON.parse(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin\n\t$tw.utils.each(pluginTiddlers,function(tiddler) {\n\t\tself.saveTiddler(directory,new $tw.Tiddler(tiddler));\n\t});\n};\n\nWikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {\n\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\tdirectory: path.resolve(this.wikiFolderPath,directory),\n\t\twiki: this.wiki\n\t});\n\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\n};\n\nWikiFolderMaker.prototype.saveJSONFile = function(filename,json) {\n\tthis.saveTextFile(filename,JSON.stringify(json,null,$tw.config.preferences.jsonSpaces));\n};\n\nWikiFolderMaker.prototype.saveTextFile = function(filename,data) {\n\tthis.saveFile(filename,\"utf8\",data);\n};\n\nWikiFolderMaker.prototype.saveFile = function(filename,encoding,data) {\n\tvar filepath = path.resolve(this.wikiFolderPath,filename);\n\t$tw.utils.createFileDirectories(filepath);\n\tfs.writeFileSync(filepath,data,encoding);\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/server.js": {
"title": "$:/core/modules/commands/server.js",
"text": "/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nDeprecated legacy command for serving tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: {\n\t\t\tport: this.params[0],\n\t\t\thost: this.params[6],\n\t\t\t\"root-tiddler\": this.params[1],\n\t\t\t\"root-render-type\": this.params[2],\n\t\t\t\"root-serve-type\": this.params[3],\n\t\t\tusername: this.params[4],\n\t\t\tpassword: this.params[5],\n\t\t\t\"path-prefix\": this.params[7],\n\t\t\t\"debug-level\": this.params[8]\n\t\t}\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/setfield.js": {
"title": "$:/core/modules/commands/setfield.js",
"text": "/*\\\ntitle: $:/core/modules/commands/setfield.js\ntype: application/javascript\nmodule-type: command\n\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"setfield\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 4) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tfieldname = this.params[1] || \"text\",\n\t\ttemplatetitle = this.params[2],\n\t\trendertype = this.params[3] || \"text/plain\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(templatetitle),\n\t\t\tnewFields = {},\n\t\t\ttiddler = wiki.getTiddler(title);\n\t\tif(parser) {\n\t\t\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tnewFields[fieldname] = rendertype === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t} else {\n\t\t\tnewFields[fieldname] = undefined;\n\t\t}\n\t\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/unpackplugin.js": {
"title": "$:/core/modules/commands/unpackplugin.js",
"text": "/*\\\ntitle: $:/core/modules/commands/unpackplugin.js\ntype: application/javascript\nmodule-type: command\n\nCommand to extract the shadow tiddlers from within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"unpackplugin\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing plugin name\";\n\t}\n\tvar self = this,\n\t\ttitle = this.params[0],\n\t\tpluginData = this.commander.wiki.getTiddlerDataCached(title);\n\tif(!pluginData) {\n\t\treturn \"Plugin '\" + title + \"' not found\";\n\t}\n\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\n\t\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/verbose.js": {
"title": "$:/core/modules/commands/verbose.js",
"text": "/*\\\ntitle: $:/core/modules/commands/verbose.js\ntype: application/javascript\nmodule-type: command\n\nVerbose command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"verbose\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.verbose = true;\n\t// Output the boot message log\n\tthis.commander.streams.output.write(\"Boot log:\\n \" + $tw.boot.logMessages.join(\"\\n \") + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/version.js": {
"title": "$:/core/modules/commands/version.js",
"text": "/*\\\ntitle: $:/core/modules/commands/version.js\ntype: application/javascript\nmodule-type: command\n\nVersion command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"version\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.streams.output.write($tw.version + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/config.js": {
"title": "$:/core/modules/config.js",
"text": "/*\\\ntitle: $:/core/modules/config.js\ntype: application/javascript\nmodule-type: config\n\nCore configuration constants\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.preferences = {};\n\nexports.preferences.notificationDuration = 3 * 1000;\nexports.preferences.jsonSpaces = 4;\n\nexports.textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00d6\\u00d8-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z\\u00df-\\u00f6\\u00f8-\\u00ff\\u0151\\u0171]\",\n\tanyLetter: \"[A-Za-z0-9\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tblockPrefixLetters:\t\"[A-Za-z0-9-_\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\"\n};\n\nexports.textPrimitives.unWikiLink = \"~\";\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \"+\" +\n\texports.textPrimitives.lowerLetter + \"+\" +\n\texports.textPrimitives.upperLetter +\n\texports.textPrimitives.anyLetter + \"*\";\n\nexports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\n\nexports.htmlVoidElements = \"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\".split(\",\");\n\nexports.htmlBlockElements = \"address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video\".split(\",\");\n\nexports.htmlUnsafeElements = \"script\".split(\",\");\n\n})();\n",
"type": "application/javascript",
"module-type": "config"
},
"$:/core/modules/deserializers.js": {
"title": "$:/core/modules/deserializers.js",
"text": "/*\\\ntitle: $:/core/modules/deserializers.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nFunctions to deserialise tiddlers from a block of text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\n\n<div title=\"Title\" creator=\"JoeBloggs\" modifier=\"JoeBloggs\" created=\"201102111106\" modified=\"201102111310\" tags=\"myTag [[my long tag]]\">\n<pre>The text of the tiddler (without the expected HTML encoding).\n</pre>\n</div>\n\nNote that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.\n\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\n*/\nvar parseTiddlerDiv = function(text /* [,fields] */) {\n\t// Slot together the default results\n\tvar result = {};\n\tif(arguments.length > 1) {\n\t\tfor(var f=1; f<arguments.length; f++) {\n\t\t\tvar fields = arguments[f];\n\t\t\tfor(var t in fields) {\n\t\t\t\tresult[t] = fields[t];\t\t\n\t\t\t}\n\t\t}\n\t}\n\t// Parse the DIV body\n\tvar startRegExp = /^\\s*<div\\s+([^>]*)>(\\s*<pre>)?/gi,\n\t\tendRegExp,\n\t\tmatch = startRegExp.exec(text);\n\tif(match) {\n\t\t// Old-style DIVs don't have the <pre> tag\n\t\tif(match[2]) {\n\t\t\tendRegExp = /<\\/pre>\\s*<\\/div>\\s*$/gi;\n\t\t} else {\n\t\t\tendRegExp = /<\\/div>\\s*$/gi;\n\t\t}\n\t\tvar endMatch = endRegExp.exec(text);\n\t\tif(endMatch) {\n\t\t\t// Extract the text\n\t\t\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\n\t\t\t// Process the attributes\n\t\t\tvar attrRegExp = /\\s*([^=\\s]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi,\n\t\t\t\tattrMatch;\n\t\t\tdo {\n\t\t\t\tattrMatch = attrRegExp.exec(match[1]);\n\t\t\t\tif(attrMatch) {\n\t\t\t\t\tvar name = attrMatch[1];\n\t\t\t\t\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\n\t\t\t\t\tresult[name] = value;\n\t\t\t\t}\n\t\t\t} while(attrMatch);\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [parseTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar incoming,\n\t\tresults = [];\n\ttry {\n\t\tincoming = JSON.parse(text);\n\t} catch(e) {\n\t\tincoming = [{\n\t\t\ttitle: \"JSON error: \" + e,\n\t\t\ttext: \"\"\n\t\t}]\n\t}\n\tif(!$tw.utils.isArray(incoming)) {\n\t\tincoming = [incoming];\n\t}\n\tfor(var t=0; t<incoming.length; t++) {\n\t\tvar incomingFields = incoming[t],\n\t\t\tfields = {};\n\t\tfor(var f in incomingFields) {\n\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t}\n\t\t}\n\t\tresults.push(fields);\n\t}\n\treturn results;\n};\n\n/*\nParse an HTML file into tiddlers. There are three possibilities:\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\n# An ordinary HTML file\n*/\nexports[\"text/html\"] = function(text,fields) {\n\t// Check if we've got a store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tmatch = storeAreaMarkerRegExp.exec(text);\n\tif(match) {\n\t\t// If so, it's either a classic TiddlyWiki file or an unencrypted TW5 file\n\t\t// First read the normal tiddlers\n\t\tvar results = deserializeTiddlyWikiFile(text,storeAreaMarkerRegExp.lastIndex,!!match[1],fields);\n\t\t// Then any system tiddlers\n\t\tvar systemAreaMarkerRegExp = /<div id=[\"']?systemArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\t\tsysMatch = systemAreaMarkerRegExp.exec(text);\n\t\tif(sysMatch) {\n\t\t\tresults.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));\n\t\t}\n\t\treturn results;\n\t} else {\n\t\t// Check whether we've got an encrypted file\n\t\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedStoreArea) {\n\t\t\t// If so, attempt to decrypt it using the current password\n\t\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t\t} else {\n\t\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\t\treturn deserializeHtmlFile(text,fields);\n\t\t}\n\t}\n};\n\nfunction deserializeHtmlFile(text,fields) {\n\tvar result = {};\n\t$tw.utils.each(fields,function(value,name) {\n\t\tresult[name] = value;\n\t});\n\tresult.text = text;\n\tresult.type = \"text/html\";\n\treturn [result];\n}\n\nfunction deserializeTiddlyWikiFile(text,storeAreaEnd,isTiddlyWiki5,fields) {\n\tvar results = [],\n\t\tendOfDivRegExp = /(<\\/div>\\s*)/gi,\n\t\tstartPos = storeAreaEnd,\n\t\tdefaultType = isTiddlyWiki5 ? undefined : \"text/x-tiddlywiki\";\n\tendOfDivRegExp.lastIndex = startPos;\n\tvar match = endOfDivRegExp.exec(text);\n\twhile(match) {\n\t\tvar endPos = endOfDivRegExp.lastIndex,\n\t\t\ttiddlerFields = parseTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\n\t\tif(!tiddlerFields) {\n\t\t\tbreak;\n\t\t}\n\t\t$tw.utils.each(tiddlerFields,function(value,name) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\n\t\t\t}\n\t\t});\n\t\tif(tiddlerFields.text !== null) {\n\t\t\tresults.push(tiddlerFields);\n\t\t}\n\t\tstartPos = endPos;\n\t\tmatch = endOfDivRegExp.exec(text);\n\t}\n\treturn results;\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "tiddlerdeserializer"
},
"$:/core/modules/editor/engines/framed.js": {
"title": "$:/core/modules/editor/engines/framed.js",
"text": "/*\\\ntitle: $:/core/modules/editor/engines/framed.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction FramedEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass;\n\t}\n\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create the iframe\n\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\n\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeNode.style[\"background-color\"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText(\"$:/palette\"),\"tiddler-editor-background\");\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";\n\tthis.widget.domNodes.push(this.iframeNode);\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.iframeDoc.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.iframeNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\t// Copy the styles from the dummy textarea\n\tthis.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"click\",handlerObject: this,handlerMethod: \"handleClickEvent\"},\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this.widget,handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.iframeDoc.body.appendChild(this.domNode);\n}\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\tthis.domNode.style[\"background-color\"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText(\"$:/palette\"),\"tiddler-editor-background\");\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nFramedEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.iframeNode.style.height = (newHeight + 14) + \"px\"; // +14 for the border on the textarea\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\tthis.iframeNode.style.height = (fixedHeight + 14) + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a click\n*/\nFramedEngine.prototype.handleClickEvent = function(event) {\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.iframeDoc.queryCommandSupported(\"insertText\") && this.iframeDoc.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.iframeDoc.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.iframeDoc.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedEngine = FramedEngine;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/engines/simple.js": {
"title": "$:/core/modules/editor/engines/simple.js",
"text": "/*\\\ntitle: $:/core/modules/editor/engines/simple.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction SimpleEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.domNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode || text === \"\") {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nSimpleEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNode,\n\t\t\ttitle: this.widget.editFocusPopup,\n\t\t\twiki: this.widget.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleEngine = SimpleEngine;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/factory.js": {
"title": "$:/core/modules/editor/factory.js",
"text": "/*\\\ntitle: $:/core/modules/editor/factory.js\ntype: application/javascript\nmodule-type: library\n\nFactory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\n// Configuration tiddlers\nvar HEIGHT_MODE_TITLE = \"$:/config/TextEditor/EditorHeight/Mode\";\nvar ENABLE_TOOLBAR_TITLE = \"$:/config/TextEditor/EnableToolbar\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nfunction editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {\n\n\tvar EditTextWidget = function(parseTreeNode,options) {\n\t\t// Initialise the editor operations if they've not been done already\n\t\tif(!this.editorOperations) {\n\t\t\tEditTextWidget.prototype.editorOperations = {};\n\t\t\t$tw.modules.applyMethods(\"texteditoroperation\",this.editorOperations);\n\t\t}\n\t\tthis.initialise(parseTreeNode,options);\n\t};\n\n\t/*\n\tInherit from the base widget class\n\t*/\n\tEditTextWidget.prototype = new Widget();\n\n\t/*\n\tRender this widget into the DOM\n\t*/\n\tEditTextWidget.prototype.render = function(parent,nextSibling) {\n\t\t// Save the parent dom node\n\t\tthis.parentDomNode = parent;\n\t\t// Compute our attributes\n\t\tthis.computeAttributes();\n\t\t// Execute our logic\n\t\tthis.execute();\n\t\t// Create the wrapper for the toolbar and render its content\n\t\tif(this.editShowToolbar) {\n\t\t\tthis.toolbarNode = this.document.createElement(\"div\");\n\t\t\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\t\t\tparent.insertBefore(this.toolbarNode,nextSibling);\n\t\t\tthis.renderChildren(this.toolbarNode,null);\n\t\t\tthis.domNodes.push(this.toolbarNode);\n\t\t}\n\t\t// Create our element\n\t\tvar editInfo = this.getEditInfo(),\n\t\t\tEngine = this.editShowToolbar ? toolbarEngine : nonToolbarEngine;\n\t\tthis.engine = new Engine({\n\t\t\t\twidget: this,\n\t\t\t\tvalue: editInfo.value,\n\t\t\t\ttype: editInfo.type,\n\t\t\t\tparentNode: parent,\n\t\t\t\tnextSibling: nextSibling\n\t\t\t});\n\t\t// Call the postRender hook\n\t\tif(this.postRender) {\n\t\t\tthis.postRender();\n\t\t}\n\t\t// Fix height\n\t\tthis.engine.fixHeight();\n\t\t// Focus if required\n\t\tif(this.editFocus === \"true\" || this.editFocus === \"yes\") {\n\t\t\tthis.engine.focus();\n\t\t}\n\t\t// Add widget message listeners\n\t\tthis.addEventListeners([\n\t\t\t{type: \"tm-edit-text-operation\", handler: \"handleEditTextOperationMessage\"}\n\t\t]);\n\t};\n\n\t/*\n\tGet the tiddler being edited and current value\n\t*/\n\tEditTextWidget.prototype.getEditInfo = function() {\n\t\t// Get the edit value\n\t\tvar self = this,\n\t\t\tvalue,\n\t\t\ttype = \"text/plain\",\n\t\t\tupdate;\n\t\tif(this.editIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\t\tupdate = function(value) {\n\t\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\t// Get the current tiddler and the field name\n\t\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\t\tif(tiddler) {\n\t\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t\t\tif(this.editField === \"text\") {\n\t\t\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\t\tswitch(this.editField) {\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\t\ttype = \"text/vnd.tiddlywiki\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"title\":\n\t\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\t\tvalue = this.editDefault;\n\t\t\t\t}\n\t\t\t}\n\t\t\tupdate = function(value) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\t\tupdateFields = {\n\t\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t\t};\n\t\t\t\tupdateFields[self.editField] = value;\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t\t};\n\t\t}\n\t\tif(this.editType) {\n\t\t\ttype = this.editType;\n\t\t}\n\t\treturn {value: value || \"\", type: type, update: update};\n\t};\n\n\t/*\n\tHandle an edit text operation message from the toolbar\n\t*/\n\tEditTextWidget.prototype.handleEditTextOperationMessage = function(event) {\n\t\t// Prepare information about the operation\n\t\tvar operation = this.engine.createTextOperation();\n\t\t// Invoke the handler for the selected operation\n\t\tvar handler = this.editorOperations[event.param];\n\t\tif(handler) {\n\t\t\thandler.call(this,event,operation);\n\t\t}\n\t\t// Execute the operation via the engine\n\t\tvar newText = this.engine.executeTextOperation(operation);\n\t\t// Fix the tiddler height and save changes\n\t\tthis.engine.fixHeight();\n\t\tthis.saveChanges(newText);\n\t};\n\n\t/*\n\tCompute the internal state of the widget\n\t*/\n\tEditTextWidget.prototype.execute = function() {\n\t\t// Get our parameters\n\t\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.editField = this.getAttribute(\"field\",\"text\");\n\t\tthis.editIndex = this.getAttribute(\"index\");\n\t\tthis.editDefault = this.getAttribute(\"default\");\n\t\tthis.editClass = this.getAttribute(\"class\");\n\t\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t\tthis.editSize = this.getAttribute(\"size\");\n\t\tthis.editRows = this.getAttribute(\"rows\");\n\t\tthis.editAutoHeight = this.wiki.getTiddlerText(HEIGHT_MODE_TITLE,\"auto\");\n\t\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",this.editAutoHeight === \"auto\" ? \"yes\" : \"no\") === \"yes\";\n\t\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\t\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\t\tthis.editFocus = this.getAttribute(\"focus\");\n\t\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\t\t// Get the default editor element tag and type\n\t\tvar tag,type;\n\t\tif(this.editField === \"text\") {\n\t\t\ttag = \"textarea\";\n\t\t} else {\n\t\t\ttag = \"input\";\n\t\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\t\ttag = fieldModule.editTag;\n\t\t\t}\n\t\t\tif(fieldModule && fieldModule.editType) {\n\t\t\t\ttype = fieldModule.editType;\n\t\t\t}\n\t\t\ttype = type || \"text\";\n\t\t}\n\t\t// Get the rest of our parameters\n\t\tthis.editTag = this.getAttribute(\"tag\",tag) || \"input\";\n\t\tthis.editType = this.getAttribute(\"type\",type);\n\t\t// Make the child widgets\n\t\tthis.makeChildWidgets();\n\t\t// Determine whether to show the toolbar\n\t\tthis.editShowToolbar = this.wiki.getTiddlerText(ENABLE_TOOLBAR_TITLE,\"yes\");\n\t\tthis.editShowToolbar = (this.editShowToolbar === \"yes\") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);\n\t};\n\n\t/*\n\tSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n\t*/\n\tEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\t\tvar changedAttributes = this.computeAttributes();\n\t\t// Completely rerender if any of our attributes have changed\n\t\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE]) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t\t} else if(changedTiddlers[this.editTitle]) {\n\t\t\tvar editInfo = this.getEditInfo();\n\t\t\tthis.updateEditor(editInfo.value,editInfo.type);\n\t\t}\n\t\tthis.engine.fixHeight();\n\t\tif(this.editShowToolbar) {\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/*\n\tUpdate the editor with new text. This method is separate from updateEditorDomNode()\n\tso that subclasses can override updateEditor() and still use updateEditorDomNode()\n\t*/\n\tEditTextWidget.prototype.updateEditor = function(text,type) {\n\t\tthis.updateEditorDomNode(text,type);\n\t};\n\n\t/*\n\tUpdate the editor dom node with new text\n\t*/\n\tEditTextWidget.prototype.updateEditorDomNode = function(text,type) {\n\t\tthis.engine.setText(text,type);\n\t};\n\n\t/*\n\tSave changes back to the tiddler store\n\t*/\n\tEditTextWidget.prototype.saveChanges = function(text) {\n\t\tvar editInfo = this.getEditInfo();\n\t\tif(text !== editInfo.value) {\n\t\t\teditInfo.update(text);\n\t\t}\n\t};\n\n\t/*\n\tHandle a dom \"keydown\" event, which we'll bubble up to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.handleKeydownEvent = function(event) {\n\t\t// Check for a keyboard shortcut\n\t\tif(this.toolbarNode) {\n\t\t\tvar shortcutElements = this.toolbarNode.querySelectorAll(\"[data-tw-keyboard-shortcut]\");\n\t\t\tfor(var index=0; index<shortcutElements.length; index++) {\n\t\t\t\tvar el = shortcutElements[index],\n\t\t\t\t\tshortcutData = el.getAttribute(\"data-tw-keyboard-shortcut\"),\n\t\t\t\t\tkeyInfoArray = $tw.keyboardManager.parseKeyDescriptors(shortcutData,{\n\t\t\t\t\t\twiki: this.wiki\n\t\t\t\t\t});\n\t\t\t\tif($tw.keyboardManager.checkKeyDescriptors(event,keyInfoArray)) {\n\t\t\t\t\tvar clickEvent = this.document.createEvent(\"Events\");\n\t\t\t\t clickEvent.initEvent(\"click\",true,false);\n\t\t\t\t el.dispatchEvent(clickEvent);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Propogate the event to the container\n\t\tif(this.propogateKeydownEvent(event)) {\n\t\t\t// Ignore the keydown if it was already handled\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise, process the keydown normally\n\t\treturn false;\n\t};\n\n\t/*\n\tPropogate keydown events to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.propogateKeydownEvent = function(event) {\n\t\tvar newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent(\"Events\");\n\t\tif(newEvent.initEvent) {\n\t\t\tnewEvent.initEvent(\"keydown\", true, true);\n\t\t}\n\t\tnewEvent.keyCode = event.keyCode;\n\t\tnewEvent.which = event.which;\n\t\tnewEvent.metaKey = event.metaKey;\n\t\tnewEvent.ctrlKey = event.ctrlKey;\n\t\tnewEvent.altKey = event.altKey;\n\t\tnewEvent.shiftKey = event.shiftKey;\n\t\treturn !this.parentDomNode.dispatchEvent(newEvent);\n\t};\n\n\treturn EditTextWidget;\n\n}\n\nexports.editTextWidgetFactory = editTextWidgetFactory;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/operations/bitmap/clear.js": {
"title": "$:/core/modules/editor/operations/bitmap/clear.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/clear.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to clear the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"clear\"] = function(event) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.globalAlpha = 1;\n\tctx.fillStyle = event.paramObject.colour || \"white\";\n\tctx.fillRect(0,0,this.canvasDomNode.width,this.canvasDomNode.height);\n\t// Save changes\n\tthis.strokeEnd();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/bitmap/resize.js": {
"title": "$:/core/modules/editor/operations/bitmap/resize.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/resize.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to resize the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"resize\"] = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(event.paramObject.width || this.canvasDomNode.width,10),\n\t\tnewHeight = parseInt(event.paramObject.height || this.canvasDomNode.height,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newHeight > 0 && !(newWidth === this.currCanvas.width && newHeight === this.currCanvas.height)) {\n\t\tthis.changeCanvasSize(newWidth,newHeight);\n\t}\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/bitmap/rotate-left.js": {
"title": "$:/core/modules/editor/operations/bitmap/rotate-left.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/rotate-left.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to rotate the image left by 90 degrees\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"rotate-left\"] = function(event) {\n\t// Rotate the canvas left by 90 degrees\n\tthis.rotateCanvasLeft();\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/text/excise.js": {
"title": "$:/core/modules/editor/operations/text/excise.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/excise.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to excise the selection to a new tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"excise\"] = function(event,operation) {\n\tvar editTiddler = this.wiki.getTiddler(this.editTitle),\n\t\teditTiddlerTitle = this.editTitle;\n\tif(editTiddler && editTiddler.fields[\"draft.of\"]) {\n\t\teditTiddlerTitle = editTiddler.fields[\"draft.of\"];\n\t}\n\tvar excisionTitle = event.paramObject.title || this.wiki.generateNewTitle(\"New Excision\");\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\tthis.wiki.getModificationFields(),\n\t\t{\n\t\t\ttitle: excisionTitle,\n\t\t\ttext: operation.selection,\n\t\t\ttags: event.paramObject.tagnew === \"yes\" ? [editTiddlerTitle] : []\n\t\t}\n\t));\n\toperation.replacement = excisionTitle;\n\tswitch(event.paramObject.type || \"transclude\") {\n\t\tcase \"transclude\":\n\t\t\toperation.replacement = \"{{\" + operation.replacement+ \"}}\";\n\t\t\tbreak;\n\t\tcase \"link\":\n\t\t\toperation.replacement = \"[[\" + operation.replacement+ \"]]\";\n\t\t\tbreak;\n\t\tcase \"macro\":\n\t\t\toperation.replacement = \"<<\" + (event.paramObject.macro || \"translink\") + \" \\\"\\\"\\\"\" + operation.replacement + \"\\\"\\\"\\\">>\";\n\t\t\tbreak;\n\t}\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/make-link.js": {
"title": "$:/core/modules/editor/operations/text/make-link.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/make-link.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to make a link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"make-link\"] = function(event,operation) {\n\tif(operation.selection) {\n\t\toperation.replacement = \"[[\" + operation.selection + \"|\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t} else {\n\t\toperation.replacement = \"[[\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t}\n\toperation.newSelStart = operation.selStart + operation.replacement.length;\n\toperation.newSelEnd = operation.newSelStart;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/prefix-lines.js": {
"title": "$:/core/modules/editor/operations/text/prefix-lines.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/prefix-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to add a prefix to the selected lines\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"prefix-lines\"] = function(event,operation) {\n\tvar targetCount = parseInt(event.paramObject.count + \"\",10);\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Compose the required prefix\n\tvar prefix = $tw.utils.repeat(event.paramObject.character,targetCount);\n\t// Process each line\n\tvar lines = operation.text.substring(operation.cutStart,operation.cutEnd).split(/\\r?\\n/mg);\n\t$tw.utils.each(lines,function(line,index) {\n\t\t// Remove and count any existing prefix characters\n\t\tvar count = 0;\n\t\twhile(line.charAt(0) === event.paramObject.character) {\n\t\t\tline = line.substring(1);\n\t\t\tcount++;\n\t\t}\n\t\t// Remove any whitespace\n\t\twhile(line.charAt(0) === \" \") {\n\t\t\tline = line.substring(1);\n\t\t}\n\t\t// We're done if we removed the exact required prefix, otherwise add it\n\t\tif(count !== targetCount) {\n\t\t\t// Apply the prefix\n\t\t\tline = prefix + \" \" + line;\n\t\t}\n\t\t// Save the modified line\n\t\tlines[index] = line;\n\t});\n\t// Stitch the replacement text together and set the selection\n\toperation.replacement = lines.join(\"\\n\");\n\tif(lines.length === 1) {\n\t\toperation.newSelStart = operation.cutStart + operation.replacement.length;\n\t\toperation.newSelEnd = operation.newSelStart;\n\t} else {\n\t\toperation.newSelStart = operation.cutStart;\n\t\toperation.newSelEnd = operation.newSelStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/replace-all.js": {
"title": "$:/core/modules/editor/operations/text/replace-all.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-all.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the entire text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-all\"] = function(event,operation) {\n\toperation.cutStart = 0;\n\toperation.cutEnd = operation.text.length;\n\toperation.replacement = event.paramObject.text;\n\toperation.newSelStart = 0;\n\toperation.newSelEnd = operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/replace-selection.js": {
"title": "$:/core/modules/editor/operations/text/replace-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the selection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-selection\"] = function(event,operation) {\n\toperation.replacement = event.paramObject.text;\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/save-selection.js": {
"title": "$:/core/modules/editor/operations/text/save-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/save-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to save the current selection in a specified tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"save-selection\"] = function(event,operation) {\n\tvar tiddler = event.paramObject.tiddler,\n\t\tfield = event.paramObject.field || \"text\";\n\tif(tiddler && field) {\n\t\tthis.wiki.setText(tiddler,field,null,operation.text.substring(operation.selStart,operation.selEnd));\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/wrap-lines.js": {
"title": "$:/core/modules/editor/operations/text/wrap-lines.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selected lines with a prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-lines\"] = function(event,operation) {\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Add the prefix and suffix\n\toperation.replacement = event.paramObject.prefix + \"\\n\" +\n\t\t\t\toperation.text.substring(operation.cutStart,operation.cutEnd) + \"\\n\" +\n\t\t\t\tevent.paramObject.suffix + \"\\n\";\n\toperation.newSelStart = operation.cutStart + event.paramObject.prefix.length + 1;\n\toperation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/wrap-selection.js": {
"title": "$:/core/modules/editor/operations/text/wrap-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selection with the specified prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-selection\"] = function(event,operation) {\n\tif(operation.selStart === operation.selEnd) {\n\t\t// No selection; check if we're within the prefix/suffix\n\t\tif(operation.text.substring(operation.selStart - event.paramObject.prefix.length,operation.selStart + event.paramObject.suffix.length) === event.paramObject.prefix + event.paramObject.suffix) {\n\t\t\t// Remove the prefix and suffix\n\t\t\toperation.cutStart = operation.selStart - event.paramObject.prefix.length;\n\t\t\toperation.cutEnd = operation.selEnd + event.paramObject.suffix.length;\n\t\t\toperation.replacement = \"\";\n\t\t\toperation.newSelStart = operation.cutStart;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t} else {\n\t\t\t// Wrap the cursor instead\n\t\t\toperation.cutStart = operation.selStart;\n\t\t\toperation.cutEnd = operation.selEnd;\n\t\t\toperation.replacement = event.paramObject.prefix + event.paramObject.suffix;\n\t\t\toperation.newSelStart = operation.selStart + event.paramObject.prefix.length;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t}\n\t} else if(operation.text.substring(operation.selStart,operation.selStart + event.paramObject.prefix.length) === event.paramObject.prefix && operation.text.substring(operation.selEnd - event.paramObject.suffix.length,operation.selEnd) === event.paramObject.suffix) {\n\t\t// Prefix and suffix are already present, so remove them\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = operation.selection.substring(event.paramObject.prefix.length,operation.selection.length - event.paramObject.suffix.length);\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t} else {\n\t\t// Add the prefix and suffix\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = event.paramObject.prefix + operation.selection + event.paramObject.suffix;\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/filters/addprefix.js": {
"title": "$:/core/modules/filters/addprefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/addprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a prefix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand + title);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/addsuffix.js": {
"title": "$:/core/modules/filters/addsuffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/addsuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a suffix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addsuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title + operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/after.js": {
"title": "$:/core/modules/filters/after.js",
"text": "/*\\\ntitle: $:/core/modules/filters/after.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.after = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index === -1 || index > (results.length - 2)) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index + 1]];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/all/current.js": {
"title": "$:/core/modules/filters/all/current.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/current.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(currTiddlerTitle) {\n\t\treturn [currTiddlerTitle];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/missing.js": {
"title": "$:/core/modules/filters/all/missing.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/missing.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\treturn options.wiki.getMissingTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/orphans.js": {
"title": "$:/core/modules/filters/all/orphans.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/orphans.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[orphans]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphans = function(source,prefix,options) {\n\treturn options.wiki.getOrphanTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/shadows.js": {
"title": "$:/core/modules/filters/all/shadows.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/shadows.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[shadows]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadows = function(source,prefix,options) {\n\treturn options.wiki.allShadowTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/tags.js": {
"title": "$:/core/modules/filters/all/tags.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/tags.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tags]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,prefix,options) {\n\treturn Object.keys(options.wiki.getTagMap());\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/tiddlers.js": {
"title": "$:/core/modules/filters/all/tiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/tiddlers.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddlers = function(source,prefix,options) {\n\treturn options.wiki.allTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all.js": {
"title": "$:/core/modules/filters/all.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for selecting tiddlers\n\n[all[shadows+tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar allFilterOperators;\n\nfunction getAllFilterOperators() {\n\tif(!allFilterOperators) {\n\t\tallFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"allfilteroperator\",allFilterOperators);\n\t}\n\treturn allFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.all = function(source,operator,options) {\n\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = [],\n\t\tsubops = operator.operand.split(\"+\");\n\t// Check for common optimisations\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\t$tw.utils.pushTop(results,subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/backlinks.js": {
"title": "$:/core/modules/filters/backlinks.js",
"text": "/*\\\ntitle: $:/core/modules/filters/backlinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.backlinks = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/before.js": {
"title": "$:/core/modules/filters/before.js",
"text": "/*\\\ntitle: $:/core/modules/filters/before.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.before = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index <= 0) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index - 1]];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/commands.js": {
"title": "$:/core/modules/filters/commands.js",
"text": "/*\\\ntitle: $:/core/modules/filters/commands.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the commands available in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.commands = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.commands,function(commandInfo,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/compare.js": {
"title": "$:/core/modules/filters/compare.js",
"text": "/*\\\ntitle: $:/core/modules/filters/compare.js\ntype: application/javascript\nmodule-type: filteroperator\n\nGeneral purpose comparison operator\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.compare = function(source,operator,options) {\n\tvar suffixes = operator.suffixes || [],\n\t\ttype = (suffixes[0] || [])[0],\n\t\tmode = (suffixes[1] || [])[0],\n\t\ttypeFn = types[type] || types.number,\n\t\tmodeFn = modes[mode] || modes.eq,\n\t\tinvert = operator.prefix === \"!\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tif(modeFn(typeFn(title,operator.operand)) !== invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nvar types = {\n\t\"number\": function(a,b) {\n\t\treturn compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b));\n\t},\n\t\"integer\": function(a,b) {\n\t\treturn compare($tw.utils.parseInt(a),$tw.utils.parseInt(b));\n\t},\n\t\"string\": function(a,b) {\n\t\treturn compare(\"\" + a,\"\" +b);\n\t},\n\t\"date\": function(a,b) {\n\t\tvar dateA = $tw.utils.parseDate(a),\n\t\t\tdateB = $tw.utils.parseDate(b);\n\t\tif(!isFinite(dateA)) {\n\t\t\tdateA = new Date(0);\n\t\t}\n\t\tif(!isFinite(dateB)) {\n\t\t\tdateB = new Date(0);\n\t\t}\n\t\treturn compare(dateA,dateB);\n\t},\n\t\"version\": function(a,b) {\n\t\treturn $tw.utils.compareVersions(a,b);\n\t}\n};\n\nfunction compare(a,b) {\n\tif(a > b) {\n\t\treturn +1;\n\t} else if(a < b) {\n\t\treturn -1;\n\t} else {\n\t\treturn 0;\n\t}\n};\n\nvar modes = {\n\t\"eq\": function(value) {return value === 0;},\n\t\"ne\": function(value) {return value !== 0;},\n\t\"gteq\": function(value) {return value >= 0;},\n\t\"gt\": function(value) {return value > 0;},\n\t\"lteq\": function(value) {return value <= 0;},\n\t\"lt\": function(value) {return value < 0;}\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/contains.js": {
"title": "$:/core/modules/filters/contains.js",
"text": "/*\\\ntitle: $:/core/modules/filters/contains.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for finding values in array fields\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.contains = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"list\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/count.js": {
"title": "$:/core/modules/filters/count.js",
"text": "/*\\\ntitle: $:/core/modules/filters/count.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the number of entries in the current list.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.count = function(source,operator,options) {\n\tvar count = 0;\n\tsource(function(tiddler,title) {\n\t\tcount++;\n\t});\n\treturn [count + \"\"];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/days.js": {
"title": "$:/core/modules/filters/days.js",
"text": "/*\\\ntitle: $:/core/modules/filters/days.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a specified date field within a specified date interval.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.days = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\tdayInterval = (parseInt(operator.operand,10)||0),\n\t\tdayIntervalSign = $tw.utils.sign(dayInterval),\n\t\ttargetTimeStamp = (new Date()).setHours(0,0,0,0) + 1000*60*60*24*dayInterval,\n\t\tisWithinDays = function(dateField) {\n\t\t\tvar sign = $tw.utils.sign(targetTimeStamp - (new Date(dateField)).setHours(0,0,0,0));\n\t\t\treturn sign === 0 || sign === dayIntervalSign;\n\t\t};\n\n\tif(operator.prefix === \"!\") {\n\t\ttargetTimeStamp = targetTimeStamp - 1000*60*60*24*dayIntervalSign;\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(!isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/each.js": {
"title": "$:/core/modules/filters/each.js",
"text": "/*\\\ntitle: $:/core/modules/filters/each.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique value of the specified field.\nWith suffix \"list\", selects all tiddlers that are values in a specified list field.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.each = function(source,operator,options) {\n\tvar results =[] ,\n\tvalue,values = {},\n\tfield = operator.operand || \"title\";\n\tif(operator.suffix === \"value\" && field === \"title\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(values,title)) {\n\t\t\t\tvalues[title] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else if(operator.suffix !== \"list-item\") {\n\t\tif(field === \"title\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && !$tw.utils.hop(values,title)) {\n\t\t\t\t\tvalues[title] = true;\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvalue = tiddler.getFieldString(field);\n\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\t$tw.utils.each(\n\t\t\t\t\toptions.wiki.getTiddlerList(title,field),\n\t\t\t\t\tfunction(value) {\n\t\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\t\tresults.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/eachday.js": {
"title": "$:/core/modules/filters/eachday.js",
"text": "/*\\\ntitle: $:/core/modules/filters/eachday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique day covered by the specified date field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.eachday = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = [],\n\t\tfieldName = operator.operand || \"modified\";\n\t// Function to convert a date/time to a date integer\n\tvar toDate = function(value) {\n\t\tvalue = (new Date(value)).setHours(0,0,0,0);\n\t\treturn value+0;\n\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tvar value = toDate($tw.utils.parseDate(tiddler.fields[fieldName]));\n\t\t\tif(values.indexOf(value) === -1) {\n\t\t\t\tvalues.push(value);\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/editiondescription.js": {
"title": "$:/core/modules/filters/editiondescription.js",
"text": "/*\\\ntitle: $:/core/modules/filters/editiondescription.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the descriptions of the specified edition names\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editiondescription = function(source,operator,options) {\n\tvar results = [],\n\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\tresults.push(editionInfo[title].description || \"\");\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/editions.js": {
"title": "$:/core/modules/filters/editions.js",
"text": "/*\\\ntitle: $:/core/modules/filters/editions.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the available editions in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editions = function(source,operator,options) {\n\tvar results = [],\n\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\tresults.push(name);\n\t\t});\n\t}\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/else.js": {
"title": "$:/core/modules/filters/else.js",
"text": "/*\\\ntitle: $:/core/modules/filters/else.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing an empty input list with a constant, passing a non-empty input list straight through\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.else = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tif(results.length === 0) {\n\t\treturn [operator.operand];\n\t} else {\n\t\treturn results;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/decodeuricomponent.js": {
"title": "$:/core/modules/filters/decodeuricomponent.js",
"text": "/*\\\ntitle: $:/core/modules/filters/decodeuricomponent.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for applying decodeURIComponent() to each item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter functions\n*/\n\nexports.decodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURIComponent(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURIComponent(title));\n\t});\n\treturn results;\n};\n\nexports.decodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURI(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURI(title));\n\t});\n\treturn results;\n};\n\nexports.decodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlDecode(title));\n\t});\n\treturn results;\n};\n\nexports.encodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlEncode(title));\n\t});\n\treturn results;\n};\n\nexports.stringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.stringify(title));\n\t});\n\treturn results;\n};\n\nexports.jsonstringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.jsonStringify(title));\n\t});\n\treturn results;\n};\n\nexports.escaperegexp = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.escapeRegExp(title));\n\t});\n\treturn results;\n};\n\nexports.escapecss = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t// escape any character with a special meaning in CSS using CSS.escape()\n\t\tresults.push(CSS.escape(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/enlist.js": {
"title": "$:/core/modules/filters/enlist.js",
"text": "/*\\\ntitle: $:/core/modules/filters/enlist.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand parsed as a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.enlist = function(source,operator,options) {\n\tvar allowDuplicates = false;\n\tswitch(operator.suffix) {\n\t\tcase \"raw\":\n\t\t\tallowDuplicates = true;\n\t\t\tbreak;\n\t\tcase \"dedupe\":\n\t\t\tallowDuplicates = false;\n\t\t\tbreak;\n\t}\n\tvar list = $tw.utils.parseStringArray(operator.operand,allowDuplicates);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/field.js": {
"title": "$:/core/modules/filters/field.js",
"text": "/*\\\ntitle: $:/core/modules/filters/field.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.field = function(source,operator,options) {\n\tvar results = [],indexedResults,\n\t\tfieldname = (operator.suffix || operator.operator || \"title\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text !== operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !!operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif(source.byField && operator.operand) {\n\t\t\t\tindexedResults = source.byField(fieldname,operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults\n\t\t\t\t}\n\t\t\t}\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text === operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/fields.js": {
"title": "$:/core/modules/filters/fields.js",
"text": "/*\\\ntitle: $:/core/modules/filters/fields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.fields = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName,\n\t\tsuffixes = (operator.suffixes || [])[0] || [],\n\t\toperand = $tw.utils.parseStringArray(operator.operand);\n\t\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(suffixes.indexOf(\"include\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? $tw.utils.pushTop(results,fieldName) : \"\";\n\t\t\t\t}\n\t\t\t} else if (suffixes.indexOf(\"exclude\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? \"\" : $tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else if\n\t\t\telse {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else\n\t\t} // if (tiddler)\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/get.js": {
"title": "$:/core/modules/filters/get.js",
"text": "/*\\\ntitle: $:/core/modules/filters/get.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.get = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value = tiddler.getFieldString(operator.operand);\n\t\t\tif(value) {\n\t\t\t\tresults.push(value);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/getindex.js": {
"title": "$:/core/modules/filters/getindex.js",
"text": "/*\\\ntitle: $:/core/modules/filters/getindex.js\ntype: application/javascript\nmodule-type: filteroperator\n\nreturns the value at a given index of datatiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getindex = function(source,operator,options) {\n\tvar data,title,results = [];\n\tif(operator.operand){\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = tiddler ? tiddler.fields.title : title;\n\t\t\tdata = options.wiki.extractTiddlerDataItem(tiddler,operator.operand);\n\t\t\tif(data) {\n\t\t\t\tresults.push(data);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/getvariable.js": {
"title": "$:/core/modules/filters/getvariable.js",
"text": "/*\\\ntitle: $:/core/modules/filters/getvariable.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing input values by the value of the variable with the same name, or blank if the variable is missing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getvariable = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.widget.getVariable(title) || \"\");\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/has.js": {
"title": "$:/core/modules/filters/has.js",
"text": "/*\\\ntitle: $:/core/modules/filters/has.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a tiddler has the specified field or index\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.has = function(source,operator,options) {\n\tvar results = [],\n\t\tinvert = operator.prefix === \"!\";\n\n\tif(operator.suffix === \"field\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse if(operator.suffix === \"index\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop($tw.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop($tw.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand] === \"\")) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && !(tiddler.fields[operator.operand] === \"\" || tiddler.fields[operator.operand].length === 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\t\t\t\t\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/haschanged.js": {
"title": "$:/core/modules/filters/haschanged.js",
"text": "/*\\\ntitle: $:/core/modules/filters/haschanged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returns tiddlers from the list that have a non-zero changecount.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.haschanged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) === 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) > 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/indexes.js": {
"title": "$:/core/modules/filters/indexes.js",
"text": "/*\\\ntitle: $:/core/modules/filters/indexes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the indexes of a data tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.indexes = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = options.wiki.getTiddlerDataCached(title);\n\t\tif(data) {\n\t\t\t$tw.utils.pushTop(results,Object.keys(data));\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/insertbefore.js": {
"title": "$:/core/modules/filters/insertbefore.js",
"text": "/*\\\ntitle: $:/core/modules/filters/insertbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nInsert an item before another item in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.insertbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar target = options.widget && options.widget.getVariable(operator.suffix || \"currentTiddler\");\n\tif(target !== operator.operand) {\n\t\t// Remove the entry from the list if it is present\n\t\tvar pos = results.indexOf(operator.operand);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,1);\n\t\t}\n\t\t// Insert the entry before the target marker\n\t\tpos = results.indexOf(target);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,0,operator.operand);\n\t\t} else {\n\t\t\tresults.push(operator.operand);\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/is/binary.js": {
"title": "$:/core/modules/filters/is/binary.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/binary.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[binary]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.binary = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/blank.js": {
"title": "$:/core/modules/filters/is/blank.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/blank.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[blank]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.blank = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/current.js": {
"title": "$:/core/modules/filters/is/current.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/current.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar results = [],\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title !== currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title === currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/image.js": {
"title": "$:/core/modules/filters/is/image.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/image.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[image]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.image = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/missing.js": {
"title": "$:/core/modules/filters/is/missing.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/missing.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/orphan.js": {
"title": "$:/core/modules/filters/is/orphan.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/orphan.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[orphan]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphan = function(source,prefix,options) {\n\tvar results = [],\n\t\torphanTitles = options.wiki.getOrphanTitles();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) !== -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/shadow.js": {
"title": "$:/core/modules/filters/is/shadow.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/shadow.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[shadow]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadow = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/system.js": {
"title": "$:/core/modules/filters/is/system.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/system.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[system]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.system = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tag.js": {
"title": "$:/core/modules/filters/is/tag.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/tag.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tag]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,prefix,options) {\n\tvar results = [],\n\t\ttagMap = options.wiki.getTagMap();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tiddler.js": {
"title": "$:/core/modules/filters/is/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/tiddler.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tiddler]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddler = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/variable.js": {
"title": "$:/core/modules/filters/is/variable.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/variable.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[variable]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variable = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!(title in options.widget.variables)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title in options.widget.variables) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is.js": {
"title": "$:/core/modules/filters/is.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking tiddler properties\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar isFilterOperators;\n\nfunction getIsFilterOperators() {\n\tif(!isFilterOperators) {\n\t\tisFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"isfilteroperator\",isFilterOperators);\n\t}\n\treturn isFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.is = function(source,operator,options) {\n\t// Dispatch to the correct isfilteroperator\n\tvar isFilterOperators = getIsFilterOperators();\n\tif(operator.operand) {\n\t\tvar isFilterOperator = isFilterOperators[operator.operand];\n\t\tif(isFilterOperator) {\n\t\t\treturn isFilterOperator(source,operator.prefix,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/IsFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all tiddlers if the operand is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/limit.js": {
"title": "$:/core/modules/filters/limit.js",
"text": "/*\\\ntitle: $:/core/modules/filters/limit.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for chopping the results to a specified maximum number of entries\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.limit = function(source,operator,options) {\n\tvar results = [];\n\t// Convert to an array\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Slice the array if necessary\n\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\n\tif(operator.prefix === \"!\") {\n\t\tresults = results.slice(-limit);\n\t} else {\n\t\tresults = results.slice(0,limit);\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/links.js": {
"title": "$:/core/modules/filters/links.js",
"text": "/*\\\ntitle: $:/core/modules/filters/links.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the links from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.links = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/list.js": {
"title": "$:/core/modules/filters/list.js",
"text": "/*\\\ntitle: $:/core/modules/filters/list.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.list = function(source,operator,options) {\n\tvar results = [],\n\t\ttr = $tw.utils.parseTextReference(operator.operand),\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\"),\n\t\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults = list;\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listed.js": {
"title": "$:/core/modules/filters/listed.js",
"text": "/*\\\ntitle: $:/core/modules/filters/listed.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that have the selected tiddlers in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.listed = function(source,operator,options) {\n\tvar field = operator.operand || \"list\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listops.js": {
"title": "$:/core/modules/filters/listops.js",
"text": "/*\\\ntitle: $:/core/modules/filters/listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for manipulating the current selection list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.order = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.operand.toLowerCase() === \"reverse\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.unshift(title);\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nReverse list\n*/\nexports.reverse = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.unshift(title);\n\t});\n\treturn results;\n};\n\n/*\nFirst entry/entries in list\n*/\nexports.first = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,count);\n};\n\n/*\nLast entry/entries in list\n*/\nexports.last = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(-count);\n};\n\n/*\nAll but the first entry/entries of the list\n*/\nexports.rest = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count);\n};\nexports.butfirst = exports.rest;\nexports.bf = exports.rest;\n\n/*\nAll but the last entry/entries of the list\n*/\nexports.butlast = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,-count);\n};\nexports.bl = exports.butlast;\n\n/*\nThe nth member of the list\n*/\nexports.nth = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count - 1,count);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/lookup.js": {
"title": "$:/core/modules/filters/lookup.js",
"text": "/*\\\ntitle: $:/core/modules/filters/lookup.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that looks up values via a title prefix\n\n[lookup:<field>[<prefix>]]\n\nPrepends the prefix to the selected items and returns the specified field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.lookup = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.getTiddlerText(operator.operand + title) || options.wiki.getTiddlerText(operator.operand + operator.suffix));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/match.js": {
"title": "$:/core/modules/filters/match.js",
"text": "/*\\\ntitle: $:/core/modules/filters/match.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title matches a string\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.match = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() !== (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() === (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title !== operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title === operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/math.js": {
"title": "$:/core/modules/filters/math.js",
"text": "/*\\\ntitle: $:/core/modules/filters/math.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for math. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\nNote that strings are converted to numbers automatically. Trailing non-digits are ignored.\n\n* \"\" converts to 0\n* \"12kk\" converts to 12\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.negate = makeNumericBinaryOperator(\n\tfunction(a) {return -a}\n);\n\nexports.abs = makeNumericBinaryOperator(\n\tfunction(a) {return Math.abs(a)}\n);\n\nexports.ceil = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(a)}\n);\n\nexports.floor = makeNumericBinaryOperator(\n\tfunction(a) {return Math.floor(a)}\n);\n\nexports.round = makeNumericBinaryOperator(\n\tfunction(a) {return Math.round(a)}\n);\n\nexports.trunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.trunc(a)}\n);\n\nexports.untrunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(Math.abs(a)) * Math.sign(a)}\n);\n\nexports.sign = makeNumericBinaryOperator(\n\tfunction(a) {return Math.sign(a)}\n);\n\nexports.add = makeNumericBinaryOperator(\n\tfunction(a,b) {return a + b;}\n);\n\nexports.subtract = makeNumericBinaryOperator(\n\tfunction(a,b) {return a - b;}\n);\n\nexports.multiply = makeNumericBinaryOperator(\n\tfunction(a,b) {return a * b;}\n);\n\nexports.divide = makeNumericBinaryOperator(\n\tfunction(a,b) {return a / b;}\n);\n\nexports.remainder = makeNumericBinaryOperator(\n\tfunction(a,b) {return a % b;}\n);\n\nexports.max = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.max(a,b);}\n);\n\nexports.min = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.min(a,b);}\n);\n\nexports.fixed = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toFixed.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.precision = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toPrecision.call(a,Math.min(Math.max(b,1),100));}\n);\n\nexports.exponential = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.sum = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0 // Initial value\n);\n\nexports.product = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator * value},\n\t1 // Initial value\n);\n\nexports.maxall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.max(accumulator,value)},\n\t-Infinity // Initial value\n);\n\nexports.minall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.min(accumulator,value)},\n\tInfinity // Initial value\n);\n\nfunction makeNumericBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [],\n\t\t\tnumOperand = $tw.utils.parseNumber(operator.operand);\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push($tw.utils.stringifyNumber(fnCalc($tw.utils.parseNumber(title),numOperand)));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeNumericReducingOperator(fnCalc,initialValue) {\n\tinitialValue = initialValue || 0;\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\treturn [$tw.utils.stringifyNumber(result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,$tw.utils.parseNumber(currentValue));\n\t\t},initialValue))];\n\t};\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/minlength.js": {
"title": "$:/core/modules/filters/minlength.js",
"text": "/*\\\ntitle: $:/core/modules/filters/minlength.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for filtering out titles that don't meet the minimum length in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.minlength = function(source,operator,options) {\n\tvar results = [],\n\t\tminLength = parseInt(operator.operand || \"\",10) || 0;\n\tsource(function(tiddler,title) {\n\t\tif(title.length >= minLength) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/modules.js": {
"title": "$:/core/modules/filters/modules.js",
"text": "/*\\\ntitle: $:/core/modules/filters/modules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the modules of a given type in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.modules = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\tresults.push(moduleName);\n\t\t});\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/moduletypes.js": {
"title": "$:/core/modules/filters/moduletypes.js",
"text": "/*\\\ntitle: $:/core/modules/filters/moduletypes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the module types in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.moduletypes = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/next.js": {
"title": "$:/core/modules/filters/next.js",
"text": "/*\\\ntitle: $:/core/modules/filters/next.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.next = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch++;\n\t\tif(match > 0 && match < list.length) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/plugintiddlers.js": {
"title": "$:/core/modules/filters/plugintiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/filters/plugintiddlers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the shadow tiddlers within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.plugintiddlers = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerDataCached(title,{tiddlers:[]});\n\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\n\t\t\t\tresults.push(title);\n\t\t\t});\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/prefix.js": {
"title": "$:/core/modules/filters/prefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/prefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title starts with a prefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.prefix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/previous.js": {
"title": "$:/core/modules/filters/previous.js",
"text": "/*\\\ntitle: $:/core/modules/filters/previous.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.previous = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch--;\n\t\tif(match >= 0) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/range.js": {
"title": "$:/core/modules/filters/range.js",
"text": "/*\\\ntitle: $:/core/modules/filters/range.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for generating a numeric range.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.range = function(source,operator,options) {\n\tvar results = [];\n\t// Split the operand into numbers delimited by these symbols\n\tvar parts = operator.operand.split(/[,:;]/g),\n\t\tbeg, end, inc, i, fixed = 0;\n\tfor (i=0; i<parts.length; i++) {\n\t\t// Validate real number\n\t\tif(!/^\\s*[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))\\s*$/.test(parts[i])) {\n\t\t\treturn [\"range: bad number \\\"\" + parts[i] + \"\\\"\"];\n\t\t}\n\t\t// Count digits; the most precise number determines decimal places in output.\n\t\tvar frac = /\\.\\d+/.exec(parts[i]);\n\t\tif(frac) {\n\t\t\tfixed = Math.max(fixed,frac[0].length-1);\n\t\t}\n\t\tparts[i] = parseFloat(parts[i]);\n\t}\n\tswitch(parts.length) {\n\t\tcase 1:\n\t\t\tend = parts[0];\n\t\t\tif (end >= 1) {\n\t\t\t\tbeg = 1;\n\t\t\t}\n\t\t\telse if (end <= -1) {\n\t\t\t\tbeg = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = Math.abs(parts[2]);\n\t\t\tbreak;\n\t}\n\tif(inc === 0) {\n\t\treturn [\"range: increment 0 causes infinite loop\"];\n\t}\n\t// May need to count backwards\n\tvar direction = ((end < beg) ? -1 : 1);\n\tinc *= direction;\n\t// Estimate number of resulting elements\n\tif((end - beg) / inc > 10000) {\n\t\treturn [\"range: too many steps (over 10K)\"];\n\t}\n\t// Avoid rounding error on last step\n\tend += direction * 0.5 * Math.pow(0.1,fixed);\n\tvar safety = 10010;\n\t// Enumerate the range\n\tif (end<beg) {\n\t\tfor(i=beg; i>end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor(i=beg; i<end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif(safety<0) {\n\t\treturn [\"range: unexpectedly large output\"];\n\t}\n\t// Reverse?\n\tif(operator.prefix === \"!\") {\n\t\tresults.reverse();\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/regexp.js": {
"title": "$:/core/modules/filters/regexp.js",
"text": "/*\\\ntitle: $:/core/modules/filters/regexp.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for regexp matching\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.regexp = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"title\").toLowerCase(),\n\t\tregexpString, regexp, flags = \"\", match,\n\t\tgetFieldString = function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\treturn tiddler.getFieldString(fieldname);\n\t\t\t} else if(fieldname === \"title\") {\n\t\t\t\treturn title;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t// Process flags and construct regexp\n\tregexpString = operator.operand;\n\tmatch = /^\\(\\?([gim]+)\\)/.exec(regexpString);\n\tif(match) {\n\t\tflags = match[1];\n\t\tregexpString = regexpString.substr(match[0].length);\n\t} else {\n\t\tmatch = /\\(\\?([gim]+)\\)$/.exec(regexpString);\n\t\tif(match) {\n\t\t\tflags = match[1];\n\t\t\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\n\t\t}\n\t}\n\ttry {\n\t\tregexp = new RegExp(regexpString,flags);\n\t} catch(e) {\n\t\treturn [\"\" + e];\n\t}\n\t// Process the incoming tiddlers\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removeprefix.js": {
"title": "$:/core/modules/filters/removeprefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/removeprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removeprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removesuffix.js": {
"title": "$:/core/modules/filters/removesuffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/removesuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removesuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title && title.substr(-operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sameday.js": {
"title": "$:/core/modules/filters/sameday.js",
"text": "/*\\\ntitle: $:/core/modules/filters/sameday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sameday = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\n\t// Function to convert a date/time to a date integer\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(tiddler.getFieldDay(fieldName) === targetDate) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/search.js": {
"title": "$:/core/modules/filters/search.js",
"text": "/*\\\ntitle: $:/core/modules/filters/search.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for searching for the text in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.search = function(source,operator,options) {\n\tvar invert = operator.prefix === \"!\";\n\tif(operator.suffixes) {\n\t\tvar hasFlag = function(flag) {\n\t\t\t\treturn (operator.suffixes[1] || []).indexOf(flag) !== -1;\n\t\t\t},\n\t\t\texcludeFields = false,\n\t\t\tfieldList = operator.suffixes[0] || [],\n\t\t\tfirstField = fieldList[0] || \"\", \n\t\t\tfirstChar = firstField.charAt(0),\n\t\t\tfields;\n\t\tif(firstChar === \"-\") {\n\t\t\tfields = [firstField.slice(1)].concat(fieldList.slice(1));\n\t\t\texcludeFields = true;\n\t\t} else if(fieldList[0] === \"*\"){\n\t\t\tfields = [];\n\t\t\texcludeFields = true;\n\t\t} else {\n\t\t\tfields = fieldList.slice(0);\n\t\t}\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: fields,\n\t\t\texcludeField: excludeFields,\n\t\t\tcaseSensitive: hasFlag(\"casesensitive\"),\n\t\t\tliteral: hasFlag(\"literal\"),\n\t\t\twhitespace: hasFlag(\"whitespace\"),\n\t\t\tanchored: hasFlag(\"anchored\"),\n\t\t\tregexp: hasFlag(\"regexp\"),\n\t\t\twords: hasFlag(\"words\")\n\t\t});\n\t} else {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/shadowsource.js": {
"title": "$:/core/modules/filters/shadowsource.js",
"text": "/*\\\ntitle: $:/core/modules/filters/shadowsource.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the source plugins for shadow tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadowsource = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar source = options.wiki.getShadowSource(title);\n\t\tif(source) {\n\t\t\t$tw.utils.pushTop(results,source);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sort.js": {
"title": "$:/core/modules/filters/sort.js",
"text": "/*\\\ntitle: $:/core/modules/filters/sort.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,false);\n\treturn results;\n};\n\nexports.nsort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,true);\n\treturn results;\n};\n\nexports.sortan = function(source, operator, options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results, operator.operand || \"title\", operator.prefix === \"!\",false,false,true);\n\treturn results;\n};\n\nexports.sortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,false);\n\treturn results;\n};\n\nexports.nsortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,true);\n\treturn results;\n};\n\nvar prepare_results = function (source) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/splitbefore.js": {
"title": "$:/core/modules/filters/splitbefore.js",
"text": "/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.splitbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(operator.operand);\n\t\tif(parts.length === 1) {\n\t\t\t$tw.utils.pushTop(results,parts[0]);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,parts[0] + operator.operand);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/storyviews.js": {
"title": "$:/core/modules/filters/storyviews.js",
"text": "/*\\\ntitle: $:/core/modules/filters/storyviews.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the story views in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.storyviews = function(source,operator,options) {\n\tvar results = [],\n\t\tstoryviews = {};\n\t$tw.modules.applyMethods(\"storyview\",storyviews);\n\t$tw.utils.each(storyviews,function(info,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/strings.js": {
"title": "$:/core/modules/filters/strings.js",
"text": "/*\\\ntitle: $:/core/modules/filters/strings.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for strings. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.length = makeStringBinaryOperator(\n\tfunction(a) {return [\"\" + (\"\" + a).length];}\n);\n\nexports.uppercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toUpperCase()];}\n);\n\nexports.lowercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toLowerCase()];}\n);\n\nexports.sentencecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toSentenceCase(a)];}\n);\n\nexports.titlecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toTitleCase(a)];}\n);\n\nexports.trim = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.trim(a)];}\n);\n\nexports.split = makeStringBinaryOperator(\n\tfunction(a,b) {return (\"\" + a).split(b);}\n);\n\nexports.join = makeStringReducingOperator(\n\tfunction(accumulator,value,operand) {\n\t\tif(accumulator === null) {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn accumulator + operand + value;\n\t\t}\n\t},null\n);\n\nfunction makeStringBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tArray.prototype.push.apply(result,fnCalc(title,operator.operand || \"\"));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeStringReducingOperator(fnCalc,initialValue) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\treturn [result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,currentValue,operator.operand || \"\");\n\t\t},initialValue) || \"\"];\n\t};\n}\n\nexports.splitregexp = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\tflags = (suffix.indexOf(\"m\") !== -1 ? \"m\" : \"\") + (suffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tregExp;\n\ttry {\n\t\tregExp = new RegExp(operator.operand || \"\",flags);\t\t\n\t} catch(ex) {\n\t\treturn [\"RegExp error: \" + ex];\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,title.split(regExp));\n\t});\t\t\n\treturn result;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/subfilter.js": {
"title": "$:/core/modules/filters/subfilter.js",
"text": "/*\\\ntitle: $:/core/modules/filters/subfilter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand evaluated as a filter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subfilter = function(source,operator,options) {\n\tvar list = options.wiki.filterTiddlers(operator.operand,options.widget,source);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/subtiddlerfields.js": {
"title": "$:/core/modules/filters/subtiddlerfields.js",
"text": "/*\\\ntitle: $:/core/modules/filters/subtiddlerfields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected subtiddlers of the plugin named in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subtiddlerfields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar subtiddler = options.wiki.getSubTiddler(operator.operand,title);\n\t\tif(subtiddler) {\n\t\t\tfor(var fieldName in subtiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/suffix.js": {
"title": "$:/core/modules/filters/suffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/suffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title ends with a suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.suffix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tag.js": {
"title": "$:/core/modules/filters/tag.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tag.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking for the presence of a tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,operator,options) {\n\tvar results = [],indexedResults;\n\tif((operator.suffix || \"\").toLowerCase() === \"strict\" && !operator.operand) {\n\t\t// New semantics:\n\t\t// Always return copy of input if operator.operand is missing\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else {\n\t\t// Old semantics:\n\t\tvar tiddlers;\n\t\tif(operator.prefix === \"!\") {\n\t\t\t// Returns a copy of the input if operator.operand is missing\n\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddlers.indexOf(title) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// Returns empty results if operator.operand is missing\n\t\t\tif(source.byTag) {\n\t\t\t\tindexedResults = source.byTag(operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\t\tsource(function(tiddler,title) {\n\t\t\t\t\tif(tiddlers.indexOf(title) !== -1) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t\t\t}\n\t\t}\t\t\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tagging.js": {
"title": "$:/core/modules/filters/tagging.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tagging.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tagging = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tags.js": {
"title": "$:/core/modules/filters/tags.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tags.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the tags of the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,operator,options) {\n\tvar tags = {};\n\tsource(function(tiddler,title) {\n\t\tvar t, length;\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\tfor(t=0, length=tiddler.fields.tags.length; t<length; t++) {\n\t\t\t\ttags[tiddler.fields.tags[t]] = true;\n\t\t\t}\n\t\t}\n\t});\n\treturn Object.keys(tags);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/then.js": {
"title": "$:/core/modules/filters/then.js",
"text": "/*\\\ntitle: $:/core/modules/filters/then.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing any titles with a constant\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.then = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/title.js": {
"title": "$:/core/modules/filters/title.js",
"text": "/*\\\ntitle: $:/core/modules/filters/title.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing title fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.title = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields.title !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults.push(operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/untagged.js": {
"title": "$:/core/modules/filters/untagged.js",
"text": "/*\\\ntitle: $:/core/modules/filters/untagged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the selected tiddlers that are untagged\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.untagged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.hasField(\"tags\") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/variables.js": {
"title": "$:/core/modules/filters/variables.js",
"text": "/*\\\ntitle: $:/core/modules/filters/variables.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the active variables\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variables = function(source,operator,options) {\n\tvar names = [];\n\tfor(var variable in options.widget.variables) {\n\t\tnames.push(variable);\n\t}\n\treturn names.sort();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/wikiparserrules.js": {
"title": "$:/core/modules/filters/wikiparserrules.js",
"text": "/*\\\ntitle: $:/core/modules/filters/wikiparserrules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the wiki parser rules in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.wikiparserrules = function(source,operator,options) {\n\tvar results = [],\n\t\toperand = operator.operand;\n\t$tw.utils.each($tw.modules.types.wikirule,function(mod) {\n\t\tvar exp = mod.exports;\n\t\tif(!operand || exp.types[operand]) {\n\t\t\tresults.push(exp.name);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/x-listops.js": {
"title": "$:/core/modules/filters/x-listops.js",
"text": "/*\\\ntitle: $:/core/modules/filters/x-listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nExtended filter operators to manipulate the current list.\n\n\\*/\n(function () {\n\n /*jslint node: true, browser: true */\n /*global $tw: false */\n \"use strict\";\n\n /*\n Fetch titles from the current list\n */\n var prepare_results = function (source) {\n var results = [];\n source(function (tiddler, title) {\n results.push(title);\n });\n return results;\n };\n\n /*\n Moves a number of items from the tail of the current list before the item named in the operand\n */\n exports.putbefore = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -1) :\n results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\n };\n\n /*\n Moves a number of items from the tail of the current list after the item named in the operand\n */\n exports.putafter = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -1) :\n results.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n };\n\n /*\n Replaces the item named in the operand with a number of items from the tail of the current list\n */\n exports.replace = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -count) :\n results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n };\n\n /*\n Moves a number of items from the tail of the current list to the head of the list\n */\n exports.putfirst = function (source, operator) {\n var results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,1);\n return results.slice(-count).concat(results.slice(0, -count));\n };\n\n /*\n Moves a number of items from the head of the current list to the tail of the list\n */\n exports.putlast = function (source, operator) {\n var results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,1);\n return results.slice(count).concat(results.slice(0, count));\n };\n\n /*\n Moves the item named in the operand a number of places forward or backward in the list\n */\n exports.move = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1),\n marker = results.splice(index, 1),\n offset = (index + count) > 0 ? index + count : 0;\n return results.slice(0, offset).concat(marker).concat(results.slice(offset));\n };\n\n /*\n Returns the items from the current list that are after the item named in the operand\n */\n exports.allafter = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand);\n return (index === -1) ? [] :\n (operator.suffix) ? results.slice(index) :\n results.slice(index + 1);\n };\n\n /*\n Returns the items from the current list that are before the item named in the operand\n */\n exports.allbefore = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand);\n return (index === -1) ? [] :\n (operator.suffix) ? results.slice(0, index + 1) :\n results.slice(0, index);\n };\n\n /*\n Appends the items listed in the operand array to the tail of the current list\n */\n exports.append = function (source, operator) {\n var append = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = parseInt(operator.suffix) || append.length;\n return (append.length === 0) ? results :\n (operator.prefix) ? results.concat(append.slice(-count)) :\n results.concat(append.slice(0, count));\n };\n\n /*\n Prepends the items listed in the operand array to the head of the current list\n */\n exports.prepend = function (source, operator) {\n var prepend = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,prepend.length);\n return (prepend.length === 0) ? results :\n (operator.prefix) ? prepend.slice(-count).concat(results) :\n prepend.slice(0, count).concat(results);\n };\n\n /*\n Returns all items from the current list except the items listed in the operand array\n */\n exports.remove = function (source, operator) {\n var array = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = parseInt(operator.suffix) || array.length,\n p,\n len,\n index;\n len = array.length - 1;\n for (p = 0; p < count; ++p) {\n if (operator.prefix) {\n index = results.indexOf(array[len - p]);\n } else {\n index = results.indexOf(array[p]);\n }\n if (index !== -1) {\n results.splice(index, 1);\n }\n }\n return results;\n };\n\n /*\n Returns all items from the current list sorted in the order of the items in the operand array\n */\n exports.sortby = function (source, operator) {\n var results = prepare_results(source);\n if (!results || results.length < 2) {\n return results;\n }\n var lookup = $tw.utils.parseStringArray(operator.operand, \"true\");\n results.sort(function (a, b) {\n return lookup.indexOf(a) - lookup.indexOf(b);\n });\n return results;\n };\n\n /*\n Removes all duplicate items from the current list\n */\n exports.unique = function (source, operator) {\n var results = prepare_results(source);\n var set = results.reduce(function (a, b) {\n if (a.indexOf(b) < 0) {\n a.push(b);\n }\n return a;\n }, []);\n return set;\n };\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters.js": {
"title": "$:/core/modules/filters.js",
"text": "/*\\\ntitle: $:/core/modules/filters.js\ntype: application/javascript\nmodule-type: wikimethod\n\nAdds tiddler filtering methods to the $tw.Wiki object.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParses an operation (i.e. a run) within a filter string\n\toperators: Array of array of operator nodes into which results should be inserted\n\tfilterString: filter string\n\tp: start position within the string\nReturns the new start position, after the parsed operation\n*/\nfunction parseFilterOperation(operators,filterString,p) {\n\tvar nextBracketPos, operator;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\tthrow \"Missing [ in filter expression\";\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = filterString.charAt(p++);\n\t\t}\n\t\t// Get the operator name\n\t\tnextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing [ in filter expression\";\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\t// The raw suffix for older filters\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t\t// The processed suffix for newer filters\n\t\t\toperator.suffixes = [];\n\t\t\t$tw.utils.each(operator.suffix.split(\":\"),function(subsuffix) {\n\t\t\t\toperator.suffixes.push([]);\n\t\t\t\t$tw.utils.each(subsuffix.split(\",\"),function(entry) {\n\t\t\t\t\tentry = $tw.utils.trim(entry);\n\t\t\t\t\tif(entry) {\n\t\t\t\t\t\toperator.suffixes[operator.suffixes.length - 1].push(entry); \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\n\t\tp = nextBracketPos + 1;\n\t\tswitch (bracket) {\n\t\t\tcase \"{\": // Curly brackets\n\t\t\t\toperator.indirect = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"[\": // Square brackets\n\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"<\": // Angle brackets\n\t\t\t\toperator.variable = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"/\": // regexp brackets\n\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\tif(rexMatch) {\n\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n// DEPRECATION WARNING\nconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t}\n\t\tif(!operator.regexp) {\n\t\t\toperator.operand = filterString.substring(p,nextBracketPos);\n\t\t}\n\t\tp = nextBracketPos + 1;\n\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-|~|=)?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow $tw.language.getString(\"Error/FilterSyntax\");\n\t\t\t}\n\t\t\tvar operation = {\n\t\t\t\tprefix: \"\",\n\t\t\t\toperators: []\n\t\t\t};\n\t\t\tif(match[1]) {\n\t\t\t\toperation.prefix = match[1];\n\t\t\t\tp++;\n\t\t\t}\n\t\t\tif(match[2]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[3] || match[4] || match[5]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operand: match[3] || match[4] || match[5]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\treturn function(source,widget) {\n\t\t\treturn [$tw.language.getString(\"Error/Filter\") + \": \" + e];\n\t\t};\n\t}\n\t// Get the hashmap of filter operator functions\n\tvar filterOperators = this.getFilterOperators();\n\t// Assemble array of functions, one for each operation\n\tvar operationFunctions = [];\n\t// Step through the operations\n\tvar self = this;\n\t$tw.utils.each(filterParseTree,function(operation) {\n\t\t// Create a function for the chain of operators in the operation\n\t\tvar operationSubFunction = function(source,widget) {\n\t\t\tvar accumulator = source,\n\t\t\t\tresults = [],\n\t\t\t\tcurrTiddlerTitle = widget && widget.getVariable(\"currentTiddler\");\n\t\t\t$tw.utils.each(operation.operators,function(operator) {\n\t\t\t\tvar operand = operator.operand,\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\toperatorFunction = filterOperators.field;\n\t\t\t\t} else {\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\tif(operator.indirect) {\n\t\t\t\t\toperand = self.getTextReference(operator.operand,\"\",currTiddlerTitle);\n\t\t\t\t}\n\t\t\t\tif(operator.variable) {\n\t\t\t\t\toperand = widget.getVariable(operator.operand,{defaultValue: \"\"});\n\t\t\t\t}\n\t\t\t\t// Invoke the appropriate filteroperator module\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operand,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\tsuffixes: operator.suffixes,\n\t\t\t\t\t\t\tregexp: operator.regexp\n\t\t\t\t\t\t},{\n\t\t\t\t\t\t\twiki: self,\n\t\t\t\t\t\t\twidget: widget\n\t\t\t\t\t\t});\n\t\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\t\taccumulator = self.makeTiddlerIterator(results);\n\t\t\t\t} else {\n\t\t\t\t\taccumulator = results;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\tvar resultArray = [];\n\t\t\t\tresults(function(tiddler,title) {\n\t\t\t\t\tresultArray.push(title);\n\t\t\t\t});\n\t\t\t\treturn resultArray;\n\t\t\t}\n\t\t};\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"=\": // The results of the operation are pushed into the result without deduplication\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\tArray.prototype.push.apply(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.removeArrayEntries(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\t\t\t\t\tsource = self.makeTiddlerIterator(results);\n\t\t\t\t\t\tresults.splice(0,results.length);\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"~\": // This operation is unioned into the result only if the main result so far is empty\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\tif(results.length === 0) {\n\t\t\t\t\t\t\t// Main result so far is empty\n\t\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t}\n\t\t})());\n\t});\n\t// Return a function that applies the operations to a source iterator of tiddler titles\n\treturn $tw.perf.measure(\"filter: \" + filterString,function filterFunction(source,widget) {\n\t\tif(!source) {\n\t\t\tsource = self.each;\n\t\t} else if(typeof source === \"object\") { // Array or hashmap\n\t\t\tsource = self.makeTiddlerIterator(source);\n\t\t}\n\t\tvar results = [];\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results;\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/core/modules/indexers/backlinks-indexer.js": {
"title": "$:/core/modules/indexers/backlinks-indexer.js",
"text": "/*\\\ntitle: $:/core/modules/indexers/backlinks-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers' backlinks\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\n\nfunction BacklinksIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nBacklinksIndexer.prototype.init = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype.rebuild = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype._getLinks = function(tiddler) {\n\tvar parser = this.wiki.parseText(tiddler.fields.type, tiddler.fields.text, {});\n\tif(parser) {\n\t\treturn this.wiki.extractLinks(parser.tree);\n\t}\n\treturn [];\n}\n\nBacklinksIndexer.prototype.update = function(updateDescriptor) {\n\tif(!this.index) {\n\t\treturn;\n\t}\n\tvar newLinks = [],\n\t oldLinks = [],\n\t self = this;\n\tif(updateDescriptor.old.exists) {\n\t\toldLinks = this._getLinks(updateDescriptor.old.tiddler);\n\t}\n\tif(updateDescriptor.new.exists) {\n\t\tnewLinks = this._getLinks(updateDescriptor.new.tiddler);\n\t}\n\n\t$tw.utils.each(oldLinks,function(link) {\n\t\tif(self.index[link]) {\n\t\t\tdelete self.index[link][updateDescriptor.old.tiddler.fields.title];\n\t\t}\n\t});\n\t$tw.utils.each(newLinks,function(link) {\n\t\tif(!self.index[link]) {\n\t\t\tself.index[link] = Object.create(null);\n\t\t}\n\t\tself.index[link][updateDescriptor.new.tiddler.fields.title] = true;\n\t});\n}\n\nBacklinksIndexer.prototype.lookup = function(title) {\n\tif(!this.index) {\n\t\tthis.index = Object.create(null);\n\t\tvar self = this;\n\t\tthis.wiki.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self._getLinks(tiddler);\n\t\t\t$tw.utils.each(links, function(link) {\n\t\t\t\tif(!self.index[link]) {\n\t\t\t\t\tself.index[link] = Object.create(null);\n\t\t\t\t}\n\t\t\t\tself.index[link][title] = true;\n\t\t\t});\n\t\t});\n\t}\n\tif(this.index[title]) {\n\t\treturn Object.keys(this.index[title]);\n\t} else {\n\t\treturn [];\n\t}\n}\n\nexports.BacklinksIndexer = BacklinksIndexer;\n\n})();\n",
"type": "application/javascript",
"module-type": "indexer"
},
"$:/core/modules/indexers/field-indexer.js": {
"title": "$:/core/modules/indexers/field-indexer.js",
"text": "/*\\\ntitle: $:/core/modules/indexers/field-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nvar DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH = 128;\n\nfunction FieldIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nFieldIndexer.prototype.init = function() {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH;\n\tthis.addIndexMethods();\n}\n\n// Provided for testing\nFieldIndexer.prototype.setMaxIndexedValueLength = function(length) {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = length;\n};\n\nFieldIndexer.prototype.addIndexMethods = function() {\n\tvar self = this;\n\tthis.wiki.each.byField = function(name,value) {\n\t\tvar titles = self.wiki.allTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachShadow.byField = function(name,value) {\n\t\tvar titles = self.wiki.allShadowTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachTiddlerPlusShadows.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n\tthis.wiki.eachShadowPlusTiddlers.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n};\n\n/*\nTear down and then rebuild the index as if all tiddlers have changed\n*/\nFieldIndexer.prototype.rebuild = function() {\n\t// Invalidate the index so that it will be rebuilt when it is next used\n\tthis.index = null;\n};\n\n/*\nBuild the index for a particular field\n*/\nFieldIndexer.prototype.buildIndexForField = function(name) {\n\tvar self = this;\n\t// Hashmap by field name of hashmap by field value of array of tiddler titles\n\tthis.index = this.index || Object.create(null);\n\tthis.index[name] = Object.create(null);\n\tvar baseIndex = this.index[name];\n\t// Update the index for each tiddler\n\tthis.wiki.eachTiddlerPlusShadows(function(tiddler,title) {\n\t\tif(name in tiddler.fields) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t// Skip any values above the maximum length\n\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\tbaseIndex[value] = baseIndex[value] || [];\n\t\t\t\tbaseIndex[value].push(title);\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nUpdate the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create)\nupdateDescriptor: {old: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>},new: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>}}\n*/\nFieldIndexer.prototype.update = function(updateDescriptor) {\n\tvar self = this;\n\t// Don't do anything if the index hasn't been built yet\n\tif(this.index === null) {\n\t\treturn;\n\t}\n\t// Remove the old tiddler from the index\n\tif(updateDescriptor.old.tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor.old.tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor.old.tiddler.getFieldString(name),\n\t\t\t\t\ttiddlerList = indexEntry[value];\n\t\t\t\tif(tiddlerList) {\n\t\t\t\t\tvar index = tiddlerList.indexOf(updateDescriptor.old.tiddler.fields.title);\n\t\t\t\t\tif(index !== -1) {\n\t\t\t\t\t\ttiddlerList.splice(index,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// Add the new tiddler to the index\n\tif(updateDescriptor[\"new\"].tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor[\"new\"].tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor[\"new\"].tiddler.getFieldString(name);\n\t\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\t\tindexEntry[value] = indexEntry[value] || [];\n\t\t\t\t\tindexEntry[value].push(updateDescriptor[\"new\"].tiddler.fields.title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n// Lookup the given field returning a list of tiddler titles\nFieldIndexer.prototype.lookup = function(name,value) {\n\t// Fail the lookup if the value is too long\n\tif(value.length >= this.maxIndexedValueLength) {\n\t\treturn null;\n\t}\n\t// Update the index if it has yet to be built\n\tif(this.index === null || !this.index[name]) {\n\t\tthis.buildIndexForField(name);\n\t}\n\treturn this.index[name][value] || [];\n};\n\nexports.FieldIndexer = FieldIndexer;\n\n})();\n",
"type": "application/javascript",
"module-type": "indexer"
},
"$:/core/modules/indexers/tag-indexer.js": {
"title": "$:/core/modules/indexers/tag-indexer.js",
"text": "/*\\\ntitle: $:/core/modules/indexers/tag-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nfunction TagIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nTagIndexer.prototype.init = function() {\n\tthis.subIndexers = [\n\t\tnew TagSubIndexer(this,\"each\"),\n\t\tnew TagSubIndexer(this,\"eachShadow\"),\n\t\tnew TagSubIndexer(this,\"eachTiddlerPlusShadows\"),\n\t\tnew TagSubIndexer(this,\"eachShadowPlusTiddlers\")\n\t];\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.addIndexMethod();\n\t});\n};\n\nTagIndexer.prototype.rebuild = function() {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.rebuild();\n\t});\n};\n\nTagIndexer.prototype.update = function(updateDescriptor) {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.update(updateDescriptor);\n\t});\n};\n\nfunction TagSubIndexer(indexer,iteratorMethod) {\n\tthis.indexer = indexer;\n\tthis.iteratorMethod = iteratorMethod;\n\tthis.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} or null if not yet initialised\n}\n\nTagSubIndexer.prototype.addIndexMethod = function() {\n\tvar self = this;\n\tthis.indexer.wiki[this.iteratorMethod].byTag = function(tag) {\n\t\treturn self.lookup(tag).slice(0);\n\t};\n};\n\nTagSubIndexer.prototype.rebuild = function() {\n\tvar self = this;\n\t// Hashmap by tag of array of {isSorted:, titles:[]}\n\tthis.index = Object.create(null);\n\t// Add all the tags\n\tthis.indexer.wiki[this.iteratorMethod](function(tiddler,title) {\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\tif(!self.index[tag]) {\n\t\t\t\tself.index[tag] = {isSorted: false, titles: [title]};\n\t\t\t} else {\n\t\t\t\tself.index[tag].titles.push(title);\n\t\t\t}\n\t\t});\t\t\n\t});\n};\n\nTagSubIndexer.prototype.update = function(updateDescriptor) {\n\tthis.index = null;\n};\n\nTagSubIndexer.prototype.lookup = function(tag) {\n\t// Update the index if it has yet to be built\n\tif(this.index === null) {\n\t\tthis.rebuild();\n\t}\n\tvar indexRecord = this.index[tag];\n\tif(indexRecord) {\n\t\tif(!indexRecord.isSorted) {\n\t\t\tif(this.indexer.wiki.sortByList) {\n\t\t\t\tindexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag);\n\t\t\t}\t\t\t\n\t\t\tindexRecord.isSorted = true;\n\t\t}\n\t\treturn indexRecord.titles;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n\nexports.TagIndexer = TagIndexer;\n\n})();\n",
"type": "application/javascript",
"module-type": "indexer"
},
"$:/core/modules/info/platform.js": {
"title": "$:/core/modules/info/platform.js",
"text": "/*\\\ntitle: $:/core/modules/info/platform.js\ntype: application/javascript\nmodule-type: info\n\nInitialise basic platform $:/info/ tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.getInfoTiddlerFields = function() {\n\tvar mapBoolean = function(value) {return value ? \"yes\" : \"no\";},\n\t\tinfoTiddlerFields = [];\n\t// Basics\n\tinfoTiddlerFields.push({title: \"$:/info/browser\", text: mapBoolean(!!$tw.browser)});\n\tinfoTiddlerFields.push({title: \"$:/info/node\", text: mapBoolean(!!$tw.node)});\n\tif($tw.browser) {\n\t\t// Document location\n\t\tvar setLocationProperty = function(name,value) {\n\t\t\t\tinfoTiddlerFields.push({title: \"$:/info/url/\" + name, text: value});\t\t\t\n\t\t\t},\n\t\t\tlocation = document.location;\n\t\tsetLocationProperty(\"full\", (location.toString()).split(\"#\")[0]);\n\t\tsetLocationProperty(\"host\", location.host);\n\t\tsetLocationProperty(\"hostname\", location.hostname);\n\t\tsetLocationProperty(\"protocol\", location.protocol);\n\t\tsetLocationProperty(\"port\", location.port);\n\t\tsetLocationProperty(\"pathname\", location.pathname);\n\t\tsetLocationProperty(\"search\", location.search);\n\t\tsetLocationProperty(\"origin\", location.origin);\n\t\t// Screen size\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/width\", text: window.screen.width.toString()});\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/height\", text: window.screen.height.toString()});\n\t\t// Language\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/language\", text: navigator.language || \"\"});\n\t}\n\treturn infoTiddlerFields;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "info"
},
"$:/core/modules/keyboard.js": {
"title": "$:/core/modules/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/keyboard.js\ntype: application/javascript\nmodule-type: global\n\nKeyboard handling utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"cancel\": 3,\n\t\"help\": 6,\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"clear\": 12,\n\t\"return\": 13,\n\t\"enter\": 13,\n\t\"pause\": 19,\n\t\"escape\": 27,\n\t\"space\": 32,\n\t\"page_up\": 33,\n\t\"page_down\": 34,\n\t\"end\": 35,\n\t\"home\": 36,\n\t\"left\": 37,\n\t\"up\": 38,\n\t\"right\": 39,\n\t\"down\": 40,\n\t\"printscreen\": 44,\n\t\"insert\": 45,\n\t\"delete\": 46,\n\t\"0\": 48,\n\t\"1\": 49,\n\t\"2\": 50,\n\t\"3\": 51,\n\t\"4\": 52,\n\t\"5\": 53,\n\t\"6\": 54,\n\t\"7\": 55,\n\t\"8\": 56,\n\t\"9\": 57,\n\t\"firefoxsemicolon\": 59,\n\t\"firefoxequals\": 61,\n\t\"a\": 65,\n\t\"b\": 66,\n\t\"c\": 67,\n\t\"d\": 68,\n\t\"e\": 69,\n\t\"f\": 70,\n\t\"g\": 71,\n\t\"h\": 72,\n\t\"i\": 73,\n\t\"j\": 74,\n\t\"k\": 75,\n\t\"l\": 76,\n\t\"m\": 77,\n\t\"n\": 78,\n\t\"o\": 79,\n\t\"p\": 80,\n\t\"q\": 81,\n\t\"r\": 82,\n\t\"s\": 83,\n\t\"t\": 84,\n\t\"u\": 85,\n\t\"v\": 86,\n\t\"w\": 87,\n\t\"x\": 88,\n\t\"y\": 89,\n\t\"z\": 90,\n\t\"numpad0\": 96,\n\t\"numpad1\": 97,\n\t\"numpad2\": 98,\n\t\"numpad3\": 99,\n\t\"numpad4\": 100,\n\t\"numpad5\": 101,\n\t\"numpad6\": 102,\n\t\"numpad7\": 103,\n\t\"numpad8\": 104,\n\t\"numpad9\": 105,\n\t\"multiply\": 106,\n\t\"add\": 107,\n\t\"separator\": 108,\n\t\"subtract\": 109,\n\t\"decimal\": 110,\n\t\"divide\": 111,\n\t\"f1\": 112,\n\t\"f2\": 113,\n\t\"f3\": 114,\n\t\"f4\": 115,\n\t\"f5\": 116,\n\t\"f6\": 117,\n\t\"f7\": 118,\n\t\"f8\": 119,\n\t\"f9\": 120,\n\t\"f10\": 121,\n\t\"f11\": 122,\n\t\"f12\": 123,\n\t\"f13\": 124,\n\t\"f14\": 125,\n\t\"f15\": 126,\n\t\"f16\": 127,\n\t\"f17\": 128,\n\t\"f18\": 129,\n\t\"f19\": 130,\n\t\"f20\": 131,\n\t\"f21\": 132,\n\t\"f22\": 133,\n\t\"f23\": 134,\n\t\"f24\": 135,\n\t\"firefoxminus\": 173,\n\t\"semicolon\": 186,\n\t\"equals\": 187,\n\t\"comma\": 188,\n\t\"dash\": 189,\n\t\"period\": 190,\n\t\"slash\": 191,\n\t\"backquote\": 192,\n\t\"openbracket\": 219,\n\t\"backslash\": 220,\n\t\"closebracket\": 221,\n\t\"quote\": 222\n};\n\nfunction KeyboardManager(options) {\n\tvar self = this;\n\toptions = options || \"\";\n\t// Save the named key hashmap\n\tthis.namedKeys = namedKeys;\n\t// Create a reverse mapping of code to keyname\n\tthis.keyNames = [];\n\t$tw.utils.each(namedKeys,function(keyCode,name) {\n\t\tself.keyNames[keyCode] = name.substr(0,1).toUpperCase() + name.substr(1);\n\t});\n\t// Save the platform-specific name of the \"meta\" key\n\tthis.metaKeyName = $tw.platform.isMac ? \"cmd-\" : \"win-\";\n\tthis.shortcutKeysList = [], // Stores the shortcut-key descriptors\n\tthis.shortcutActionList = [], // Stores the corresponding action strings\n\tthis.shortcutParsedList = []; // Stores the parsed key descriptors\n\tthis.lookupNames = [\"shortcuts\"];\n\tthis.lookupNames.push($tw.platform.isMac ? \"shortcuts-mac\" : \"shortcuts-not-mac\")\n\tthis.lookupNames.push($tw.platform.isWindows ? \"shortcuts-windows\" : \"shortcuts-not-windows\");\n\tthis.lookupNames.push($tw.platform.isLinux ? \"shortcuts-linux\" : \"shortcuts-not-linux\");\n\tthis.updateShortcutLists(this.getShortcutTiddlerList());\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.handleShortcutChanges(changes);\n\t});\n}\n\n/*\nReturn an array of keycodes for the modifier keys ctrl, shift, alt, meta\n*/\nKeyboardManager.prototype.getModifierKeys = function() {\n\treturn [\n\t\t16, // Shift\n\t\t17, // Ctrl\n\t\t18, // Alt\n\t\t20, // CAPS LOCK\n\t\t91, // Meta (left)\n\t\t93, // Meta (right)\n\t\t224 // Meta (Firefox)\n\t]\n};\n\n/*\nParses a key descriptor into the structure:\n{\n\tkeyCode: numeric keycode\n\tshiftKey: boolean\n\taltKey: boolean\n\tctrlKey: boolean\n\tmetaKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nKeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor) {\n\tvar components = keyDescriptor.split(/\\+|\\-/),\n\t\tinfo = {\n\t\t\tkeyCode: 0,\n\t\t\tshiftKey: false,\n\t\t\taltKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase(),\n\t\t\tc = s.charCodeAt(0);\n\t\t// Look for modifier keys\n\t\tif(s === \"ctrl\") {\n\t\t\tinfo.ctrlKey = true;\n\t\t} else if(s === \"shift\") {\n\t\t\tinfo.shiftKey = true;\n\t\t} else if(s === \"alt\") {\n\t\t\tinfo.altKey = true;\n\t\t} else if(s === \"meta\" || s === \"cmd\" || s === \"win\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(this.namedKeys[s]) {\n\t\t\tinfo.keyCode = this.namedKeys[s];\n\t\t}\n\t}\n\tif(info.keyCode) {\n\t\treturn info;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nParse a list of key descriptors into an array of keyInfo objects. The key descriptors can be passed as an array of strings or a space separated string\n*/\nKeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) {\n\tvar self = this;\n\toptions = options || {};\n\toptions.stack = options.stack || [];\n\tvar wiki = options.wiki || $tw.wiki;\n\tif(typeof keyDescriptors === \"string\" && keyDescriptors === \"\") {\n\t\treturn [];\n\t}\n\tif(!$tw.utils.isArray(keyDescriptors)) {\n\t\tkeyDescriptors = keyDescriptors.split(\" \");\n\t}\n\tvar result = [];\n\t$tw.utils.each(keyDescriptors,function(keyDescriptor) {\n\t\t// Look for a named shortcut\n\t\tif(keyDescriptor.substr(0,2) === \"((\" && keyDescriptor.substr(-2,2) === \"))\") {\n\t\t\tif(options.stack.indexOf(keyDescriptor) === -1) {\n\t\t\t\toptions.stack.push(keyDescriptor);\n\t\t\t\tvar name = keyDescriptor.substring(2,keyDescriptor.length - 2),\n\t\t\t\t\tlookupName = function(configName) {\n\t\t\t\t\t\tvar keyDescriptors = wiki.getTiddlerText(\"$:/config/\" + configName + \"/\" + name);\n\t\t\t\t\t\tif(keyDescriptors) {\n\t\t\t\t\t\t\tresult.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t$tw.utils.each(self.lookupNames,function(platformDescriptor) {\n\t\t\t\t\tlookupName(platformDescriptor);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tresult.push(self.parseKeyDescriptor(keyDescriptor));\n\t\t}\n\t});\n\treturn result;\n};\n\nKeyboardManager.prototype.getPrintableShortcuts = function(keyInfoArray) {\n\tvar self = this,\n\t\tresult = [];\n\t$tw.utils.each(keyInfoArray,function(keyInfo) {\n\t\tif(keyInfo) {\n\t\t\tresult.push((keyInfo.ctrlKey ? \"ctrl-\" : \"\") + \n\t\t\t\t (keyInfo.shiftKey ? \"shift-\" : \"\") + \n\t\t\t\t (keyInfo.altKey ? \"alt-\" : \"\") + \n\t\t\t\t (keyInfo.metaKey ? self.metaKeyName : \"\") + \n\t\t\t\t (self.keyNames[keyInfo.keyCode]));\n\t\t}\n\t});\n\treturn result;\n}\n\nKeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) {\n\treturn keyInfo &&\n\t\t\tevent.keyCode === keyInfo.keyCode && \n\t\t\tevent.shiftKey === keyInfo.shiftKey && \n\t\t\tevent.altKey === keyInfo.altKey && \n\t\t\tevent.ctrlKey === keyInfo.ctrlKey && \n\t\t\tevent.metaKey === keyInfo.metaKey;\n};\n\nKeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {\n\tfor(var t=0; t<keyInfoArray.length; t++) {\n\t\tif(this.checkKeyDescriptor(event,keyInfoArray[t])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.getShortcutTiddlerList = function() {\n\treturn $tw.wiki.getTiddlersWithTag(\"$:/tags/KeyboardShortcut\");\n};\n\nKeyboardManager.prototype.updateShortcutLists = function(tiddlerList) {\n\tthis.shortcutTiddlers = tiddlerList;\n\tfor(var i=0; i<tiddlerList.length; i++) {\n\t\tvar title = tiddlerList[i],\n\t\t\ttiddlerFields = $tw.wiki.getTiddler(title).fields;\n\t\tthis.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined;\n\t\tthis.shortcutActionList[i] = tiddlerFields.text;\n\t\tthis.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;\n\t}\n};\n\nKeyboardManager.prototype.handleKeydownEvent = function(event) {\n\tvar key, action;\n\tfor(var i=0; i<this.shortcutTiddlers.length; i++) {\n\t\tif(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) {\n\t\t\tkey = this.shortcutParsedList[i];\n\t\t\taction = this.shortcutActionList[i];\n\t\t}\n\t}\n\tif(key !== undefined) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\t$tw.rootWidget.invokeActionString(action,$tw.rootWidget);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.detectNewShortcuts = function(changedTiddlers) {\n\tvar shortcutConfigTiddlers = [],\n\t\thandled = false;\n\t$tw.utils.each(this.lookupNames,function(platformDescriptor) {\n\t\tvar descriptorString = \"$:/config/\" + platformDescriptor + \"/\";\n\t\tObject.keys(changedTiddlers).forEach(function(configTiddler) {\n\t\t\tvar configString = configTiddler.substr(0, configTiddler.lastIndexOf(\"/\") + 1);\n\t\t\tif(configString === descriptorString) {\n\t\t\t\tshortcutConfigTiddlers.push(configTiddler);\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t});\n\t});\n\tif(handled) {\n\t\treturn $tw.utils.hopArray(changedTiddlers,shortcutConfigTiddlers);\n\t} else {\n\t\treturn false;\n\t}\n};\n\nKeyboardManager.prototype.handleShortcutChanges = function(changedTiddlers) {\n\tvar newList = this.getShortcutTiddlerList();\n\tvar hasChanged = $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) ? true :\n\t\t($tw.utils.hopArray(changedTiddlers,newList) ? true :\n\t\t(this.detectNewShortcuts(changedTiddlers))\n\t);\n\t// Re-cache shortcuts if something changed\n\tif(hasChanged) {\n\t\tthis.updateShortcutLists(newList);\n\t}\n};\n\nexports.KeyboardManager = KeyboardManager;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/language.js": {
"title": "$:/core/modules/language.js",
"text": "/*\\\ntitle: $:/core/modules/language.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Language() manages translateable strings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate an instance of the language manager. Options include:\nwiki: wiki from which to retrieve translation tiddlers\n*/\nfunction Language(options) {\n\toptions = options || \"\";\n\tthis.wiki = options.wiki || $tw.wiki;\n}\n\n/*\nReturn a wikified translateable string. The title is automatically prefixed with \"$:/language/\"\nOptions include:\nvariables: optional hashmap of variables to supply to the language wikification\n*/\nLanguage.prototype.getString = function(title,options) {\n\toptions = options || {};\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.renderTiddler(\"text/plain\",title,{variables: options.variables});\n};\n\n/*\nReturn a raw, unwikified translateable string. The title is automatically prefixed with \"$:/language/\"\n*/\nLanguage.prototype.getRawString = function(title) {\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.getTiddlerText(title);\n};\n\nexports.Language = Language;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/macros/changecount.js": {
"title": "$:/core/modules/macros/changecount.js",
"text": "/*\\\ntitle: $:/core/modules/macros/changecount.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the changecount for the current tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"changecount\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn this.wiki.getChangeCount(this.getVariable(\"currentTiddler\")) + \"\";\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/contrastcolour.js": {
"title": "$:/core/modules/macros/contrastcolour.js",
"text": "/*\\\ntitle: $:/core/modules/macros/contrastcolour.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to choose which of two colours has the highest contrast with a base colour\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"contrastcolour\";\n\nexports.params = [\n\t{name: \"target\"},\n\t{name: \"fallbackTarget\"},\n\t{name: \"colourA\"},\n\t{name: \"colourB\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(target,fallbackTarget,colourA,colourB) {\n\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\n\tif(!rgbTarget) {\n\t\treturn colourA;\n\t}\n\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB);\n\tif(rgbColourA && !rgbColourB) {\n\t\treturn rgbColourA;\n\t}\n\tif(rgbColourB && !rgbColourA) {\n\t\treturn rgbColourB;\n\t}\n\tif(!rgbColourA && !rgbColourB) {\n\t\t// If neither colour is readable, return a crude inverse of the target\n\t\treturn [255 - rgbTarget[0],255 - rgbTarget[1],255 - rgbTarget[2],rgbTarget[3]];\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar brightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\n\t\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\n\t\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\n\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/csvtiddlers.js": {
"title": "$:/core/modules/macros/csvtiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/macros/csvtiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to CSV\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"csvtiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"format\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,format) {\n\tvar self = this,\n\t\ttiddlers = this.wiki.filterTiddlers(filter),\n\t\ttiddler,\n\t\tfields = [],\n\t\tt,f;\n\t// Collect all the fields\n\tfor(t=0;t<tiddlers.length; t++) {\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tfor(f in tiddler.fields) {\n\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\tfields.push(f);\n\t\t\t}\n\t\t}\n\t}\n\t// Sort the fields and bring the standard ones to the front\n\tfields.sort();\n\t\"title text modified modifier created creator\".split(\" \").reverse().forEach(function(value,index) {\n\t\tvar p = fields.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tfields.splice(p,1);\n\t\t\tfields.unshift(value)\n\t\t}\n\t});\n\t// Output the column headings\n\tvar output = [], row = [];\n\tfields.forEach(function(value) {\n\t\trow.push(quoteAndEscape(value))\n\t});\n\toutput.push(row.join(\",\"));\n\t// Output each tiddler\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\trow = [];\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t}\n\t\toutput.push(row.join(\",\"));\n\t}\n\treturn output.join(\"\\n\");\n};\n\nfunction quoteAndEscape(value) {\n\treturn \"\\\"\" + value.replace(/\"/mg,\"\\\"\\\"\") + \"\\\"\";\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/displayshortcuts.js": {
"title": "$:/core/modules/macros/displayshortcuts.js",
"text": "/*\\\ntitle: $:/core/modules/macros/displayshortcuts.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to display a list of keyboard shortcuts in human readable form. Notably, it resolves named shortcuts like `((bold))` to the underlying keystrokes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"displayshortcuts\";\n\nexports.params = [\n\t{name: \"shortcuts\"},\n\t{name: \"prefix\"},\n\t{name: \"separator\"},\n\t{name: \"suffix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(shortcuts,prefix,separator,suffix) {\n\tvar shortcutArray = $tw.keyboardManager.getPrintableShortcuts($tw.keyboardManager.parseKeyDescriptors(shortcuts,{\n\t\twiki: this.wiki\n\t}));\n\tif(shortcutArray.length > 0) {\n\t\tshortcutArray.sort(function(a,b) {\n\t\t return a.toLowerCase().localeCompare(b.toLowerCase());\n\t\t})\n\t\treturn prefix + shortcutArray.join(separator) + suffix;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/jsontiddler.js": {
"title": "$:/core/modules/macros/jsontiddler.js",
"text": "/*\\\ntitle: $:/core/modules/macros/jsontiddler.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output a single tiddler to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddler\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\ttitle = title || this.getVariable(\"currentTiddler\");\n\tvar tiddler = !!title && this.wiki.getTiddler(title),\n\t\tfields = new Object();\n\tif(tiddler) {\n\t\tfor(var field in tiddler.fields) {\n\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t}\n\t}\n\treturn JSON.stringify(fields,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/jsontiddlers.js": {
"title": "$:/core/modules/macros/jsontiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/macros/jsontiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"spaces\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,spaces) {\n\treturn this.wiki.getTiddlersAsJson(filter,$tw.utils.parseInt(spaces));\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/makedatauri.js": {
"title": "$:/core/modules/macros/makedatauri.js",
"text": "/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert a string of text to a data URI\n\n<<makedatauri text:\"Text to be converted\" type:\"text/vnd.tiddlywiki\">>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"makedatauri\";\n\nexports.params = [\n\t{name: \"text\"},\n\t{name: \"type\"},\n\t{name: \"_canonical_uri\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type,_canonical_uri) {\n\treturn $tw.utils.makeDataUri(text,type,_canonical_uri);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/now.js": {
"title": "$:/core/modules/macros/now.js",
"text": "/*\\\ntitle: $:/core/modules/macros/now.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a formatted version of the current time\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"now\";\n\nexports.params = [\n\t{name: \"format\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(format) {\n\treturn $tw.utils.formatDateString(new Date(),format || \"0hh:0mm, DDth MMM YYYY\");\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/qualify.js": {
"title": "$:/core/modules/macros/qualify.js",
"text": "/*\\\ntitle: $:/core/modules/macros/qualify.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to qualify a state tiddler title according\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"qualify\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title + \"-\" + this.getStateQualifier();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/resolvepath.js": {
"title": "$:/core/modules/macros/resolvepath.js",
"text": "/*\\\ntitle: $:/core/modules/macros/resolvepath.js\ntype: application/javascript\nmodule-type: macro\n\nResolves a relative path for an absolute rootpath.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"resolvepath\";\n\nexports.params = [\n\t{name: \"source\"},\n\t{name: \"root\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(source, root) {\n\treturn $tw.utils.resolvePath(source, root);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/unusedtitle.js": {
"title": "$:/core/modules/macros/unusedtitle.js",
"text": "/*\\\ntitle: $:/core/modules/macros/unusedtitle.js\ntype: application/javascript\nmodule-type: macro\nMacro to return a new title that is unused in the wiki. It can be given a name as a base.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"unusedtitle\";\n\nexports.params = [\n\t{name: \"baseName\"},\n\t{name: \"options\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(baseName, options) {\n\tif(!baseName) {\n\t\tbaseName = $tw.language.getString(\"DefaultNewTiddlerTitle\");\n\t}\n\treturn this.wiki.generateNewTitle(baseName, options);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/version.js": {
"title": "$:/core/modules/macros/version.js",
"text": "/*\\\ntitle: $:/core/modules/macros/version.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the TiddlyWiki core version number\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"version\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn $tw.version;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/parsers/audioparser.js": {
"title": "$:/core/modules/parsers/audioparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/audioparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe audio parser parses an audio tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AudioParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"audio\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"audio/ogg\"] = AudioParser;\nexports[\"audio/mpeg\"] = AudioParser;\nexports[\"audio/mp3\"] = AudioParser;\nexports[\"audio/mp4\"] = AudioParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/binaryparser.js": {
"title": "$:/core/modules/parsers/binaryparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/binaryparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe binary parser parses a binary tiddler into a warning message and download link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar BinaryParser = function(type,text,options) {\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on binary tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!title\"}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to external or internal data URI\n\tif(options._canonical_uri) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: options._canonical_uri\n\t\t};\n\t} else if(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/octet-stream\"] = BinaryParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/csvparser.js": {
"title": "$:/core/modules/parsers/csvparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/csvparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CsvParser = function(type,text,options) {\n\t// Table framework\n\tthis.tree = [{\n\t\t\"type\": \"scrollable\", \"children\": [{\n\t\t\t\"type\": \"element\", \"tag\": \"table\", \"children\": [{\n\t\t\t\t\"type\": \"element\", \"tag\": \"tbody\", \"children\": []\n\t\t\t}], \"attributes\": {\n\t\t\t\t\"class\": {\"type\": \"string\", \"value\": \"tc-csv-table\"}\n\t\t\t}\n\t\t}]\n\t}];\n\t// Split the text into lines\n\tvar lines = text.split(/\\r?\\n/mg),\n\t\ttag = \"th\";\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar lineText = lines[line];\n\t\tif(lineText) {\n\t\t\tvar row = {\n\t\t\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t\t\t};\n\t\t\tvar columns = lineText.split(\",\");\n\t\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\t\trow.children.push({\n\t\t\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\t\t\"text\": columns[column]\n\t\t\t\t\t\t}]\n\t\t\t\t\t});\n\t\t\t}\n\t\t\ttag = \"td\";\n\t\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t\t}\n\t}\n};\n\nexports[\"text/csv\"] = CsvParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/htmlparser.js": {
"title": "$:/core/modules/parsers/htmlparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src},\n\t\t\tsandbox: {type: \"string\", value: \"\"}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/imageparser.js": {
"title": "$:/core/modules/parsers/imageparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/imageparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe image parser parses an image into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"img\",\n\t\t\tattributes: {}\n\t\t};\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\tif(type === \"image/svg+xml\" || type === \".svg\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:image/svg+xml,\" + encodeURIComponent(text)};\n\t\t} else {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t\t}\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"image/svg+xml\"] = ImageParser;\nexports[\"image/jpg\"] = ImageParser;\nexports[\"image/jpeg\"] = ImageParser;\nexports[\"image/png\"] = ImageParser;\nexports[\"image/gif\"] = ImageParser;\nexports[\"image/webp\"] = ImageParser;\nexports[\"image/heic\"] = ImageParser;\nexports[\"image/heif\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/utils/parseutils.js": {
"title": "$:/core/modules/utils/parseutils.js",
"text": "/*\\\ntitle: $:/core/modules/utils/parseutils.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions concerned with parsing text into tokens.\n\nMost functions have the following pattern:\n\n* The parameters are:\n** `source`: the source string being parsed\n** `pos`: the current parse position within the string\n** Any further parameters are used to identify the token that is being parsed\n* The return value is:\n** null if the token was not found at the specified position\n** an object representing the token with the following standard fields:\n*** `type`: string indicating the type of the token\n*** `start`: start position of the token in the source string\n*** `end`: end position of the token in the source string\n*** Any further fields required to describe the token\n\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \"whitespace\", start:, end:,}\n*/\nexports.parseWhiteSpace = function(source,pos) {\n\tvar p = pos,c;\n\twhile(true) {\n\t\tc = source.charAt(p);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tp++;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(p === pos) {\n\t\treturn null;\n\t} else {\n\t\treturn {\n\t\t\ttype: \"whitespace\",\n\t\t\tstart: pos,\n\t\t\tend: p\n\t\t}\n\t}\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar c;\n\twhile(true) {\n\t\tc = source.charAt(pos);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tpos++;\n\t\t} else {\n\t\t\treturn pos;\n\t\t}\n\t}\n};\n\n/*\nLook for a given string token. Returns null if not found, otherwise returns {type: \"token\", value:, start:, end:,}\n*/\nexports.parseTokenString = function(source,pos,token) {\n\tvar match = source.indexOf(token,pos) === pos;\n\tif(match) {\n\t\treturn {\n\t\t\ttype: \"token\",\n\t\t\tvalue: token,\n\t\t\tstart: pos,\n\t\t\tend: pos + token.length\n\t\t};\n\t}\n\treturn null;\n};\n\n/*\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \"regexp\", match:, start:, end:,}\n*/\nexports.parseTokenRegExp = function(source,pos,reToken) {\n\tvar node = {\n\t\ttype: \"regexp\",\n\t\tstart: pos\n\t};\n\treToken.lastIndex = pos;\n\tnode.match = reToken.exec(source);\n\tif(node.match && node.match.index === pos) {\n\t\tnode.end = pos + node.match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a string literal. Returns null if not found, otherwise returns {type: \"string\", value:, start:, end:,}\n*/\nexports.parseStringLiteral = function(source,pos) {\n\tvar node = {\n\t\ttype: \"string\",\n\t\tstart: pos\n\t};\n\tvar reString = /(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\")|(?:'([^']*)')/g;\n\treString.lastIndex = pos;\n\tvar match = reString.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.value = match[1] !== undefined ? match[1] :(\n\t\t\tmatch[2] !== undefined ? match[2] : match[3] \n\t\t\t\t\t);\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a macro invocation parameter. Returns null if not found, or {type: \"macro-parameter\", name:, value:, start:, end:}\n*/\nexports.parseMacroParameter = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macro-parameter\",\n\t\tstart: pos\n\t};\n\t// Define our regexp\n\tvar reMacroParameter = /(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\\s>\"'=]+)))/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the parameter\n\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the parameter details\n\tnode.value = token.match[2] !== undefined ? token.match[2] : (\n\t\t\t\t\ttoken.match[3] !== undefined ? token.match[3] : (\n\t\t\t\t\t\ttoken.match[4] !== undefined ? token.match[4] : (\n\t\t\t\t\t\t\ttoken.match[5] !== undefined ? token.match[5] : (\n\t\t\t\t\t\t\t\ttoken.match[6] !== undefined ? token.match[6] : (\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\tif(token.match[1]) {\n\t\tnode.name = token.match[1];\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, parameters:, start:, end:}\n*/\nexports.parseMacroInvocation = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macrocall\",\n\t\tstart: pos,\n\t\tparams: []\n\t};\n\t// Define our regexps\n\tvar reMacroName = /([^\\s>\"'=]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double less than sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"<<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the macro name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Process parameters\n\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\n\twhile(parameter) {\n\t\tnode.params.push(parameter);\n\t\tpos = parameter.end;\n\t\t// Get the next parameter\n\t\tparameter = $tw.utils.parseMacroParameter(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">>\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, valueType: \"string|indirect|macro\", value:, start:, end:,}\n*/\nexports.parseAttribute = function(source,pos) {\n\tvar node = {\n\t\tstart: pos\n\t};\n\t// Define our regexps\n\tvar reAttributeName = /([^\\/\\s>\"'=]+)/g,\n\t\treUnquotedAttribute = /([^\\/\\s<>\"'=]+)/g,\n\t\treFilteredValue = /\\{\\{\\{(.+?)\\}\\}\\}/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the attribute name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for an equals sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"=\");\n\tif(token) {\n\t\tpos = token.end;\n\t\t// Skip whitespace\n\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t// Look for a string literal\n\t\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\n\t\tif(stringLiteral) {\n\t\t\tpos = stringLiteral.end;\n\t\t\tnode.type = \"string\";\n\t\t\tnode.value = stringLiteral.value;\n\t\t} else {\n\t\t\t// Look for a filtered value\n\t\t\tvar filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);\n\t\t\tif(filteredValue) {\n\t\t\t\tpos = filteredValue.end;\n\t\t\t\tnode.type = \"filtered\";\n\t\t\t\tnode.filter = filteredValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for an indirect value\n\t\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\t\tif(indirectValue) {\n\t\t\t\t\tpos = indirectValue.end;\n\t\t\t\t\tnode.type = \"indirect\";\n\t\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a unquoted value\n\t\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\t\tif(unquotedValue) {\n\t\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\t\tnode.value = \"true\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tnode.type = \"string\";\n\t\tnode.value = \"true\";\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/parsers/pdfparser.js": {
"title": "$:/core/modules/parsers/pdfparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/pdfparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe PDF parser embeds a PDF viewer\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"embed\",\n\t\t\tattributes: {}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/pdf\"] = ImageParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/textparser.js": {
"title": "$:/core/modules/parsers/textparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/textparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TextParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"codeblock\",\n\t\tattributes: {\n\t\t\tcode: {type: \"string\", value: text},\n\t\t\tlanguage: {type: \"string\", value: type}\n\t\t}\n\t}];\n};\n\nexports[\"text/plain\"] = TextParser;\nexports[\"text/x-tiddlywiki\"] = TextParser;\nexports[\"application/javascript\"] = TextParser;\nexports[\"application/json\"] = TextParser;\nexports[\"text/css\"] = TextParser;\nexports[\"application/x-tiddler-dictionary\"] = TextParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/videoparser.js": {
"title": "$:/core/modules/parsers/videoparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/videoparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe video parser parses a video tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar VideoParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"video\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"video/ogg\"] = VideoParser;\nexports[\"video/webm\"] = VideoParser;\nexports[\"video/mp4\"] = VideoParser;\nexports[\"video/quicktime\"] = VideoParser;\n\n})();\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/codeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/codeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for code blocks. For example:\n\n```\n\t```\n\tThis text will not be //wikified//\n\t```\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match and get language if defined\n\tthis.matchRegExp = /```([\\w-]*)\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\\r?\\n```$)/mg;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Return the $codeblock widget\n\treturn [{\n\t\t\ttype: \"codeblock\",\n\t\t\tattributes: {\n\t\t\t\t\tcode: {type: \"string\", value: text},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1]}\n\t\t\t}\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/codeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/codeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for code runs. For example:\n\n```\n\tThis is a `code run`.\n\tThis is another ``code run``\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(``?)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = new RegExp(this.match[1], \"mg\");\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"code\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: text\n\t\t}]\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/commentblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/commentinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/dash.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/dash.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/dash.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for dashes. For example:\n\n```\nThis is an en-dash: --\n\nThis is an em-dash: ---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"dash\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{2,3}(?!-)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar dash = this.match[0].length === 2 ? \"–\" : \"—\";\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: dash\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"bold\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /''/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - italic. For example:\n\n```\n\tThis is //italic// text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except italic\n\\rules only italic\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"italic\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\/\\//mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\/\\//mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"em\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - strikethrough. For example:\n\n```\n\tThis is ~~strikethrough~~ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except strikethrough \n\\rules only strikethrough \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strikethrough\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~~/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strike\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - subscript. For example:\n\n```\n\tThis is ,,subscript,, text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except subscript \n\\rules only subscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"subscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /,,/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sub\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - superscript. For example:\n\n```\n\tThis is ^^superscript^^ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except superscript \n\\rules only superscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"superscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\^\\^/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\^\\^/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sup\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - underscore. For example:\n\n```\n\tThis is __underscore__ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except underscore \n\\rules only underscore\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"underscore\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /__/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"u\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/entity.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/entity.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML entities. For example:\n\n```\n\tThis is a copyright symbol: ©\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"entity\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar entityString = this.match[1];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the entity\n\treturn [{type: \"entity\", entity: this.match[0]}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/extlink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/extlink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\nAn external link: https://www.tiddlywiki.com/\n\nA suppressed external link: ~http://www.tiddlyspace.com/\n```\n\nExternal links can be suppressed by preceding them with `~`.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"extlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(this.match[0].substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: this.match[0].substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: this.match[0]},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: this.match[0]\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for marking areas with hard line breaks. For example:\n\n```\n\"\"\"\nThis is some text\nThat is set like\nIt is a Poem\nWhen it is\nClearly\nNot\n\"\"\"\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"hardlinebreaks\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\"\"\"(?:\\r?\\n)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\"\"\")|(\\r?\\n)/mg,\n\t\ttree = [],\n\t\tmatch;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tdo {\n\t\t// Parse the run up to the terminator\n\t\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\n\t\t// Redo the terminator match\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tmatch = reEnd.exec(this.parser.source);\n\t\tif(match) {\n\t\t\tthis.parser.pos = reEnd.lastIndex;\n\t\t\t// Add a line break if the terminator was a line break\n\t\t\tif(match[2]) {\n\t\t\t\ttree.push({type: \"element\", tag: \"br\"});\n\t\t\t}\n\t\t}\n\t} while(match && !match[1]);\n\t// Return the nodes\n\treturn tree;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/heading.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/heading.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"heading\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(!{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classes = this.parser.parseClasses();\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel, \n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \")}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/horizrule.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/horizrule.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for rules. For example:\n\n```\n---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"horizrule\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{3,}\\r?(?:\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{type: \"element\", tag: \"hr\"}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/html.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/html.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for HTML elements and widgets. For example:\n\n{{{\n<aside>\nThis is an HTML5 aside element\n</aside>\n\n<$slider target=\"MyTiddler\">\nThis is a widget invocation\n</$slider>\n\n}}}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"html\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\n\t\trequireLineBreak: this.is.block\n\t});\n\treturn this.nextTag ? this.nextTag.start : undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Retrieve the most recent match so that recursive calls don't overwrite it\n\tvar tag = this.nextTag;\n\tthis.nextTag = null;\n\t// Advance the parser position to past the tag\n\tthis.parser.pos = tag.end;\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Set whether we're in block mode\n\ttag.isBlock = this.is.block || hasLineBreak;\n\t// Parse the body if we need to\n\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\n\t\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\",\n\t\t\t\treEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd);\n\t\t}\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tvar endMatch = reEnd.exec(this.parser.source);\n\t\tif(endMatch && endMatch.index === this.parser.pos) {\n\t\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.slice(1).indexOf(\"$\") !== -1) {\n\t\treturn null;\n\t}\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Check that the tag is terminated by a space, / or >\n\tif(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === \"/\") && !(source.charAt(pos) === \">\") ) {\n\t\treturn null;\n\t}\n\t// Process attributes\n\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\twhile(attribute) {\n\t\tnode.attributes[attribute.name] = attribute;\n\t\tpos = attribute.end;\n\t\t// Get the next attribute\n\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a closing slash\n\ttoken = $tw.utils.parseTokenString(source,pos,\"/\");\n\tif(token) {\n\t\tpos = token.end;\n\t\tnode.isSelfClosing = true;\n\t}\n\t// Look for a greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Check for a required line break\n\tif(options.requireLineBreak) {\n\t\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\tif(!token) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.findNextTag = function(source,pos,options) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /<([a-zA-Z\\-\\$]+)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseTag(source,match.index,options);\n\t\t// Return success\n\t\tif(tag && this.isLegalTag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\nexports.isLegalTag = function(tag) {\n\t// Widgets are always OK\n\tif(tag.type !== \"element\") {\n\t\treturn true;\n\t// If it's an HTML tag that starts with a dash then it's not legal\n\t} else if(tag.tag.charAt(0) === \"-\") {\n\t\treturn false;\n\t} else {\n\t\t// Otherwise it's OK\n\t\treturn true;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/image.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/image.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for embedding images. For example:\n\n```\n[img[https://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [https://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [https://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|https://tiddlywiki.com/fractalveg.jpg]]\n[img[TiddlerTitle]]\n[img[Description of image|TiddlerTitle]]\n```\n\nGenerates the `<$image>` widget.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"image\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\n\treturn this.nextImage ? this.nextImage.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextImage.end;\n\tvar node = {\n\t\ttype: \"image\",\n\t\tattributes: this.nextImage.attributes\n\t};\n\treturn [node];\n};\n\n/*\nFind the next image from the current position\n*/\nexports.findNextImage = function(source,pos) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /(\\[img)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseImage(source,match.index);\n\t\t// Return success\n\t\tif(tag) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \"image\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseImage = function(source,pos) {\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"image\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[img`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[img\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Process attributes\n\tif(source.charAt(pos) !== \"[\") {\n\t\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\t\twhile(attribute) {\n\t\t\tnode.attributes[attribute.name] = attribute;\n\t\t\tpos = attribute.end;\n\t\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t\tif(source.charAt(pos) !== \"[\") {\n\t\t\t\t// Get the next attribute\n\t\t\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t\t\t} else {\n\t\t\t\tattribute = null;\n\t\t\t}\n\t\t}\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[` after the attributes\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the source up to the terminating `]]`\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\]]*?)\\|)?([^\\]]+?)\\]\\]/g);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\tif(token.match[1]) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: token.match[1].trim()};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim()};\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/import.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/import.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/import.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for importing variable definitions\n\n```\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"import\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\import[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the filter terminated by a line break\n\tvar reMatch = /(.*)(\\r?\\n)|$/mg;\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\tthis.parser.pos = reMatch.lastIndex;\n\t// Parse tree nodes to return\n\treturn [{\n\t\ttype: \"importvariables\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: match[1]}\n\t\t},\n\t\tchildren: []\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/list.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/list.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"list\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\*#;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"*\": {listTag: \"ul\", itemTag: \"li\"},\n\t\"#\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"div\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\*#;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for block macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^>\\s]+)(?:\\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\\r?\\n|$)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: true\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^\\s>]+)\\s*([\\s\\S]*?)>>/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrodef.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrodef.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for macro definitions\n\n```\n\\define name(param:defaultvalue,param2:defaultvalue)\ndefinition text, including $param$ markers\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrodef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\define\\s+([^(\\s]+)\\(\\s*([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar paramString = this.match[2],\n\t\tparams = [];\n\tif(paramString !== \"\") {\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))?/mg,\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\twhile(paramMatch) {\n\t\t\t// Save the parameter details\n\t\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\n\t\t\tif(defaultValue) {\n\t\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t\t}\n\t\t\tparams.push(paramInfo);\n\t\t\t// Look for the next parameter\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n\t// Is this a multiline definition?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, the end of the body is marked with \\end\n\t\treEnd = /(\\r?\\n\\\\end[^\\S\\n\\r]*(?:$|\\r?\\n))/mg;\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /($|\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"set\",\n\t\tattributes: {\n\t\t\tname: {type: \"string\", value: this.match[1]},\n\t\t\tvalue: {type: \"string\", value: text}\n\t\t},\n\t\tchildren: [],\n\t\tparams: params,\n\t\tisMacroDefinition: true\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettyextlink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\n[ext[https://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|https://tiddlywiki.com/fractalveg.jpg]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettyextlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\n\treturn this.nextLink ? this.nextLink.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextLink.end;\n\treturn [this.nextLink];\n};\n\n/*\nFind the next link from the current position\n*/\nexports.findNextLink = function(source,pos) {\n\t// A regexp for finding candidate links\n\tvar reLookahead = /(\\[ext\\[)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a link\n\t\tvar link = this.parseLink(source,match.index);\n\t\t// Return success\n\t\tif(link) {\n\t\t\treturn link;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \"element\", tag: \"a\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseLink = function(source,pos) {\n\tvar token,\n\t\ttextNode = {\n\t\t\ttype: \"text\"\n\t\t},\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tstart: pos,\n\t\t\tattributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t},\n\t\t\tchildren: [textNode]\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[ext[`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[ext[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Look ahead for the terminating `]]`\n\tvar closePos = source.indexOf(\"]]\",pos);\n\tif(closePos === -1) {\n\t\treturn null;\n\t}\n\t// Look for a `|` separating the tooltip\n\tvar splitPos = source.indexOf(\"|\",pos);\n\tif(splitPos === -1 || splitPos > closePos) {\n\t\tsplitPos = null;\n\t}\n\t// Pull out the tooltip and URL\n\tvar tooltip, URL;\n\tif(splitPos) {\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t} else {\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL};\n\tnode.attributes.target = {type: \"string\", value: \"_blank\"};\n\tnode.attributes.rel = {type: \"string\", value: \"noopener noreferrer\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettylink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/prettylink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for pretty links. For example:\n\n```\n[[Introduction]]\n\n[[Link description|TiddlerTitle]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettylink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Process the link\n\tvar text = this.match[1],\n\t\tlink = this.match[2] || text;\n\tif($tw.utils.isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/quoteblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/quoteblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for quote blocks. For example:\n\n```\n\t<<<.optionalClass(es) optional cited from\n\ta quote\n\t<<<\n\t\n\t<<<.optionalClass(es)\n\ta quote\n\t<<< optional cited from\n```\n\nQuotes can be quoted by putting more <s\n\n```\n\t<<<\n\tQuote Level 1\n\t\n\t<<<<\n\tQuoteLevel 2\n\t<<<<\n\t\n\t<<<\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"quoteblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(<<<+)/mg;\n};\n\nexports.parse = function() {\n\tvar classes = [\"tc-quote\"];\n\t// Get all the details of the match\n\tvar reEndString = \"^\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\n\t// Parse any classes, whitespace and then the optional cite itself\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// before handling the cite, parse the body of the quote\n\tvar tree= this.parser.parseBlocks(reEndString);\n\t// If we got a cite, put it before the text\n\tif(cite.length > 0) {\n\t\ttree.unshift({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// If we got a cite, push it\n\tif(cite.length > 0) {\n\t\ttree.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Return the blockquote element\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"blockquote\",\n\t\tattributes: {\n\t\t\tclass: { type: \"string\", value: classes.join(\" \") },\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/rules.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/rules.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/rules.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for rules specifications\n\n```\n\\rules except ruleone ruletwo rulethree\n\\rules only ruleone ruletwo rulethree\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"rules\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\rules[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(tokens.length > 0) {\n\t\tthis.parser.amendRules(tokens[0],tokens.slice(1));\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/styleblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\n\n```\n@@.myClass\n@@background-color:red;\nThis paragraph will have the CSS class `myClass`.\n\n* The `<ul>` around this list will also have the class `myClass`\n* List item 2\n\n@@\n```\n\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\n\n```\n@@.myFirstClass.mySecondClass\n@@width:100px;.myThirdClass\nThis is a paragraph\n@@\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(?:\\.([^\\r\\n\\s]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEndString = \"^@@(?:\\\\r?\\\\n)?\";\n\tvar classes = [], styles = [];\n\tdo {\n\t\t// Get the class and style\n\t\tif(this.match[1]) {\n\t\t\tstyles.push(this.match[1]);\n\t\t}\n\t\tif(this.match[2]) {\n\t\t\tclasses.push(this.match[2].split(\".\").join(\" \"));\n\t\t}\n\t\t// Move past the match\n\t\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\t// Look for another line of classes and styles\n\t\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t} while(this.match && this.match.index === this.parser.pos);\n\t// Parse the body\n\tvar tree = this.parser.parseBlocks(reEndString);\n\tfor(var t=0; t<tree.length; t++) {\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\" \"));\n\t\t}\n\t\tif(styles.length > 0) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(tree[t],\"style\",styles.join(\"\"));\n\t\t}\n\t}\n\treturn tree;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/styleinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for assigning styles and classes to inline runs. For example:\n\n```\n@@.myClass This is some text with a class@@\n@@background-color:red;This is some text with a background colour@@\n@@width:100px;.myClass This is some text with a class and a width@@\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(\\.(?:[^\\r\\n\\s]+)\\s+)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /@@/g;\n\t// Get the styles and class\n\tvar stylesString = this.match[1],\n\t\tclassString = this.match[2] ? this.match[2].split(\".\").join(\" \") : undefined;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the run up to the terminator\n\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t// Return the classed span\n\tvar node = {\n\t\ttype: \"element\",\n\t\ttag: \"span\",\n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-inline-style\"}\n\t\t},\n\t\tchildren: tree\n\t};\n\tif(classString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,classString);\n\t}\n\tif(stylesString) {\n\t\t$tw.utils.addAttributeToParseTreeNode(node,\"style\",stylesString);\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/syslink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/syslink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/syslink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for system tiddler links.\nCan be suppressed preceding them with `~`.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"syslink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp(\n\t\t\"~?\\\\$:\\\\/[\" +\n\t\t$tw.config.textPrimitives.anyLetter.substr(1,$tw.config.textPrimitives.anyLetter.length - 2) +\n\t\t\"\\/._-]+\",\n\t\t\"mg\"\n\t);\n};\n\nexports.parse = function() {\n\tvar match = this.match[0];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(match.substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: match.substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: match}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: match\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/table.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/table.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for tables.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"table\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\|(?:[^\\n]*)\\|(?:[fhck]?)\\r?(?:\\n|$)/mg;\n};\n\nvar processRow = function(prevColumns) {\n\tvar cellRegExp = /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?\\r?(?:\\n|$))/mg,\n\t\tcellTermRegExp = /((?:\\x20*)\\|)/mg,\n\t\ttree = [],\n\t\tcol = 0,\n\t\tcolSpanCount = 1,\n\t\tprevCell,\n\t\tvAlign;\n\t// Match a single cell\n\tcellRegExp.lastIndex = this.parser.pos;\n\tvar cellMatch = cellRegExp.exec(this.parser.source);\n\twhile(cellMatch && cellMatch.index === this.parser.pos) {\n\t\tif(cellMatch[1] === \"~\") {\n\t\t\t// Rowspan\n\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \">\") {\n\t\t\t// Colspan\n\t\t\tcolSpanCount++;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \"<\" && prevCell) {\n\t\t\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\"colspan\",1);\n\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\tcolSpanCount = 1;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[2]) {\n\t\t\t// End of row\n\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\n\t\t\t\t\t\tcolSpanCount += prevCell.attributes.colspan.value;\n\t\t\t\t} else {\n\t\t\t\t\tcolSpanCount -= 1;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\t}\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// For ordinary cells, step beyond the opening `|`\n\t\t\tthis.parser.pos++;\n\t\t\t// Look for a space at the start of the cell\n\t\t\tvar spaceLeft = false;\n\t\t\tvAlign = null;\n\t\t\tif(this.parser.source.substr(this.parser.pos).search(/^\\^([^\\^]|\\^\\^)/) === 0) {\n\t\t\t\tvAlign = \"top\";\n\t\t\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\n\t\t\t\tvAlign = \"bottom\";\n\t\t\t}\n\t\t\tif(vAlign) {\n\t\t\t\tthis.parser.pos++;\n\t\t\t}\n\t\t\tvar chr = this.parser.source.substr(this.parser.pos,1);\n\t\t\twhile(chr === \" \") {\n\t\t\t\tspaceLeft = true;\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tchr = this.parser.source.substr(this.parser.pos,1);\n\t\t\t}\n\t\t\t// Check whether this is a heading cell\n\t\t\tvar cell;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", children: []};\n\t\t\t}\n\t\t\ttree.push(cell);\n\t\t\t// Record information about this cell\n\t\t\tprevCell = cell;\n\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t// Check for a colspan\n\t\t\tif(colSpanCount > 1) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\tcolSpanCount = 1;\n\t\t\t}\n\t\t\t// Parse the cell\n\t\t\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\n\t\t\t// Set the alignment for the cell\n\t\t\tif(vAlign) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"valign\",vAlign);\n\t\t\t}\n\t\t\tif(this.parser.source.substr(this.parser.pos - 2,1) === \" \") { // spaceRight\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t} else if(spaceLeft) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t}\n\t\t\t// Move back to the closing `|`\n\t\t\tthis.parser.pos--;\n\t\t}\n\t\tcol++;\n\t\tcellRegExp.lastIndex = this.parser.pos;\n\t\tcellMatch = cellRegExp.exec(this.parser.source);\n\t}\n\treturn tree;\n};\n\nexports.parse = function() {\n\tvar rowContainerTypes = {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\t\ttable = {type: \"element\", tag: \"table\", children: []},\n\t\trowRegExp = /^\\|([^\\n]*)\\|([fhck]?)\\r?(?:\\n|$)/mg,\n\t\trowTermRegExp = /(\\|(?:[fhck]?)\\r?(?:\\n|$))/mg,\n\t\tprevColumns = [],\n\t\tcurrRowType,\n\t\trowContainer,\n\t\trowCount = 0;\n\t// Match the row\n\trowRegExp.lastIndex = this.parser.pos;\n\tvar rowMatch = rowRegExp.exec(this.parser.source);\n\twhile(rowMatch && rowMatch.index === this.parser.pos) {\n\t\tvar rowType = rowMatch[2];\n\t\t// Check if it is a class assignment\n\t\tif(rowType === \"k\") {\n\t\t\t$tw.utils.addClassToParseTreeNode(table,rowMatch[1]);\n\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t} else {\n\t\t\t// Otherwise, create a new row if this one is of a different type\n\t\t\tif(rowType !== currRowType) {\n\t\t\t\trowContainer = {type: \"element\", tag: rowContainerTypes[rowType], children: []};\n\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\tcurrRowType = rowType;\n\t\t\t}\n\t\t\t// Is this a caption row?\n\t\t\tif(currRowType === \"c\") {\n\t\t\t\t// If so, move past the opening `|` of the row\n\t\t\t\tthis.parser.pos++;\n\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t// Set the alignment - TODO: figure out why TW did this\n//\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t// Parse the caption\n\t\t\t\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\n\t\t\t} else {\n\t\t\t\t// Create the row\n\t\t\t\tvar theRow = {type: \"element\", tag: \"tr\", children: []};\n\t\t\t\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \"oddRow\" : \"evenRow\");\n\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t// Process the row\n\t\t\t\ttheRow.children = processRow.call(this,prevColumns);\n\t\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\trowMatch = rowRegExp.exec(this.parser.source);\n\t}\n\treturn [table];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {},\n\t\t\tisBlock: true\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tisBlock: true,\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/typedblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/typedblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for typed blocks. For example:\n\n```\n$$$.js\nThis will be rendered as JavaScript\n$$$\n\n$$$.svg\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"150\" height=\"100\">\n <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n</svg>\n$$$\n\n$$$text/vnd.tiddlywiki>text/html\nThis will be rendered as an //HTML representation// of WikiText\n$$$\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.name = \"typedblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /\\r?\\n\\$\\$\\$\\r?(?:\\n|$)/mg;\n\t// Save the type\n\tvar parseType = this.match[1],\n\t\trenderType = this.match[2];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Parse the block according to the specified type\n\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \"text/plain\"});\n\t// If there's no render type, just return the parse tree\n\tif(!renderType) {\n\t\treturn parser.tree;\n\t} else {\n\t\t// Otherwise, render to the rendertype and return in a <PRE> tag\n\t\tvar widgetNode = this.parser.wiki.makeWidget(parser),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\ttext = renderType === \"text/html\" ? container.innerHTML : container.textContent;\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"pre\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/whitespace.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/whitespace.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/whitespace.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for whitespace specifications\n\n```\n\\whitespace trim\n\\whitespace notrim\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"whitespace\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\whitespace[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\t$tw.utils.each(tokens,function(token) {\n\t\tswitch(token) {\n\t\t\tcase \"trim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = true;\n\t\t\t\tbreak;\n\t\t\tcase \"notrim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = false;\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/wikilink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/wikilink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for wiki links. For example:\n\n```\nAWikiLink\nAnotherLink\n~SuppressedLink\n```\n\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \"?\" + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// If the link starts with the unwikilink character then just output it as plain text\n\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\n\t\treturn [{type: \"text\", text: linkText.substr(1)}];\n\t}\n\t// If the link has been preceded with a blocked letter then don't treat it as a link\n\tif(this.match.index > 0) {\n\t\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\"mg\");\n\t\tpreRegExp.lastIndex = this.match.index-1;\n\t\tvar preMatch = preRegExp.exec(this.parser.source);\n\t\tif(preMatch && preMatch.index === this.match.index-1) {\n\t\t\treturn [{type: \"text\", text: linkText}];\n\t\t}\n\t}\n\treturn [{\n\t\ttype: \"link\",\n\t\tattributes: {\n\t\t\tto: {type: \"string\", value: linkText}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: linkText\n\t\t}]\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/wikiparser.js": {
"title": "$:/core/modules/parsers/wikiparser/wikiparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe wiki text parser processes blocks of source text into a parse tree.\n\nThe parse tree is made up of nested arrays of these JavaScript objects:\n\n\t{type: \"element\", tag: <string>, attributes: {}, children: []} - an HTML element\n\t{type: \"text\", text: <string>} - a text node\n\t{type: \"entity\", value: <string>} - an entity\n\t{type: \"raw\", html: <string>} - raw HTML\n\nAttributes are stored as hashmaps of the following objects:\n\n\t{type: \"string\", value: <string>} - literal string\n\t{type: \"indirect\", textReference: <textReference>} - indirect through a text reference\n\t{type: \"macro\", macro: <TBD>} - indirect through a macro invocation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\tvar self = this;\n\t// Check for an externally linked tiddler\n\tif($tw.browser && (text || \"\") === \"\" && options._canonical_uri) {\n\t\tthis.loadRemoteTiddler(options._canonical_uri);\n\t\ttext = $tw.language.getRawString(\"LazyLoadingWarning\");\n\t}\n\t// Initialise the classes if we don't have them already\n\tif(!this.pragmaRuleClasses) {\n\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\"$:/config/WikiParserRules/Pragmas/\");\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\"$:/config/WikiParserRules/Block/\");\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\"$:/config/WikiParserRules/Inline/\");\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Flag for ignoring whitespace\n\tthis.configTrimWhiteSpace = false;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = [];\n\tvar topBranch = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\ttopBranch.push.apply(topBranch,this.parseInlineRun());\n\t} else {\n\t\ttopBranch.push.apply(topBranch,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\n*/\nWikiParser.prototype.loadRemoteTiddler = function(url) {\n\tvar self = this;\n\t$tw.utils.httpRequest({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tcallback: function(err,data) {\n\t\t\tif(!err) {\n\t\t\t\tvar tiddlers = self.wiki.deserializeTiddlers(\".tid\",data,self.wiki.getCreationFields());\n\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\ttiddler[\"_canonical_uri\"] = url;\n\t\t\t\t});\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tself.wiki.addTiddlers(tiddlers);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\n*/\nWikiParser.prototype.setupRules = function(proto,configPrefix) {\n\tvar self = this;\n\tif(!$tw.safemode) {\n\t\t$tw.utils.each(proto,function(object,name) {\n\t\t\tif(self.wiki.getTiddlerText(configPrefix + name,\"enable\") !== \"enable\") {\n\t\t\t\tdelete proto[name];\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar currentTreeBranch = this.tree;\n\twhile(true) {\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\tvar subTree = nextMatch.rule.parse();\n\t\tif(subTree.length > 0) {\n\t\t\t// Quick hack; we only cope with a single parse tree node being returned, which is true at the moment\n\t\t\tcurrentTreeBranch.push.apply(currentTreeBranch,subTree);\n\t\t\tsubTree[0].children = [];\n\t\t\tcurrentTreeBranch = subTree[0].children;\n\t\t}\n\t}\n\treturn currentTreeBranch;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\"(\" + terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n)\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\treturn nextMatch.rule.parse();\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\treturn [{type: \"element\", tag: \"p\", children: this.parseInlineRun(terminatorRegExp)}];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(\"(\" + terminatorRegExpString + \")\",\"mg\"),\n\t\ttree = [];\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t// Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\ttree.push.apply(tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t}\n\treturn tree;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex));\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t\t// Look for the next run rule\n\t\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\toptions = options || {};\n\tvar tree = [];\n\t// Find the next occurrence of the terminator\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\t// Find the next occurrence of a inlinerule\n\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\n\t\t// Return if we've found the terminator, and it precedes any inline rule match\n\t\tif(terminatorMatch) {\n\t\t\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\n\t\t\t\tif(terminatorMatch.index > this.pos) {\n\t\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index));\n\t\t\t\t}\n\t\t\t\tthis.pos = terminatorMatch.index;\n\t\t\t\tif(options.eatTerminator) {\n\t\t\t\t\tthis.pos += terminatorMatch[0].length;\n\t\t\t\t}\n\t\t\t\treturn tree;\n\t\t\t}\n\t\t}\n\t\t// Process any inline rule, along with the text preceding it\n\t\tif(inlineRuleMatch) {\n\t\t\t// Preceding text\n\t\t\tif(inlineRuleMatch.matchIndex > this.pos) {\n\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex));\n\t\t\t\tthis.pos = inlineRuleMatch.matchIndex;\n\t\t\t}\n\t\t\t// Process the inline rule\n\t\t\ttree.push.apply(tree,inlineRuleMatch.rule.parse());\n\t\t\t// Look for the next inline rule\n\t\t\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t\t\t// Look for the next terminator match\n\t\t\tterminatorRegExp.lastIndex = this.pos;\n\t\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\t}\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\n/*\nPush a text widget onto an array, respecting the configTrimWhiteSpace setting\n*/\nWikiParser.prototype.pushTextWidget = function(array,text) {\n\tif(this.configTrimWhiteSpace) {\n\t\ttext = $tw.utils.trim(text);\n\t}\n\tif(text) {\n\t\tarray.push({type: \"text\", text: text});\t\t\n\t}\n};\n\n/*\nParse zero or more class specifiers `.classname`\n*/\nWikiParser.prototype.parseClasses = function() {\n\tvar classRegExp = /\\.([^\\s\\.]+)/mg,\n\t\tclassNames = [];\n\tclassRegExp.lastIndex = this.pos;\n\tvar match = classRegExp.exec(this.source);\n\twhile(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tclassNames.push(match[1]);\n\t\tmatch = classRegExp.exec(this.source);\n\t}\n\treturn classNames;\n};\n\n/*\nAmend the rules used by this instance of the parser\n\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\n\tnames: array of rule names\n*/\nWikiParser.prototype.amendRules = function(type,names) {\n\tnames = names || [];\n\t// Define the filter function\n\tvar keepFilter;\n\tif(type === \"only\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) !== -1;\n\t\t};\n\t} else if(type === \"except\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) === -1;\n\t\t};\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif(!keepFilter(ruleArray[t].rule.name)) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/wikirulebase.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\ntype: application/javascript\nmodule-type: global\n\nBase class for wiki parser rules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\n*/\nvar WikiRuleBase = function() {\n};\n\n/*\nTo be overridden by individual rules\n*/\nWikiRuleBase.prototype.init = function(parser) {\n\tthis.parser = parser;\n};\n\n/*\nDefault implementation of findNextMatch uses RegExp matching\n*/\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\treturn this.match ? this.match.index : undefined;\n};\n\nexports.WikiRuleBase = WikiRuleBase;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/pluginswitcher.js": {
"title": "$:/core/modules/pluginswitcher.js",
"text": "/*\\\ntitle: $:/core/modules/pluginswitcher.js\ntype: application/javascript\nmodule-type: global\n\nManages switching plugins for themes and languages.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\noptions:\nwiki: wiki store to be used\npluginType: type of plugin to be switched\ncontrollerTitle: title of tiddler used to control switching of this resource\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\nonSwitch: callback when plugin is switched (single parameter is array of plugin titles)\n*/\nfunction PluginSwitcher(options) {\n\tthis.wiki = options.wiki;\n\tthis.pluginType = options.pluginType;\n\tthis.controllerTitle = options.controllerTitle;\n\tthis.defaultPlugins = options.defaultPlugins || [];\n\tthis.onSwitch = options.onSwitch;\n\t// Switch to the current plugin\n\tthis.switchPlugins();\n\t// Listen for changes to the selected plugin\n\tvar self = this;\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,self.controllerTitle)) {\n\t\t\tself.switchPlugins();\n\t\t}\n\t});\n}\n\nPluginSwitcher.prototype.switchPlugins = function() {\n\t// Get the name of the current theme\n\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\n\t// If it doesn't exist, then fallback to one of the default themes\n\tvar index = 0;\n\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {\n\t\tselectedPluginTitle = this.defaultPlugins[index++];\n\t}\n\t// Accumulate the titles of the plugins that we need to load\n\tvar plugins = [],\n\t\tself = this,\n\t\taccumulatePlugin = function(title) {\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\n\t\t\t\tplugins.push(title);\n\t\t\t\tvar pluginInfo = JSON.parse(self.wiki.getTiddlerText(title)),\n\t\t\t\t\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \"\");\n\t\t\t\t$tw.utils.each(dependents,function(title) {\n\t\t\t\t\taccumulatePlugin(title);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\taccumulatePlugin(selectedPluginTitle);\n\t// Read the plugin info for the incoming plugins\n\tvar changes = $tw.wiki.readPluginInfo(plugins);\n\t// Unregister any existing theme tiddlers\n\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\n\t// Register any new theme tiddlers\n\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\n\t// Unpack the current theme tiddlers\n\t$tw.wiki.unpackPluginTiddlers();\n\t// Call the switch handler\n\tif(this.onSwitch) {\n\t\tthis.onSwitch(plugins);\n\t}\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/saver-handler.js": {
"title": "$:/core/modules/saver-handler.js",
"text": "/*\\\ntitle: $:/core/modules/saver-handler.js\ntype: application/javascript\nmodule-type: global\n\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the saver handler with the following options:\nwiki: wiki to be synced\ndirtyTracking: true if dirty tracking should be performed\n*/\nfunction SaverHandler(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.dirtyTracking = options.dirtyTracking;\n\tthis.preloadDirty = options.preloadDirty || [];\n\tthis.pendingAutoSave = false;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"saver-handler\");\n\t// Initialise our savers\n\tif($tw.browser) {\n\t\tthis.initSavers();\n\t}\n\t// Only do dirty tracking if required\n\tif($tw.browser && this.dirtyTracking) {\n\t\t// Compile the dirty tiddler filter\n\t\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t\t// Count of changes that have not yet been saved\n\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(self.preloadDirty,function(title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t});\n\t\tthis.numChanges = filteredChanges.length;\n\t\t// Listen out for changes to tiddlers\n\t\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t// Filter the changes so that we only count changes to tiddlers that we care about\n\t\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Adjust the number of changes\n\t\t\tself.numChanges += filteredChanges.length;\n\t\t\tself.updateDirtyStatus();\n\t\t\t// Do any autosave if one is pending and there's no more change events\n\t\t\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.pendingAutoSave = false;\n\t\t\t}\n\t\t});\n\t\t// Listen for the autosave event\n\t\t$tw.rootWidget.addEventListener(\"tm-auto-save-wiki\",function(event) {\n\t\t\t// Do the autosave unless there are outstanding tiddler change events\n\t\t\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise put ourselves in the \"pending autosave\" state and wait for the change event before we do the autosave\n\t\t\t\tself.pendingAutoSave = true;\n\t\t\t}\n\t\t});\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t}\n\t// Install the save action handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget.addEventListener(\"tm-save-wiki\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-download-file\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\tmethod: \"download\",\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t}\n}\n\nSaverHandler.prototype.titleSyncFilter = \"$:/config/SaverFilter\";\nSaverHandler.prototype.titleAutoSave = \"$:/config/AutoSave\";\nSaverHandler.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\n\n/*\nSelect the appropriate saver modules and set them up\n*/\nSaverHandler.prototype.initSavers = function(moduleType) {\n\tmoduleType = moduleType || \"saver\";\n\t// Instantiate the available savers\n\tthis.savers = [];\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tif(module.canSave(self)) {\n\t\t\tself.savers.push(module.create(self.wiki));\n\t\t}\n\t});\n\t// Sort the savers into priority order\n\tthis.savers.sort(function(a,b) {\n\t\tif(a.info.priority < b.info.priority) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(a.info.priority > b.info.priority) {\n\t\t\t\treturn +1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nSave the wiki contents. Options are:\n\tmethod: \"save\", \"autosave\" or \"download\"\n\ttemplate: the tiddler containing the template to save\n\tdownloadType: the content type for the saved file\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tmethod = options.method || \"save\";\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && this.wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\") {\n\t\treturn false;\n\t}\n\tvar\tvariables = options.variables || {},\n\t\ttemplate = options.template || \"$:/core/save/all\",\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = this.wiki.renderTiddler(downloadType,template,options),\n\t\tcallback = function(err) {\n\t\t\tif(err) {\n\t\t\t\talert($tw.language.getString(\"Error/WhileSaving\") + \":\\n\\n\" + err);\n\t\t\t} else {\n\t\t\t\t// Clear the task queue if we're saving (rather than downloading)\n\t\t\t\tif(method !== \"download\") {\n\t\t\t\t\tself.numChanges = 0;\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t}\n\t\t\t\t$tw.notifier.display(self.titleSavedNotification);\n\t\t\t\tif(options.callback) {\n\t\t\t\t\toptions.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Call the highest priority saver that supports this method\n\tfor(var t=this.savers.length-1; t>=0; t--) {\n\t\tvar saver = this.savers[t];\n\t\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\n\t\t\tthis.logger.log(\"Saving wiki with method\",method,\"through saver\",saver.info.name);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSaverHandler.prototype.isDirty = function() {\n\treturn this.numChanges > 0;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSaverHandler.prototype.updateDirtyStatus = function() {\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/savers/andtidwiki.js": {
"title": "$:/core/modules/savers/andtidwiki.js",
"text": "/*\\\ntitle: $:/core/modules/savers/andtidwiki.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the AndTidWiki Android app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar AndTidWiki = function(wiki) {\n};\n\nAndTidWiki.prototype.save = function(text,method,callback,options) {\n\tvar filename = options && options.variables ? options.variables.filename : null;\n\tif (method === \"download\") {\n\t\t// Support download\n\t\tif (window.twi.saveDownload) {\n\t\t\ttry {\n\t\t\t\twindow.twi.saveDownload(text,filename);\n\t\t\t} catch(err) {\n\t\t\t\tif (err.message === \"Method not found\") {\n\t\t\t\t\twindow.twi.saveDownload(text);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvar link = document.createElement(\"a\");\n\t\t\tlink.setAttribute(\"href\",\"data:text/plain,\" + encodeURIComponent(text));\n\t\t\tif (filename) {\n\t\t\t link.setAttribute(\"download\",filename);\n\t\t\t}\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t}\n\t} else if (window.twi.saveWiki) {\n\t\t// Direct save in Tiddloid\n\t\twindow.twi.saveWiki(text);\n\t} else {\n\t\t// Get the pathname of this document\n\t\tvar pathname = decodeURIComponent(document.location.toString().split(\"#\")[0]);\n\t\t// Strip the file://\n\t\tif(pathname.indexOf(\"file://\") === 0) {\n\t\t\tpathname = pathname.substr(7);\n\t\t}\n\t\t// Strip any query or location part\n\t\tvar p = pathname.indexOf(\"?\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\tp = pathname.indexOf(\"#\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\t// Save the file\n\t\twindow.twi.saveFile(pathname,text);\n\t}\n\t// Call the callback\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nAndTidWiki.prototype.info = {\n\tname: \"andtidwiki\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.twi && !!window.twi.saveFile;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new AndTidWiki(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/beaker.js": {
"title": "$:/core/modules/savers/beaker.js",
"text": "/*\\\ntitle: $:/core/modules/savers/beaker.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Beaker browser's (https://beakerbrowser.com) Dat protocol (https://datproject.org/)\nCompatible with beaker >= V0.7.2\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar BeakerSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nBeakerSaver.prototype.save = function(text,method,callback) {\n\tvar dat = new DatArchive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Beaker Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Beaker Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nBeakerSaver.prototype.info = {\n\tname: \"beaker\",\n\tpriority: 3000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.DatArchive && location.protocol===\"dat:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new BeakerSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/download.js": {
"title": "$:/core/modules/savers/download.js",
"text": "/*\\\ntitle: $:/core/modules/savers/download.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar DownloadSaver = function(wiki) {\n};\n\nDownloadSaver.prototype.save = function(text,method,callback,options) {\n\toptions = options || {};\n\t// Get the current filename\n\tvar filename = options.variables.filename;\n\tif(!filename) {\n\t\tvar p = document.location.pathname.lastIndexOf(\"/\");\n\t\tif(p !== -1) {\n\t\t\t// We decode the pathname because document.location is URL encoded by the browser\n\t\t\tfilename = decodeURIComponent(document.location.pathname.substr(p+1));\n\t\t}\n\t}\n\tif(!filename) {\n\t\tfilename = \"tiddlywiki.html\";\n\t}\n\t// Set up the link\n\tvar link = document.createElement(\"a\");\n\tif(Blob !== undefined) {\n\t\tvar blob = new Blob([text], {type: \"text/html\"});\n\t\tlink.setAttribute(\"href\", URL.createObjectURL(blob));\n\t} else {\n\t\tlink.setAttribute(\"href\",\"data:text/html,\" + encodeURIComponent(text));\n\t}\n\tlink.setAttribute(\"download\",filename);\n\tdocument.body.appendChild(link);\n\tlink.click();\n\tdocument.body.removeChild(link);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nDownloadSaver.prototype.info = {\n\tname: \"download\",\n\tpriority: 100\n};\n\nObject.defineProperty(DownloadSaver.prototype.info, \"capabilities\", {\n\tget: function() {\n\t\tvar capabilities = [\"save\", \"download\"];\n\t\tif(($tw.wiki.getTextReference(\"$:/config/DownloadSaver/AutoSave\") || \"\").toLowerCase() === \"yes\") {\n\t\t\tcapabilities.push(\"autosave\");\n\t\t}\n\t\treturn capabilities;\n\t}\n});\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn document.createElement(\"a\").download !== undefined;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new DownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/fsosaver.js": {
"title": "$:/core/modules/savers/fsosaver.js",
"text": "/*\\\ntitle: $:/core/modules/savers/fsosaver.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via MS FileSystemObject ActiveXObject\n\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar FSOSaver = function(wiki) {\n};\n\nFSOSaver.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = unescape(document.location.pathname);\n\t// Test for a Windows path of the form /x:\\blah...\n\tif(/^\\/[A-Z]\\:\\\\[^\\\\]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t} else if(document.location.hostname !== \"\" && /^\\/\\\\[^\\\\]+\\\\[^\\\\]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t\t// reconstruct UNC path\n\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t} else {\n\t\treturn false;\n\t}\n\t// Save the file (as UTF-16)\n\tvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\n\tfile.Write(text);\n\tfile.Close();\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nFSOSaver.prototype.info = {\n\tname: \"FSOSaver\",\n\tpriority: 120,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\ttry {\n\t\treturn (window.location.protocol === \"file:\") && !!(new ActiveXObject(\"Scripting.FileSystemObject\"));\n\t} catch(e) { return false; }\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new FSOSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/gitea.js": {
"title": "$:/core/modules/savers/gitea.js",
"text": "/*\\\ntitle: $:/core/modules/savers/gitea.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the gitea\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GiteaSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGiteaSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/Gitea/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"Gitea\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/Gitea/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/Gitea/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/Gitea/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/Gitea/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/Gitea/ServerURL\") || \"https://gitea\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"Basic \" + window.btoa(username + \":\" + password)\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !path || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar use_put = true;\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(sha === \"\"){\n\t\t\t\t\tuse_put = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: endpoint + \"/repos/\" + repo + \"/branches/\" + branch,\n\t\t\t\ttype: \"GET\",\n\t\t\t\theaders: headers,\n\t\t\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\t\t\tif(xhr.status === 404) {\n\t\t\t\t\t\tcallback(\"Please ensure the branch in the Gitea repo exists\");\n\t\t\t\t\t}else{\n\t\t\t\t\t\tdata[\"branch\"] = branch;\n\t\t\t\t\t\tself.upload(uri + filename, use_put?\"PUT\":\"POST\", headers, data, callback);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\nGiteaSaver.prototype.upload = function(uri,method,headers,data,callback) {\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: method,\n\t\theaders: headers,\n\t\tdata: JSON.stringify(data),\n\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\tcallback(null);\n\t\t}\n\t});\n};\n\n/*\nInformation about this saver\n*/\nGiteaSaver.prototype.info = {\n\tname: \"Gitea\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GiteaSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/github.js": {
"title": "$:/core/modules/savers/github.js",
"text": "/*\\\ntitle: $:/core/modules/savers/github.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitHub v3 REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitHubSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitHubSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitHub/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"github\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitHub/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitHub/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitHub/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitHub/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitHub/ServerURL\") || \"https://api.github.com\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/vnd.github.v3+json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"Basic \" + window.btoa(username + \":\" + password)\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !path || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a PUT request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + filename,\n\t\t\t\ttype: \"PUT\",\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitHubSaver.prototype.info = {\n\tname: \"github\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitHubSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/gitlab.js": {
"title": "$:/core/modules/savers/gitlab.js",
"text": "/*\\\ntitle: $:/core/modules/savers/gitlab.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitLab REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: true */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitLabSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitLabSaver.prototype.save = function(text,method,callback) {\n\t/* See https://docs.gitlab.com/ee/api/repository_files.html */\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitLab/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"gitlab\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitLab/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitLab/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitLab/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitLab/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitLab/ServerURL\") || \"https://gitlab.com/api/v4\",\n\t\theaders = {\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Private-Token\": password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !path || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/projects/\" + encodeURIComponent(repo) + \"/repository/\";\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri + \"tree/?path=\" + encodeURIComponent(path.replace(/^\\/+|\\/$/g, '')) + \"&branch=\" + encodeURIComponent(branch.replace(/^\\/+|\\/$/g, '')),\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar requestType = \"POST\";\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\trequestType = \"PUT\";\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tcommit_message: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: text,\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + \"files/\" + encodeURIComponent(path.replace(/^\\/+/, '') + filename),\n\t\t\t\ttype: requestType,\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitLabSaver.prototype.info = {\n\tname: \"gitlab\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitLabSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/manualdownload.js": {
"title": "$:/core/modules/savers/manualdownload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/manualdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Title of the tiddler containing the download message\nvar downloadInstructionsTitle = \"$:/language/Modals/Download\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar ManualDownloadSaver = function(wiki) {\n};\n\nManualDownloadSaver.prototype.save = function(text,method,callback) {\n\t$tw.modal.display(downloadInstructionsTitle,{\n\t\tdownloadLink: \"data:text/html,\" + encodeURIComponent(text)\n\t});\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nManualDownloadSaver.prototype.info = {\n\tname: \"manualdownload\",\n\tpriority: 0,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new ManualDownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/msdownload.js": {
"title": "$:/core/modules/savers/msdownload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/msdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via window.navigator.msSaveBlob()\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar MsDownloadSaver = function(wiki) {\n};\n\nMsDownloadSaver.prototype.save = function(text,method,callback) {\n\t// Get the current filename\n\tvar filename = \"tiddlywiki.html\",\n\t\tp = document.location.pathname.lastIndexOf(\"/\");\n\tif(p !== -1) {\n\t\tfilename = document.location.pathname.substr(p+1);\n\t}\n\t// Set up the link\n\tvar blob = new Blob([text], {type: \"text/html\"});\n\twindow.navigator.msSaveBlob(blob,filename);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nMsDownloadSaver.prototype.info = {\n\tname: \"msdownload\",\n\tpriority: 110,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.navigator.msSaveBlob;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new MsDownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/put.js": {
"title": "$:/core/modules/savers/put.js",
"text": "/*\\\ntitle: $:/core/modules/savers/put.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by performing a PUT request to the server\n\nWorks with any server which accepts a PUT request\nto the current URL, such as a WebDAV server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRetrieve ETag if available\n*/\nvar retrieveETag = function(self) {\n\tvar headers = {\n\t\tAccept: \"*/*;charset=UTF-8\"\n\t};\n\t$tw.utils.httpRequest({\n\t\turl: self.uri(),\n\t\ttype: \"HEAD\",\n\t\theaders: headers,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar etag = xhr.getResponseHeader(\"ETag\");\n\t\t\tif(!etag) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tself.etag = etag.replace(/^W\\//,\"\");\n\t\t}\n\t});\n};\n\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar PutSaver = function(wiki) {\n\tthis.wiki = wiki;\n\tvar self = this;\n\tvar uri = this.uri();\n\t// Async server probe. Until probe finishes, save will fail fast\n\t// See also https://github.com/Jermolene/TiddlyWiki5/issues/2276\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"OPTIONS\",\n\t\tcallback: function(err,data,xhr) {\n\t\t\t// Check DAV header http://www.webdav.org/specs/rfc2518.html#rfc.section.9.1\n\t\t\tif(!err) {\n\t\t\t\tself.serverAcceptsPuts = xhr.status === 200 && !!xhr.getResponseHeader(\"dav\");\n\t\t\t}\n\t\t}\n\t});\n\tretrieveETag(this);\n};\n\nPutSaver.prototype.uri = function() {\n\treturn document.location.toString().split(\"#\")[0];\n};\n\n// TODO: in case of edit conflict\n// Prompt: Do you want to save over this? Y/N\n// Merging would be ideal, and may be possible using future generic merge flow\nPutSaver.prototype.save = function(text,method,callback) {\n\tif(!this.serverAcceptsPuts) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tvar headers = {\n\t\t\"Content-Type\": \"text/html;charset=UTF-8\"\n\t};\n\tif(this.etag) {\n\t\theaders[\"If-Match\"] = this.etag;\n\t}\n\t$tw.utils.httpRequest({\n\t\turl: this.uri(),\n\t\ttype: \"PUT\",\n\t\theaders: headers,\n\t\tdata: text,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\t// response is textual: \"XMLHttpRequest error code: 412\"\n\t\t\t\tvar status = Number(err.substring(err.indexOf(':') + 2, err.length))\n\t\t\t\tif(status === 412) { // edit conflict\n\t\t\t\t\tvar message = $tw.language.getString(\"Error/EditConflict\");\n\t\t\t\t\tcallback(message);\n\t\t\t\t} else {\n\t\t\t\t\tcallback(err); // fail\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.etag = xhr.getResponseHeader(\"ETag\");\n\t\t\t\tif(self.etag == null) {\n\t\t\t\t\tretrieveETag(self);\n\t\t\t\t}\n\t\t\t\tcallback(null); // success\n\t\t\t}\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nPutSaver.prototype.info = {\n\tname: \"put\",\n\tpriority: 2000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn /^https?:/.test(location.protocol);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new PutSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyfox.js": {
"title": "$:/core/modules/savers/tiddlyfox.js",
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyfox.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TiddlyFox file extension\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TiddlyFoxSaver = function(wiki) {\n};\n\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\n\tvar messageBox = document.getElementById(\"tiddlyfox-message-box\");\n\tif(messageBox) {\n\t\t// Get the pathname of this document\n\t\tvar pathname = document.location.toString().split(\"#\")[0];\n\t\t// Replace file://localhost/ with file:///\n\t\tif(pathname.indexOf(\"file://localhost/\") === 0) {\n\t\t\tpathname = \"file://\" + pathname.substr(16);\n\t\t}\n\t\t// Windows path file:///x:/blah/blah --> x:\\blah\\blah\n\t\tif(/^file\\:\\/\\/\\/[A-Z]\\:\\//i.test(pathname)) {\n\t\t\t// Remove the leading slash and convert slashes to backslashes\n\t\t\tpathname = pathname.substr(8).replace(/\\//g,\"\\\\\");\n\t\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\n\t\t} else if(pathname.indexOf(\"file://///\") === 0) {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\//g,\"\\\\\");\n\t\t// Mac/Unix local path file:///path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:///\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(7));\n\t\t// Mac/Unix local path file:/path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:/\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(5));\n\t\t// Otherwise Windows networth path file://server/share/path/path --> \\\\server\\share\\path\\path\n\t\t} else {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\"/\",\"g\"),\"\\\\\");\n\t\t}\n\t\t// Create the message element and put it in the message box\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.setAttribute(\"data-tiddlyfox-path\",decodeURIComponent(pathname));\n\t\tmessage.setAttribute(\"data-tiddlyfox-content\",text);\n\t\tmessageBox.appendChild(message);\n\t\t// Add an event handler for when the file has been saved\n\t\tmessage.addEventListener(\"tiddlyfox-have-saved-file\",function(event) {\n\t\t\tcallback(null);\n\t\t}, false);\n\t\t// Create and dispatch the custom event to the extension\n\t\tvar event = document.createEvent(\"Events\");\n\t\tevent.initEvent(\"tiddlyfox-save-file\",true,false);\n\t\tmessage.dispatchEvent(event);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyFoxSaver.prototype.info = {\n\tname: \"tiddlyfox\",\n\tpriority: 1500,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyie.js": {
"title": "$:/core/modules/savers/tiddlyie.js",
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyie.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar TiddlyIESaver = function(wiki) {\n};\n\nTiddlyIESaver.prototype.save = function(text,method,callback) {\n\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\n\tif(typeof(window.TiddlyIE) != \"undefined\") {\n\t\t// Get the pathname of this document\n\t\tvar pathname = unescape(document.location.pathname);\n\t\t// Test for a Windows path of the form /x:/blah...\n\t\tif(/^\\/[A-Z]\\:\\/[^\\/]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\.[^/]+ )\n\t\t\t// Remove the leading slash\n\t\t\tpathname = pathname.substr(1);\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t} else if(document.hostname !== \"\" && /^\\/[^\\/]+\\/[^\\/]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t\t// reconstruct UNC path\n\t\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t\t} else return false;\n\t\t// Prompt the user to save the file\n\t\twindow.TiddlyIE.save(pathname, text);\n\t\t// Callback that we succeeded\n\t\tcallback(null);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyIESaver.prototype.info = {\n\tname: \"tiddlyiesaver\",\n\tpriority: 1500,\n\tcapabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyIESaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/twedit.js": {
"title": "$:/core/modules/savers/twedit.js",
"text": "/*\\\ntitle: $:/core/modules/savers/twedit.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TWEdit iOS app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TWEditSaver = function(wiki) {\n};\n\nTWEditSaver.prototype.save = function(text,method,callback) {\n\t// Bail if we're not running under TWEdit\n\tif(typeof DeviceInfo !== \"object\") {\n\t\treturn false;\n\t}\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.pathname);\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Remove the leading \"/Documents\" from path\n\tvar prefix = \"/Documents\";\n\tif(pathname.indexOf(prefix) === 0) {\n\t\tpathname = pathname.substr(prefix.length);\n\t}\n\t// Error handler\n\tvar errorHandler = function(event) {\n\t\t// Error\n\t\tcallback($tw.language.getString(\"Error/SavingToTWEdit\") + \": \" + event.target.error.code);\n\t};\n\t// Get the file system\n\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\n\t\t// Now we've got the filesystem, get the fileEntry\n\t\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\n\t\t\t// Now we've got the fileEntry, create the writer\n\t\t\tfileEntry.createWriter(function(writer) {\n\t\t\t\twriter.onerror = errorHandler;\n\t\t\t\twriter.onwrite = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\twriter.position = 0;\n\t\t\t\twriter.write(text);\n\t\t\t},errorHandler);\n\t\t}, errorHandler);\n\t}, errorHandler);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nTWEditSaver.prototype.info = {\n\tname: \"twedit\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TWEditSaver(wiki);\n};\n\n/////////////////////////// Hack\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\nif($tw.browser) {\n\twindow.version = {title: \"TiddlyWiki\"};\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/upload.js": {
"title": "$:/core/modules/savers/upload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/upload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via upload to a server.\n\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar UploadSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nUploadSaver.prototype.save = function(text,method,callback) {\n\t// Get the various parameters we need\n\tvar backupDir = this.wiki.getTextReference(\"$:/UploadBackupDir\") || \".\",\n\t\tusername = this.wiki.getTextReference(\"$:/UploadName\"),\n\t\tpassword = $tw.utils.getPassword(\"upload\"),\n\t\tuploadDir = this.wiki.getTextReference(\"$:/UploadDir\") || \".\",\n\t\tuploadFilename = this.wiki.getTextReference(\"$:/UploadFilename\") || \"index.html\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\treturn false;\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\t\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch(ex) {\n\t\treturn callback($tw.language.getString(\"Error/Caption\") + \":\" + ex);\n\t}\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nUploadSaver.prototype.info = {\n\tname: \"upload\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new UploadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/server/authenticators/basic.js": {
"title": "$:/core/modules/server/authenticators/basic.js",
"text": "/*\\\ntitle: $:/core/modules/server/authenticators/basic.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for WWW basic authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\");\n}\n\nfunction BasicAuthenticator(server) {\n\tthis.server = server;\n\tthis.credentialsData = [];\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nBasicAuthenticator.prototype.init = function() {\n\t// Read the credentials data\n\tthis.credentialsFilepath = this.server.get(\"credentials\");\n\tif(this.credentialsFilepath) {\n\t\tvar resolveCredentialsFilepath = path.resolve($tw.boot.wikiPath,this.credentialsFilepath);\n\t\tif(fs.existsSync(resolveCredentialsFilepath) && !fs.statSync(resolveCredentialsFilepath).isDirectory()) {\n\t\t\tvar credentialsText = fs.readFileSync(resolveCredentialsFilepath,\"utf8\"),\n\t\t\t\tcredentialsData = $tw.utils.parseCsvStringWithHeader(credentialsText);\n\t\t\tif(typeof credentialsData === \"string\") {\n\t\t\t\treturn \"Error: \" + credentialsData + \" reading credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t\t} else {\n\t\t\t\tthis.credentialsData = credentialsData;\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"Error: Unable to load user credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t}\n\t}\n\t// Add the hardcoded username and password if specified\n\tif(this.server.get(\"username\") && this.server.get(\"password\")) {\n\t\tthis.credentialsData = this.credentialsData || [];\n\t\tthis.credentialsData.push({\n\t\t\tusername: this.server.get(\"username\"),\n\t\t\tpassword: this.server.get(\"password\")\n\t\t});\n\t}\n\treturn this.credentialsData.length > 0;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nBasicAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Extract the incoming username and password from the request\n\tvar header = request.headers.authorization || \"\";\n\tif(!header && state.allowAnon) {\n\t\t// If there's no header and anonymous access is allowed then we don't set authenticatedUsername\n\t\treturn true;\n\t}\n\tvar token = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tincomingUsername = parts[0],\n\t\tincomingPassword = parts[1];\n\t// Check that at least one of the credentials matches\n\tvar matchingCredentials = this.credentialsData.find(function(credential) {\n\t\treturn credential.username === incomingUsername && credential.password === incomingPassword;\n\t});\n\tif(matchingCredentials) {\n\t\t// If so, add the authenticated username to the request state\n\t\tstate.authenticatedUsername = incomingUsername;\n\t\treturn true;\n\t} else {\n\t\t// If not, return an authentication challenge\n\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\n\t\treturn false;\n\t}\n};\n\nexports.AuthenticatorClass = BasicAuthenticator;\n\n})();\n",
"type": "application/javascript",
"module-type": "authenticator"
},
"$:/core/modules/server/authenticators/header.js": {
"title": "$:/core/modules/server/authenticators/header.js",
"text": "/*\\\ntitle: $:/core/modules/server/authenticators/header.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for trusted header authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction HeaderAuthenticator(server) {\n\tthis.server = server;\n\tthis.header = server.get(\"authenticated-user-header\");\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nHeaderAuthenticator.prototype.init = function() {\n\treturn !!this.header;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nHeaderAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Otherwise, authenticate as the username in the specified header\n\tvar username = request.headers[this.header];\n\tif(!username && !state.allowAnon) {\n\t\tresponse.writeHead(401,\"Authorization header required to login to '\" + state.server.servername + \"'\");\n\t\tresponse.end();\n\t\treturn false;\n\t} else {\n\t\t// authenticatedUsername will be undefined for anonymous users\n\t\tstate.authenticatedUsername = username;\n\t\treturn true;\n\t}\n};\n\nexports.AuthenticatorClass = HeaderAuthenticator;\n\n})();\n",
"type": "application/javascript",
"module-type": "authenticator"
},
"$:/core/modules/server/routes/delete-tiddler.js": {
"title": "$:/core/modules/server/routes/delete-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/delete-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nDELETE /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"DELETE\";\n\nexports.path = /^\\/bags\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]);\n\tstate.wiki.deleteTiddler(title);\n\tresponse.writeHead(204, \"OK\", {\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-favicon.js": {
"title": "$:/core/modules/server/routes/get-favicon.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-favicon.js\ntype: application/javascript\nmodule-type: route\n\nGET /favicon.ico\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/favicon.ico$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"image/x-icon\"});\n\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\tresponse.end(buffer,\"base64\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-file.js": {
"title": "$:/core/modules/server/routes/get-file.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-file.js\ntype: application/javascript\nmodule-type: route\n\nGET /files/:filepath\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/files\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar path = require(\"path\"),\n\t\tfs = require(\"fs\"),\n\t\tutil = require(\"util\"),\n\t\tsuppliedFilename = decodeURIComponent(state.params[0]),\n\t\tfilename = path.resolve($tw.boot.wikiPath,\"files\",suppliedFilename),\n\t\textension = path.extname(filename);\n\tfs.readFile(filename,function(err,content) {\n\t\tvar status,content,type = \"text/plain\";\n\t\tif(err) {\n\t\t\tconsole.log(\"Error accessing file \" + filename + \": \" + err.toString());\n\t\t\tstatus = 404;\n\t\t\tcontent = \"File '\" + suppliedFilename + \"' not found\";\n\t\t} else {\n\t\t\tstatus = 200;\n\t\t\tcontent = content;\n\t\t\ttype = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : \"application/octet-stream\");\n\t\t}\n\t\tresponse.writeHead(status,{\n\t\t\t\"Content-Type\": type\n\t\t});\n\t\tresponse.end(content);\n\t});\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-index.js": {
"title": "$:/core/modules/server/routes/get-index.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-index.js\ntype: application/javascript\nmodule-type: route\n\nGET /\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar zlib = require(\"zlib\");\n\nexports.method = \"GET\";\n\nexports.path = /^\\/$/;\n\nexports.handler = function(request,response,state) {\n\tvar acceptEncoding = request.headers[\"accept-encoding\"];\n\tif(!acceptEncoding) {\n\t\tacceptEncoding = \"\";\n\t}\n\tvar text = state.wiki.renderTiddler(state.server.get(\"root-render-type\"),state.server.get(\"root-tiddler\")),\n\t\tresponseHeaders = {\n\t\t\"Content-Type\": state.server.get(\"root-serve-type\")\n\t};\n\t/*\n\tIf the gzip=yes flag for `listen` is set, check if the user agent permits\n\tcompression. If so, compress our response. Note that we use the synchronous\n\tfunctions from zlib to stay in the imperative style. The current `Server`\n\tdoesn't depend on this, and we may just as well use the async versions.\n\t*/\n\tif(state.server.enableGzip) {\n\t\tif (/\\bdeflate\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"deflate\";\n\t\t\ttext = zlib.deflateSync(text);\n\t\t} else if (/\\bgzip\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"gzip\";\n\t\t\ttext = zlib.gzipSync(text);\n\t\t}\n\t}\n\tresponse.writeHead(200,responseHeaders);\n\tresponse.end(text);\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-login-basic.js": {
"title": "$:/core/modules/server/routes/get-login-basic.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-login-basic.js\ntype: application/javascript\nmodule-type: route\n\nGET /login-basic -- force a Basic Authentication challenge\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/login-basic$/;\n\nexports.handler = function(request,response,state) {\n\tif(!state.authenticatedUsername) {\n\t\t// Challenge if there's no username\n\t\tresponse.writeHead(401,{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\t\t\n\t} else {\n\t\t// Redirect to the root wiki if login worked\n\t\tresponse.writeHead(302,{\n\t\t\tLocation: \"/\"\n\t\t});\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-status.js": {
"title": "$:/core/modules/server/routes/get-status.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-status.js\ntype: application/javascript\nmodule-type: route\n\nGET /status\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/status$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar text = JSON.stringify({\n\t\tusername: state.authenticatedUsername || state.server.get(\"anon-username\") || \"\",\n\t\tanonymous: !state.authenticatedUsername,\n\t\tread_only: !state.server.isAuthorized(\"writers\",state.authenticatedUsername),\n\t\tspace: {\n\t\t\trecipe: \"default\"\n\t\t},\n\t\ttiddlywiki_version: $tw.version\n\t});\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddler-html.js": {
"title": "$:/core/modules/server/routes/get-tiddler-html.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler-html.js\ntype: application/javascript\nmodule-type: route\n\nGET /:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/([^\\/]+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar renderType = tiddler.getFieldString(\"_render_type\"),\n\t\t\trenderTemplate = tiddler.getFieldString(\"_render_template\");\n\t\t// Tiddler fields '_render_type' and '_render_template' overwrite\n\t\t// system wide settings for render type and template\n\t\tif(state.wiki.isSystemTiddler(title)) {\n\t\t\trenderType = renderType || state.server.get(\"system-tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"system-tiddler-render-template\");\n\t\t} else {\n\t\t\trenderType = renderType || state.server.get(\"tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"tiddler-render-template\");\n\t\t}\n\t\tvar text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}});\n\t\t// Naughty not to set a content-type, but it's the easiest way to ensure the browser will see HTML pages as HTML, and accept plain text tiddlers as CSS or JS\n\t\tresponse.writeHead(200);\n\t\tresponse.end(text,\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddler.js": {
"title": "$:/core/modules/server/routes/get-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title),\n\t\ttiddlerFields = {},\n\t\tknownFields = [\n\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t];\n\tif(tiddler) {\n\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\ttiddlerFields[name] = value;\n\t\t\t} else {\n\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t}\n\t\t});\n\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\ttiddlerFields.bag = \"default\";\n\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\tresponse.end(JSON.stringify(tiddlerFields),\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddlers-json.js": {
"title": "$:/core/modules/server/routes/get-tiddlers-json.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddlers-json.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/tiddlers.json?filter=<filter>\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_FILTER = \"[all[tiddlers]!is[system]sort[title]]\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers.json$/;\n\nexports.handler = function(request,response,state) {\n\tvar filter = state.queryParameters.filter || DEFAULT_FILTER;\n\tif($tw.wiki.getTiddlerText(\"$:/config/Server/AllowAllExternalFilters\") !== \"yes\") {\n\t\tif($tw.wiki.getTiddlerText(\"$:/config/Server/ExternalFilters/\" + filter) !== \"yes\") {\n\t\t\tconsole.log(\"Blocked attempt to GET /recipes/default/tiddlers/tiddlers.json with filter: \" + filter);\n\t\t\tresponse.writeHead(403);\n\t\t\tresponse.end();\n\t\t\treturn;\n\t\t}\n\t}\n\tvar excludeFields = (state.queryParameters.exclude || \"text\").split(\",\"),\n\t\ttitles = state.wiki.filterTiddlers(filter);\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar tiddlers = [];\n\t$tw.utils.each(titles,function(title) {\n\t\tvar tiddler = state.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tvar tiddlerFields = tiddler.getFieldStrings({exclude: excludeFields});\n\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\ttiddlers.push(tiddlerFields);\n\t\t}\n\t});\n\tvar text = JSON.stringify(tiddlers);\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/put-tiddler.js": {
"title": "$:/core/modules/server/routes/put-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/put-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nPUT /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"PUT\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\tfields = JSON.parse(state.data);\n\t// Pull up any subfields in the `fields` object\n\tif(fields.fields) {\n\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\tfields[name] = field;\n\t\t});\n\t\tdelete fields.fields;\n\t}\n\t// Remove any revision field\n\tif(fields.revision) {\n\t\tdelete fields.revision;\n\t}\n\tstate.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title},state.wiki.getModificationFields()));\n\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\tresponse.writeHead(204, \"OK\",{\n\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/server.js": {
"title": "$:/core/modules/server/server.js",
"text": "/*\\\ntitle: $:/core/modules/server/server.js\ntype: application/javascript\nmodule-type: library\n\nServe tiddlers over http\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\"),\n\t\tquerystring = require(\"querystring\");\n}\n\n/*\nA simple HTTP server with regexp-based routes\noptions: variables - optional hashmap of variables to set (a misnomer - they are really constant parameters)\n\t\t routes - optional array of routes to use\n\t\t wiki - reference to wiki object\n*/\nfunction Server(options) {\n\tvar self = this;\n\tthis.routes = options.routes || [];\n\tthis.authenticators = options.authenticators || [];\n\tthis.wiki = options.wiki;\n\tthis.servername = $tw.utils.transliterateToSafeASCII(this.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\");\n\t// Initialise the variables\n\tthis.variables = $tw.utils.extend({},this.defaultVariables);\n\tif(options.variables) {\n\t\tfor(var variable in options.variables) {\n\t\t\tif(options.variables[variable]) {\n\t\t\t\tthis.variables[variable] = options.variables[variable];\n\t\t\t}\n\t\t}\t\t\n\t}\n\t$tw.utils.extend({},this.defaultVariables,options.variables);\n\t// Initialise CSRF\n\tthis.csrfDisable = this.get(\"csrf-disable\") === \"yes\";\n\t// Initialize Gzip compression\n\tthis.enableGzip = this.get(\"gzip\") === \"yes\";\n\t// Initialise authorization\n\tvar authorizedUserName = (this.get(\"username\") && this.get(\"password\")) ? this.get(\"username\") : \"(anon)\";\n\tthis.authorizationPrincipals = {\n\t\treaders: (this.get(\"readers\") || authorizedUserName).split(\",\").map($tw.utils.trim),\n\t\twriters: (this.get(\"writers\") || authorizedUserName).split(\",\").map($tw.utils.trim)\n\t}\n\t// Load and initialise authenticators\n\t$tw.modules.forEachModuleOfType(\"authenticator\", function(title,authenticatorDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addAuthenticator(authenticatorDefinition.AuthenticatorClass);\n\t});\n\t// Load route handlers\n\t$tw.modules.forEachModuleOfType(\"route\", function(title,routeDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addRoute(routeDefinition);\n\t});\n\t// Initialise the http vs https\n\tthis.listenOptions = null;\n\tthis.protocol = \"http\";\n\tvar tlsKeyFilepath = this.get(\"tls-key\"),\n\t\ttlsCertFilepath = this.get(\"tls-cert\");\n\tif(tlsCertFilepath && tlsKeyFilepath) {\n\t\tthis.listenOptions = {\n\t\t\tkey: fs.readFileSync(path.resolve($tw.boot.wikiPath,tlsKeyFilepath),\"utf8\"),\n\t\t\tcert: fs.readFileSync(path.resolve($tw.boot.wikiPath,tlsCertFilepath),\"utf8\")\n\t\t};\n\t\tthis.protocol = \"https\";\n\t}\n\tthis.transport = require(this.protocol);\n}\n\nServer.prototype.defaultVariables = {\n\tport: \"8080\",\n\thost: \"127.0.0.1\",\n\t\"root-tiddler\": \"$:/core/save/all\",\n\t\"root-render-type\": \"text/plain\",\n\t\"root-serve-type\": \"text/html\",\n\t\"tiddler-render-type\": \"text/html\",\n\t\"tiddler-render-template\": \"$:/core/templates/server/static.tiddler.html\",\n\t\"system-tiddler-render-type\": \"text/plain\",\n\t\"system-tiddler-render-template\": \"$:/core/templates/wikified-tiddler\",\n\t\"debug-level\": \"none\",\n\t\"gzip\": \"no\"\n};\n\nServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nServer.prototype.addAuthenticator = function(AuthenticatorClass) {\n\t// Instantiate and initialise the authenticator\n\tvar authenticator = new AuthenticatorClass(this),\n\t\tresult = authenticator.init();\n\tif(typeof result === \"string\") {\n\t\t$tw.utils.error(\"Error: \" + result);\n\t} else if(result) {\n\t\t// Only use the authenticator if it initialised successfully\n\t\tthis.authenticators.push(authenticator);\n\t}\n};\n\nServer.prototype.findMatchingRoute = function(request,state) {\n\tvar pathprefix = this.get(\"path-prefix\") || \"\";\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(pathprefix) {\n\t\t\tif(pathname.substr(0,pathprefix.length) === pathprefix) {\n\t\t\t\tpathname = pathname.substr(pathprefix.length) || \"/\";\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\nServer.prototype.methodMappings = {\n\t\"GET\": \"readers\",\n\t\"OPTIONS\": \"readers\",\n\t\"HEAD\": \"readers\",\n\t\"PUT\": \"writers\",\n\t\"POST\": \"writers\",\n\t\"DELETE\": \"writers\"\n};\n\n/*\nCheck whether a given user is authorized for the specified authorizationType (\"readers\" or \"writers\"). Pass null or undefined as the username to check for anonymous access\n*/\nServer.prototype.isAuthorized = function(authorizationType,username) {\n\tvar principals = this.authorizationPrincipals[authorizationType] || [];\n\treturn principals.indexOf(\"(anon)\") !== -1 || (username && (principals.indexOf(\"(authenticated)\") !== -1 || principals.indexOf(username) !== -1));\n}\n\nServer.prototype.requestHandler = function(request,response) {\n\t// Compose the state object\n\tvar self = this;\n\tvar state = {};\n\tstate.wiki = self.wiki;\n\tstate.server = self;\n\tstate.urlInfo = url.parse(request.url);\n\tstate.queryParameters = querystring.parse(state.urlInfo.query);\n\t// Get the principals authorized to access this resource\n\tvar authorizationType = this.methodMappings[request.method] || \"readers\";\n\t// Check for the CSRF header if this is a write\n\tif(!this.csrfDisable && authorizationType === \"writers\" && request.headers[\"x-requested-with\"] !== \"TiddlyWiki\") {\n\t\tresponse.writeHead(403,\"'X-Requested-With' header required to login to '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\t\t\n\t}\n\t// Check whether anonymous access is granted\n\tstate.allowAnon = this.isAuthorized(authorizationType,null);\n\t// Authenticate with the first active authenticator\n\tif(this.authenticators.length > 0) {\n\t\tif(!this.authenticators[0].authenticateRequest(request,response,state)) {\n\t\t\t// Bail if we failed (the authenticator will have sent the response)\n\t\t\treturn;\n\t\t}\t\t\n\t}\n\t// Authorize with the authenticated username\n\tif(!this.isAuthorized(authorizationType,state.authenticatedUsername)) {\n\t\tresponse.writeHead(401,\"'\" + state.authenticatedUsername + \"' is not authorized to access '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Find the route that matches this path\n\tvar route = self.findMatchingRoute(request,state);\n\t// Optionally output debug info\n\tif(self.get(\"debug-level\") !== \"none\") {\n\t\tconsole.log(\"Request path:\",JSON.stringify(state.urlInfo));\n\t\tconsole.log(\"Request headers:\",JSON.stringify(request.headers));\n\t\tconsole.log(\"authenticatedUsername:\",state.authenticatedUsername);\n\t}\n\t// Return a 404 if we didn't find a route\n\tif(!route) {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Receive the request body if necessary and hand off to the route handler\n\tif(route.bodyFormat === \"stream\" || request.method === \"GET\" || request.method === \"HEAD\") {\n\t\t// Let the route handle the request stream itself\n\t\troute.handler(request,response,state);\n\t} else if(route.bodyFormat === \"string\" || !route.bodyFormat) {\n\t\t// Set the encoding for the incoming request\n\t\trequest.setEncoding(\"utf8\");\n\t\tvar data = \"\";\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata += chunk.toString();\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = data;\n\t\t\troute.handler(request,response,state);\n\t\t});\n\t} else if(route.bodyFormat === \"buffer\") {\n\t\tvar data = [];\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata.push(chunk);\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = Buffer.concat(data);\n\t\t\troute.handler(request,response,state);\n\t\t})\n\t} else {\n\t\tresponse.writeHead(400,\"Invalid bodyFormat \" + route.bodyFormat + \" in route \" + route.method + \" \" + route.path.source);\n\t\tresponse.end();\n\t}\n};\n\n/*\nListen for requests\nport: optional port number (falls back to value of \"port\" variable)\nhost: optional host address (falls back to value of \"host\" variable)\nprefix: optional prefix (falls back to value of \"path-prefix\" variable)\n*/\nServer.prototype.listen = function(port,host,prefix) {\n\tvar self = this;\n\t// Handle defaults for port and host\n\tport = port || this.get(\"port\");\n\thost = host || this.get(\"host\");\n\tprefix = prefix || this.get(\"path-prefix\") || \"\";\n\t// Check for the port being a string and look it up as an environment variable\n\tif(parseInt(port,10).toString() !== port) {\n\t\tport = process.env[port] || 8080;\n\t}\n\t// Warn if required plugins are missing\n\tif(!$tw.wiki.getTiddler(\"$:/plugins/tiddlywiki/tiddlyweb\") || !$tw.wiki.getTiddler(\"$:/plugins/tiddlywiki/filesystem\")) {\n\t\t$tw.utils.warning(\"Warning: Plugins required for client-server operation (\\\"tiddlywiki/filesystem\\\" and \\\"tiddlywiki/tiddlyweb\\\") are missing from tiddlywiki.info file\");\n\t}\n\t// Create the server\n\tvar server;\n\tif(this.listenOptions) {\n\t\tserver = this.transport.createServer(this.listenOptions,this.requestHandler.bind(this));\n\t} else {\n\t\tserver = this.transport.createServer(this.requestHandler.bind(this));\n\t}\n\t// Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port)\n\tserver.on(\"listening\",function() {\n\t\tvar address = server.address();\n\t\t$tw.utils.log(\"Serving on \" + self.protocol + \"://\" + address.address + \":\" + address.port + prefix,\"brown/orange\");\n\t\t$tw.utils.log(\"(press ctrl-C to exit)\",\"red\");\n\t});\n\t// Listen\n\treturn server.listen(port,host);\n};\n\nexports.Server = Server;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/browser-messaging.js": {
"title": "$:/core/modules/browser-messaging.js",
"text": "/*\\\ntitle: $:/core/modules/browser-messaging.js\ntype: application/javascript\nmodule-type: startup\n\nBrowser message handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"browser-messaging\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*\nLoad a specified url as an iframe and call the callback when it is loaded. If the url is already loaded then the existing iframe instance is used\n*/\nfunction loadIFrame(url,callback) {\n\t// Check if iframe already exists\n\tvar iframeInfo = $tw.browserMessaging.iframeInfoMap[url];\n\tif(iframeInfo) {\n\t\t// We've already got the iframe\n\t\tcallback(null,iframeInfo);\n\t} else {\n\t\t// Create the iframe and save it in the list\n\t\tvar iframe = document.createElement(\"iframe\");\n\t\tiframeInfo = {\n\t\t\turl: url,\n\t\t\tstatus: \"loading\",\n\t\t\tdomNode: iframe\n\t\t};\n\t\t$tw.browserMessaging.iframeInfoMap[url] = iframeInfo;\n\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t// Add the iframe to the DOM and hide it\n\t\tiframe.style.display = \"none\";\n\t\tiframe.setAttribute(\"library\",\"true\");\n\t\tdocument.body.appendChild(iframe);\n\t\t// Set up onload\n\t\tiframe.onload = function() {\n\t\t\tiframeInfo.status = \"loaded\";\n\t\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t\tcallback(null,iframeInfo);\n\t\t};\n\t\tiframe.onerror = function() {\n\t\t\tcallback(\"Cannot load iframe\");\n\t\t};\n\t\ttry {\n\t\t\tiframe.src = url;\n\t\t} catch(ex) {\n\t\t\tcallback(ex);\n\t\t}\n\t}\n}\n\n/*\nUnload library iframe for given url\n*/\nfunction unloadIFrame(url){\n\t$tw.utils.each(document.getElementsByTagName('iframe'), function(iframe) {\n\t\tif(iframe.getAttribute(\"library\") === \"true\" &&\n\t\t iframe.getAttribute(\"src\") === url) {\n\t\t\tiframe.parentNode.removeChild(iframe);\n\t\t}\n\t});\n}\n\nfunction saveIFrameInfoTiddler(iframeInfo) {\n\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),{\n\t\ttitle: \"$:/temp/ServerConnection/\" + iframeInfo.url,\n\t\ttext: iframeInfo.status,\n\t\ttags: [\"$:/tags/ServerConnection\"],\n\t\turl: iframeInfo.url\n\t},$tw.wiki.getModificationFields()));\n}\n\nexports.startup = function() {\n\t// Initialise the store of iframes we've created\n\t$tw.browserMessaging = {\n\t\tiframeInfoMap: {} // Hashmap by URL of {url:,status:\"loading/loaded\",domNode:}\n\t};\n\t// Listen for widget messages to control loading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\tif(url) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers.json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-info\",\n\t\t\t\t\t\t\tinfoTitlePrefix: paramObject.infoTitlePrefix || \"$:/temp/RemoteAssetInfo/\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for widget messages to control unloading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-unload-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\t$tw.browserMessaging.iframeInfoMap[url] = undefined;\n\t\tif(url) {\n\t\t\tunloadIFrame(url);\n\t\t\t$tw.utils.each(\n\t\t\t\t$tw.wiki.filterTiddlers(\"[[$:/temp/ServerConnection/\" + url + \"]] [prefix[$:/temp/RemoteAssetInfo/\" + url + \"/]]\"),\n\t\t\t\tfunction(title) {\n\t\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-from-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url,\n\t\t\ttitle = paramObject.title;\n\t\tif(url && title) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers/\" + encodeURIComponent(title) + \".json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-tiddler\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for window messages from other windows\n\twindow.addEventListener(\"message\",function listener(event){\n\t\t// console.log(\"browser-messaging: \",document.location.toString())\n\t\t// console.log(\"browser-messaging: Received message from\",event.origin);\n\t\t// console.log(\"browser-messaging: Message content\",event.data);\n\t\tswitch(event.data.verb) {\n\t\t\tcase \"GET-RESPONSE\":\n\t\t\t\tif(event.data.status.charAt(0) === \"2\") {\n\t\t\t\t\tif(event.data.cookies) {\n\t\t\t\t\t\tif(event.data.cookies.type === \"save-info\") {\n\t\t\t\t\t\t\tvar tiddlers = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\t\t\t\t\ttitle: event.data.cookies.infoTitlePrefix + event.data.cookies.url + \"/\" + tiddler.title,\n\t\t\t\t\t\t\t\t\t\"original-title\": tiddler.title,\n\t\t\t\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t\t\t\t\ttype: \"text/vnd.tiddlywiki\",\n\t\t\t\t\t\t\t\t\t\"original-type\": tiddler.type,\n\t\t\t\t\t\t\t\t\t\"plugin-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-plugin-type\": tiddler[\"plugin-type\"],\n\t\t\t\t\t\t\t\t\t\"module-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-module-type\": tiddler[\"module-type\"],\n\t\t\t\t\t\t\t\t\ttags: [\"$:/tags/RemoteAssetInfo\"],\n\t\t\t\t\t\t\t\t\t\"original-tags\": $tw.utils.stringifyList(tiddler.tags || []),\n\t\t\t\t\t\t\t\t\t\"server-url\": event.data.cookies.url\n\t\t\t\t\t\t\t\t},$tw.wiki.getModificationFields()));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if(event.data.cookies.type === \"save-tiddler\") {\n\t\t\t\t\t\t\tvar tiddler = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t},false);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/commands.js": {
"title": "$:/core/modules/startup/commands.js",
"text": "/*\\\ntitle: $:/core/modules/startup/commands.js\ntype: application/javascript\nmodule-type: startup\n\nCommand processing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"commands\";\nexports.platforms = [\"node\"];\nexports.after = [\"story\"];\nexports.synchronous = false;\n\nexports.startup = function(callback) {\n\t// On the server, start a commander with the command line arguments\n\tvar commander = new $tw.Commander(\n\t\t$tw.boot.argv,\n\t\tfunction(err) {\n\t\t\tif(err) {\n\t\t\t\treturn $tw.utils.error(\"Error: \" + err);\n\t\t\t}\n\t\t\tcallback();\n\t\t},\n\t\t$tw.wiki,\n\t\t{output: process.stdout, error: process.stderr}\n\t);\n\tcommander.execute();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/CSSescape.js": {
"title": "$:/core/modules/startup/CSSescape.js",
"text": "/*\\\ntitle: $:/core/modules/startup/CSSescape.js\ntype: application/javascript\nmodule-type: startup\n\nPolyfill for CSS.escape()\n\n\\*/\n(function(root,factory){\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"css-escape\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n// https://github.com/umdjs/umd/blob/master/returnExports.js\nexports.startup = factory(root);\n}(typeof global != 'undefined' ? global : this, function(root) {\n\n\tif (root.CSS && root.CSS.escape) {\n\t\treturn;\n\t}\n\n\t// https://drafts.csswg.org/cssom/#serialize-an-identifier\n\tvar cssEscape = function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n\n\tif (!root.CSS) {\n\t\troot.CSS = {};\n\t}\n\n\troot.CSS.escape = cssEscape;\n\n}));\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/favicon.js": {
"title": "$:/core/modules/startup/favicon.js",
"text": "/*\\\ntitle: $:/core/modules/startup/favicon.js\ntype: application/javascript\nmodule-type: startup\n\nFavicon handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"favicon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\n// Favicon tiddler\nvar FAVICON_TITLE = \"$:/favicon.ico\";\n\nexports.startup = function() {\n\t// Set up the favicon\n\tsetFavicon();\n\t// Reset the favicon when the tiddler changes\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\n\t\t\tsetFavicon();\n\t\t}\n\t});\n};\n\nfunction setFavicon() {\n\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\n\tif(tiddler) {\n\t\tvar faviconLink = document.getElementById(\"faviconLink\");\n\t\tfaviconLink.setAttribute(\"href\",\"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text);\n\t}\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/info.js": {
"title": "$:/core/modules/startup/info.js",
"text": "/*\\\ntitle: $:/core/modules/startup/info.js\ntype: application/javascript\nmodule-type: startup\n\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"info\";\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_INFO_PLUGIN = \"$:/temp/info-plugin\";\n\nexports.startup = function() {\n\t// Collect up the info tiddlers\n\tvar infoTiddlerFields = {};\n\t// Give each info module a chance to fill in as many info tiddlers as they want\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tvar tiddlerFieldsArray = moduleExports.getInfoTiddlerFields(infoTiddlerFields);\n\t\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\t\tif(fields) {\n\t\t\t\t\tinfoTiddlerFields[fields.title] = fields;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Bake the info tiddlers into a plugin. We use the non-standard plugin-type \"info\" because ordinary plugins are only registered asynchronously after being loaded dynamically\n\tvar fields = {\n\t\ttitle: TITLE_INFO_PLUGIN,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"info\",\n\t\ttext: JSON.stringify({tiddlers: infoTiddlerFields},null,$tw.config.preferences.jsonSpaces)\n\t};\n\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\t$tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);\n\t$tw.wiki.registerPluginTiddlers(\"info\");\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/load-modules.js": {
"title": "$:/core/modules/startup/load-modules.js",
"text": "/*\\\ntitle: $:/core/modules/startup/load-modules.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"load-modules\";\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Load modules\n\t$tw.modules.applyMethods(\"utils\",$tw.utils);\n\tif($tw.node) {\n\t\t$tw.modules.applyMethods(\"utils-node\",$tw.utils);\n\t}\n\t$tw.modules.applyMethods(\"global\",$tw);\n\t$tw.modules.applyMethods(\"config\",$tw.config);\n\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\"tiddlerfield\");\n\t$tw.modules.applyMethods(\"tiddlermethod\",$tw.Tiddler.prototype);\n\t$tw.modules.applyMethods(\"wikimethod\",$tw.Wiki.prototype);\n\t$tw.wiki.addIndexersToWiki();\n\t$tw.modules.applyMethods(\"tiddlerdeserializer\",$tw.Wiki.tiddlerDeserializerModules);\n\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\"macro\");\n\t$tw.wiki.initParsers();\n\t$tw.Commander.initCommands();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/password.js": {
"title": "$:/core/modules/startup/password.js",
"text": "/*\\\ntitle: $:/core/modules/startup/password.js\ntype: application/javascript\nmodule-type: startup\n\nPassword handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"password\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t$tw.rootWidget.addEventListener(\"tm-set-password\",function(event) {\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: $tw.language.getString(\"Encryption/PromptSetPassword\"),\n\t\t\tnoUserName: true,\n\t\t\tsubmitText: $tw.language.getString(\"Encryption/SetPassword\"),\n\t\t\tcanCancel: true,\n\t\t\trepeatPassword: true,\n\t\t\tcallback: function(data) {\n\t\t\t\tif(data) {\n\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t}\n\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t}\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-clear-password\",function(event) {\n\t\tif($tw.browser) {\n\t\t\tif(!confirm($tw.language.getString(\"Encryption/ConfirmClearPassword\"))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.crypto.setPassword(null);\n\t});\n\t// Ensure that $:/isEncrypted is maintained properly\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,\"$:/isEncrypted\")) {\n\t\t\t$tw.crypto.updateCryptoStateTiddler();\n\t\t}\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/plugins.js": {
"title": "$:/core/modules/startup/plugins.js",
"text": "/*\\\ntitle: $:/core/modules/startup/plugins.js\ntype: application/javascript\nmodule-type: startup\n\nStartup logic concerned with managing plugins\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"plugins\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = \"$:/status/RequireReloadDueToPluginChange\";\n\nvar PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = \"$:/config/RegisterPluginType/\";\n\nexports.startup = function() {\n\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"no\"});\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tvar changesToProcess = [],\n\t\t\trequireReloadDueToPluginChange = false;\n\t\t$tw.utils.each(Object.keys(changes),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\t\trequiresReload = $tw.wiki.doesPluginRequireReload(title);\n\t\t\tif(requiresReload) {\n\t\t\t\trequireReloadDueToPluginChange = true;\n\t\t\t} else if(tiddler) {\n\t\t\t\tvar pluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields[\"plugin-type\"] || \"\"),\"no\") === \"yes\") {\n\t\t\t\t\tchangesToProcess.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tif(requireReloadDueToPluginChange) {\n\t\t\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"yes\"});\n\t\t}\n\t\t// Read or delete the plugin info of the changed tiddlers\n\t\tif(changesToProcess.length > 0) {\n\t\t\tvar changes = $tw.wiki.readPluginInfo(changesToProcess);\n\t\t\tif(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) {\n\t\t\t\t// (Re-)register any modified plugins\n\t\t\t\t$tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins);\n\t\t\t\t// Unregister any deleted plugins\n\t\t\t\t$tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins);\n\t\t\t\t// Unpack the shadow tiddlers\n\t\t\t\t$tw.wiki.unpackPluginTiddlers();\n\t\t\t}\n\t\t}\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/render.js": {
"title": "$:/core/modules/startup/render.js",
"text": "/*\\\ntitle: $:/core/modules/startup/render.js\ntype: application/javascript\nmodule-type: startup\n\nTitle, stylesheet and page rendering\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"render\";\nexports.platforms = [\"browser\"];\nexports.after = [\"story\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar PAGE_TITLE_TITLE = \"$:/core/wiki/title\";\nvar PAGE_STYLESHEET_TITLE = \"$:/core/ui/PageStylesheet\";\nvar PAGE_TEMPLATE_TITLE = \"$:/core/ui/PageTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT_TITLE = \"$:/config/Drafts/TypingTimeout\";\nvar THROTTLE_REFRESH_TIMEOUT = 400;\n\nexports.startup = function() {\n\t// Set up the title\n\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE,{document: $tw.fakeDocument, parseAsInline: true});\n\t$tw.titleContainer = $tw.fakeDocument.createElement(\"div\");\n\t$tw.titleWidgetNode.render($tw.titleContainer,null);\n\tdocument.title = $tw.titleContainer.textContent;\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\n\t\t\tdocument.title = $tw.titleContainer.textContent;\n\t\t}\n\t});\n\t// Set up the styles\n\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\n\t$tw.styleContainer = $tw.fakeDocument.createElement(\"style\");\n\t$tw.styleWidgetNode.render($tw.styleContainer,null);\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"styleRefresh\",function(changes) {\n\t\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\n\t\t\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\t\t}\n\t}));\n\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\n\t$tw.perf.report(\"mainRender\",function() {\n\t\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget});\n\t\t$tw.pageContainer = document.createElement(\"div\");\n\t\t$tw.utils.addClass($tw.pageContainer,\"tc-page-container-wrapper\");\n\t\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\n\t\t$tw.pageWidgetNode.render($tw.pageContainer,null);\n \t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t})();\n\t// Remove any splash screen elements\n\tvar removeList = document.querySelectorAll(\".tc-remove-when-wiki-loaded\");\n\t$tw.utils.each(removeList,function(removeItem) {\n\t\tif(removeItem.parentNode) {\n\t\t\tremoveItem.parentNode.removeChild(removeItem);\n\t\t}\n\t});\n\t// Prepare refresh mechanism\n\tvar deferredChanges = Object.create(null),\n\t\ttimerId;\n\tfunction refresh() {\n\t\t// Process the refresh\n\t\t$tw.hooks.invokeHook(\"th-page-refreshing\");\n\t\t$tw.pageWidgetNode.refresh(deferredChanges);\n\t\tdeferredChanges = Object.create(null);\n\t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t}\n\t// Add the change event handler\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"mainRefresh\",function(changes) {\n\t\t// Check if only tiddlers that are throttled have changed\n\t\tvar onlyThrottledTiddlersHaveChanged = true;\n\t\tfor(var title in changes) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(!tiddler || !(tiddler.hasField(\"draft.of\") || tiddler.hasField(\"throttle.refresh\"))) {\n\t\t\t\tonlyThrottledTiddlersHaveChanged = false;\n\t\t\t}\n\t\t}\n\t\t// Defer the change if only drafts have changed\n\t\tif(timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t}\n\t\ttimerId = null;\n\t\tif(onlyThrottledTiddlersHaveChanged) {\n\t\t\tvar timeout = parseInt($tw.wiki.getTiddlerText(DRAFT_TIDDLER_TIMEOUT_TITLE,\"\"),10);\n\t\t\tif(isNaN(timeout)) {\n\t\t\t\ttimeout = THROTTLE_REFRESH_TIMEOUT;\n\t\t\t}\n\t\t\ttimerId = setTimeout(refresh,timeout);\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t} else {\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t\trefresh();\n\t\t}\n\t}));\n\t// Fix up the link between the root widget and the page container\n\t$tw.rootWidget.domNodes = [$tw.pageContainer];\n\t$tw.rootWidget.children = [$tw.pageWidgetNode];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/rootwidget.js": {
"title": "$:/core/modules/startup/rootwidget.js",
"text": "/*\\\ntitle: $:/core/modules/startup/rootwidget.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"rootwidget\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Install the modal message mechanism\n\t$tw.modal = new $tw.utils.Modal($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-modal\",function(event) {\n\t\t$tw.modal.display(event.param,{variables: event.paramObject, event: event});\n\t});\n\t// Install the notification mechanism\n\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-notify\",function(event) {\n\t\t$tw.notifier.display(event.param,{variables: event.paramObject});\n\t});\n\t// Install the copy-to-clipboard mechanism\n\t$tw.rootWidget.addEventListener(\"tm-copy-to-clipboard\",function(event) {\n\t\t$tw.utils.copyToClipboard(event.param);\n\t});\n\t// Install the tm-focus-selector message\n\t$tw.rootWidget.addEventListener(\"tm-focus-selector\",function(event) {\n\t\tvar selector = event.param || \"\",\n\t\t\telement;\n\t\ttry {\n\t\t\telement = document.querySelector(selector);\n\t\t} catch(e) {\n\t\t\tconsole.log(\"Error in selector: \",selector)\n\t\t}\n\t\tif(element && element.focus) {\n\t\t\telement.focus(event.paramObject);\n\t\t}\n\t});\n\t// Install the scroller\n\t$tw.pageScroller = new $tw.utils.PageScroller();\n\t$tw.rootWidget.addEventListener(\"tm-scroll\",function(event) {\n\t\t$tw.pageScroller.handleEvent(event);\n\t});\n\tvar fullscreen = $tw.utils.getFullScreenApis();\n\tif(fullscreen) {\n\t\t$tw.rootWidget.addEventListener(\"tm-full-screen\",function(event) {\n\t\t\tvar fullScreenDocument = event.event ? event.event.target.ownerDocument : document;\n\t\t\tif(event.param === \"enter\") {\n\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t} else if(event.param === \"exit\") {\n\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tif(fullScreenDocument[fullscreen._fullscreenElement]) {\n\t\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t\t} else {\n\t\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\t// If we're being viewed on a data: URI then give instructions for how to save\n\tif(document.location.protocol === \"data:\") {\n\t\t$tw.rootWidget.dispatchEvent({\n\t\t\ttype: \"tm-modal\",\n\t\t\tparam: \"$:/language/Modals/SaveInstructions\"\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup.js": {
"title": "$:/core/modules/startup.js",
"text": "/*\\\ntitle: $:/core/modules/startup.js\ntype: application/javascript\nmodule-type: startup\n\nMiscellaneous startup logic for both the client and server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\n// Set to `true` to enable performance instrumentation\nvar PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE = \"$:/config/Performance/Instrumentation\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.startup = function() {\n\tvar modules,n,m,f;\n\t// Minimal browser detection\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t\t$tw.browser.isFirefox = !!document.mozFullScreenEnabled;\n\t}\n\t// Platform detection\n\t$tw.platform = {};\n\tif($tw.browser) {\n\t\t$tw.platform.isMac = /Mac/.test(navigator.platform);\n\t\t$tw.platform.isWindows = /win/i.test(navigator.platform);\n\t\t$tw.platform.isLinux = /Linux/i.test(navigator.platform);\n\t} else {\n\t\tswitch(require(\"os\").platform()) {\n\t\t\tcase \"darwin\":\n\t\t\t\t$tw.platform.isMac = true;\n\t\t\t\tbreak;\n\t\t\tcase \"win32\":\n\t\t\t\t$tw.platform.isWindows = true;\n\t\t\t\tbreak;\n\t\t\tcase \"freebsd\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t\tcase \"linux\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t// Initialise version\n\t$tw.version = $tw.utils.extractVersionInfo();\n\t// Set up the performance framework\n\t$tw.perf = new $tw.Performance($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,\"no\") === \"yes\");\n\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\n\t$tw.rootWidget = new widget.widget({\n\t\ttype: \"widget\",\n\t\tchildren: []\n\t},{\n\t\twiki: $tw.wiki,\n\t\tdocument: $tw.browser ? document : $tw.fakeDocument\n\t});\n\t// Execute any startup actions\n\tvar executeStartupTiddlers = function(tag) {\n\t\t$tw.utils.each($tw.wiki.filterTiddlers(\"[all[shadows+tiddlers]tag[\" + tag + \"]!has[draft.of]]\"),function(title) {\n\t\t\t$tw.rootWidget.invokeActionString($tw.wiki.getTiddlerText(title),$tw.rootWidget);\n\t\t});\n\t};\n\texecuteStartupTiddlers(\"$:/tags/StartupAction\");\n\tif($tw.browser) {\n\t\texecuteStartupTiddlers(\"$:/tags/StartupAction/Browser\");\t\t\n\t}\n\tif($tw.node) {\n\t\texecuteStartupTiddlers(\"$:/tags/StartupAction/Node\");\t\t\n\t}\n\t// Kick off the language manager and switcher\n\t$tw.language = new $tw.Language();\n\t$tw.languageSwitcher = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"language\",\n\t\tcontrollerTitle: \"$:/language\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/languages/en-GB\"\n\t\t],\n\t\tonSwitch: function(plugins) {\n\t\t\tif($tw.browser) {\n\t\t\t\tvar pluginTiddler = $tw.wiki.getTiddler(plugins[0]);\n\t\t\t\tif(pluginTiddler) {\n\t\t\t\t\tdocument.documentElement.setAttribute(\"dir\",pluginTiddler.getFieldString(\"text-direction\") || \"auto\");\n\t\t\t\t} else {\n\t\t\t\t\tdocument.documentElement.removeAttribute(\"dir\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Kick off the theme manager\n\t$tw.themeManager = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"theme\",\n\t\tcontrollerTitle: \"$:/theme\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/themes/tiddlywiki/snowwhite\",\n\t\t\t\"$:/themes/tiddlywiki/vanilla\"\n\t\t]\n\t});\n\t// Kick off the keyboard manager\n\t$tw.keyboardManager = new $tw.KeyboardManager();\n\t// Listen for shortcuts\n\tif($tw.browser) {\n\t\t$tw.utils.addEventListeners(document,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t}\n\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\n\t$tw.wiki.clearTiddlerEventQueue();\n\t// Find a working syncadaptor\n\t$tw.syncadaptor = undefined;\n\t$tw.modules.forEachModuleOfType(\"syncadaptor\",function(title,module) {\n\t\tif(!$tw.syncadaptor && module.adaptorClass) {\n\t\t\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\n\t\t}\n\t});\n\t// Set up the syncer object if we've got a syncadaptor\n\tif($tw.syncadaptor) {\n\t\t$tw.syncer = new $tw.Syncer({wiki: $tw.wiki, syncadaptor: $tw.syncadaptor});\n\t}\n\t// Setup the saver handler\n\t$tw.saverHandler = new $tw.SaverHandler({\n\t\twiki: $tw.wiki,\n\t\tdirtyTracking: !$tw.syncadaptor,\n\t\tpreloadDirty: $tw.boot.preloadDirty || []\n\t});\n\t// Host-specific startup\n\tif($tw.browser) {\n\t\t// Install the popup manager\n\t\t$tw.popup = new $tw.utils.Popup();\n\t\t// Install the animator\n\t\t$tw.anim = new $tw.utils.Animator();\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/story.js": {
"title": "$:/core/modules/startup/story.js",
"text": "/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\nvar CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD = \"$:/config/Navigation/Permalinkview/CopyToClipboard\"; // Can be \"yes\" (default) or \"no\"\nvar CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/Permalinkview/UpdateAddressBar\"; // Can be \"yes\" (default) or \"no\"\n\n\n// Links to help, if there is no param\nvar HELP_OPEN_EXTERNAL_WINDOW = \"http://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window\";\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers({\n\t\tdisableHistory: $tw.boot.disableStartupNavigation\n\t});\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for tm-open-external-window message\n\t\t$tw.rootWidget.addEventListener(\"tm-open-external-window\",function(event) {\n\t\t\tvar paramObject = event.paramObject || {},\n\t\t\t\tstrUrl = event.param || HELP_OPEN_EXTERNAL_WINDOW,\n\t\t\t\tstrWindowName = paramObject.windowName,\n\t\t\t\tstrWindowFeatures = paramObject.windowFeatures;\n\t\t\twindow.open(strUrl, strWindowName, strWindowFeatures);\n\t\t});\n\t\t// Listen for the tm-print message\n\t\t$tw.rootWidget.addEventListener(\"tm-print\",function(event) {\n\t\t\t(event.event.view || window).print();\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\"\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\"\n\t\t\t});\t\t\t\t\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndisableHistory: if true $:/History is NOT updated\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = decodeURIComponent(hash.trim());\n\t\t} else {\n\t\t\ttarget = decodeURIComponent(hash.substr(0,split).trim());\n\t\t\tstoryFilter = decodeURIComponent(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t// Invoke any hooks that want to change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// Update history\n\tif(!options.disableHistory) {\n\t\t// If a target tiddler was specified add it to the history stack\n\t\tif(target && target !== \"\") {\n\t\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t\t}\n\t\t\t$tw.wiki.addToHistory(target);\n\t\t} else if(storyList.length > 0) {\n\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t}\t\t\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.copyToClipboard: \"permalink\", \"permaview\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\t// Get the story and the history stack\n\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\ttargetTiddler = \"\";\n\tif(options.targetTiddler) {\n\t\ttargetTiddler = options.targetTiddler;\n\t} else {\n\t\t// The target tiddler is the one at the top of the stack\n\t\tif(historyList.length > 0) {\n\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t}\n\t\t// Blank the target tiddler if it isn't present in the story\n\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\ttargetTiddler = \"\";\n\t\t}\n\t}\n\t// Assemble the location hash\n\tswitch(options.updateAddressBar) {\n\t\tcase \"permalink\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t\tbreak;\n\t}\n\t// Copy URL to the clipboard\n\tswitch(options.copyToClipboard) {\n\t\tcase \"permalink\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler));\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList)));\n\t\t\tbreak;\n\t}\n\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\tif(options.updateHistory === \"yes\") {\n\t\t\t// Assign the location hash so that history is updated\n\t\t\twindow.location.hash = $tw.locationHash;\n\t\t} else {\n\t\t\t// We use replace so that browser history isn't affected\n\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t}\n\t}\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/windows.js": {
"title": "$:/core/modules/startup/windows.js",
"text": "/*\\\ntitle: $:/core/modules/startup/windows.js\ntype: application/javascript\nmodule-type: startup\n\nSetup root widget handlers for the messages concerned with opening external browser windows\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"windows\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Global to keep track of open windows (hashmap by title)\nvar windows = {};\n\nexports.startup = function() {\n\t// Handle open window message\n\t$tw.rootWidget.addEventListener(\"tm-open-window\",function(event) {\n\t\t// Get the parameters\n\t\tvar refreshHandler,\n\t\t\ttitle = event.param || event.tiddlerTitle,\n\t\t\tparamObject = event.paramObject || {},\n\t\t\twindowTitle = paramObject.windowTitle || title,\n\t\t\ttemplate = paramObject.template || \"$:/core/templates/single.tiddler.window\",\n\t\t\twidth = paramObject.width || \"700\",\n\t\t\theight = paramObject.height || \"600\",\n\t\t\tvariables = $tw.utils.extend({},paramObject,{currentTiddler: title});\n\t\t// Open the window\n\t\tvar srcWindow,\n\t\t srcDocument;\n\t\t// In case that popup blockers deny opening a new window\n\t\ttry {\n\t\t\tsrcWindow = window.open(\"\",\"external-\" + title,\"scrollbars,width=\" + width + \",height=\" + height),\n\t\t\tsrcDocument = srcWindow.document;\n\t\t}\n\t\tcatch(e) {\n\t\t\treturn;\n\t\t}\n\t\twindows[title] = srcWindow;\n\t\t// Check for reopening the same window\n\t\tif(srcWindow.haveInitialisedWindow) {\n\t\t\treturn;\n\t\t}\n\t\t// Initialise the document\n\t\tsrcDocument.write(\"<html><head></head><body class='tc-body tc-single-tiddler-window'></body></html>\");\n\t\tsrcDocument.close();\n\t\tsrcDocument.title = windowTitle;\n\t\tsrcWindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tdelete windows[title];\n\t\t\t$tw.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t},false);\n\t\t// Set up the styles\n\t\tvar styleWidgetNode = $tw.wiki.makeTranscludeWidget(\"$:/core/ui/PageStylesheet\",{\n\t\t\t\tdocument: $tw.fakeDocument,\n\t\t\t\tvariables: variables,\n\t\t\t\timportPageMacros: true}),\n\t\t\tstyleContainer = $tw.fakeDocument.createElement(\"style\");\n\t\tstyleWidgetNode.render(styleContainer,null);\n\t\tvar styleElement = srcDocument.createElement(\"style\");\n\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\tsrcDocument.head.insertBefore(styleElement,srcDocument.head.firstChild);\n\t\t// Render the text of the tiddler\n\t\tvar parser = $tw.wiki.parseTiddler(template),\n\t\t\twidgetNode = $tw.wiki.makeWidget(parser,{document: srcDocument, parentWidget: $tw.rootWidget, variables: variables});\n\t\twidgetNode.render(srcDocument.body,srcDocument.body.firstChild);\n\t\t// Function to handle refreshes\n\t\trefreshHandler = function(changes) {\n\t\t\tif(styleWidgetNode.refresh(changes,styleContainer,null)) {\n\t\t\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\t\t}\n\t\t\twidgetNode.refresh(changes);\n\t\t};\n\t\t$tw.wiki.addEventListener(\"change\",refreshHandler);\n\t\t// Listen for keyboard shortcuts\n\t\t$tw.utils.addEventListeners(srcDocument,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t},{\n\t\t\tname: \"click\",\n\t\t\thandlerObject: $tw.popup,\n\t\t\thandlerMethod: \"handleEvent\"\n\t\t}]);\n\t\tsrcWindow.haveInitialisedWindow = true;\n\t});\n\t// Close open windows when unloading main window\n\t$tw.addUnloadTask(function() {\n\t\t$tw.utils.each(windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t});\n\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/story.js": {
"title": "$:/core/modules/story.js",
"text": "/*\\\ntitle: $:/core/modules/story.js\ntype: application/javascript\nmodule-type: global\n\nLightweight object for managing interactions with the story and history lists.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nConstruct Story object with options:\nwiki: reference to wiki object to use to resolve tiddler titles\nstoryTitle: title of story list tiddler\nhistoryTitle: title of history list tiddler\n*/\nfunction Story(options) {\n\toptions = options || {};\n\tthis.wiki = options.wiki || $tw.wiki;\n\tthis.storyTitle = options.storyTitle || \"$:/StoryList\";\n\tthis.historyTitle = options.historyTitle || \"$:/HistoryList\";\n};\n\nStory.prototype.navigateTiddler = function(navigateTo,navigateFromTitle,navigateFromClientRect) {\n\tthis.addToStory(navigateTo,navigateFromTitle);\n\tthis.addToHistory(navigateTo,navigateFromClientRect);\n};\n\nStory.prototype.getStoryList = function() {\n\treturn this.wiki.getTiddlerList(this.storyTitle) || [];\n};\n\nStory.prototype.addToStory = function(navigateTo,navigateFromTitle,options) {\n\toptions = options || {};\n\tvar storyList = this.getStoryList();\n\t// See if the tiddler is already there\n\tvar slot = storyList.indexOf(navigateTo);\n\t// Quit if it already exists in the story river\n\tif(slot >= 0) {\n\t\treturn;\n\t}\n\t// First we try to find the position of the story element we navigated from\n\tvar fromIndex = storyList.indexOf(navigateFromTitle);\n\tif(fromIndex >= 0) {\n\t\t// The tiddler is added from inside the river\n\t\t// Determine where to insert the tiddler; Fallback is \"below\"\n\t\tswitch(options.openLinkFromInsideRiver) {\n\t\t\tcase \"top\":\n\t\t\t\tslot = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tslot = storyList.length;\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\tslot = fromIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"below\": // Intentional fall-through\n\t\t\tdefault:\n\t\t\t\tslot = fromIndex + 1;\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \"top\"\n\t\tif(options.openLinkFromOutsideRiver === \"bottom\") {\n\t\t\t// Insert at bottom\n\t\t\tslot = storyList.length;\n\t\t} else {\n\t\t\t// Insert at top\n\t\t\tslot = 0;\n\t\t}\n\t}\n\t// Add the tiddler\n\tstoryList.splice(slot,0,navigateTo);\n\t// Save the story\n\tthis.saveStoryList(storyList);\n};\n\nStory.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList},\n\t\tthis.wiki.getModificationFields()\n\t));\n};\n\nStory.prototype.addToHistory = function(navigateTo,navigateFromClientRect) {\n\tvar titles = $tw.utils.isArray(navigateTo) ? navigateTo : [navigateTo];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: navigateFromClientRect});\n\t});\n\tthis.wiki.setTiddlerData(this.historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\nStory.prototype.storyCloseTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCloseAllTiddlers = function() {\n// TBD\n};\n\nStory.prototype.storyCloseOtherTiddlers = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyEditTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyDeleteTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storySaveTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCancelTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyNewTiddler = function(targetTitle) {\n// TBD\n};\n\nexports.Story = Story;\n\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/storyviews/classic.js": {
"title": "$:/core/modules/storyviews/classic.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/classic.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ClassicStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration()\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\tif(duration) {\n\t\t// Scroll the node into view\n\t\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\t\n\t} else {\n\t\ttargetElement.scrollIntoView();\n\t}\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Reset the margin once the transition is over\n\t\tsetTimeout(function() {\n\t\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t\t{transition: \"none\"},\n\t\t\t\t{marginBottom: \"\"}\n\t\t\t]);\n\t\t},duration);\n\t\t// Set up the initial position of the element\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t// Transition to the final position\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t]);\n\t}\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode(),\n\t\t\tremoveElement = function() {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t};\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\tremoveElement();\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar currWidth = targetElement.offsetWidth,\n\t\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Remove the dom nodes of the widget at the end of the transition\n\t\tsetTimeout(removeElement,duration);\n\t\t// Animate the closure\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"translateX(0px)\"},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n};\n\nexports.classic = ClassicStoryView;\n\n})();",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/pop.js": {
"title": "$:/core/modules/storyviews/pop.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/pop.js\ntype: application/javascript\nmodule-type: storyview\n\nAnimates list insertions and removals\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PopStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nPopStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nPopStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Reset once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"none\"}\n\t\t]);\n\t\t$tw.utils.setStyle(widget.document.body,[\n\t\t\t{\"overflow-x\": \"\"}\n\t\t]);\n\t},duration);\n\t// Prevent the page from overscrolling due to the zoom factor\n\t$tw.utils.setStyle(widget.document.body,[\n\t\t{\"overflow-x\": \"hidden\"}\n\t]);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(2)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nPopStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\tif(targetElement && targetElement.parentNode) {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t}\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Remove the element at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(0.1)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.pop = PopStoryView;\n\n})();\n",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/zoomin.js": {
"title": "$:/core/modules/storyviews/zoomin.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/zoomin.js\ntype: application/javascript\nmodule-type: storyview\n\nZooms between individual tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ZoominListView = function(listWidget) {\n\tvar self = this;\n\tthis.listWidget = listWidget;\n\t// Get the index of the tiddler that is at the top of the history\n\tvar history = this.listWidget.wiki.getTiddlerDataCached(this.listWidget.historyTitle,[]),\n\t\ttargetTiddler;\n\tif(history.length > 0) {\n\t\ttargetTiddler = history[history.length-1].title;\n\t}\n\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\n\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\n\t\tvar domNode = itemWidget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(domNode instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\tif((targetTiddler && targetTiddler !== itemWidget.parseTreeNode.itemTitle) || (!targetTiddler && index)) {\n\t\t\tdomNode.style.display = \"none\";\n\t\t} else {\n\t\t\tself.currentTiddlerDomNode = domNode;\n\t\t}\n\t\t$tw.utils.addClass(domNode,\"tc-storyview-zoomin-tiddler\");\n\t});\n};\n\nZoominListView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\t\tlistElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the new tiddler be position absolute and visible so that we can measure it\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"0 0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t// Get the position of the source node, or use the centre of the window as the source position\n\tvar sourceBounds = historyInfo.fromPageRect || {\n\t\t\tleft: window.innerWidth/2 - 2,\n\t\t\ttop: window.innerHeight/2 - 2,\n\t\t\twidth: window.innerWidth/8,\n\t\t\theight: window.innerHeight/8\n\t\t};\n\t// Try to find the title node in the target tiddler\n\tvar titleDomNode = findTitleDomNode(listItemWidget) || listItemWidget.findFirstDomNode(),\n\t\tzoomBounds = titleDomNode.getBoundingClientRect();\n\t// Compute the transform for the target tiddler to make the title lie over the source rectange\n\tvar targetBounds = targetElement.getBoundingClientRect(),\n\t\tscale = sourceBounds.width / zoomBounds.width,\n\t\tx = sourceBounds.left - targetBounds.left - (zoomBounds.left - targetBounds.left) * scale,\n\t\ty = sourceBounds.top - targetBounds.top - (zoomBounds.top - targetBounds.top) * scale;\n\t// Transform the target tiddler to its starting position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(targetElement);\n\t// Apply the ending transitions with a timeout to ensure that the previously applied transformations are applied first\n\tvar self = this,\n\t\tprevCurrentTiddler = this.currentTiddlerDomNode;\n\tthis.currentTiddlerDomNode = targetElement;\n\t// Transform the target tiddler to its natural size\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{zIndex: \"500\"},\n\t]);\n\t// Transform the previous tiddler out of the way and then hide it\n\tif(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {\n\t\tscale = zoomBounds.width / sourceBounds.width;\n\t\tx = zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;\n\t\ty = zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;\n\t\t$tw.utils.setStyle(prevCurrentTiddler,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transformOrigin: \"0 0\"},\n\t\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"},\n\t\t\t{zIndex: \"0\"}\n\t\t]);\n\t\t// Hide the tiddler when the transition has finished\n\t\tsetTimeout(function() {\n\t\t\tif(self.currentTiddlerDomNode !== prevCurrentTiddler) {\n\t\t\t\tprevCurrentTiddler.style.display = \"none\";\n\t\t\t}\n\t\t},duration);\n\t}\n\t// Scroll the target into view\n//\t$tw.pageScroller.scrollIntoView(targetElement);\n};\n\n/*\nFind the first child DOM node of a widget that has the class \"tc-title\"\n*/\nfunction findTitleDomNode(widget,targetClass) {\n\ttargetClass = targetClass || \"tc-title\";\n\tvar domNode = widget.findFirstDomNode();\n\tif(domNode && domNode.querySelector) {\n\t\treturn domNode.querySelector(\".\" + targetClass);\n\t}\n\treturn null;\n}\n\nZoominListView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the newly inserted node position absolute and hidden\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"none\"}\n\t]);\n};\n\nZoominListView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Abandon if hidden\n\tif(targetElement.style.display != \"block\" ) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Set up the tiddler that is being closed\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\t// We'll move back to the previous or next element in the story\n\tvar toWidget = widget.previousSibling();\n\tif(!toWidget) {\n\t\ttoWidget = widget.nextSibling();\n\t}\n\tvar toWidgetDomNode = toWidget && toWidget.findFirstDomNode();\n\t// Set up the tiddler we're moving back in\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.addClass(toWidgetDomNode,\"tc-storyview-zoomin-tiddler\");\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{display: \"block\"},\n\t\t\t{transformOrigin: \"50% 50%\"},\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(10)\"},\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0\"},\n\t\t\t{zIndex: \"500\"}\n\t\t]);\n\t\tthis.currentTiddlerDomNode = toWidgetDomNode;\n\t}\n\t// Animate them both\n\t// Force layout\n\t$tw.utils.forceLayout(this.listWidget.parentDomNode);\n\t// First, the tiddler we're closing\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(0.1)\"},\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"0\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\tsetTimeout(removeElement,duration);\n\t// Now the tiddler we're going back to\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t\t{opacity: \"1\"}\n\t\t]);\n\t}\n\treturn true; // Indicate that we'll delete the DOM node\n};\n\nexports.zoomin = ZoominListView;\n\n})();\n",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/syncer.js": {
"title": "$:/core/modules/syncer.js",
"text": "/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store and synchronises them to a remote data store represented as a \"sync adaptor\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDefaults\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleIsAnonymous = \"$:/status/IsAnonymous\";\nSyncer.prototype.titleIsReadOnly = \"$:/status/IsReadOnly\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSyncPollingInterval = \"$:/config/SyncPollingInterval\";\nSyncer.prototype.titleSyncDisableLazyLoading = \"$:/config/SyncDisableLazyLoading\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.titleSyncThrottleInterval = \"$:/config/SyncThrottleInterval\";\nSyncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\nSyncer.prototype.errorRetryInterval = 5 * 1000; // Interval to retry after an error\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\n\n/*\nInstantiate the syncer with the following options:\nsyncadaptor: reference to syncadaptor to be used\nwiki: wiki to be synced\n*/\nfunction Syncer(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\t// Save parameters\n\tthis.syncadaptor = options.syncadaptor;\n\tthis.disableUI = !!options.disableUI;\n\tthis.titleIsLoggedIn = options.titleIsLoggedIn || this.titleIsLoggedIn;\n\tthis.titleUserName = options.titleUserName || this.titleUserName;\n\tthis.titleSyncFilter = options.titleSyncFilter || this.titleSyncFilter;\n\tthis.titleSavedNotification = options.titleSavedNotification || this.titleSavedNotification;\n\tthis.taskTimerInterval = options.taskTimerInterval || this.taskTimerInterval;\n\tthis.throttleInterval = options.throttleInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncThrottleInterval,\"\"),10) || this.throttleInterval;\n\tthis.errorRetryInterval = options.errorRetryInterval || this.errorRetryInterval;\n\tthis.fallbackInterval = options.fallbackInterval || this.fallbackInterval;\n\tthis.pollTimerInterval = options.pollTimerInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncPollingInterval,\"\"),10) || this.pollTimerInterval;\n\tthis.logging = \"logging\" in options ? options.logging : true;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\") + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\"),{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging,\n\t\tsaveHistory: true\n\t});\n\t// Make another logger for connection errors\n\tthis.loggerConnection = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\") + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\") + \"-connection\",{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging\n\t});\n\t// Ask the syncadaptor to use the main logger\n\tif(this.syncadaptor.setLoggerSaveBuffer) {\n\t\tthis.syncadaptor.setLoggerSaveBuffer(this.logger);\n\t}\n\t// Compile the dirty tiddler filter\n\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t// Record information for known tiddlers\n\tthis.readTiddlerInfo();\n\tthis.titlesToBeLoaded = {}; // Hashmap of titles of tiddlers that need loading from the server\n\tthis.titlesHaveBeenLazyLoaded = {}; // Hashmap of titles of tiddlers that have already been lazily loaded from the server\n\t// Timers\n\tthis.taskTimerId = null; // Timer for task dispatch\n\tthis.pollTimerId = null; // Timer for polling server\n\t// Number of outstanding requests\n\tthis.numTasksInProgress = 0;\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Filter the changes to just include ones that are being synced\n\t\tvar filteredChanges = self.getSyncedTiddlers(function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t\tif(filteredChanges.length > 0) {\n\t\t\tself.processTaskQueue();\n\t\t} else {\n\t\t\t// Look for deletions of tiddlers we're already syncing\t\n\t\t\tvar outstandingDeletion = false\n\t\t\t$tw.utils.each(changes,function(change,title,object) {\n\t\t\t\tif(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) {\n\t\t\t\t\toutstandingDeletion = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(outstandingDeletion) {\n\t\t\t\tself.processTaskQueue();\n\t\t\t}\n\t\t}\n\t});\n\t// Browser event handlers\n\tif($tw.browser && !this.disableUI) {\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t\t// Listen out for login/logout/refresh events in the browser\n\t\t$tw.rootWidget.addEventListener(\"tm-login\",function() {\n\t\t\tself.handleLoginEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-copy-syncer-logs-to-clipboard\",function() {\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getSystemInfo() + \"\\n\\nLog:\\n\" + self.logger.getBuffer());\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tif(!this.disableUI && $tw.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== \"yes\") {\n\t\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\t\tself.handleLazyLoadEvent(title);\n\t\t});\t\t\n\t}\n\t// Get the login status\n\tthis.getStatus(function(err,isLoggedIn) {\n\t\t// Do a sync from the server\n\t\tself.syncFromServer();\n\t});\n}\n\n/*\nShow a generic network error alert\n*/\nSyncer.prototype.displayError = function(msg,err) {\n\tif(err === ($tw.language.getString(\"Error/XMLHttpRequest\") + \": 0\")) {\n\t\tthis.loggerConnection.alert($tw.language.getString(\"Error/NetworkErrorAlert\"));\n\t\tthis.logger.log(msg + \":\",err);\n\t} else {\n\t\tthis.logger.alert(msg + \":\",err);\n\t}\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getSyncedTiddlers = function(source) {\n\treturn this.filterFn.call(this.wiki,source);\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getTiddlerRevision = function(title) {\n\tif(this.syncadaptor && this.syncadaptor.getTiddlerRevision) {\n\t\treturn this.syncadaptor.getTiddlerRevision(title);\n\t} else {\n\t\treturn this.wiki.getTiddler(title).fields.revision;\t\n\t} \n};\n\n/*\nRead (or re-read) the latest tiddler info from the store\n*/\nSyncer.prototype.readTiddlerInfo = function() {\n\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\n\t// \"revision\" is the revision of the tiddler last seen on the server, and \"changecount\" is the corresponding local changecount\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.getSyncedTiddlers();\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title);\n\t\tself.tiddlerInfo[title] = {\n\t\t\trevision: self.getTiddlerRevision(title),\n\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t};\n\t});\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\tthis.logger.log(\"Checking dirty status\");\n\t// Check tiddlers that are in the store and included in the filter function\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(this.wiki.tiddlerExists(title)) {\n\t\t\tif(tiddlerInfo) {\n\t\t\t\t// If the tiddler is known on the server and has been modified locally then it needs to be saved to the server\n\t\t\t\tif($tw.wiki.getChangeCount(title) > tiddlerInfo.changeCount) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If the tiddler isn't known on the server then it needs to be saved to the server\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\t// Check tiddlers that are known from the server but not currently in the store\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\tif(!this.wiki.tiddlerExists(titles[index])) {\n\t\t\t// There must be a pending delete\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSyncer.prototype.updateDirtyStatus = function() {\n\tif($tw.browser && !this.disableUI) {\n\t\tvar dirty = this.isDirty();\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",dirty);\n\t\tif(!dirty) {\n\t\t\tthis.loggerConnection.clearAlerts();\n\t\t}\n\t}\n};\n\n/*\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\n*/\nSyncer.prototype.storeTiddler = function(tiddlerFields) {\n\t// Save the tiddler\n\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: this.getTiddlerRevision(tiddlerFields.title),\n\t\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\n\t\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title)\n\t};\n};\n\nSyncer.prototype.getStatus = function(callback) {\n\tvar self = this;\n\t// Check if the adaptor supports getStatus()\n\tif(this.syncadaptor && this.syncadaptor.getStatus) {\n\t\t// Mark us as not logged in\n\t\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \"no\"});\n\t\t// Get login status\n\t\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\t// Set the various status tiddlers\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsAnonymous,text: isAnonymous ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\t\tif(isLoggedIn) {\n\t\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tif(callback) {\n\t\t\t\tcallback(err,isLoggedIn,username);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null,true,\"UNAUTHENTICATED\");\n\t}\n};\n\n/*\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\n*/\nSyncer.prototype.syncFromServer = function() {\n\tvar self = this,\n\t\tcancelNextSync = function() {\n\t\t\tif(self.pollTimerId) {\n\t\t\t\tclearTimeout(self.pollTimerId);\n\t\t\t\tself.pollTimerId = null;\n\t\t\t}\n\t\t},\n\t\ttriggerNextSync = function() {\n\t\t\tself.pollTimerId = setTimeout(function() {\n\t\t\t\tself.pollTimerId = null;\n\t\t\t\tself.syncFromServer.call(self);\n\t\t\t},self.pollTimerInterval);\n\t\t};\n\tif(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) {\n\t\tthis.logger.log(\"Retrieving updated tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getUpdatedTiddlers(self,function(err,updates) {\n\t\t\ttriggerNextSync();\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(updates) {\n\t\t\t\t$tw.utils.each(updates.modifications,function(title) {\n\t\t\t\t\tself.titlesToBeLoaded[title] = true;\n\t\t\t\t});\n\t\t\t\t$tw.utils.each(updates.deletions,function(title) {\n\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t});\n\t\t\t\tif(updates.modifications.length > 0 || updates.deletions.length > 0) {\n\t\t\t\t\tself.processTaskQueue();\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t} else if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.logger.log(\"Retrieving skinny tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\ttriggerNextSync();\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Keep track of which tiddlers we already know about have been reported this time\n\t\t\tvar previousTitles = Object.keys(self.tiddlerInfo);\n\t\t\t// Process each incoming tiddler\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t// Get the incoming tiddler fields, and the existing tiddler\n\t\t\t\tvar tiddlerFields = tiddlers[t],\n\t\t\t\t\tincomingRevision = tiddlerFields.revision + \"\",\n\t\t\t\t\ttiddler = self.wiki.tiddlerExists(tiddlerFields.title) && self.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.tiddlerInfo[tiddlerFields.title],\n\t\t\t\t\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null,\n\t\t\t\t\tindexInPreviousTitles = previousTitles.indexOf(tiddlerFields.title);\n\t\t\t\tif(indexInPreviousTitles !== -1) {\n\t\t\t\t\tpreviousTitles.splice(indexInPreviousTitles,1);\n\t\t\t\t}\n\t\t\t\t// Ignore the incoming tiddler if it's the same as the revision we've already got\n\t\t\t\tif(currRevision !== incomingRevision) {\n\t\t\t\t\t// Only load the skinny version if we don't already have a fat version of the tiddler\n\t\t\t\t\tif(!tiddler || tiddler.fields.text === undefined) {\n\t\t\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\tself.titlesToBeLoaded[tiddlerFields.title] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Delete any tiddlers that were previously reported but missing this time\n\t\t\t$tw.utils.each(previousTitles,function(title) {\n\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t});\n\t\t\tself.processTaskQueue();\n\t\t});\n\t}\n};\n\n/*\nForce load a tiddler from the server\n*/\nSyncer.prototype.enqueueLoadTiddler = function(title) {\n\tthis.titlesToBeLoaded[title] = true;\n\tthis.processTaskQueue();\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Ignore if the syncadaptor doesn't handle it\n\tif(!this.syncadaptor.supportsLazyLoading) {\n\t\treturn;\n\t}\n\t// Don't lazy load the same tiddler twice\n\tif(!this.titlesHaveBeenLazyLoaded[title]) {\n\t\t// Don't lazy load if the tiddler isn't included in the sync filter\n\t\tif(this.getSyncedTiddlers().indexOf(title) !== -1) {\n\t\t\t// Mark the tiddler as needing loading, and having already been lazily loaded\n\t\t\tthis.titlesToBeLoaded[title] = true;\n\t\t\tthis.titlesHaveBeenLazyLoaded[title] = true;\n\t\t}\n\t}\n};\n\n/*\nDispay a password prompt and allow the user to login\n*/\nSyncer.prototype.handleLoginEvent = function() {\n\tvar self = this;\n\tthis.getStatus(function(err,isLoggedIn,username) {\n\t\tif(!err && !isLoggedIn) {\n\t\t\t$tw.passwordPrompt.createPrompt({\n\t\t\t\tserviceName: $tw.language.getString(\"LoginToTiddlySpace\"),\n\t\t\t\tcallback: function(data) {\n\t\t\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\t\t\tself.syncFromServer();\n\t\t\t\t\t});\n\t\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(err,isLoggedIn);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tcallback(null,true);\n\t}\n};\n\n/*\nAttempt to log out of TiddlyWeb\n*/\nSyncer.prototype.handleLogoutEvent = function() {\n\tthis.logger.log(\"Attempting to logout\");\n\tvar self = this;\n\tif(this.syncadaptor.logout) {\n\t\tthis.syncadaptor.logout(function(err) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\tself.getStatus();\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nImmediately refresh from the server\n*/\nSyncer.prototype.handleRefreshEvent = function() {\n\tthis.syncFromServer();\n};\n\n/*\nProcess the next task\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if the sync adaptor is fully initialised and we're not already performing\n\t// a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif((!this.syncadaptor.isReady || this.syncadaptor.isReady()) && this.numTasksInProgress === 0) {\n\t\t// Choose the next task to perform\n\t\tvar task = this.chooseNextTask();\n\t\t// Perform the task if we had one\n\t\tif(typeof task === \"object\" && task !== null) {\n\t\t\tthis.numTasksInProgress += 1;\n\t\t\ttask.run(function(err) {\n\t\t\t\tself.numTasksInProgress -= 1;\n\t\t\t\tif(err) {\n\t\t\t\t\tself.displayError(\"Sync error while processing \" + task.type + \" of '\" + task.title + \"'\",err);\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\tself.triggerTimeout(self.errorRetryInterval);\n\t\t\t\t} else {\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\t// Process the next task\n\t\t\t\t\tself.processTaskQueue.call(self);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// No task is ready so update the status\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// And trigger a timeout if there is a pending task\n\t\t\tif(task === true) {\n\t\t\t\tthis.triggerTimeout();\t\t\t\t\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthis.updateDirtyStatus();\t\t\n\t}\n};\n\nSyncer.prototype.triggerTimeout = function(interval) {\n\tvar self = this;\n\tif(!this.taskTimerId) {\n\t\tthis.taskTimerId = setTimeout(function() {\n\t\t\tself.taskTimerId = null;\n\t\t\tself.processTaskQueue.call(self);\n\t\t},interval || self.taskTimerInterval);\n\t}\n};\n\n/*\nChoose the next sync task. We prioritise saves, then deletes, then loads from the server\n\nReturns either a task object, null if there's no upcoming tasks, or the boolean true if there are pending tasks that aren't yet due\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar thresholdLastSaved = (new Date()) - this.throttleInterval,\n\t\thavePending = null;\n\t// First we look for tiddlers that have been modified locally and need saving back to the server\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title),\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(tiddler) {\n\t\t\t// If the tiddler is not known on the server, or has been modified locally no more recently than the threshold then it needs to be saved to the server\n\t\t\tvar hasChanged = !tiddlerInfo || $tw.wiki.getChangeCount(title) > tiddlerInfo.changeCount,\n\t\t\t\tisReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved;\n\t\t\tif(hasChanged) {\n\t\t\t\tif(isReadyToSave) {\n\t\t\t\t\treturn new SaveTiddlerTask(this,title); \t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\thavePending = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Second, we check tiddlers that are known from the server but not currently in the store, and so need deleting on the server\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\ttitle = titles[index];\n\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\treturn new DeleteTiddlerTask(this,title);\n\t\t}\n\t}\n\t// Check for tiddlers that need loading\n\ttitle = Object.keys(this.titlesToBeLoaded)[0];\n\tif(title) {\n\t\tdelete this.titlesToBeLoaded[title];\n\t\treturn new LoadTiddlerTask(this,title);\n\t}\n\t// No tasks are ready\n\treturn havePending;\n};\n\nfunction SaveTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"save\";\n}\n\nSaveTiddlerTask.prototype.run = function(callback) {\n\tvar self = this,\n\t\tchangeCount = this.syncer.wiki.getChangeCount(this.title),\n\t\ttiddler = this.syncer.wiki.tiddlerExists(this.title) && this.syncer.wiki.getTiddler(this.title);\n\tthis.syncer.logger.log(\"Dispatching 'save' task:\",this.title);\n\tif(tiddler) {\n\t\tthis.syncer.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t// If there's an error, exit without changing any internal state\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Adjust the info stored about this tiddler\n\t\t\tself.syncer.tiddlerInfo[self.title] = {\n\t\t\t\tchangeCount: changeCount,\n\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\trevision: revision,\n\t\t\t\ttimestampLastSaved: new Date()\n\t\t\t};\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t});\n\t} else {\n\t\tthis.syncer.logger.log(\" Not Dispatching 'save' task:\",this.title,\"tiddler does not exist\");\n\t\t$tw.utils.nextTick(callback(null));\n\t}\n};\n\nfunction DeleteTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"delete\";\n}\n\nDeleteTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'delete' task:\",this.title);\n\tthis.syncer.syncadaptor.deleteTiddler(this.title,function(err) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Remove the info stored about this tiddler\n\t\tdelete self.syncer.tiddlerInfo[self.title];\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t},{\n\t\ttiddlerInfo: self.syncer.tiddlerInfo[this.title]\n\t});\n};\n\nfunction LoadTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"load\";\n}\n\nLoadTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'load' task:\",this.title);\n\tthis.syncer.syncadaptor.loadTiddler(this.title,function(err,tiddlerFields) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Update the info stored about this tiddler\n\t\tif(tiddlerFields) {\n\t\t\tself.syncer.storeTiddler(tiddlerFields);\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t});\n};\n\nexports.Syncer = Syncer;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/tiddler.js": {
"title": "$:/core/modules/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/tiddler.js\ntype: application/javascript\nmodule-type: tiddlermethod\n\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.hasTag = function(tag) {\n\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\n};\n\nexports.isPlugin = function() {\n\treturn this.fields.type === \"application/json\" && this.hasField(\"plugin-type\");\n};\n\nexports.isDraft = function() {\n\treturn this.hasField(\"draft.of\");\n};\n\nexports.getFieldString = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn \"\";\n\t}\n\t// Parse the field with the associated module (if any)\n\tvar fieldModule = $tw.Tiddler.fieldModules[field];\n\tif(fieldModule && fieldModule.stringify) {\n\t\treturn fieldModule.stringify.call(this,value);\n\t} else {\n\t\treturn value.toString();\n\t}\n};\n\n/*\nGet the value of a field as a list\n*/\nexports.getFieldList = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn [];\n\t}\n\treturn $tw.utils.parseStringArray(value);\n};\n\n/*\nGet all the fields as a hashmap of strings. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStrings = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [];\n\tvar fields = {};\n\tfor(var field in this.fields) {\n\t\tif($tw.utils.hop(this.fields,field)) {\n\t\t\tif(exclude.indexOf(field) === -1) {\n\t\t\t\tfields[field] = this.getFieldString(field);\n\t\t\t}\n\t\t}\n\t}\n\treturn fields;\n};\n\n/*\nGet all the fields as a name:value block. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStringBlock = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [],\n\t\tfields = Object.keys(this.fields).sort(),\n\t\tresult = [];\n\tfor(var t=0; t<fields.length; t++) {\n\t\tvar field = fields[t];\n\t\tif(exclude.indexOf(field) === -1) {\n\t\t\tresult.push(field + \": \" + this.getFieldString(field));\n\t\t}\n\t}\n\treturn result.join(\"\\n\");\n};\n\nexports.getFieldDay = function(field) {\n\tif(this.cache && this.cache.day && $tw.utils.hop(this.cache.day,field) ) {\n\t\treturn this.cache.day[field];\n\t}\n\tvar day = \"\";\n\tif(this.fields[field]) {\n\t\tday = (new Date($tw.utils.parseDate(this.fields[field]))).setHours(0,0,0,0);\n\t}\n\tthis.cache.day = this.cache.day || {};\n\tthis.cache.day[field] = day;\n\treturn day;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "tiddlermethod"
},
"$:/core/modules/upgraders/plugins.js": {
"title": "$:/core/modules/upgraders/plugins.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/plugins.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that checks that plugins are newer than any already installed version\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar BLOCKED_PLUGINS = {\n\t\"$:/themes/tiddlywiki/stickytitles\": {\n\t\tversions: [\"*\"]\n\t},\n\t\"$:/plugins/tiddlywiki/fullscreen\": {\n\t\tversions: [\"*\"]\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tupgradeLibrary,\n\t\tgetLibraryTiddler = function(title) {\n\t\t\tif(!upgradeLibrary) {\n\t\t\t\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\n\t\t\t\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\n\t\t\t}\n\t\t\treturn upgradeLibrary.tiddlers[title];\n\t\t};\n\n\t// Go through all the incoming tiddlers\n\t$tw.utils.each(titles,function(title) {\n\t\tvar incomingTiddler = tiddlers[title];\n\t\t// Check if we're dealing with a plugin\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"]) {\n\t\t\t// Check whether the plugin contains JS modules\n\t\t\tvar requiresReload = $tw.wiki.doesPluginInfoRequireReload(JSON.parse(incomingTiddler.text)) ? ($tw.wiki.getTiddlerText(\"$:/language/ControlPanel/Plugins/PluginWillRequireReload\") + \" \") : \"\";\n\t\t\tmessages[title] = requiresReload;\n\t\t\tif(incomingTiddler.version) {\n\t\t\t\t// Upgrade the incoming plugin if it is in the upgrade library\n\t\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\t\tmessages[title] = requiresReload + $tw.language.getString(\"Import/Upgrader/Plugins/Upgraded\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\t\tmessages[title] = requiresReload + $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Version\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Check whether the plugin is on the blocked list\n\t\t\tvar blockInfo = BLOCKED_PLUGINS[title];\n\t\t\tif(blockInfo) {\n\t\t\t\tif(blockInfo.versions.indexOf(\"*\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Incompatible\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/system.js": {
"title": "$:/core/modules/upgraders/system.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/system.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_LIST = [\"$:/StoryList\",\"$:/HistoryList\"],\n\tDONT_IMPORT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\",\"$:/Import\"],\n\tWARN_IMPORT_PREFIX_LIST = [\"$:/core/modules/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tshowAlert = false;\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\n\t\t\ttiddlers[title] = Object.create(null);\n\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Suppressed\");\n\t\t} else {\n\t\t\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/State/Suppressed\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(var t=0; t<WARN_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = WARN_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix && wiki.isShadowTiddler(title)) {\n\t\t\t\t\tshowAlert = true;\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Warning\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tif(showAlert) {\n\t\tvar logger = new $tw.utils.Logger(\"import\");\n\t\tlogger.alert($tw.language.getString(\"Import/Upgrader/System/Alert\"));\n\t}\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/themetweaks.js": {
"title": "$:/core/modules/upgraders/themetweaks.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/themetweaks.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\n\nPreviously, theme tweaks were stored in two data tiddlers:\n\n* $:/themes/tiddlywiki/vanilla/metrics\n* $:/themes/tiddlywiki/vanilla/settings\n\nNow, each tweak is stored in its own separate tiddler.\n\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MAPPINGS = {\n\t\"$:/themes/tiddlywiki/vanilla/metrics\": {\n\t\t\"fontsize\": \"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\n\t\t\"lineheight\": \"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\n\t\t\"storyleft\": \"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\n\t\t\"storytop\": \"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\n\t\t\"storyright\": \"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\n\t\t\"storywidth\": \"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\n\t\t\"tiddlerwidth\": \"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"\n\t},\n\t\"$:/themes/tiddlywiki/vanilla/settings\": {\n\t\t\"fontfamily\": \"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tvar mapping = MAPPINGS[title];\n\t\tif(mapping) {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\n\t\t\t\ttiddlerData = wiki.getTiddlerDataCached(tiddler,{});\n\t\t\tfor(var index in mapping) {\n\t\t\t\tvar mappedTitle = mapping[index];\n\t\t\t\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\n\t\t\t\t\ttiddlers[mappedTitle] = {\n\t\t\t\t\t\ttitle: mappedTitle,\n\t\t\t\t\t\ttext: tiddlerData[index]\n\t\t\t\t\t};\n\t\t\t\t\tmessages[mappedTitle] = $tw.language.getString(\"Import/Upgrader/ThemeTweaks/Created\",{variables: {\n\t\t\t\t\t\tfrom: title + \"##\" + index\n\t\t\t\t\t}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/utils/base64-utf8/base64-utf8.module.js": {
"text": "(function(){// From https://gist.github.com/Nijikokun/5192472\n//\n// UTF8 Module\n//\n// Cleaner and modularized utf-8 encoding and decoding library for javascript.\n//\n// copyright: MIT\n// author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com\n!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"utf8\",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if(\"string\"!=typeof r)return r;r=r.replace(/\\r\\n/g,\"\\n\");for(var e,o=\"\",t=0;t<r.length;t++)(e=r.charCodeAt(t))<128?o+=String.fromCharCode(e):e>127&&e<2048?(o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128)):(o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128));return o},decode:function(r){if(\"string\"!=typeof r)return r;for(var e=\"\",o=0,t=0;o<r.length;)(t=r.charCodeAt(o))<128?(e+=String.fromCharCode(t),o++):t>191&&t<224?(e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2):(e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3);return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var n=0;n<t.length;n++)o[t[n]]=o.require(t[n]);o.module.exports=e.apply(o)}else void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"base64\",t||[],e):o.base64=e.apply(o)}(0,function(r){var e=r||this.utf8,o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";return{encode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=e.encode(r);for(var t,n,i,d,f,a,h,c=\"\",u=0;u<r.length;)d=(t=r.charCodeAt(u++))>>2,f=(3&t)<<4|(n=r.charCodeAt(u++))>>4,a=(15&n)<<2|(i=r.charCodeAt(u++))>>6,h=63&i,isNaN(n)?a=h=64:isNaN(i)&&(h=64),c+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return c},decode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");for(var t,n,i,d,f,a,h=\"\",c=0;c<r.length;)t=o.indexOf(r.charAt(c++))<<2|(d=o.indexOf(r.charAt(c++)))>>4,n=(15&d)<<4|(f=o.indexOf(r.charAt(c++)))>>2,i=(3&f)<<6|(a=o.indexOf(r.charAt(c++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(n)),64!=a&&(h+=String.fromCharCode(i));return e.decode(h)}}},this,[\"utf8\"]);}).call(exports);",
"type": "application/javascript",
"title": "$:/core/modules/utils/base64-utf8/base64-utf8.module.js",
"module-type": "library"
},
"$:/core/modules/utils/crypto.js": {
"title": "$:/core/modules/utils/crypto.js",
"text": "/*\\\ntitle: $:/core/modules/utils/crypto.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions related to crypto.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for an encrypted store area in the text of a TiddlyWiki file\n*/\nexports.extractEncryptedStoreArea = function(text) {\n\tvar encryptedStoreAreaStartMarker = \"<pre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">\",\n\t\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\n\tif(encryptedStoreAreaStart !== -1) {\n\t\tvar encryptedStoreAreaEnd = text.indexOf(\"</pre>\",encryptedStoreAreaStart);\n\t\tif(encryptedStoreAreaEnd !== -1) {\n\t\t\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd-1));\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\n*/\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\n\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\n\tif(decryptedText) {\n\t\tvar json = JSON.parse(decryptedText),\n\t\t\ttiddlers = [];\n\t\tfor(var title in json) {\n\t\t\tif(title !== \"$:/isEncrypted\") {\n\t\t\t\ttiddlers.push(json[title]);\n\t\t\t}\n\t\t}\n\t\treturn tiddlers;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\ncallback: function(tiddlers) called with the array of decrypted tiddlers\n\nThe following configuration settings are supported:\n\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\n*/\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\n\t// Try to decrypt with the current password\n\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\n\tif(tiddlers) {\n\t\tcallback(tiddlers);\n\t} else {\n\t\t// Prompt for a new password and keep trying\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: \"Enter a password to decrypt the imported TiddlyWiki\",\n\t\t\tnoUserName: true,\n\t\t\tcanCancel: true,\n\t\t\tsubmitText: \"Decrypt\",\n\t\t\tcallback: function(data) {\n\t\t\t\t// Exit if the user cancelled\n\t\t\t\tif(!data) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Attempt to decrypt the tiddlers\n\t\t\t\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tif($tw.config.usePasswordVault) {\n\t\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t\t}\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t\t// Exit and remove the password prompt\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\t// We didn't decrypt everything, so continue to prompt for password\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/csv.js": {
"title": "$:/core/modules/utils/csv.js",
"text": "/*\\\ntitle: $:/core/modules/utils/csv.js\ntype: application/javascript\nmodule-type: utils\n\nA barebones CSV parser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a CSV string with a header row and return an array of hashmaps.\n*/\nexports.parseCsvStringWithHeader = function(text,options) {\n\toptions = options || {};\n\tvar separator = options.separator || \",\",\n\t\trows = text.split(/\\r?\\n/mg).map(function(row) {\n\t\t\treturn $tw.utils.trim(row);\n\t\t}).filter(function(row) {\n\t\t\treturn row !== \"\";\n\t\t});\n\tif(rows.length < 1) {\n\t\treturn \"Missing header row\";\n\t}\n\tvar headings = rows[0].split(separator),\n\t\tresults = [];\n\tfor(var row=1; row<rows.length; row++) {\n\t\tvar columns = rows[row].split(separator),\n\t\t\tcolumnResult = Object.create(null);\n\t\tif(columns.length !== headings.length) {\n\t\t\treturn \"Malformed CSV row '\" + rows[row] + \"'\";\n\t\t}\n\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\tvar columnName = headings[column];\n\t\t\tcolumnResult[columnName] = $tw.utils.trim(columns[column] || \"\");\n\t\t}\n\t\tresults.push(columnResult);\t\t\t\n\t}\n\treturn results;\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/diff-match-patch/diff_match_patch.js": {
"text": "(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=.5;this.Patch_Margin=4;this.Match_MaxBits=32}var DIFF_DELETE=-1,DIFF_INSERT=1,DIFF_EQUAL=0;\ndiff_match_patch.prototype.diff_main=function(a,b,c,d){\"undefined\"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error(\"Null input. (diff_main)\");if(a==b)return a?[[DIFF_EQUAL,a]]:[];\"undefined\"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);f=this.diff_commonSuffix(a,b);var g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,\nb,e,d);c&&a.unshift([DIFF_EQUAL,c]);g&&a.push([DIFF_EQUAL,g]);this.diff_cleanupMerge(a);return a};\ndiff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[DIFF_INSERT,b]];if(!b)return[[DIFF_DELETE,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[DIFF_INSERT,e.substring(0,g)],[DIFF_EQUAL,f],[DIFF_INSERT,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=DIFF_DELETE),c):1==f.length?[[DIFF_DELETE,a],[DIFF_INSERT,b]]:(e=this.diff_halfMatch_(a,b))?(b=e[1],f=e[3],a=e[4],e=this.diff_main(e[0],e[2],c,d),c=this.diff_main(b,f,c,d),e.concat([[DIFF_EQUAL,\na]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,d):this.diff_bisect_(a,b,d)};\ndiff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([DIFF_EQUAL,\"\"]);for(var e=d=b=0,f=\"\",g=\"\";b<a.length;){switch(a[b][0]){case DIFF_INSERT:e++;g+=a[b][1];break;case DIFF_DELETE:d++;f+=a[b][1];break;case DIFF_EQUAL:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=\nd.length}d=e=0;g=f=\"\"}b++}a.pop();return a};\ndiff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=2*f,h=Array(g),l=Array(g),k=0;k<g;k++)h[k]=-1,l[k]=-1;h[f+1]=0;l[f+1]=0;k=d-e;for(var m=0!=k%2,p=0,x=0,w=0,q=0,t=0;t<f&&!((new Date).getTime()>c);t++){for(var v=-t+p;v<=t-x;v+=2){var n=f+v;var r=v==-t||v!=t&&h[n-1]<h[n+1]?h[n+1]:h[n-1]+1;for(var y=r-v;r<d&&y<e&&a.charAt(r)==b.charAt(y);)r++,y++;h[n]=r;if(r>d)x+=2;else if(y>e)p+=2;else if(m&&(n=f+k-v,0<=n&&n<g&&-1!=l[n])){var u=d-l[n];if(r>=\nu)return this.diff_bisectSplit_(a,b,r,y,c)}}for(v=-t+w;v<=t-q;v+=2){n=f+v;u=v==-t||v!=t&&l[n-1]<l[n+1]?l[n+1]:l[n-1]+1;for(r=u-v;u<d&&r<e&&a.charAt(d-u-1)==b.charAt(e-r-1);)u++,r++;l[n]=u;if(u>d)q+=2;else if(r>e)w+=2;else if(!m&&(n=f+k-v,0<=n&&n<g&&-1!=h[n]&&(r=h[n],y=f+r-n,u=d-u,r>=u)))return this.diff_bisectSplit_(a,b,r,y,c)}}return[[DIFF_DELETE,a],[DIFF_INSERT,b]]};\ndiff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};\ndiff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b=\"\",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf(\"\\n\",c);-1==f&&(f=a.length-1);var h=a.substring(c,f+1);c=f+1;(e.hasOwnProperty?e.hasOwnProperty(h):void 0!==e[h])?b+=String.fromCharCode(e[h]):(b+=String.fromCharCode(g),e[h]=g,d[g++]=h)}return b}var d=[],e={};d[0]=\"\";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};\ndiff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join(\"\")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;d=0;for(var e=1;;){var f=a.substring(c-e);f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};\ndiff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g=\"\",h,k,l,m;-1!=(e=b.indexOf(d,e+1));){var p=f.diff_commonPrefix(a.substring(c),b.substring(e)),u=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<u+p&&(g=b.substring(e-u,e)+b.substring(e,e+p),h=a.substring(0,c-u),k=a.substring(c+p),l=b.substring(0,e-u),m=b.substring(e+p))}return 2*g.length>=a.length?[h,k,l,m,g]:null}if(0>=this.Diff_Timeout)return null;\nvar d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4));d=c(d,e,Math.ceil(d.length/2));if(g||d)g=d?g?g[4].length>d[4].length?g:d:d:g;else return null;if(a.length>b.length){d=g[0];e=g[1];var h=g[2];var l=g[3]}else h=g[0],l=g[1],d=g[2],e=g[3];return[d,e,h,l,g[4]]};\ndiff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,l=0,k=0;f<a.length;)a[f][0]==DIFF_EQUAL?(c[d++]=f,g=l,h=k,k=l=0,e=a[f][1]):(a[f][0]==DIFF_INSERT?l+=a[f][1].length:k+=a[f][1].length,e&&e.length<=Math.max(g,h)&&e.length<=Math.max(l,k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,d--,f=0<d?c[d-1]:-1,k=l=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(a[f-1][0]==\nDIFF_DELETE&&a[f][0]==DIFF_INSERT){b=a[f-1][1];c=a[f][1];d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[DIFF_EQUAL,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[DIFF_EQUAL,b.substring(0,e)]),a[f-1][0]=DIFF_INSERT,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=DIFF_DELETE,a[f+1][1]=b.substring(e),f++;f++}f++}};\ndiff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_);c=g&&c.match(diff_match_patch.linebreakRegex_);d=h&&d.match(diff_match_patch.linebreakRegex_);var k=c&&a.match(diff_match_patch.blanklineEndRegex_),l=d&&b.match(diff_match_patch.blanklineStartRegex_);\nreturn k||l?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(a[c-1][0]==DIFF_EQUAL&&a[c+1][0]==DIFF_EQUAL){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g){var h=e.substring(e.length-g);d=d.substring(0,d.length-g);e=h+e.substring(0,e.length-g);f=h+f}g=d;h=e;for(var l=f,k=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){d+=e.charAt(0);e=e.substring(1)+f.charAt(0);f=f.substring(1);var m=b(d,e)+b(e,f);m>=k&&(k=m,g=d,h=e,l=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-\n1,1),c--),a[c][1]=h,l?a[c+1][1]=l:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\\s/;diff_match_patch.linebreakRegex_=/[\\r\\n]/;diff_match_patch.blanklineEndRegex_=/\\n\\r?\\n$/;diff_match_patch.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;\ndiff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,l=!1,k=!1;f<a.length;)a[f][0]==DIFF_EQUAL?(a[f][1].length<this.Diff_EditCost&&(l||k)?(c[d++]=f,g=l,h=k,e=a[f][1]):(d=0,e=null),l=k=!1):(a[f][0]==DIFF_DELETE?k=!0:l=!0,e&&(g&&h&&l&&k||e.length<this.Diff_EditCost/2&&3==g+h+l+k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,e=null,g&&h?(l=k=!0,d=0):(d--,f=0<d?c[d-1]:-1,l=k=!1),b=!0)),f++;b&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([DIFF_EQUAL,\"\"]);for(var b=0,c=0,d=0,e=\"\",f=\"\",g;b<a.length;)switch(a[b][0]){case DIFF_INSERT:d++;f+=a[b][1];b++;break;case DIFF_DELETE:c++;e+=a[b][1];b++;break;case DIFF_EQUAL:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&a[b-c-d-1][0]==DIFF_EQUAL?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[DIFF_EQUAL,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-\ng)+a[b][1],f=f.substring(0,f.length-g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[DIFF_INSERT,f]):0===d?a.splice(b-c,c+d,[DIFF_DELETE,e]):a.splice(b-c-d,c+d,[DIFF_DELETE,e],[DIFF_INSERT,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&a[b-1][0]==DIFF_EQUAL?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=\"\"}\"\"===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)a[b-1][0]==DIFF_EQUAL&&a[b+1][0]==DIFF_EQUAL&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,\na[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){a[g][0]!==DIFF_INSERT&&(c+=a[g][1].length);a[g][0]!==DIFF_DELETE&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&a[g][0]===DIFF_DELETE?f:f+(b-e)};\ndiff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\\n/g,g=0;g<a.length;g++){var h=a[g][0],l=a[g][1].replace(c,\"&\").replace(d,\"<\").replace(e,\">\").replace(f,\"¶<br>\");switch(h){case DIFF_INSERT:b[g]='<ins style=\"background:#e6ffe6;\">'+l+\"</ins>\";break;case DIFF_DELETE:b[g]='<del style=\"background:#ffe6e6;\">'+l+\"</del>\";break;case DIFF_EQUAL:b[g]=\"<span>\"+l+\"</span>\"}}return b.join(\"\")};\ndiff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_INSERT&&(b[c]=a[c][1]);return b.join(\"\")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_DELETE&&(b[c]=a[c][1]);return b.join(\"\")};\ndiff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][1];switch(a[e][0]){case DIFF_INSERT:c+=f.length;break;case DIFF_DELETE:d+=f.length;break;case DIFF_EQUAL:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};\ndiff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case DIFF_INSERT:b[c]=\"+\"+encodeURI(a[c][1]);break;case DIFF_DELETE:b[c]=\"-\"+a[c][1].length;break;case DIFF_EQUAL:b[c]=\"=\"+a[c][1].length}return b.join(\"\\t\").replace(/%20/g,\" \")};\ndiff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case \"+\":try{c[d++]=[DIFF_INSERT,decodeURI(h)]}catch(k){throw Error(\"Illegal escape in diff_fromDelta: \"+h);}break;case \"-\":case \"=\":var l=parseInt(h,10);if(isNaN(l)||0>l)throw Error(\"Invalid number in diff_fromDelta: \"+h);h=a.substring(e,e+=l);\"=\"==f[g].charAt(0)?c[d++]=[DIFF_EQUAL,h]:c[d++]=[DIFF_DELETE,h];break;default:if(f[g])throw Error(\"Invalid diff operation in diff_fromDelta: \"+\nf[g]);}}if(e!=a.length)throw Error(\"Delta length (\"+e+\") does not equal source text length (\"+a.length+\").\");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error(\"Null input. (match_main)\");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};\ndiff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return f.Match_Distance?e+g/f.Match_Distance:g?1:e}if(b.length>this.Match_MaxBits)throw Error(\"Pattern too long for this browser.\");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));var l=1<<b.length-1;h=-1;for(var k,m,p=b.length+a.length,x,w=0;w<b.length;w++){k=0;for(m=p;k<m;)d(w,\nc+m)<=g?k=m:p=m,m=Math.floor((p-k)/2+k);p=m;k=Math.max(1,c-m+1);var q=Math.min(c+m,a.length)+b.length;m=Array(q+2);for(m[q+1]=(1<<w)-1;q>=k;q--){var t=e[a.charAt(q-1)];m[q]=0===w?(m[q+1]<<1|1)&t:(m[q+1]<<1|1)&t|(x[q+1]|x[q])<<1|1|x[q+1];if(m[q]&l&&(t=d(w,q-1),t<=g))if(g=t,h=q-1,h>c)k=Math.max(1,2*c-h);else break}if(d(w+1,c)>g)break;x=m}return h};\ndiff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};\ndiff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([DIFF_EQUAL,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([DIFF_EQUAL,d]);a.start1-=c.length;a.start2-=\nc.length;a.length1+=c.length+d.length;a.length2+=c.length+d.length}};\ndiff_match_patch.prototype.patch_make=function(a,b,c){if(\"string\"==typeof a&&\"string\"==typeof b&&\"undefined\"==typeof c){var d=a;b=this.diff_main(d,b,!0);2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b))}else if(a&&\"object\"==typeof a&&\"undefined\"==typeof b&&\"undefined\"==typeof c)b=a,d=this.diff_text1(b);else if(\"string\"==typeof a&&b&&\"object\"==typeof b&&\"undefined\"==typeof c)d=a;else if(\"string\"==typeof a&&\"string\"==typeof b&&c&&\"object\"==typeof c)d=a,b=c;else throw Error(\"Unknown call format to patch_make.\");\nif(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,l=0;l<b.length;l++){var k=b[l][0],m=b[l][1];e||k===DIFF_EQUAL||(a.start1=f,a.start2=g);switch(k){case DIFF_INSERT:a.diffs[e++]=b[l];a.length2+=m.length;d=d.substring(0,g)+m+d.substring(g);break;case DIFF_DELETE:a.length1+=m.length;a.diffs[e++]=b[l];d=d.substring(0,g)+d.substring(g+m.length);break;case DIFF_EQUAL:m.length<=2*this.Patch_Margin&&e&&b.length!=l+1?(a.diffs[e++]=b[l],a.length1+=m.length,a.length2+=m.length):\nm.length>=2*this.Patch_Margin&&e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}k!==DIFF_INSERT&&(f+=m.length);k!==DIFF_DELETE&&(g+=m.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};\ndiff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};\ndiff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),l=-1;if(h.length>this.Match_MaxBits){var k=this.match_main(b,h.substring(0,this.Match_MaxBits),g);-1!=k&&(l=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==l||k>=l)&&(k=-1)}else k=this.match_main(b,h,\ng);if(-1==k)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=k-g,g=-1==l?b.substring(k,k+h.length):b.substring(k,l+this.Match_MaxBits),h==g)b=b.substring(0,k)+this.diff_text2(a[f].diffs)+b.substring(k+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);h=0;var m;for(l=0;l<a[f].diffs.length;l++){var p=a[f].diffs[l];p[0]!==DIFF_EQUAL&&(m=this.diff_xIndex(g,h));p[0]===\nDIFF_INSERT?b=b.substring(0,k+m)+p[1]+b.substring(k+m):p[0]===DIFF_DELETE&&(b=b.substring(0,k+m)+b.substring(k+this.diff_xIndex(g,h+p[1].length)));p[0]!==DIFF_DELETE&&(h+=p[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};\ndiff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c=\"\",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;d=a[0];var e=d.diffs;if(0==e.length||e[0][0]!=DIFF_EQUAL)e.unshift([DIFF_EQUAL,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||e[e.length-\n1][0]!=DIFF_EQUAL?(e.push([DIFF_EQUAL,c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};\ndiff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g=\"\";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,l=!0;h.start1=e-g.length;h.start2=f-g.length;\"\"!==g&&(h.length1=h.length2=g.length,h.diffs.push([DIFF_EQUAL,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){g=d.diffs[0][0];var k=d.diffs[0][1];g===DIFF_INSERT?(h.length2+=k.length,f+=k.length,h.diffs.push(d.diffs.shift()),\nl=!1):g===DIFF_DELETE&&1==h.diffs.length&&h.diffs[0][0]==DIFF_EQUAL&&k.length>2*b?(h.length1+=k.length,e+=k.length,l=!1,h.diffs.push([g,k]),d.diffs.shift()):(k=k.substring(0,b-h.length1-this.Patch_Margin),h.length1+=k.length,e+=k.length,g===DIFF_EQUAL?(h.length2+=k.length,f+=k.length):l=!1,h.diffs.push([g,k]),k==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(k.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);k=this.diff_text1(d.diffs).substring(0,\nthis.Patch_Margin);\"\"!==k&&(h.length1+=k.length,h.length2+=k.length,0!==h.diffs.length&&h.diffs[h.diffs.length-1][0]===DIFF_EQUAL?h.diffs[h.diffs.length-1][1]+=k:h.diffs.push([DIFF_EQUAL,k]));l||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join(\"\")};\ndiff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split(\"\\n\");for(var c=0,d=/^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error(\"Invalid patch string: \"+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);\"\"===e[2]?(f.start1--,f.length1=1):\"0\"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);\"\"===e[4]?(f.start2--,f.length2=1):\"0\"==e[4]?f.length2=0:(f.start2--,f.length2=\nparseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error(\"Illegal escape in patch_fromText: \"+g);}if(\"-\"==e)f.diffs.push([DIFF_DELETE,g]);else if(\"+\"==e)f.diffs.push([DIFF_INSERT,g]);else if(\" \"==e)f.diffs.push([DIFF_EQUAL,g]);else if(\"@\"==e)break;else if(\"\"!==e)throw Error('Invalid patch mode \"'+e+'\" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};\ndiff_match_patch.patch_obj.prototype.toString=function(){for(var a=[\"@@ -\"+(0===this.length1?this.start1+\",0\":1==this.length1?this.start1+1:this.start1+1+\",\"+this.length1)+\" +\"+(0===this.length2?this.start2+\",0\":1==this.length2?this.start2+1:this.start2+1+\",\"+this.length2)+\" @@\\n\"],b,c=0;c<this.diffs.length;c++){switch(this.diffs[c][0]){case DIFF_INSERT:b=\"+\";break;case DIFF_DELETE:b=\"-\";break;case DIFF_EQUAL:b=\" \"}a[c+1]=b+encodeURI(this.diffs[c][1])+\"\\n\"}return a.join(\"\").replace(/%20/g,\" \")};\nthis.diff_match_patch=diff_match_patch;this.DIFF_DELETE=DIFF_DELETE;this.DIFF_INSERT=DIFF_INSERT;this.DIFF_EQUAL=DIFF_EQUAL;\n}).call(exports);",
"type": "application/javascript",
"title": "$:/core/modules/utils/diff-match-patch/diff_match_patch.js",
"module-type": "library"
},
"$:/core/modules/utils/dom/animations/slide.js": {
"title": "$:/core/modules/utils/dom/animations/slide.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animations/slide.js\ntype: application/javascript\nmodule-type: animation\n\nA simple slide animation that varies the height of the element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction slideOpen(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration();\n\t// Get the current height of the domNode\n\tvar computedStyle = window.getComputedStyle(domNode),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\n\t\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"none\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{marginTop: currMarginTop + \"px\"},\n\t\t{paddingBottom: currPaddingBottom + \"px\"},\n\t\t{paddingTop: currPaddingTop + \"px\"},\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n}\n\nfunction slideClosed(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Clear the properties we've set when the animation is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n}\n\nexports.slide = {\n\topen: slideOpen,\n\tclose: slideClosed\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "animation"
},
"$:/core/modules/utils/dom/animator.js": {
"title": "$:/core/modules/utils/dom/animator.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animator.js\ntype: application/javascript\nmodule-type: utils\n\nOrchestrates animations and transitions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Animator() {\n\t// Get the registered animation modules\n\tthis.animations = {};\n\t$tw.modules.applyMethods(\"animation\",this.animations);\n}\n\nAnimator.prototype.perform = function(type,domNode,options) {\n\toptions = options || {};\n\t// Find an animation that can handle this type\n\tvar chosenAnimation;\n\t$tw.utils.each(this.animations,function(animation,name) {\n\t\tif($tw.utils.hop(animation,type)) {\n\t\t\tchosenAnimation = animation[type];\n\t\t}\n\t});\n\tif(!chosenAnimation) {\n\t\tchosenAnimation = function(domNode,options) {\n\t\t\tif(options.callback) {\n\t\t\t\toptions.callback();\n\t\t\t}\n\t\t};\n\t}\n\t// Call the animation\n\tchosenAnimation(domNode,options);\n};\n\nexports.Animator = Animator;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/browser.js": {
"title": "$:/core/modules/utils/dom/browser.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/browser.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser feature detection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet style properties of an element\n\telement: dom node\n\tstyles: ordered array of {name: value} pairs\n*/\nexports.setStyle = function(element,styles) {\n\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\n\t\tfor(var t=0; t<styles.length; t++) {\n\t\t\tfor(var styleName in styles[t]) {\n\t\t\t\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\n\t\"background-color\" --> \"backgroundColor\"\n\t\"transition\" --> \"webkitTransition\"\n*/\n\nvar styleNameCache = {}; // We'll cache the style name conversions\n\nexports.convertStyleNameToPropertyName = function(styleName) {\n\t// Return from the cache if we can\n\tif(styleNameCache[styleName]) {\n\t\treturn styleNameCache[styleName];\n\t}\n\t// Convert it by first removing any hyphens\n\tvar propertyName = $tw.utils.unHyphenateCss(styleName);\n\t// Then check if it needs a prefix\n\tif($tw.browser && document.body.style[propertyName] === undefined) {\n\t\tvar prefixes = [\"O\",\"MS\",\"Moz\",\"webkit\"];\n\t\tfor(var t=0; t<prefixes.length; t++) {\n\t\t\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\n\t\t\tif(document.body.style[prefixedName] !== undefined) {\n\t\t\t\tpropertyName = prefixedName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// Put it in the cache too\n\tstyleNameCache[styleName] = propertyName;\n\treturn propertyName;\n};\n\n/*\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\n\t\"backgroundColor\" --> \"background-color\"\n\t\"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.convertPropertyNameToStyleName = function(propertyName) {\n\t// Rehyphenate the name\n\tvar styleName = $tw.utils.hyphenateCss(propertyName);\n\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\n\tif(styleName.indexOf(\"webkit\") === 0) {\n\t\tstyleName = \"-\" + styleName;\n\t} else if(styleName.indexOf(\"-m-s\") === 0) {\n\t\tstyleName = \"-ms\" + styleName.substr(4);\n\t}\n\treturn styleName;\n};\n\n/*\nRound trip a stylename to a property name and back again. For example:\n\t\"transform\" --> \"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.roundTripPropertyName = function(propertyName) {\n\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\n};\n\n/*\nConverts a standard event name into the local browser specific equivalent. For example:\n\t\"animationEnd\" --> \"webkitAnimationEnd\"\n*/\n\nvar eventNameCache = {}; // We'll cache the conversions\n\nvar eventNameMappings = {\n\t\"transitionEnd\": {\n\t\tcorrespondingCssProperty: \"transition\",\n\t\tmappings: {\n\t\t\ttransition: \"transitionend\",\n\t\t\tOTransition: \"oTransitionEnd\",\n\t\t\tMSTransition: \"msTransitionEnd\",\n\t\t\tMozTransition: \"transitionend\",\n\t\t\twebkitTransition: \"webkitTransitionEnd\"\n\t\t}\n\t},\n\t\"animationEnd\": {\n\t\tcorrespondingCssProperty: \"animation\",\n\t\tmappings: {\n\t\t\tanimation: \"animationend\",\n\t\t\tOAnimation: \"oAnimationEnd\",\n\t\t\tMSAnimation: \"msAnimationEnd\",\n\t\t\tMozAnimation: \"animationend\",\n\t\t\twebkitAnimation: \"webkitAnimationEnd\"\n\t\t}\n\t}\n};\n\nexports.convertEventName = function(eventName) {\n\tif(eventNameCache[eventName]) {\n\t\treturn eventNameCache[eventName];\n\t}\n\tvar newEventName = eventName,\n\t\tmappings = eventNameMappings[eventName];\n\tif(mappings) {\n\t\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\n\t\tif(mappings.mappings[convertedProperty]) {\n\t\t\tnewEventName = mappings.mappings[convertedProperty];\n\t\t}\n\t}\n\t// Put it in the cache too\n\teventNameCache[eventName] = newEventName;\n\treturn newEventName;\n};\n\n/*\nReturn the names of the fullscreen APIs\n*/\nexports.getFullScreenApis = function() {\n\tvar d = document,\n\t\tdb = d.body,\n\t\tresult = {\n\t\t\"_requestFullscreen\": db.webkitRequestFullscreen !== undefined ? \"webkitRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.mozRequestFullScreen !== undefined ? \"mozRequestFullScreen\" :\n\t\t\t\t\t\t\tdb.msRequestFullscreen !== undefined ? \"msRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.requestFullscreen !== undefined ? \"requestFullscreen\" : \"\",\n\t\t\"_exitFullscreen\": d.webkitExitFullscreen !== undefined ? \"webkitExitFullscreen\" :\n\t\t\t\t\t\t\td.mozCancelFullScreen !== undefined ? \"mozCancelFullScreen\" :\n\t\t\t\t\t\t\td.msExitFullscreen !== undefined ? \"msExitFullscreen\" :\n\t\t\t\t\t\t\td.exitFullscreen !== undefined ? \"exitFullscreen\" : \"\",\n\t\t\"_fullscreenElement\": d.webkitFullscreenElement !== undefined ? \"webkitFullscreenElement\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozFullScreenElement\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"msFullscreenElement\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenElement\" : \"\",\n\t\t\"_fullscreenChange\": d.webkitFullscreenElement !== undefined ? \"webkitfullscreenchange\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozfullscreenchange\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"MSFullscreenChange\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenchange\" : \"\"\n\t};\n\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement || !result._fullscreenChange) {\n\t\treturn null;\n\t} else {\n\t\treturn result;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/csscolorparser.js": {
"title": "$:/core/modules/utils/dom/csscolorparser.js",
"text": "// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) { // Clamp to integer 0 .. 255.\n i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) { // Clamp to float 0.0 .. 1.0.\n return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) { // int or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_byte(parseFloat(str) / 100 * 255);\n return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) { // float or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_float(parseFloat(str) / 100);\n return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n if (h < 0) h += 1;\n else if (h > 1) h -= 1;\n\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n return m1;\n}\n\nfunction parseCSSColor(css_str) {\n // Remove all whitespace, not compliant, but should just be more accepting.\n var str = css_str.replace(/ /g, '').toLowerCase();\n\n // Color keywords (and transparent) lookup.\n if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.\n\n // #abc and #abc123 syntax.\n if (str[0] === '#') {\n if (str.length === 4) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.\n return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n (iv & 0xf0) | ((iv & 0xf0) >> 4),\n (iv & 0xf) | ((iv & 0xf) << 4),\n 1];\n } else if (str.length === 7) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.\n return [(iv & 0xff0000) >> 16,\n (iv & 0xff00) >> 8,\n iv & 0xff,\n 1];\n }\n\n return null;\n }\n\n var op = str.indexOf('('), ep = str.indexOf(')');\n if (op !== -1 && ep + 1 === str.length) {\n var fname = str.substr(0, op);\n var params = str.substr(op+1, ep-(op+1)).split(',');\n var alpha = 1; // To allow case fallthrough.\n switch (fname) {\n case 'rgba':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'rgb':\n if (params.length !== 3) return null;\n return [parse_css_int(params[0]),\n parse_css_int(params[1]),\n parse_css_int(params[2]),\n alpha];\n case 'hsla':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'hsl':\n if (params.length !== 3) return null;\n var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1\n // NOTE(deanm): According to the CSS spec s/l should only be\n // percentages, but we don't bother and let float or percentage.\n var s = parse_css_float(params[1]);\n var l = parse_css_float(params[2]);\n var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var m1 = l * 2 - m2;\n return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n alpha];\n default:\n return null;\n }\n }\n\n return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom.js": {
"title": "$:/core/modules/utils/dom.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static DOM-related utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDetermines whether element 'a' contains element 'b'\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\n*/\nexports.domContains = function(a,b) {\n\treturn a.contains ?\n\t\ta !== b && a.contains(b) :\n\t\t!!(a.compareDocumentPosition(b) & 16);\n};\n\nexports.removeChildren = function(node) {\n\twhile(node.hasChildNodes()) {\n\t\tnode.removeChild(node.firstChild);\n\t}\n};\n\nexports.hasClass = function(el,className) {\n\treturn el && el.className && el.className.toString().split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = el.className.split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t\tel.className = c.join(\" \");\n\t}\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = el.className.split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.className = c.join(\" \");\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the first parent element that has scrollbars or use the body as fallback.\n*/\nexports.getScrollContainer = function(el) {\n\tvar doc = el.ownerDocument;\n\twhile(el.parentNode) {\t\n\t\tel = el.parentNode;\n\t\tif(el.scrollTop) {\n\t\t\treturn el;\n\t\t}\n\t}\n\treturn doc.body;\n};\n\n/*\nGet the scroll position of the viewport\nReturns:\n\t{\n\t\tx: horizontal scroll position in pixels,\n\t\ty: vertical scroll position in pixels\n\t}\n*/\nexports.getScrollPosition = function(srcWindow) {\n\tvar scrollWindow = srcWindow || window;\n\tif(\"scrollX\" in scrollWindow) {\n\t\treturn {x: scrollWindow.scrollX, y: scrollWindow.scrollY};\n\t} else {\n\t\treturn {x: scrollWindow.document.documentElement.scrollLeft, y: scrollWindow.document.documentElement.scrollTop};\n\t}\n};\n\n/*\nAdjust the height of a textarea to fit its content, preserving scroll position, and return the height\n*/\nexports.resizeTextAreaToFit = function(domNode,minHeight) {\n\t// Get the scroll container and register the current scroll position\n\tvar container = $tw.utils.getScrollContainer(domNode),\n\t\tscrollTop = container.scrollTop;\n // Measure the specified minimum height\n\tdomNode.style.height = minHeight;\n\tvar measuredHeight = domNode.offsetHeight || parseInt(minHeight,10);\n\t// Set its height to auto so that it snaps to the correct height\n\tdomNode.style.height = \"auto\";\n\t// Calculate the revised height\n\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,measuredHeight);\n\t// Only try to change the height if it has changed\n\tif(newHeight !== domNode.offsetHeight) {\n\t\tdomNode.style.height = newHeight + \"px\";\n\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t$tw.utils.forceLayout(domNode);\n\t\t// Set the container to the position we registered at the beginning\n\t\tcontainer.scrollTop = scrollTop;\n\t}\n\treturn newHeight;\n};\n\n/*\nGets the bounding rectangle of an element in absolute page coordinates\n*/\nexports.getBoundingPageRect = function(element) {\n\tvar scrollPos = $tw.utils.getScrollPosition(element.ownerDocument.defaultView),\n\t\tclientRect = element.getBoundingClientRect();\n\treturn {\n\t\tleft: clientRect.left + scrollPos.x,\n\t\twidth: clientRect.width,\n\t\tright: clientRect.right + scrollPos.x,\n\t\ttop: clientRect.top + scrollPos.y,\n\t\theight: clientRect.height,\n\t\tbottom: clientRect.bottom + scrollPos.y\n\t};\n};\n\n/*\nSaves a named password in the browser\n*/\nexports.savePassword = function(name,password) {\n\tvar done = false;\n\ttry {\n\t\twindow.localStorage.setItem(\"tw5-password-\" + name,password);\n\t\tdone = true;\n\t} catch(e) {\n\t}\n\tif(!done) {\n\t\t$tw.savedPasswords = $tw.savedPasswords || Object.create(null);\n\t\t$tw.savedPasswords[name] = password;\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\tvar value;\n\ttry {\n\t\tvalue = window.localStorage.getItem(\"tw5-password-\" + name);\n\t} catch(e) {\n\t}\n\tif(value !== undefined) {\n\t\treturn value;\n\t} else {\n\t\treturn ($tw.savedPasswords || Object.create(null))[name] || \"\";\n\t}\n};\n\n/*\nForce layout of a dom node and its descendents\n*/\nexports.forceLayout = function(element) {\n\tvar dummy = element.offsetWidth;\n};\n\n/*\nPulse an element for debugging purposes\n*/\nexports.pulseElement = function(element) {\n\t// Event handler to remove the class at the end\n\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\n\t\telement.removeEventListener($tw.browser.animationEnd,handler,false);\n\t\t$tw.utils.removeClass(element,\"pulse\");\n\t},false);\n\t// Apply the pulse class\n\t$tw.utils.removeClass(element,\"pulse\");\n\t$tw.utils.forceLayout(element);\n\t$tw.utils.addClass(element,\"pulse\");\n};\n\n/*\nAttach specified event handlers to a DOM node\ndomNode: where to attach the event handlers\nevents: array of event handlers to be added (see below)\nEach entry in the events array is an object with these properties:\nhandlerFunction: optional event handler function\nhandlerObject: optional event handler object\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\n*/\nexports.addEventListeners = function(domNode,events) {\n\t$tw.utils.each(events,function(eventInfo) {\n\t\tvar handler;\n\t\tif(eventInfo.handlerFunction) {\n\t\t\thandler = eventInfo.handlerFunction;\n\t\t} else if(eventInfo.handlerObject) {\n\t\t\tif(eventInfo.handlerMethod) {\n\t\t\t\thandler = function(event) {\n\t\t\t\t\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\n\t\t\t\t};\t\n\t\t\t} else {\n\t\t\t\thandler = eventInfo.handlerObject;\n\t\t\t}\n\t\t}\n\t\tdomNode.addEventListener(eventInfo.name,handler,false);\n\t});\n};\n\n/*\nGet the computed styles applied to an element as an array of strings of individual CSS properties\n*/\nexports.getComputedStyles = function(domNode) {\n\tvar textAreaStyles = window.getComputedStyle(domNode,null),\n\t\tstyleDefs = [],\n\t\tname;\n\tfor(var t=0; t<textAreaStyles.length; t++) {\n\t\tname = textAreaStyles[t];\n\t\tstyleDefs.push(name + \": \" + textAreaStyles.getPropertyValue(name) + \";\");\n\t}\n\treturn styleDefs;\n};\n\n/*\nApply a set of styles passed as an array of strings of individual CSS properties\n*/\nexports.setStyles = function(domNode,styleDefs) {\n\tdomNode.style.cssText = styleDefs.join(\"\");\n};\n\n/*\nCopy the computed styles from a source element to a destination element\n*/\nexports.copyStyles = function(srcDomNode,dstDomNode) {\n\t$tw.utils.setStyles(dstDomNode,$tw.utils.getComputedStyles(srcDomNode));\n};\n\n/*\nCopy plain text to the clipboard on browsers that support it\n*/\nexports.copyToClipboard = function(text,options) {\n\toptions = options || {};\n\tvar textArea = document.createElement(\"textarea\");\n\ttextArea.style.position = \"fixed\";\n\ttextArea.style.top = 0;\n\ttextArea.style.left = 0;\n\ttextArea.style.fontSize = \"12pt\";\n\ttextArea.style.width = \"2em\";\n\ttextArea.style.height = \"2em\";\n\ttextArea.style.padding = 0;\n\ttextArea.style.border = \"none\";\n\ttextArea.style.outline = \"none\";\n\ttextArea.style.boxShadow = \"none\";\n\ttextArea.style.background = \"transparent\";\n\ttextArea.value = text;\n\tdocument.body.appendChild(textArea);\n\ttextArea.select();\n\ttextArea.setSelectionRange(0,text.length);\n\tvar succeeded = false;\n\ttry {\n\t\tsucceeded = document.execCommand(\"copy\");\n\t} catch (err) {\n\t}\n\tif(!options.doNotNotify) {\n\t\t$tw.notifier.display(succeeded ? \"$:/language/Notifications/CopiedToClipboard/Succeeded\" : \"$:/language/Notifications/CopiedToClipboard/Failed\");\n\t}\n\tdocument.body.removeChild(textArea);\n};\n\nexports.getLocationPath = function() {\n\treturn window.location.toString().split(\"#\")[0];\n};\n\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/dragndrop.js": {
"title": "$:/core/modules/utils/dom/dragndrop.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/dragndrop.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser data transfer utilities, used with the clipboard and drag and drop\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOptions:\n\ndomNode: dom node to make draggable\ndragImageType: \"pill\" or \"dom\"\ndragTiddlerFn: optional function to retrieve the title of tiddler to drag\ndragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag\nwidget: widget to use as the contect for the filter\n*/\nexports.makeDraggable = function(options) {\n\tvar dragImageType = options.dragImageType || \"dom\",\n\t\tdragImage,\n\t\tdomNode = options.domNode;\n\t// Make the dom node draggable (not necessary for anchor tags)\n\tif((domNode.tagName || \"\").toLowerCase() !== \"a\") {\n\t\tdomNode.setAttribute(\"draggable\",\"true\");\t\t\n\t}\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragstart\", handlerFunction: function(event) {\n\t\t\tif(event.dataTransfer === undefined) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Collect the tiddlers being dragged\n\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t \tstartActions = options.startActions;\n\t\t\tif(dragFilter) {\n\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t}\n\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t// Check that we've something to drag\n\t\t\tif(titles.length > 0 && event.target === domNode) {\n\t\t\t\t// Mark the drag in progress\n\t\t\t\t$tw.dragInProgress = domNode;\n\t\t\t\t// Set the dragging class on the element being dragged\n\t\t\t\t$tw.utils.addClass(event.target,\"tc-dragging\");\n\t\t\t\t// Invoke drag-start actions if given\n\t\t\t\tif(startActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(startActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Create the drag image elements\n\t\t\t\tdragImage = options.widget.document.createElement(\"div\");\n\t\t\t\tdragImage.className = \"tc-tiddler-dragger\";\n\t\t\t\tvar inner = options.widget.document.createElement(\"div\");\n\t\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\t\tinner.appendChild(options.widget.document.createTextNode(\n\t\t\t\t\ttitles.length === 1 ? \n\t\t\t\t\t\ttitles[0] :\n\t\t\t\t\t\ttitles.length + \" tiddlers\"\n\t\t\t\t));\n\t\t\t\tdragImage.appendChild(inner);\n\t\t\t\toptions.widget.document.body.appendChild(dragImage);\n\t\t\t\t// Set the data transfer properties\n\t\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t\t// Set up the image\n\t\t\t\tdataTransfer.effectAllowed = \"all\";\n\t\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\t\tif(dragImageType === \"pill\") {\n\t\t\t\t\t\tdataTransfer.setDragImage(dragImage.firstChild,-16,-16);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar r = domNode.getBoundingClientRect();\n\t\t\t\t\t\tdataTransfer.setDragImage(domNode,event.clientX-r.left,event.clientY-r.top);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Set up the data transfer\n\t\t\t\tif(dataTransfer.clearData) {\n\t\t\t\t\tdataTransfer.clearData();\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tvar jsonData = [];\n\t\t\t\tif(titles.length > 1) {\n\t\t\t\t\ttitles.forEach(function(title) {\n\t\t\t\t\t\tjsonData.push(options.widget.wiki.getTiddlerAsJson(title));\n\t\t\t\t\t});\n\t\t\t\t\tjsonData = \"[\" + jsonData.join(\",\") + \"]\";\n\t\t\t\t} else {\n\t\t\t\t\tjsonData = options.widget.wiki.getTiddlerAsJson(titles[0]);\n\t\t\t\t}\n\t\t\t\t// IE doesn't like these content types\n\t\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\t\tdataTransfer.setData(\"text/plain\",titleString);\n\t\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\t}\n\t\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\tdataTransfer.setData(\"Text\",titleString);\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn false;\n\t\t}},\n\t\t{name: \"dragend\", handlerFunction: function(event) {\n\t\t\tif(event.target === domNode) {\n\t\t\t\t// Collect the tiddlers being dragged\n\t\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t \t\tendActions = options.endActions;\n\t\t\t\tif(dragFilter) {\n\t\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t\t}\n\t\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t\t$tw.dragInProgress = null;\n\t\t\t\t// Invoke drag-end actions if given\n\t\t\t\tif(endActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(endActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Remove the dragging class on the element being dragged\n\t\t\t\t$tw.utils.removeClass(event.target,\"tc-dragging\");\n\t\t\t\t// Delete the drag image element\n\t\t\t\tif(dragImage) {\n\t\t\t\t\tdragImage.parentNode.removeChild(dragImage);\n\t\t\t\t\tdragImage = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}}\n\t]);\n};\n\nexports.importDataTransfer = function(dataTransfer,fallbackTitle,callback) {\n\t// Try each provided data type in turn\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Available data types:\");\n\t\tfor(var type=0; type<dataTransfer.types.length; type++) {\n\t\t\tconsole.log(\"type\",dataTransfer.types[type],dataTransfer.getData(dataTransfer.types[type]))\n\t\t}\n\t}\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = importDataTypes[t];\n\t\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);\n\t\t\t\tcallback(tiddlerFields);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn parseJSONTiddlers(data,fallbackTitle);\n\t}},\n\t{type: \"URL\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/plain\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"Text\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}}\n];\n\nfunction parseJSONTiddlers(json,fallbackTitle) {\n\tvar data = JSON.parse(json);\n\tif(!$tw.utils.isArray(data)) {\n\t\tdata = [data];\n\t}\n\tdata.forEach(function(fields) {\n\t\tfields.title = fields.title || fallbackTitle;\n\t});\n\treturn data;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/http.js": {
"title": "$:/core/modules/utils/dom/http.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/http.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser HTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nA quick and dirty HTTP function; to be refactored later. Options are:\n\turl: URL to retrieve\n\theaders: hashmap of headers to send\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data,xhr)\n\treturnProp: string name of the property to return as first argument of callback\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\turl = options.url,\n\t\theaders = options.headers || {accept: \"application/json\"},\n\t\treturnProp = options.returnProp || \"responseText\",\n\t\trequest = new XMLHttpRequest(),\n\t\tdata = \"\",\n\t\tf,results;\n\t// Massage the data hashmap into a string\n\tif(options.data) {\n\t\tif(typeof options.data === \"string\") { // Already a string\n\t\t\tdata = options.data;\n\t\t} else { // A hashmap of strings\n\t\t\tresults = [];\n\t\t\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\n\t\t\t\tresults.push(dataItemTitle + \"=\" + encodeURIComponent(dataItem));\n\t\t\t});\n\t\t\tif(type === \"GET\" || type === \"HEAD\") {\n\t\t\t\turl += \"?\" + results.join(\"&\");\n\t\t\t} else {\n\t\t\t\tdata = results.join(\"&\");\n\t\t\t}\n\t\t}\n\t}\n\t// Set up the state change handler\n\trequest.onreadystatechange = function() {\n\t\tif(this.readyState === 4) {\n\t\t\tif(this.status === 200 || this.status === 201 || this.status === 204) {\n\t\t\t\t// Success!\n\t\t\t\toptions.callback(null,this[returnProp],this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback($tw.language.getString(\"Error/XMLHttpRequest\") + \": \" + this.status,null,this);\n\t\t}\n\t};\n\t// Make the request\n\trequest.open(type,url,true);\n\tif(headers) {\n\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\trequest.setRequestHeader(headerTitle,header);\n\t\t});\n\t}\n\tif(data && !$tw.utils.hop(headers,\"Content-type\")) {\n\t\trequest.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\tif(!$tw.utils.hop(headers,\"X-Requested-With\")) {\n\t\trequest.setRequestHeader(\"X-Requested-With\",\"TiddlyWiki\");\n\t}\n\ttry {\n\t\trequest.send(data);\n\t} catch(e) {\n\t\toptions.callback(e,null,this);\n\t}\n\treturn request;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/keyboard.js": {
"title": "$:/core/modules/utils/dom/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities; now deprecated. Instead, use $tw.keyboardManager\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n[\"parseKeyDescriptor\",\"checkKeyDescriptor\"].forEach(function(method) {\n\texports[method] = function() {\n\t\tif($tw.keyboardManager) {\n\t\t\treturn $tw.keyboardManager[method].apply($tw.keyboardManager,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t};\n});\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/modal.js": {
"title": "$:/core/modules/utils/dom/modal.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/modal.js\ntype: application/javascript\nmodule-type: utils\n\nModal message mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Modal = function(wiki) {\n\tthis.wiki = wiki;\n\tthis.modalCount = 0;\n};\n\n/*\nDisplay a modal dialogue\n\ttitle: Title of tiddler to display\n\toptions: see below\nOptions include:\n\tdownloadLink: Text of a big download link to include\n*/\nModal.prototype.display = function(title,options) {\n\toptions = options || {};\n\tthis.srcDocument = options.variables && (options.variables.rootwindow === \"true\" ||\n\t\t\t\toptions.variables.rootwindow === \"yes\") ? document :\n\t\t\t\t(options.event.event && options.event.event.target ? options.event.event.target.ownerDocument : document);\n\tthis.srcWindow = this.srcDocument.defaultView;\n\tvar self = this,\n\t\trefreshHandler,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\ttiddler = this.wiki.getTiddler(title);\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Create the wrapper divs\n\tvar wrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalBackdrop = this.srcDocument.createElement(\"div\"),\n\t\tmodalWrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalHeader = this.srcDocument.createElement(\"div\"),\n\t\theaderTitle = this.srcDocument.createElement(\"h3\"),\n\t\tmodalBody = this.srcDocument.createElement(\"div\"),\n\t\tmodalLink = this.srcDocument.createElement(\"a\"),\n\t\tmodalFooter = this.srcDocument.createElement(\"div\"),\n\t\tmodalFooterHelp = this.srcDocument.createElement(\"span\"),\n\t\tmodalFooterButtons = this.srcDocument.createElement(\"span\");\n\t// Up the modal count and adjust the body class\n\tthis.modalCount++;\n\tthis.adjustPageClass();\n\t// Add classes\n\t$tw.utils.addClass(wrapper,\"tc-modal-wrapper\");\n\tif(tiddler.fields && tiddler.fields.class) {\n\t\t$tw.utils.addClass(wrapper,tiddler.fields.class);\n\t}\n\t$tw.utils.addClass(modalBackdrop,\"tc-modal-backdrop\");\n\t$tw.utils.addClass(modalWrapper,\"tc-modal\");\n\t$tw.utils.addClass(modalHeader,\"tc-modal-header\");\n\t$tw.utils.addClass(modalBody,\"tc-modal-body\");\n\t$tw.utils.addClass(modalFooter,\"tc-modal-footer\");\n\t// Join them together\n\twrapper.appendChild(modalBackdrop);\n\twrapper.appendChild(modalWrapper);\n\tmodalHeader.appendChild(headerTitle);\n\tmodalWrapper.appendChild(modalHeader);\n\tmodalWrapper.appendChild(modalBody);\n\tmodalFooter.appendChild(modalFooterHelp);\n\tmodalFooter.appendChild(modalFooterButtons);\n\tmodalWrapper.appendChild(modalFooter);\n\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\theaderWidgetNode.render(headerTitle,null);\n\t// Render the body of the message\n\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tbodyWidgetNode.render(modalBody,null);\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(this.srcDocument.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler.fields && tiddler.fields.help) {\n\t\tvar link = this.srcDocument.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.setAttribute(\"rel\",\"noopener noreferrer\");\n\t\tlink.appendChild(this.srcDocument.createTextNode(\"Help\"));\n\t\tmodalFooterHelp.appendChild(link);\n\t\tmodalFooterHelp.style.float = \"left\";\n\t}\n\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"footer\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"button\",\n\t\t\tattributes: {\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tm-close-tiddler\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttext: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: $tw.language.getString(\"Buttons/Close/Caption\")\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tfooterWidgetNode.render(modalFooterButtons,null);\n\t// Set up the refresh handler\n\trefreshHandler = function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Remove our refresh handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Decrease the modal count and adjust the body class\n\t\tself.modalCount--;\n\t\tself.adjustPageClass();\n\t\t// Force layout and animate the modal message away\n\t\t$tw.utils.forceLayout(modalBackdrop);\n\t\t$tw.utils.forceLayout(modalWrapper);\n\t\t$tw.utils.setStyle(modalBackdrop,[\n\t\t\t{opacity: \"0\"}\n\t\t]);\n\t\t$tw.utils.setStyle(modalWrapper,[\n\t\t\t{transform: \"translateY(\" + self.srcWindow.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\tself.srcWindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tself.srcDocument.body.removeChild(wrapper);\n\t\t\t}\n\t\t},duration);\n\t\t// Don't let anyone else handle the tm-close-tiddler message\n\t\treturn false;\n\t};\n\theaderWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tbodyWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tfooterWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\t// Set the initial styles for the message\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-this.srcWindow.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tthis.srcDocument.body.appendChild(wrapper);\n\t// Set up animation for the styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{transition: \"opacity \" + duration + \"ms ease-out\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(modalBackdrop);\n\t$tw.utils.forceLayout(modalWrapper);\n\t// Set final animated styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0.7\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n};\n\nModal.prototype.adjustPageClass = function() {\n\tvar windowContainer = $tw.pageContainer ? ($tw.pageContainer === this.srcDocument.body.firstChild ? $tw.pageContainer : this.srcDocument.body.firstChild) : null;\n\tif(windowContainer) {\n\t\t$tw.utils.toggleClass(windowContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n};\n\nexports.Modal = Modal;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/notifier.js": {
"title": "$:/core/modules/utils/dom/notifier.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/notifier.js\ntype: application/javascript\nmodule-type: utils\n\nNotifier mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Notifier = function(wiki) {\n\tthis.wiki = wiki;\n};\n\n/*\nDisplay a notification\n\ttitle: Title of tiddler containing the notification text\n\toptions: see below\nOptions include:\n*/\nNotifier.prototype.display = function(title,options) {\n\toptions = options || {};\n\t// Create the wrapper divs\n\tvar self = this,\n\t\tnotification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\trefreshHandler;\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Add classes\n\t$tw.utils.addClass(notification,\"tc-notification\");\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables,\n\t\timportPageMacros: true});\n\twidgetNode.render(notification,null);\n\trefreshHandler = function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Set the initial styles for the notification\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"0\"},\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"},\n\t\t{transition: \"opacity \" + duration + \"ms ease-out, \" + $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Add the notification to the DOM\n\tdocument.body.appendChild(notification);\n\t// Force layout\n\t$tw.utils.forceLayout(notification);\n\t// Set final animated styles\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n\t// Set a timer to remove the notification\n\twindow.setTimeout(function() {\n\t\t// Remove our change event handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Force layout and animate the notification away\n\t\t$tw.utils.forceLayout(notification);\n\t\t$tw.utils.setStyle(notification,[\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transform: \"translateX(\" + (notification.offsetWidth) + \"px)\"}\n\t\t]);\n\t\t// Remove the modal message from the DOM once the transition ends\n\t\tsetTimeout(function() {\n\t\t\tif(notification.parentNode) {\n\t\t\t\tdocument.body.removeChild(notification);\n\t\t\t}\n\t\t},duration);\n\t},$tw.config.preferences.notificationDuration);\n};\n\nexports.Notifier = Notifier;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/popup.js": {
"title": "$:/core/modules/utils/dom/popup.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n};\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned (one of domNode or domNodeRect is required)\n\tdomNodeRect: rectangle to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n\tfloating: if true, skips registering the popup, meaning that it will need manually clearing\n*/\nPopup.prototype.triggerPopup = function(options) {\n\t// Check if this popup is already active\n\tvar index = this.findPopup(options.title);\n\t// Compute the new state\n\tvar state = index === -1;\n\tif(options.force !== undefined) {\n\t\tstate = options.force;\n\t}\n\t// Show or cancel the popup according to the new state\n\tif(state) {\n\t\tthis.show(options);\n\t} else {\n\t\tthis.cancel(index);\n\t}\n};\n\nPopup.prototype.findPopup = function(title) {\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\treturn index;\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar info = this.popupInfo(event.target),\n\t\t\tcancelLevel = info.popupLevel - 1;\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(info.isHandle) {\n\t\t\tcancelLevel++;\n\t\t}\n\t\t// Cancel\n\t\tthis.cancel(cancelLevel);\n\t}\n};\n\n/*\nFind the popup level containing a DOM node. Returns:\npopupLevel: count of the number of nested popups containing the specified element\nisHandle: true if the specified element is within a popup handle\n*/\nPopup.prototype.popupInfo = function(domNode) {\n\tvar isHandle = false,\n\t\tpopupCount = 0,\n\t\tnode = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\tisHandle = true;\n\t\t\tpopupCount++;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\tisHandle = true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\tpopupCount++;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tvar info = {\n\t\tpopupLevel: popupCount,\n\t\tisHandle: isHandle\n\t};\n\treturn info;\n};\n\n/*\nDisplay a popup by adding it to the stack\n*/\nPopup.prototype.show = function(options) {\n\t// Find out what was clicked on\n\tvar info = this.popupInfo(options.domNode);\n\t// Cancel any higher level popups\n\tthis.cancel(info.popupLevel);\n\n\t// Store the popup details if not already there\n\tif(!options.floating && this.findPopup(options.title) === -1) {\n\t\tthis.popups.push({\n\t\t\ttitle: options.title,\n\t\t\twiki: options.wiki,\n\t\t\tdomNode: options.domNode,\n\t\t\tnoStateReference: options.noStateReference\n\t\t});\n\t}\n\t// Set the state tiddler\n\tvar rect;\n\tif(options.domNodeRect) {\n\t\trect = options.domNodeRect;\n\t} else {\n\t\trect = {\n\t\t\tleft: options.domNode.offsetLeft,\n\t\t\ttop: options.domNode.offsetTop,\n\t\t\twidth: options.domNode.offsetWidth,\n\t\t\theight: options.domNode.offsetHeight\n\t\t};\n\t}\n\tvar popupRect = \"(\" + rect.left + \",\" + rect.top + \",\" + \n\t\t\t\trect.width + \",\" + rect.height + \")\";\n\tif(options.noStateReference) {\n\t\toptions.wiki.setText(options.title,\"text\",undefined,popupRect);\n\t} else {\n\t\toptions.wiki.setTextReference(options.title,popupRect);\n\t}\n\t// Add the click handler if we have any popups\n\tif(this.popups.length > 0) {\n\t\tthis.rootElement.addEventListener(\"click\",this,true);\t\t\n\t}\n};\n\n/*\nCancel all popups at or above a specified level or DOM node\nlevel: popup level to cancel (0 cancels all popups)\n*/\nPopup.prototype.cancel = function(level) {\n\tvar numPopups = this.popups.length;\n\tlevel = Math.max(0,Math.min(level,numPopups));\n\tfor(var t=level; t<numPopups; t++) {\n\t\tvar popup = this.popups.pop();\n\t\tif(popup.title) {\n\t\t\tif(popup.noStateReference) {\n\t\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t\t} else {\n\t\t\t\tpopup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title);\n \t\t}\n\t\t}\n\t}\n\tif(this.popups.length === 0) {\n\t\tthis.rootElement.removeEventListener(\"click\",this,false);\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup\n*/\nPopup.prototype.readPopupState = function(text) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/;\n\treturn popupLocationRegExp.test(text);\n};\n\nexports.Popup = Popup;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/scroller.js": {
"title": "$:/core/modules/utils/dom/scroller.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/scroller.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nEvent handler for when the `tm-scroll` event hits the document body\n*/\nvar PageScroller = function() {\n\tthis.idRequestFrame = null;\n\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\tfunction(callback) {\n\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t};\n\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\twindow.webkitCancelAnimationFrame ||\n\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\tfunction(id) {\n\t\t\twindow.clearTimeout(id);\n\t\t};\n};\n\nPageScroller.prototype.isScrolling = function() {\n\treturn this.idRequestFrame !== null;\n}\n\nPageScroller.prototype.cancelScroll = function(srcWindow) {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(srcWindow,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle an event\n*/\nPageScroller.prototype.handleEvent = function(event) {\n\tif(event.type === \"tm-scroll\") {\n\t\treturn this.scrollIntoView(event.target);\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element,callback) {\n\tvar self = this,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t srcWindow = element ? element.ownerDocument.defaultView : window;\n\t// Now get ready to scroll the body\n\tthis.cancelScroll(srcWindow);\n\tthis.startTime = Date.now();\n\t// Get the height of any position:fixed toolbars\n\tvar toolbar = srcWindow.document.querySelector(\".tc-adjust-top-of-scroll\"),\n\t\toffset = 0;\n\tif(toolbar) {\n\t\toffset = toolbar.offsetHeight;\n\t}\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar getBounds = function() {\n\t\t\tvar clientBounds = typeof callback === 'function' ? callback() : element.getBoundingClientRect(),\n\t\t\t\tscrollPosition = $tw.utils.getScrollPosition(srcWindow);\n\t\t\treturn {\n\t\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\t\ttop: clientBounds.top + scrollPosition.y - offset,\n\t\t\t\twidth: clientBounds.width,\n\t\t\t\theight: clientBounds.height\n\t\t\t};\n\t\t},\n\t\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\t\t// targetPos/targetSize - position and size of the target element\n\t\t// currentPos/currentSize - position and size of the current scroll viewport\n\t\t// returns: new position of the scroll viewport\n\t\tgetEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\tvar newPos = targetPos;\n\t\t\t// If we are scrolling within 50 pixels of the top/left then snap to zero\n\t\t\tif(newPos < 50) {\n\t\t\t\tnewPos = 0;\n\t\t\t}\n\t\t\treturn newPos;\n\t\t},\n\t\tdrawFrame = function drawFrame() {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll(srcWindow);\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tvar scrollPosition = $tw.utils.getScrollPosition(srcWindow),\n\t\t\t\tbounds = getBounds(),\n\t\t\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,srcWindow.innerWidth),\n\t\t\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,srcWindow.innerHeight);\n\t\t\tsrcWindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\tdrawFrame();\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/edition-info.js": {
"title": "$:/core/modules/utils/edition-info.js",
"text": "/*\\\ntitle: $:/core/modules/utils/edition-info.js\ntype: application/javascript\nmodule-type: utils-node\n\nInformation about the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\nvar editionInfo;\n\nexports.getEditionInfo = function() {\n\tif(!editionInfo) {\n\t\t// Enumerate the edition paths\n\t\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\n\t\teditionInfo = {};\n\t\tfor(var editionIndex=0; editionIndex<editionPaths.length; editionIndex++) {\n\t\t\tvar editionPath = editionPaths[editionIndex];\n\t\t\t// Enumerate the folders\n\t\t\tvar entries = fs.readdirSync(editionPath);\n\t\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\t\tvar entry = entries[entryIndex];\n\t\t\t\t// Check if directories have a valid tiddlywiki.info\n\t\t\t\tif(!editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\t\tvar info;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinfo = JSON.parse(fs.readFileSync(path.resolve(editionPath,entry,\"tiddlywiki.info\"),\"utf8\"));\n\t\t\t\t\t} catch(ex) {\n\t\t\t\t\t}\n\t\t\t\t\tif(info) {\n\t\t\t\t\t\teditionInfo[entry] = info;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn editionInfo;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/fakedom.js": {
"title": "$:/core/modules/utils/fakedom.js",
"text": "/*\\\ntitle: $:/core/modules/utils/fakedom.js\ntype: application/javascript\nmodule-type: global\n\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Sequence number used to enable us to track objects for testing\nvar sequenceNumber = null;\n\nvar bumpSequenceNumber = function(object) {\n\tif(sequenceNumber !== null) {\n\t\tobject.sequenceNumber = sequenceNumber++;\n\t}\n};\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text + \"\";\n};\n\nObject.defineProperty(TW_TextNode.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn 3;\n\t}\n});\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Element = function(tag,namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis._style = {};\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\nObject.defineProperty(TW_Element.prototype, \"style\", {\n\tget: function() {\n\t\treturn this._style;\n\t},\n\tset: function(str) {\n\t\tvar self = this;\n\t\tstr = str || \"\";\n\t\t$tw.utils.each(str.split(\";\"),function(declaration) {\n\t\t\tvar parts = declaration.split(\":\"),\n\t\t\t\tname = $tw.utils.trim(parts[0]),\n\t\t\t\tvalue = $tw.utils.trim(parts[1]);\n\t\t\tif(name && value) {\n\t\t\t\tself._style[$tw.utils.convertStyleNameToPropertyName(name)] = value;\n\t\t\t}\n\t\t});\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn 1;\n\t}\n});\n\nTW_Element.prototype.getAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot getAttribute on a raw TW_Element\";\n\t}\n\treturn this.attributes[name];\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tthis.attributes[name] = value + \"\";\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"childNodes\", {\n\tget: function() {\n\t\treturn this.children;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"tagName\", {\n\tget: function() {\n\t\treturn this.tag || \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"=\\\"\",$tw.utils.htmlEncode(v),\"\\\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this._style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this._style) {\n\t\t\t\tstyle.push($tw.utils.convertPropertyNameToStyleName(s) + \":\" + this._style[s] + \";\");\n\t\t\t}\n\t\t\tif(style.length > 0) {\n\t\t\t\toutput.push(\" style=\\\"\",style.join(\"\"),\"\\\"\");\n\t\t\t}\n\t\t}\n\t\toutput.push(\">\");\n\t\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\n\t\t\toutput.push(this.innerHTML);\n\t\t\toutput.push(\"</\",this.tag,\">\");\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"innerHTML\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn this.rawHTML;\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tif(node instanceof TW_Element) {\n\t\t\t\t\tb.push(node.outerHTML);\n\t\t\t\t} else if(node instanceof TW_TextNode) {\n\t\t\t\t\tb.push($tw.utils.htmlEncode(node.textContent));\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.isRaw = true;\n\t\tthis.rawHTML = value;\n\t\tthis.rawTextContent = null;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textInnerHTML\", {\n\tset: function(value) {\n\t\tif(this.isRaw) {\n\t\t\tthis.rawTextContent = value;\n\t\t} else {\n\t\t\tthrow \"Cannot set textInnerHTML of a non-raw TW_Element\";\n\t\t}\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tif(this.rawTextContent === null) {\n\t\t\t\treturn \"\";\n\t\t\t} else {\n\t\t\t\treturn this.rawTextContent;\n\t\t\t}\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.textContent);\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.children = [new TW_TextNode(value)];\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn \"\";\n\t\t} else {\n\t\t\tvar b = [],\n\t\t\t\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\tif(this.tag === \"li\") {\n\t\t\t\tb.push(\"* \");\n\t\t\t}\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.formattedTextContent);\n\t\t\t});\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\treturn b.join(\"\");\n\t\t}\n\t}\n});\n\nvar document = {\n\tsetSequenceNumber: function(value) {\n\t\tsequenceNumber = value;\n\t},\n\tcreateElementNS: function(namespace,tag) {\n\t\treturn new TW_Element(tag,namespace);\n\t},\n\tcreateElement: function(tag) {\n\t\treturn new TW_Element(tag);\n\t},\n\tcreateTextNode: function(text) {\n\t\treturn new TW_TextNode(text);\n\t},\n\tcompatMode: \"CSS1Compat\", // For KaTeX to know that we're not a browser in quirks mode\n\tisTiddlyWikiFakeDom: true\n};\n\nexports.fakeDocument = document;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/filesystem.js": {
"title": "$:/core/modules/utils/filesystem.js",
"text": "/*\\\ntitle: $:/core/modules/utils/filesystem.js\ntype: application/javascript\nmodule-type: utils-node\n\nFile system utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\n/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = $tw.utils.removeTrailingSeparator(srcPath);\n\tdstPath = $tw.utils.removeTrailingSeparator(dstPath);\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = Buffer.alloc(FILE_BUFFER_LENGTH);\n\t}\n\t// Create any directories in the destination\n\t$tw.utils.createDirectory(path.dirname(dstPath));\n\t// Copy the file\n\tvar srcFile = fs.openSync(srcPath,\"r\"),\n\t\tdstFile = fs.openSync(dstPath,\"w\"),\n\t\tbytesRead = 1,\n\t\tpos = 0;\n\twhile (bytesRead > 0) {\n\t\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\n\t\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\n\t\tpos += bytesRead;\n\t}\n\tfs.closeSync(srcFile);\n\tfs.closeSync(dstFile);\n\treturn null;\n};\n\n/*\nRemove trailing path separator\n*/\nexports.removeTrailingSeparator = function(dirPath) {\n\tvar len = dirPath.length;\n\tif(dirPath.charAt(len-1) === path.sep) {\n\t\tdirPath = dirPath.substr(0,len-1);\n\t}\n\treturn dirPath;\n};\n\n/*\nRecursively create a directory\n*/\nexports.createDirectory = function(dirPath) {\n\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\n\t\tdirPath = dirPath + path.sep;\n\t}\n\tvar pos = 1;\n\tpos = dirPath.indexOf(path.sep,pos);\n\twhile(pos !== -1) {\n\t\tvar subDirPath = dirPath.substr(0,pos);\n\t\tif(!$tw.utils.isDirectory(subDirPath)) {\n\t\t\ttry {\n\t\t\t\tfs.mkdirSync(subDirPath);\n\t\t\t} catch(e) {\n\t\t\t\treturn \"Error creating directory '\" + subDirPath + \"'\";\n\t\t\t}\n\t\t}\n\t\tpos = dirPath.indexOf(path.sep,pos + 1);\n\t}\n\treturn null;\n};\n\n/*\nRecursively create directories needed to contain a specified file\n*/\nexports.createFileDirectories = function(filePath) {\n\treturn $tw.utils.createDirectory(path.dirname(filePath));\n};\n\n/*\nRecursively delete a directory\n*/\nexports.deleteDirectory = function(dirPath) {\n\tif(fs.existsSync(dirPath)) {\n\t\tvar entries = fs.readdirSync(dirPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar currPath = dirPath + path.sep + entries[entryIndex];\n\t\t\tif(fs.lstatSync(currPath).isDirectory()) {\n\t\t\t\t$tw.utils.deleteDirectory(currPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(currPath);\n\t\t\t}\n\t\t}\n\tfs.rmdirSync(dirPath);\n\t}\n\treturn null;\n};\n\n/*\nCheck if a path identifies a directory\n*/\nexports.isDirectory = function(dirPath) {\n\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n};\n\n/*\nCheck if a path identifies a directory that is empty\n*/\nexports.isDirectoryEmpty = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn false;\n\t}\n\tvar files = fs.readdirSync(dirPath),\n\t\tempty = true;\n\t$tw.utils.each(files,function(file,index) {\n\t\tif(file.charAt(0) !== \".\") {\n\t\t\tempty = false;\n\t\t}\n\t});\n\treturn empty;\n};\n\n/*\nRecursively delete a tree of empty directories\n*/\nexports.deleteEmptyDirs = function(dirpath,callback) {\n\tvar self = this;\n\tfs.readdir(dirpath,function(err,files) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(files.length > 0) {\n\t\t\treturn callback(null);\n\t\t}\n\t\tfs.rmdir(dirpath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.deleteEmptyDirs(path.dirname(dirpath),callback);\n\t\t});\n\t});\n};\n\n/*\nCreate a fileInfo object for saving a tiddler:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\nOptions include:\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n*/\nexports.generateTiddlerFileInfo = function(tiddler,options) {\n\tvar fileInfo = {};\n\t// Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace\n\tvar hasUnsafeFields = false;\n\t$tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) {\n\t\tif(fieldName !== \"text\") {\n\t\t\thasUnsafeFields = hasUnsafeFields || /[\\x00-\\x1F]/mg.test(value);\n\t\t\thasUnsafeFields = hasUnsafeFields || ($tw.utils.trim(value) !== value);\n\t\t}\n\t});\n\t// Check for field values \n\tif(hasUnsafeFields) {\n\t\t// Save as a JSON file\n\t\tfileInfo.type = \"application/json\";\n\t\tfileInfo.hasMetaFile = false;\n\t} else {\n\t\t// Save as a .tid or a text/binary file plus a .meta file\n\t\tvar tiddlerType = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\tif(tiddlerType === \"text/vnd.tiddlywiki\") {\n\t\t\t// Save as a .tid file\n\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\tfileInfo.hasMetaFile = false;\n\t\t} else {\n\t\t\t// Save as a text/binary file and a .meta file\n\t\t\tfileInfo.type = tiddlerType;\n\t\t\tfileInfo.hasMetaFile = true;\n\t\t}\n\t}\n\t// Take the file extension from the tiddler content type\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: \"\"};\n\t// Generate the filepath\n\tfileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{\n\t\textension: contentTypeInfo.extension,\n\t\tdirectory: options.directory,\n\t\tpathFilters: options.pathFilters,\n\t\twiki: options.wiki\n\t});\n\treturn fileInfo;\n};\n\n/*\nGenerate the filepath for saving a tiddler\nOptions include:\n\textension: file extension to be added the finished filepath\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n*/\nexports.generateTiddlerFilepath = function(title,options) {\n\tvar self = this,\n\t\tdirectory = options.directory || \"\",\n\t\textension = options.extension || \"\",\n\t\tfilepath;\n\t// Check if any of the pathFilters applies\n\tif(options.pathFilters && options.wiki) {\n\t\t$tw.utils.each(options.pathFilters,function(filter) {\n\t\t\tif(!filepath) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\tfilepath = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// If not, generate a base pathname\n\tif(!filepath) {\n\t\tfilepath = title;\n\t\t// If the filepath already ends in the extension then remove it\n\t\tif(filepath.substring(filepath.length - extension.length) === extension) {\n\t\t\tfilepath = filepath.substring(0,filepath.length - extension.length);\n\t\t}\n\t\t// Remove any forward or backward slashes so we don't create directories\n\t\tfilepath = filepath.replace(/\\/|\\\\/g,\"_\");\n\t}\n\t// Don't let the filename start with a dot because such files are invisible on *nix\n\tfilepath = filepath.replace(/^\\./g,\"_\");\n\t// Remove any characters that can't be used in cross-platform filenames\n\tfilepath = $tw.utils.transliterate(filepath.replace(/<|>|\\:|\\\"|\\||\\?|\\*|\\^/g,\"_\"));\n\t// Truncate the filename if it is too long\n\tif(filepath.length > 200) {\n\t\tfilepath = filepath.substr(0,200);\n\t}\n\t// If the resulting filename is blank (eg because the title is just punctuation characters)\n\tif(!filepath) {\n\t\t// ...then just use the character codes of the title\n\t\tfilepath = \"\";\t\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tif(filepath) {\n\t\t\t\tfilepath += \"-\";\n\t\t\t}\n\t\t\tfilepath += char.charCodeAt(0).toString();\n\t\t});\n\t}\n\t// Add a uniquifier if the file already exists\n\tvar fullPath,\n\t\tcount = 0;\n\tdo {\n\t\tfullPath = path.resolve(directory,filepath + (count ? \"_\" + count : \"\") + extension);\n\t\tcount++;\n\t} while(fs.existsSync(fullPath));\n\t// Return the full path to the file\n\treturn fullPath;\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFile = function(tiddler,fileInfo,callback) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\",callback);\n\t\t});\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\",callback);\n\t\t} else {\n\t\t\tfs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\",callback);\n\t\t}\n\t}\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFileSync = function(tiddler,fileInfo) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFileSync(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding);\n\t\tfs.writeFileSync(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\");\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\");\n\t\t} else {\n\t\t\tfs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\");\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/logger.js": {
"title": "$:/core/modules/utils/logger.js",
"text": "/*\\\ntitle: $:/core/modules/utils/logger.js\ntype: application/javascript\nmodule-type: utils\n\nA basic logging implementation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ALERT_TAG = \"$:/tags/Alert\";\n\n/*\nMake a new logger\n*/\nfunction Logger(componentName,options) {\n\toptions = options || {};\n\tthis.componentName = componentName || \"\";\n\tthis.colour = options.colour || \"white\";\n\tthis.enable = \"enable\" in options ? options.enable : true;\n\tthis.save = \"save\" in options ? options.save : true;\n\tthis.saveLimit = options.saveLimit || 100 * 1024;\n\tthis.saveBufferLogger = this;\n\tthis.buffer = \"\";\n\tthis.alertCount = 0;\n}\n\nLogger.prototype.setSaveBuffer = function(logger) {\n\tthis.saveBufferLogger = logger;\n};\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tvar self = this;\n\tif(this.enable) {\n\t\tif(this.saveBufferLogger.save) {\n\t\t\tthis.saveBufferLogger.buffer += $tw.utils.formatDateString(new Date(),\"YYYY MM DD 0hh:0mm:0ss.0XXX\") + \":\";\n\t\t\t$tw.utils.each(Array.prototype.slice.call(arguments,0),function(arg,index) {\n\t\t\t\tself.saveBufferLogger.buffer += \" \" + arg;\n\t\t\t});\n\t\t\tthis.saveBufferLogger.buffer += \"\\n\";\n\t\t\tthis.saveBufferLogger.buffer = this.saveBufferLogger.buffer.slice(-this.saveBufferLogger.saveLimit);\t\t\t\n\t\t}\n\t\tif(console !== undefined && console.log !== undefined) {\n\t\t\treturn Function.apply.call(console.log, console, [$tw.utils.terminalColour(this.colour),this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0)).concat($tw.utils.terminalColour()));\n\t\t}\n\t} \n};\n\n/*\nRead the message buffer\n*/\nLogger.prototype.getBuffer = function() {\n\treturn this.saveBufferLogger.buffer;\n};\n\n/*\nLog a structure as a table\n*/\nLogger.prototype.table = function(value) {\n\t(console.table || console.log)(value);\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\tif(this.enable) {\n\t\t// Prepare the text of the alert\n\t\tvar text = Array.prototype.join.call(arguments,\" \");\n\t\t// Create alert tiddlers in the browser\n\t\tif($tw.browser) {\n\t\t\t// Check if there is an existing alert with the same text and the same component\n\t\t\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\t\t\talertFields,\n\t\t\t\texistingCount,\n\t\t\t\tself = this;\n\t\t\t$tw.utils.each(existingAlerts,function(title) {\n\t\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(alertFields) {\n\t\t\t\texistingCount = alertFields.count || 1;\n\t\t\t} else {\n\t\t\t\talertFields = {\n\t\t\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\t\t\ttext: text,\n\t\t\t\t\ttags: [ALERT_TAG],\n\t\t\t\t\tcomponent: this.componentName\n\t\t\t\t};\n\t\t\t\texistingCount = 0;\n\t\t\t\tthis.alertCount += 1;\n\t\t\t}\n\t\t\talertFields.modified = new Date();\n\t\t\tif(++existingCount > 1) {\n\t\t\t\talertFields.count = existingCount;\n\t\t\t} else {\n\t\t\t\talertFields.count = undefined;\n\t\t\t}\n\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t\t\t// Log the alert as well\n\t\t\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\t// Print an orange message to the console if not in the browser\n\t\t\tconsole.error(\"\\x1b[1;33m\" + text + \"\\x1b[0m\");\n\t\t}\t\t\n\t}\n};\n\n/*\nClear outstanding alerts\n*/\nLogger.prototype.clearAlerts = function() {\n\tvar self = this;\n\tif($tw.browser && this.alertCount > 0) {\n\t\t$tw.utils.each($tw.wiki.getTiddlersWithTag(ALERT_TAG),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(tiddler.fields.component === self.componentName) {\n\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t}\n\t\t});\n\t\tthis.alertCount = 0;\n\t}\n};\n\nexports.Logger = Logger;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/parsetree.js": {
"title": "$:/core/modules/utils/parsetree.js",
"text": "/*\\\ntitle: $:/core/modules/utils/parsetree.js\ntype: application/javascript\nmodule-type: utils\n\nParse tree utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[name] = {type: \"string\", value: value};\n};\n\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\n\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\n\t\treturn node.attributes[name].value;\n\t}\n\treturn defaultValue;\n};\n\nexports.addClassToParseTreeNode = function(node,classString) {\n\tvar classes = [];\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[\"class\"] = node.attributes[\"class\"] || {type: \"string\", value: \"\"};\n\tif(node.attributes[\"class\"].type === \"string\") {\n\t\tif(node.attributes[\"class\"].value !== \"\") {\n\t\t\tclasses = node.attributes[\"class\"].value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tnode.attributes[\"class\"].value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\t\tnode.attributes = node.attributes || {};\n\t\tnode.attributes.style = node.attributes.style || {type: \"string\", value: \"\"};\n\t\tif(node.attributes.style.type === \"string\") {\n\t\t\tnode.attributes.style.value += name + \":\" + value + \";\";\n\t\t}\n};\n\nexports.findParseTreeNode = function(nodeArray,search) {\n\tfor(var t=0; t<nodeArray.length; t++) {\n\t\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\n\t\t\treturn nodeArray[t];\n\t\t}\n\t}\n\treturn undefined;\n};\n\n/*\nHelper to get the text of a parse tree node or array of nodes\n*/\nexports.getParseTreeText = function getParseTreeText(tree) {\n\tvar output = [];\n\tif($tw.utils.isArray(tree)) {\n\t\t$tw.utils.each(tree,function(node) {\n\t\t\toutput.push(getParseTreeText(node));\n\t\t});\n\t} else {\n\t\tif(tree.type === \"text\") {\n\t\t\toutput.push(tree.text);\n\t\t}\n\t\tif(tree.children) {\n\t\t\treturn getParseTreeText(tree.children);\n\t\t}\n\t}\n\treturn output.join(\"\");\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/performance.js": {
"title": "$:/core/modules/utils/performance.js",
"text": "/*\\\ntitle: $:/core/modules/utils/performance.js\ntype: application/javascript\nmodule-type: global\n\nPerformance measurement.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Performance(enabled) {\n\tthis.enabled = !!enabled;\n\tthis.measures = {}; // Hashmap by measurement name of {time:, invocations:}\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n\tthis.showGreeting();\n}\n\nPerformance.prototype.showGreeting = function() {\n\tif($tw.browser) {\n\t\tthis.logger.log(\"Execute $tw.perf.log(); to see filter execution timings\");\t\t\n\t}\n};\n\n/*\nWrap performance reporting around a top level function\n*/\nPerformance.prototype.report = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tself.logger.log(name + \": \" + $tw.utils.timer(startTime).toFixed(2) + \"ms\");\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nPerformance.prototype.log = function() {\n\tvar self = this,\n\t\ttotalTime = 0,\n\t\torderedMeasures = Object.keys(this.measures).sort(function(a,b) {\n\t\t\tif(self.measures[a].time > self.measures[b].time) {\n\t\t\t\treturn -1;\n\t\t\t} else if (self.measures[a].time < self.measures[b].time) {\n\t\t\t\treturn + 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\ttotalTime += self.measures[name].time;\n\t});\n\tvar results = []\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\tvar measure = self.measures[name];\n\t\tresults.push({name: name,invocations: measure.invocations, avgTime: measure.time / measure.invocations, totalTime: measure.time, percentTime: (measure.time / totalTime) * 100})\n\t});\n\tself.logger.table(results);\n};\n\n/*\nWrap performance measurements around a subfunction\n*/\nPerformance.prototype.measure = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tif(!(name in self.measures)) {\n\t\t\t\tself.measures[name] = {time: 0, invocations: 0};\n\t\t\t}\n\t\t\tself.measures[name].time += $tw.utils.timer(startTime);\n\t\t\tself.measures[name].invocations++;\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nexports.Performance = Performance;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/pluginmaker.js": {
"title": "$:/core/modules/utils/pluginmaker.js",
"text": "/*\\\ntitle: $:/core/modules/utils/pluginmaker.js\ntype: application/javascript\nmodule-type: utils\n\nA quick and dirty way to pack up plugins within the browser.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRepack a plugin, and then delete any non-shadow payload tiddlers\n*/\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\n\tadditionalTiddlers = additionalTiddlers || [];\n\texcludeTiddlers = excludeTiddlers || [];\n\t// Get the plugin tiddler\n\tvar pluginTiddler = $tw.wiki.getTiddler(title);\n\tif(!pluginTiddler) {\n\t\tthrow \"No such tiddler as \" + title;\n\t}\n\t// Extract the JSON\n\tvar jsonPluginTiddler;\n\ttry {\n\t\tjsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);\n\t} catch(e) {\n\t\tthrow \"Cannot parse plugin tiddler \" + title + \"\\n\" + $tw.language.getString(\"Error/Caption\") + \": \" + e;\n\t}\n\t// Get the list of tiddlers\n\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\n\t// Add the additional tiddlers\n\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\n\t// Remove any excluded tiddlers\n\tfor(var t=tiddlers.length-1; t>=0; t--) {\n\t\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\n\t\t\ttiddlers.splice(t,1);\n\t\t}\n\t}\n\t// Pack up the tiddlers into a block of JSON\n\tvar plugins = {};\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\tfields = {};\n\t\t$tw.utils.each(tiddler.fields,function (value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\tplugins[title] = fields;\n\t});\n\t// Retrieve and bump the version number\n\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\"version\") || \"0.0.0\") || {\n\t\t\tmajor: \"0\",\n\t\t\tminor: \"0\",\n\t\t\tpatch: \"0\"\n\t\t};\n\tpluginVersion.patch++;\n\tvar version = pluginVersion.major + \".\" + pluginVersion.minor + \".\" + pluginVersion.patch;\n\tif(pluginVersion.prerelease) {\n\t\tversion += \"-\" + pluginVersion.prerelease;\n\t}\n\tif(pluginVersion.build) {\n\t\tversion += \"+\" + pluginVersion.build;\n\t}\n\t// Save the tiddler\n\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\n\t// Delete any non-shadow constituent tiddlers\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tif($tw.wiki.tiddlerExists(title)) {\n\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t}\n\t});\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t// Return a heartwarming confirmation\n\treturn \"Plugin \" + title + \" successfully saved\";\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/transliterate.js": {
"title": "$:/core/modules/utils/transliterate.js",
"text": "/*\\\ntitle: $:/core/modules/utils/transliterate.js\ntype: application/javascript\nmodule-type: utils\n\nTransliteration static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nTransliterate string to ASCII\n\n(Some pairs taken from http://semplicewebsites.com/removing-accents-javascript)\n*/\nexports.transliterationPairs = {\n\t\"Á\":\"A\",\n\t\"Ă\":\"A\",\n\t\"Ắ\":\"A\",\n\t\"Ặ\":\"A\",\n\t\"Ằ\":\"A\",\n\t\"Ẳ\":\"A\",\n\t\"Ẵ\":\"A\",\n\t\"Ǎ\":\"A\",\n\t\"Â\":\"A\",\n\t\"Ấ\":\"A\",\n\t\"Ậ\":\"A\",\n\t\"Ầ\":\"A\",\n\t\"Ẩ\":\"A\",\n\t\"Ẫ\":\"A\",\n\t\"Ä\":\"A\",\n\t\"Ǟ\":\"A\",\n\t\"Ȧ\":\"A\",\n\t\"Ǡ\":\"A\",\n\t\"Ạ\":\"A\",\n\t\"Ȁ\":\"A\",\n\t\"À\":\"A\",\n\t\"Ả\":\"A\",\n\t\"Ȃ\":\"A\",\n\t\"Ā\":\"A\",\n\t\"Ą\":\"A\",\n\t\"Å\":\"A\",\n\t\"Ǻ\":\"A\",\n\t\"Ḁ\":\"A\",\n\t\"Ⱥ\":\"A\",\n\t\"Ã\":\"A\",\n\t\"Ꜳ\":\"AA\",\n\t\"Æ\":\"AE\",\n\t\"Ǽ\":\"AE\",\n\t\"Ǣ\":\"AE\",\n\t\"Ꜵ\":\"AO\",\n\t\"Ꜷ\":\"AU\",\n\t\"Ꜹ\":\"AV\",\n\t\"Ꜻ\":\"AV\",\n\t\"Ꜽ\":\"AY\",\n\t\"Ḃ\":\"B\",\n\t\"Ḅ\":\"B\",\n\t\"Ɓ\":\"B\",\n\t\"Ḇ\":\"B\",\n\t\"Ƀ\":\"B\",\n\t\"Ƃ\":\"B\",\n\t\"Ć\":\"C\",\n\t\"Č\":\"C\",\n\t\"Ç\":\"C\",\n\t\"Ḉ\":\"C\",\n\t\"Ĉ\":\"C\",\n\t\"Ċ\":\"C\",\n\t\"Ƈ\":\"C\",\n\t\"Ȼ\":\"C\",\n\t\"Ď\":\"D\",\n\t\"Ḑ\":\"D\",\n\t\"Ḓ\":\"D\",\n\t\"Ḋ\":\"D\",\n\t\"Ḍ\":\"D\",\n\t\"Ɗ\":\"D\",\n\t\"Ḏ\":\"D\",\n\t\"Dz\":\"D\",\n\t\"Dž\":\"D\",\n\t\"Đ\":\"D\",\n\t\"Ƌ\":\"D\",\n\t\"DZ\":\"DZ\",\n\t\"DŽ\":\"DZ\",\n\t\"É\":\"E\",\n\t\"Ĕ\":\"E\",\n\t\"Ě\":\"E\",\n\t\"Ȩ\":\"E\",\n\t\"Ḝ\":\"E\",\n\t\"Ê\":\"E\",\n\t\"Ế\":\"E\",\n\t\"Ệ\":\"E\",\n\t\"Ề\":\"E\",\n\t\"Ể\":\"E\",\n\t\"Ễ\":\"E\",\n\t\"Ḙ\":\"E\",\n\t\"Ë\":\"E\",\n\t\"Ė\":\"E\",\n\t\"Ẹ\":\"E\",\n\t\"Ȅ\":\"E\",\n\t\"È\":\"E\",\n\t\"Ẻ\":\"E\",\n\t\"Ȇ\":\"E\",\n\t\"Ē\":\"E\",\n\t\"Ḗ\":\"E\",\n\t\"Ḕ\":\"E\",\n\t\"Ę\":\"E\",\n\t\"Ɇ\":\"E\",\n\t\"Ẽ\":\"E\",\n\t\"Ḛ\":\"E\",\n\t\"Ꝫ\":\"ET\",\n\t\"Ḟ\":\"F\",\n\t\"Ƒ\":\"F\",\n\t\"Ǵ\":\"G\",\n\t\"Ğ\":\"G\",\n\t\"Ǧ\":\"G\",\n\t\"Ģ\":\"G\",\n\t\"Ĝ\":\"G\",\n\t\"Ġ\":\"G\",\n\t\"Ɠ\":\"G\",\n\t\"Ḡ\":\"G\",\n\t\"Ǥ\":\"G\",\n\t\"Ḫ\":\"H\",\n\t\"Ȟ\":\"H\",\n\t\"Ḩ\":\"H\",\n\t\"Ĥ\":\"H\",\n\t\"Ⱨ\":\"H\",\n\t\"Ḧ\":\"H\",\n\t\"Ḣ\":\"H\",\n\t\"Ḥ\":\"H\",\n\t\"Ħ\":\"H\",\n\t\"Í\":\"I\",\n\t\"Ĭ\":\"I\",\n\t\"Ǐ\":\"I\",\n\t\"Î\":\"I\",\n\t\"Ï\":\"I\",\n\t\"Ḯ\":\"I\",\n\t\"İ\":\"I\",\n\t\"Ị\":\"I\",\n\t\"Ȉ\":\"I\",\n\t\"Ì\":\"I\",\n\t\"Ỉ\":\"I\",\n\t\"Ȋ\":\"I\",\n\t\"Ī\":\"I\",\n\t\"Į\":\"I\",\n\t\"Ɨ\":\"I\",\n\t\"Ĩ\":\"I\",\n\t\"Ḭ\":\"I\",\n\t\"Ꝺ\":\"D\",\n\t\"Ꝼ\":\"F\",\n\t\"Ᵹ\":\"G\",\n\t\"Ꞃ\":\"R\",\n\t\"Ꞅ\":\"S\",\n\t\"Ꞇ\":\"T\",\n\t\"Ꝭ\":\"IS\",\n\t\"Ĵ\":\"J\",\n\t\"Ɉ\":\"J\",\n\t\"Ḱ\":\"K\",\n\t\"Ǩ\":\"K\",\n\t\"Ķ\":\"K\",\n\t\"Ⱪ\":\"K\",\n\t\"Ꝃ\":\"K\",\n\t\"Ḳ\":\"K\",\n\t\"Ƙ\":\"K\",\n\t\"Ḵ\":\"K\",\n\t\"Ꝁ\":\"K\",\n\t\"Ꝅ\":\"K\",\n\t\"Ĺ\":\"L\",\n\t\"Ƚ\":\"L\",\n\t\"Ľ\":\"L\",\n\t\"Ļ\":\"L\",\n\t\"Ḽ\":\"L\",\n\t\"Ḷ\":\"L\",\n\t\"Ḹ\":\"L\",\n\t\"Ⱡ\":\"L\",\n\t\"Ꝉ\":\"L\",\n\t\"Ḻ\":\"L\",\n\t\"Ŀ\":\"L\",\n\t\"Ɫ\":\"L\",\n\t\"Lj\":\"L\",\n\t\"Ł\":\"L\",\n\t\"LJ\":\"LJ\",\n\t\"Ḿ\":\"M\",\n\t\"Ṁ\":\"M\",\n\t\"Ṃ\":\"M\",\n\t\"Ɱ\":\"M\",\n\t\"Ń\":\"N\",\n\t\"Ň\":\"N\",\n\t\"Ņ\":\"N\",\n\t\"Ṋ\":\"N\",\n\t\"Ṅ\":\"N\",\n\t\"Ṇ\":\"N\",\n\t\"Ǹ\":\"N\",\n\t\"Ɲ\":\"N\",\n\t\"Ṉ\":\"N\",\n\t\"Ƞ\":\"N\",\n\t\"Nj\":\"N\",\n\t\"Ñ\":\"N\",\n\t\"NJ\":\"NJ\",\n\t\"Ó\":\"O\",\n\t\"Ŏ\":\"O\",\n\t\"Ǒ\":\"O\",\n\t\"Ô\":\"O\",\n\t\"Ố\":\"O\",\n\t\"Ộ\":\"O\",\n\t\"Ồ\":\"O\",\n\t\"Ổ\":\"O\",\n\t\"Ỗ\":\"O\",\n\t\"Ö\":\"O\",\n\t\"Ȫ\":\"O\",\n\t\"Ȯ\":\"O\",\n\t\"Ȱ\":\"O\",\n\t\"Ọ\":\"O\",\n\t\"Ő\":\"O\",\n\t\"Ȍ\":\"O\",\n\t\"Ò\":\"O\",\n\t\"Ỏ\":\"O\",\n\t\"Ơ\":\"O\",\n\t\"Ớ\":\"O\",\n\t\"Ợ\":\"O\",\n\t\"Ờ\":\"O\",\n\t\"Ở\":\"O\",\n\t\"Ỡ\":\"O\",\n\t\"Ȏ\":\"O\",\n\t\"Ꝋ\":\"O\",\n\t\"Ꝍ\":\"O\",\n\t\"Ō\":\"O\",\n\t\"Ṓ\":\"O\",\n\t\"Ṑ\":\"O\",\n\t\"Ɵ\":\"O\",\n\t\"Ǫ\":\"O\",\n\t\"Ǭ\":\"O\",\n\t\"Ø\":\"O\",\n\t\"Ǿ\":\"O\",\n\t\"Õ\":\"O\",\n\t\"Ṍ\":\"O\",\n\t\"Ṏ\":\"O\",\n\t\"Ȭ\":\"O\",\n\t\"Ƣ\":\"OI\",\n\t\"Ꝏ\":\"OO\",\n\t\"Ɛ\":\"E\",\n\t\"Ɔ\":\"O\",\n\t\"Ȣ\":\"OU\",\n\t\"Ṕ\":\"P\",\n\t\"Ṗ\":\"P\",\n\t\"Ꝓ\":\"P\",\n\t\"Ƥ\":\"P\",\n\t\"Ꝕ\":\"P\",\n\t\"Ᵽ\":\"P\",\n\t\"Ꝑ\":\"P\",\n\t\"Ꝙ\":\"Q\",\n\t\"Ꝗ\":\"Q\",\n\t\"Ŕ\":\"R\",\n\t\"Ř\":\"R\",\n\t\"Ŗ\":\"R\",\n\t\"Ṙ\":\"R\",\n\t\"Ṛ\":\"R\",\n\t\"Ṝ\":\"R\",\n\t\"Ȑ\":\"R\",\n\t\"Ȓ\":\"R\",\n\t\"Ṟ\":\"R\",\n\t\"Ɍ\":\"R\",\n\t\"Ɽ\":\"R\",\n\t\"Ꜿ\":\"C\",\n\t\"Ǝ\":\"E\",\n\t\"Ś\":\"S\",\n\t\"Ṥ\":\"S\",\n\t\"Š\":\"S\",\n\t\"Ṧ\":\"S\",\n\t\"Ş\":\"S\",\n\t\"Ŝ\":\"S\",\n\t\"Ș\":\"S\",\n\t\"Ṡ\":\"S\",\n\t\"Ṣ\":\"S\",\n\t\"Ṩ\":\"S\",\n\t\"Ť\":\"T\",\n\t\"Ţ\":\"T\",\n\t\"Ṱ\":\"T\",\n\t\"Ț\":\"T\",\n\t\"Ⱦ\":\"T\",\n\t\"Ṫ\":\"T\",\n\t\"Ṭ\":\"T\",\n\t\"Ƭ\":\"T\",\n\t\"Ṯ\":\"T\",\n\t\"Ʈ\":\"T\",\n\t\"Ŧ\":\"T\",\n\t\"Ɐ\":\"A\",\n\t\"Ꞁ\":\"L\",\n\t\"Ɯ\":\"M\",\n\t\"Ʌ\":\"V\",\n\t\"Ꜩ\":\"TZ\",\n\t\"Ú\":\"U\",\n\t\"Ŭ\":\"U\",\n\t\"Ǔ\":\"U\",\n\t\"Û\":\"U\",\n\t\"Ṷ\":\"U\",\n\t\"Ü\":\"U\",\n\t\"Ǘ\":\"U\",\n\t\"Ǚ\":\"U\",\n\t\"Ǜ\":\"U\",\n\t\"Ǖ\":\"U\",\n\t\"Ṳ\":\"U\",\n\t\"Ụ\":\"U\",\n\t\"Ű\":\"U\",\n\t\"Ȕ\":\"U\",\n\t\"Ù\":\"U\",\n\t\"Ủ\":\"U\",\n\t\"Ư\":\"U\",\n\t\"Ứ\":\"U\",\n\t\"Ự\":\"U\",\n\t\"Ừ\":\"U\",\n\t\"Ử\":\"U\",\n\t\"Ữ\":\"U\",\n\t\"Ȗ\":\"U\",\n\t\"Ū\":\"U\",\n\t\"Ṻ\":\"U\",\n\t\"Ų\":\"U\",\n\t\"Ů\":\"U\",\n\t\"Ũ\":\"U\",\n\t\"Ṹ\":\"U\",\n\t\"Ṵ\":\"U\",\n\t\"Ꝟ\":\"V\",\n\t\"Ṿ\":\"V\",\n\t\"Ʋ\":\"V\",\n\t\"Ṽ\":\"V\",\n\t\"Ꝡ\":\"VY\",\n\t\"Ẃ\":\"W\",\n\t\"Ŵ\":\"W\",\n\t\"Ẅ\":\"W\",\n\t\"Ẇ\":\"W\",\n\t\"Ẉ\":\"W\",\n\t\"Ẁ\":\"W\",\n\t\"Ⱳ\":\"W\",\n\t\"Ẍ\":\"X\",\n\t\"Ẋ\":\"X\",\n\t\"Ý\":\"Y\",\n\t\"Ŷ\":\"Y\",\n\t\"Ÿ\":\"Y\",\n\t\"Ẏ\":\"Y\",\n\t\"Ỵ\":\"Y\",\n\t\"Ỳ\":\"Y\",\n\t\"Ƴ\":\"Y\",\n\t\"Ỷ\":\"Y\",\n\t\"Ỿ\":\"Y\",\n\t\"Ȳ\":\"Y\",\n\t\"Ɏ\":\"Y\",\n\t\"Ỹ\":\"Y\",\n\t\"Ź\":\"Z\",\n\t\"Ž\":\"Z\",\n\t\"Ẑ\":\"Z\",\n\t\"Ⱬ\":\"Z\",\n\t\"Ż\":\"Z\",\n\t\"Ẓ\":\"Z\",\n\t\"Ȥ\":\"Z\",\n\t\"Ẕ\":\"Z\",\n\t\"Ƶ\":\"Z\",\n\t\"IJ\":\"IJ\",\n\t\"Œ\":\"OE\",\n\t\"ᴀ\":\"A\",\n\t\"ᴁ\":\"AE\",\n\t\"ʙ\":\"B\",\n\t\"ᴃ\":\"B\",\n\t\"ᴄ\":\"C\",\n\t\"ᴅ\":\"D\",\n\t\"ᴇ\":\"E\",\n\t\"ꜰ\":\"F\",\n\t\"ɢ\":\"G\",\n\t\"ʛ\":\"G\",\n\t\"ʜ\":\"H\",\n\t\"ɪ\":\"I\",\n\t\"ʁ\":\"R\",\n\t\"ᴊ\":\"J\",\n\t\"ᴋ\":\"K\",\n\t\"ʟ\":\"L\",\n\t\"ᴌ\":\"L\",\n\t\"ᴍ\":\"M\",\n\t\"ɴ\":\"N\",\n\t\"ᴏ\":\"O\",\n\t\"ɶ\":\"OE\",\n\t\"ᴐ\":\"O\",\n\t\"ᴕ\":\"OU\",\n\t\"ᴘ\":\"P\",\n\t\"ʀ\":\"R\",\n\t\"ᴎ\":\"N\",\n\t\"ᴙ\":\"R\",\n\t\"ꜱ\":\"S\",\n\t\"ᴛ\":\"T\",\n\t\"ⱻ\":\"E\",\n\t\"ᴚ\":\"R\",\n\t\"ᴜ\":\"U\",\n\t\"ᴠ\":\"V\",\n\t\"ᴡ\":\"W\",\n\t\"ʏ\":\"Y\",\n\t\"ᴢ\":\"Z\",\n\t\"á\":\"a\",\n\t\"ă\":\"a\",\n\t\"ắ\":\"a\",\n\t\"ặ\":\"a\",\n\t\"ằ\":\"a\",\n\t\"ẳ\":\"a\",\n\t\"ẵ\":\"a\",\n\t\"ǎ\":\"a\",\n\t\"â\":\"a\",\n\t\"ấ\":\"a\",\n\t\"ậ\":\"a\",\n\t\"ầ\":\"a\",\n\t\"ẩ\":\"a\",\n\t\"ẫ\":\"a\",\n\t\"ä\":\"a\",\n\t\"ǟ\":\"a\",\n\t\"ȧ\":\"a\",\n\t\"ǡ\":\"a\",\n\t\"ạ\":\"a\",\n\t\"ȁ\":\"a\",\n\t\"à\":\"a\",\n\t\"ả\":\"a\",\n\t\"ȃ\":\"a\",\n\t\"ā\":\"a\",\n\t\"ą\":\"a\",\n\t\"ᶏ\":\"a\",\n\t\"ẚ\":\"a\",\n\t\"å\":\"a\",\n\t\"ǻ\":\"a\",\n\t\"ḁ\":\"a\",\n\t\"ⱥ\":\"a\",\n\t\"ã\":\"a\",\n\t\"ꜳ\":\"aa\",\n\t\"æ\":\"ae\",\n\t\"ǽ\":\"ae\",\n\t\"ǣ\":\"ae\",\n\t\"ꜵ\":\"ao\",\n\t\"ꜷ\":\"au\",\n\t\"ꜹ\":\"av\",\n\t\"ꜻ\":\"av\",\n\t\"ꜽ\":\"ay\",\n\t\"ḃ\":\"b\",\n\t\"ḅ\":\"b\",\n\t\"ɓ\":\"b\",\n\t\"ḇ\":\"b\",\n\t\"ᵬ\":\"b\",\n\t\"ᶀ\":\"b\",\n\t\"ƀ\":\"b\",\n\t\"ƃ\":\"b\",\n\t\"ɵ\":\"o\",\n\t\"ć\":\"c\",\n\t\"č\":\"c\",\n\t\"ç\":\"c\",\n\t\"ḉ\":\"c\",\n\t\"ĉ\":\"c\",\n\t\"ɕ\":\"c\",\n\t\"ċ\":\"c\",\n\t\"ƈ\":\"c\",\n\t\"ȼ\":\"c\",\n\t\"ď\":\"d\",\n\t\"ḑ\":\"d\",\n\t\"ḓ\":\"d\",\n\t\"ȡ\":\"d\",\n\t\"ḋ\":\"d\",\n\t\"ḍ\":\"d\",\n\t\"ɗ\":\"d\",\n\t\"ᶑ\":\"d\",\n\t\"ḏ\":\"d\",\n\t\"ᵭ\":\"d\",\n\t\"ᶁ\":\"d\",\n\t\"đ\":\"d\",\n\t\"ɖ\":\"d\",\n\t\"ƌ\":\"d\",\n\t\"ı\":\"i\",\n\t\"ȷ\":\"j\",\n\t\"ɟ\":\"j\",\n\t\"ʄ\":\"j\",\n\t\"dz\":\"dz\",\n\t\"dž\":\"dz\",\n\t\"é\":\"e\",\n\t\"ĕ\":\"e\",\n\t\"ě\":\"e\",\n\t\"ȩ\":\"e\",\n\t\"ḝ\":\"e\",\n\t\"ê\":\"e\",\n\t\"ế\":\"e\",\n\t\"ệ\":\"e\",\n\t\"ề\":\"e\",\n\t\"ể\":\"e\",\n\t\"ễ\":\"e\",\n\t\"ḙ\":\"e\",\n\t\"ë\":\"e\",\n\t\"ė\":\"e\",\n\t\"ẹ\":\"e\",\n\t\"ȅ\":\"e\",\n\t\"è\":\"e\",\n\t\"ẻ\":\"e\",\n\t\"ȇ\":\"e\",\n\t\"ē\":\"e\",\n\t\"ḗ\":\"e\",\n\t\"ḕ\":\"e\",\n\t\"ⱸ\":\"e\",\n\t\"ę\":\"e\",\n\t\"ᶒ\":\"e\",\n\t\"ɇ\":\"e\",\n\t\"ẽ\":\"e\",\n\t\"ḛ\":\"e\",\n\t\"ꝫ\":\"et\",\n\t\"ḟ\":\"f\",\n\t\"ƒ\":\"f\",\n\t\"ᵮ\":\"f\",\n\t\"ᶂ\":\"f\",\n\t\"ǵ\":\"g\",\n\t\"ğ\":\"g\",\n\t\"ǧ\":\"g\",\n\t\"ģ\":\"g\",\n\t\"ĝ\":\"g\",\n\t\"ġ\":\"g\",\n\t\"ɠ\":\"g\",\n\t\"ḡ\":\"g\",\n\t\"ᶃ\":\"g\",\n\t\"ǥ\":\"g\",\n\t\"ḫ\":\"h\",\n\t\"ȟ\":\"h\",\n\t\"ḩ\":\"h\",\n\t\"ĥ\":\"h\",\n\t\"ⱨ\":\"h\",\n\t\"ḧ\":\"h\",\n\t\"ḣ\":\"h\",\n\t\"ḥ\":\"h\",\n\t\"ɦ\":\"h\",\n\t\"ẖ\":\"h\",\n\t\"ħ\":\"h\",\n\t\"ƕ\":\"hv\",\n\t\"í\":\"i\",\n\t\"ĭ\":\"i\",\n\t\"ǐ\":\"i\",\n\t\"î\":\"i\",\n\t\"ï\":\"i\",\n\t\"ḯ\":\"i\",\n\t\"ị\":\"i\",\n\t\"ȉ\":\"i\",\n\t\"ì\":\"i\",\n\t\"ỉ\":\"i\",\n\t\"ȋ\":\"i\",\n\t\"ī\":\"i\",\n\t\"į\":\"i\",\n\t\"ᶖ\":\"i\",\n\t\"ɨ\":\"i\",\n\t\"ĩ\":\"i\",\n\t\"ḭ\":\"i\",\n\t\"ꝺ\":\"d\",\n\t\"ꝼ\":\"f\",\n\t\"ᵹ\":\"g\",\n\t\"ꞃ\":\"r\",\n\t\"ꞅ\":\"s\",\n\t\"ꞇ\":\"t\",\n\t\"ꝭ\":\"is\",\n\t\"ǰ\":\"j\",\n\t\"ĵ\":\"j\",\n\t\"ʝ\":\"j\",\n\t\"ɉ\":\"j\",\n\t\"ḱ\":\"k\",\n\t\"ǩ\":\"k\",\n\t\"ķ\":\"k\",\n\t\"ⱪ\":\"k\",\n\t\"ꝃ\":\"k\",\n\t\"ḳ\":\"k\",\n\t\"ƙ\":\"k\",\n\t\"ḵ\":\"k\",\n\t\"ᶄ\":\"k\",\n\t\"ꝁ\":\"k\",\n\t\"ꝅ\":\"k\",\n\t\"ĺ\":\"l\",\n\t\"ƚ\":\"l\",\n\t\"ɬ\":\"l\",\n\t\"ľ\":\"l\",\n\t\"ļ\":\"l\",\n\t\"ḽ\":\"l\",\n\t\"ȴ\":\"l\",\n\t\"ḷ\":\"l\",\n\t\"ḹ\":\"l\",\n\t\"ⱡ\":\"l\",\n\t\"ꝉ\":\"l\",\n\t\"ḻ\":\"l\",\n\t\"ŀ\":\"l\",\n\t\"ɫ\":\"l\",\n\t\"ᶅ\":\"l\",\n\t\"ɭ\":\"l\",\n\t\"ł\":\"l\",\n\t\"lj\":\"lj\",\n\t\"ſ\":\"s\",\n\t\"ẜ\":\"s\",\n\t\"ẛ\":\"s\",\n\t\"ẝ\":\"s\",\n\t\"ḿ\":\"m\",\n\t\"ṁ\":\"m\",\n\t\"ṃ\":\"m\",\n\t\"ɱ\":\"m\",\n\t\"ᵯ\":\"m\",\n\t\"ᶆ\":\"m\",\n\t\"ń\":\"n\",\n\t\"ň\":\"n\",\n\t\"ņ\":\"n\",\n\t\"ṋ\":\"n\",\n\t\"ȵ\":\"n\",\n\t\"ṅ\":\"n\",\n\t\"ṇ\":\"n\",\n\t\"ǹ\":\"n\",\n\t\"ɲ\":\"n\",\n\t\"ṉ\":\"n\",\n\t\"ƞ\":\"n\",\n\t\"ᵰ\":\"n\",\n\t\"ᶇ\":\"n\",\n\t\"ɳ\":\"n\",\n\t\"ñ\":\"n\",\n\t\"nj\":\"nj\",\n\t\"ó\":\"o\",\n\t\"ŏ\":\"o\",\n\t\"ǒ\":\"o\",\n\t\"ô\":\"o\",\n\t\"ố\":\"o\",\n\t\"ộ\":\"o\",\n\t\"ồ\":\"o\",\n\t\"ổ\":\"o\",\n\t\"ỗ\":\"o\",\n\t\"ö\":\"o\",\n\t\"ȫ\":\"o\",\n\t\"ȯ\":\"o\",\n\t\"ȱ\":\"o\",\n\t\"ọ\":\"o\",\n\t\"ő\":\"o\",\n\t\"ȍ\":\"o\",\n\t\"ò\":\"o\",\n\t\"ỏ\":\"o\",\n\t\"ơ\":\"o\",\n\t\"ớ\":\"o\",\n\t\"ợ\":\"o\",\n\t\"ờ\":\"o\",\n\t\"ở\":\"o\",\n\t\"ỡ\":\"o\",\n\t\"ȏ\":\"o\",\n\t\"ꝋ\":\"o\",\n\t\"ꝍ\":\"o\",\n\t\"ⱺ\":\"o\",\n\t\"ō\":\"o\",\n\t\"ṓ\":\"o\",\n\t\"ṑ\":\"o\",\n\t\"ǫ\":\"o\",\n\t\"ǭ\":\"o\",\n\t\"ø\":\"o\",\n\t\"ǿ\":\"o\",\n\t\"õ\":\"o\",\n\t\"ṍ\":\"o\",\n\t\"ṏ\":\"o\",\n\t\"ȭ\":\"o\",\n\t\"ƣ\":\"oi\",\n\t\"ꝏ\":\"oo\",\n\t\"ɛ\":\"e\",\n\t\"ᶓ\":\"e\",\n\t\"ɔ\":\"o\",\n\t\"ᶗ\":\"o\",\n\t\"ȣ\":\"ou\",\n\t\"ṕ\":\"p\",\n\t\"ṗ\":\"p\",\n\t\"ꝓ\":\"p\",\n\t\"ƥ\":\"p\",\n\t\"ᵱ\":\"p\",\n\t\"ᶈ\":\"p\",\n\t\"ꝕ\":\"p\",\n\t\"ᵽ\":\"p\",\n\t\"ꝑ\":\"p\",\n\t\"ꝙ\":\"q\",\n\t\"ʠ\":\"q\",\n\t\"ɋ\":\"q\",\n\t\"ꝗ\":\"q\",\n\t\"ŕ\":\"r\",\n\t\"ř\":\"r\",\n\t\"ŗ\":\"r\",\n\t\"ṙ\":\"r\",\n\t\"ṛ\":\"r\",\n\t\"ṝ\":\"r\",\n\t\"ȑ\":\"r\",\n\t\"ɾ\":\"r\",\n\t\"ᵳ\":\"r\",\n\t\"ȓ\":\"r\",\n\t\"ṟ\":\"r\",\n\t\"ɼ\":\"r\",\n\t\"ᵲ\":\"r\",\n\t\"ᶉ\":\"r\",\n\t\"ɍ\":\"r\",\n\t\"ɽ\":\"r\",\n\t\"ↄ\":\"c\",\n\t\"ꜿ\":\"c\",\n\t\"ɘ\":\"e\",\n\t\"ɿ\":\"r\",\n\t\"ś\":\"s\",\n\t\"ṥ\":\"s\",\n\t\"š\":\"s\",\n\t\"ṧ\":\"s\",\n\t\"ş\":\"s\",\n\t\"ŝ\":\"s\",\n\t\"ș\":\"s\",\n\t\"ṡ\":\"s\",\n\t\"ṣ\":\"s\",\n\t\"ṩ\":\"s\",\n\t\"ʂ\":\"s\",\n\t\"ᵴ\":\"s\",\n\t\"ᶊ\":\"s\",\n\t\"ȿ\":\"s\",\n\t\"ɡ\":\"g\",\n\t\"ᴑ\":\"o\",\n\t\"ᴓ\":\"o\",\n\t\"ᴝ\":\"u\",\n\t\"ť\":\"t\",\n\t\"ţ\":\"t\",\n\t\"ṱ\":\"t\",\n\t\"ț\":\"t\",\n\t\"ȶ\":\"t\",\n\t\"ẗ\":\"t\",\n\t\"ⱦ\":\"t\",\n\t\"ṫ\":\"t\",\n\t\"ṭ\":\"t\",\n\t\"ƭ\":\"t\",\n\t\"ṯ\":\"t\",\n\t\"ᵵ\":\"t\",\n\t\"ƫ\":\"t\",\n\t\"ʈ\":\"t\",\n\t\"ŧ\":\"t\",\n\t\"ᵺ\":\"th\",\n\t\"ɐ\":\"a\",\n\t\"ᴂ\":\"ae\",\n\t\"ǝ\":\"e\",\n\t\"ᵷ\":\"g\",\n\t\"ɥ\":\"h\",\n\t\"ʮ\":\"h\",\n\t\"ʯ\":\"h\",\n\t\"ᴉ\":\"i\",\n\t\"ʞ\":\"k\",\n\t\"ꞁ\":\"l\",\n\t\"ɯ\":\"m\",\n\t\"ɰ\":\"m\",\n\t\"ᴔ\":\"oe\",\n\t\"ɹ\":\"r\",\n\t\"ɻ\":\"r\",\n\t\"ɺ\":\"r\",\n\t\"ⱹ\":\"r\",\n\t\"ʇ\":\"t\",\n\t\"ʌ\":\"v\",\n\t\"ʍ\":\"w\",\n\t\"ʎ\":\"y\",\n\t\"ꜩ\":\"tz\",\n\t\"ú\":\"u\",\n\t\"ŭ\":\"u\",\n\t\"ǔ\":\"u\",\n\t\"û\":\"u\",\n\t\"ṷ\":\"u\",\n\t\"ü\":\"u\",\n\t\"ǘ\":\"u\",\n\t\"ǚ\":\"u\",\n\t\"ǜ\":\"u\",\n\t\"ǖ\":\"u\",\n\t\"ṳ\":\"u\",\n\t\"ụ\":\"u\",\n\t\"ű\":\"u\",\n\t\"ȕ\":\"u\",\n\t\"ù\":\"u\",\n\t\"ủ\":\"u\",\n\t\"ư\":\"u\",\n\t\"ứ\":\"u\",\n\t\"ự\":\"u\",\n\t\"ừ\":\"u\",\n\t\"ử\":\"u\",\n\t\"ữ\":\"u\",\n\t\"ȗ\":\"u\",\n\t\"ū\":\"u\",\n\t\"ṻ\":\"u\",\n\t\"ų\":\"u\",\n\t\"ᶙ\":\"u\",\n\t\"ů\":\"u\",\n\t\"ũ\":\"u\",\n\t\"ṹ\":\"u\",\n\t\"ṵ\":\"u\",\n\t\"ᵫ\":\"ue\",\n\t\"ꝸ\":\"um\",\n\t\"ⱴ\":\"v\",\n\t\"ꝟ\":\"v\",\n\t\"ṿ\":\"v\",\n\t\"ʋ\":\"v\",\n\t\"ᶌ\":\"v\",\n\t\"ⱱ\":\"v\",\n\t\"ṽ\":\"v\",\n\t\"ꝡ\":\"vy\",\n\t\"ẃ\":\"w\",\n\t\"ŵ\":\"w\",\n\t\"ẅ\":\"w\",\n\t\"ẇ\":\"w\",\n\t\"ẉ\":\"w\",\n\t\"ẁ\":\"w\",\n\t\"ⱳ\":\"w\",\n\t\"ẘ\":\"w\",\n\t\"ẍ\":\"x\",\n\t\"ẋ\":\"x\",\n\t\"ᶍ\":\"x\",\n\t\"ý\":\"y\",\n\t\"ŷ\":\"y\",\n\t\"ÿ\":\"y\",\n\t\"ẏ\":\"y\",\n\t\"ỵ\":\"y\",\n\t\"ỳ\":\"y\",\n\t\"ƴ\":\"y\",\n\t\"ỷ\":\"y\",\n\t\"ỿ\":\"y\",\n\t\"ȳ\":\"y\",\n\t\"ẙ\":\"y\",\n\t\"ɏ\":\"y\",\n\t\"ỹ\":\"y\",\n\t\"ź\":\"z\",\n\t\"ž\":\"z\",\n\t\"ẑ\":\"z\",\n\t\"ʑ\":\"z\",\n\t\"ⱬ\":\"z\",\n\t\"ż\":\"z\",\n\t\"ẓ\":\"z\",\n\t\"ȥ\":\"z\",\n\t\"ẕ\":\"z\",\n\t\"ᵶ\":\"z\",\n\t\"ᶎ\":\"z\",\n\t\"ʐ\":\"z\",\n\t\"ƶ\":\"z\",\n\t\"ɀ\":\"z\",\n\t\"ff\":\"ff\",\n\t\"ffi\":\"ffi\",\n\t\"ffl\":\"ffl\",\n\t\"fi\":\"fi\",\n\t\"fl\":\"fl\",\n\t\"ij\":\"ij\",\n\t\"œ\":\"oe\",\n\t\"st\":\"st\",\n\t\"ₐ\":\"a\",\n\t\"ₑ\":\"e\",\n\t\"ᵢ\":\"i\",\n\t\"ⱼ\":\"j\",\n\t\"ₒ\":\"o\",\n\t\"ᵣ\":\"r\",\n\t\"ᵤ\":\"u\",\n\t\"ᵥ\":\"v\",\n\t\"ₓ\":\"x\",\n\t\"Ё\":\"YO\",\n\t\"Й\":\"I\",\n\t\"Ц\":\"TS\",\n\t\"У\":\"U\",\n\t\"К\":\"K\",\n\t\"Е\":\"E\",\n\t\"Н\":\"N\",\n\t\"Г\":\"G\",\n\t\"Ш\":\"SH\",\n\t\"Щ\":\"SCH\",\n\t\"З\":\"Z\",\n\t\"Х\":\"H\",\n\t\"Ъ\":\"'\",\n\t\"ё\":\"yo\",\n\t\"й\":\"i\",\n\t\"ц\":\"ts\",\n\t\"у\":\"u\",\n\t\"к\":\"k\",\n\t\"е\":\"e\",\n\t\"н\":\"n\",\n\t\"г\":\"g\",\n\t\"ш\":\"sh\",\n\t\"щ\":\"sch\",\n\t\"з\":\"z\",\n\t\"х\":\"h\",\n\t\"ъ\":\"'\",\n\t\"Ф\":\"F\",\n\t\"Ы\":\"I\",\n\t\"В\":\"V\",\n\t\"А\":\"a\",\n\t\"П\":\"P\",\n\t\"Р\":\"R\",\n\t\"О\":\"O\",\n\t\"Л\":\"L\",\n\t\"Д\":\"D\",\n\t\"Ж\":\"ZH\",\n\t\"Э\":\"E\",\n\t\"ф\":\"f\",\n\t\"ы\":\"i\",\n\t\"в\":\"v\",\n\t\"а\":\"a\",\n\t\"п\":\"p\",\n\t\"р\":\"r\",\n\t\"о\":\"o\",\n\t\"л\":\"l\",\n\t\"д\":\"d\",\n\t\"ж\":\"zh\",\n\t\"э\":\"e\",\n\t\"Я\":\"Ya\",\n\t\"Ч\":\"CH\",\n\t\"С\":\"S\",\n\t\"М\":\"M\",\n\t\"И\":\"I\",\n\t\"Т\":\"T\",\n\t\"Ь\":\"'\",\n\t\"Б\":\"B\",\n\t\"Ю\":\"YU\",\n\t\"я\":\"ya\",\n\t\"ч\":\"ch\",\n\t\"с\":\"s\",\n\t\"м\":\"m\",\n\t\"и\":\"i\",\n\t\"т\":\"t\",\n\t\"ь\":\"'\",\n\t\"б\":\"b\",\n\t\"ю\":\"yu\"\n};\n\nexports.transliterate = function(str) {\n\treturn str.replace(/[^A-Za-z0-9\\[\\] ]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || ch\n\t});\n};\n\nexports.transliterateToSafeASCII = function(str) {\n\treturn str.replace(/[^\\x00-\\x7F]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || \"\"\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/utils.js": {
"title": "$:/core/modules/utils/utils.js",
"text": "/*\\\ntitle: $:/core/modules/utils/utils.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar base64utf8 = require(\"$:/core/modules/utils/base64-utf8/base64-utf8.module.js\");\n\n/*\nDisplay a message, in colour if we're on a terminal\n*/\nexports.log = function(text,colour) {\n\tconsole.log($tw.node ? exports.terminalColour(colour) + text + exports.terminalColour() : text);\n};\n\nexports.terminalColour = function(colour) {\n\tif(!$tw.browser && $tw.node && process.stdout.isTTY) {\n\t\tif(colour) {\n\t\t\tvar code = exports.terminalColourLookup[colour];\n\t\t\tif(code) {\n\t\t\t\treturn \"\\x1b[\" + code + \"m\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"\\x1b[0m\"; // Cancel colour\n\t\t}\n\t}\n\treturn \"\";\n};\n\nexports.terminalColourLookup = {\n\t\"black\": \"0;30\",\n\t\"red\": \"0;31\",\n\t\"green\": \"0;32\",\n\t\"brown/orange\": \"0;33\",\n\t\"blue\": \"0;34\",\n\t\"purple\": \"0;35\",\n\t\"cyan\": \"0;36\",\n\t\"light gray\": \"0;37\"\n};\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\texports.log(text,\"brown/orange\");\n};\n\n/*\nReturn the integer represented by the str (string).\nReturn the dflt (default) parameter if str is not a base-10 number.\n*/\nexports.getInt = function(str,deflt) {\n\tvar i = parseInt(str,10);\n\treturn isNaN(i) ? deflt : i;\n}\n\n/*\nRepeatedly replaces a substring within a string. Like String.prototype.replace, but without any of the default special handling of $ sequences in the replace string\n*/\nexports.replaceString = function(text,search,replace) {\n\treturn text.replace(search,function() {\n\t\treturn replace;\n\t});\n};\n\n/*\nRepeats a string\n*/\nexports.repeat = function(str,count) {\n\tvar result = \"\";\n\tfor(var t=0;t<count;t++) {\n\t\tresult += str;\n\t}\n\treturn result;\n};\n\n/*\nTrim whitespace from the start and end of a string\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\n*/\nexports.trim = function(str) {\n\tif(typeof str === \"string\") {\n\t\treturn str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nConvert a string to sentence case (ie capitalise first letter)\n*/\nexports.toSentenceCase = function(str) {\n\treturn (str || \"\").replace(/^\\S/, function(c) {return c.toUpperCase();});\n}\n\n/*\nConvert a string to title case (ie capitalise each initial letter)\n*/\nexports.toTitleCase = function(str) {\n\treturn (str || \"\").replace(/(^|\\s)\\S/g, function(c) {return c.toUpperCase();});\n}\n\t\n/*\nFind the line break preceding a given position in a string\nReturns position immediately after that line break, or the start of the string\n*/\nexports.findPrecedingLineBreak = function(text,pos) {\n\tvar result = text.lastIndexOf(\"\\n\",pos - 1);\n\tif(result === -1) {\n\t\tresult = 0;\n\t} else {\n\t\tresult++;\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nFind the line break following a given position in a string\n*/\nexports.findFollowingLineBreak = function(text,pos) {\n\t// Cut to just past the following line break, or to the end of the text\n\tvar result = text.indexOf(\"\\n\",pos);\n\tif(result === -1) {\n\t\tresult = text.length;\n\t} else {\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nReturn the number of keys in an object\n*/\nexports.count = function(object) {\n\treturn Object.keys(object || {}).length;\n};\n\n/*\nDetermine whether an array-item is an object-property\n*/\nexports.hopArray = function(object,array) {\n\tfor(var i=0; i<array.length; i++) {\n\t\tif($tw.utils.hop(object,array[i])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nRemove entries from an array\n\tarray: array to modify\n\tvalue: a single value to remove, or an array of values to remove\n*/\nexports.removeArrayEntries = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\tp = array.indexOf(value[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tarray.splice(p,1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t}\n};\n\n/*\nCheck whether any members of a hashmap are present in another hashmap\n*/\nexports.checkDependencies = function(dependencies,changes) {\n\tvar hit = false;\n\t$tw.utils.each(changes,function(change,title) {\n\t\tif($tw.utils.hop(dependencies,title)) {\n\t\t\thit = true;\n\t\t}\n\t});\n\treturn hit;\n};\n\nexports.extend = function(object /* [, src] */) {\n\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\n\t\tif(source) {\n\t\t\tfor(var property in source) {\n\t\t\t\tobject[property] = source[property];\n\t\t\t}\n\t\t}\n\t});\n\treturn object;\n};\n\nexports.deepCopy = function(object) {\n\tvar result,t;\n\tif($tw.utils.isArray(object)) {\n\t\t// Copy arrays\n\t\tresult = object.slice(0);\n\t} else if(typeof object === \"object\") {\n\t\tresult = {};\n\t\tfor(t in object) {\n\t\t\tif(object[t] !== undefined) {\n\t\t\t\tresult[t] = $tw.utils.deepCopy(object[t]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = object;\n\t}\n\treturn result;\n};\n\nexports.extendDeepCopy = function(object,extendedProperties) {\n\tvar result = $tw.utils.deepCopy(object),t;\n\tfor(t in extendedProperties) {\n\t\tif(extendedProperties[t] !== undefined) {\n\t\t\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\n\t\t}\n\t}\n\treturn result;\n};\n\nexports.deepFreeze = function deepFreeze(object) {\n\tvar property, key;\n\tif(object) {\n\t\tObject.freeze(object);\n\t\tfor(key in object) {\n\t\t\tproperty = object[key];\n\t\t\tif($tw.utils.hop(object,key) && (typeof property === \"object\") && !Object.isFrozen(property)) {\n\t\t\t\tdeepFreeze(property);\n\t\t\t}\n\t\t}\n\t}\n};\n\nexports.slowInSlowOut = function(t) {\n\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\n};\n\nexports.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^0hh12/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getHours12(date));\n\t\t\t}],\n\t\t\t[/^wYYYY/, function() {\n\t\t\t\treturn $tw.utils.getYearForWeekNo(date);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn date.getFullYear();\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^0XXX/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMilliseconds(),3);\n\t\t\t}],\n\t\t\t[/^0DD/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getDate());\n\t\t\t}],\n\t\t\t[/^0MM/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMonth()+1);\n\t\t\t}],\n\t\t\t[/^0WW/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getWeek(date));\n\t\t\t}],\n\t\t\t[/^ddd/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^mmm/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^DDD/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^MMM/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^TZD/, function() {\n\t\t\t\tvar tz = date.getTimezoneOffset(),\n\t\t\t\tatz = Math.abs(tz);\n\t\t\t\treturn (tz < 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\n\t\t\t}],\n\t\t\t[/^wYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\n\t\t\t}],\n\t\t\t[/^[ap]m/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toLowerCase();\n\t\t\t}],\n\t\t\t[/^hh/, function() {\n\t\t\t\treturn date.getHours();\n\t\t\t}],\n\t\t\t[/^mm/, function() {\n\t\t\t\treturn date.getMinutes();\n\t\t\t}],\n\t\t\t[/^ss/, function() {\n\t\t\t\treturn date.getSeconds();\n\t\t\t}],\n\t\t\t[/^XXX/, function() {\n\t\t\t\treturn date.getMilliseconds();\n\t\t\t}],\n\t\t\t[/^[AP]M/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toUpperCase();\n\t\t\t}],\n\t\t\t[/^DD/, function() {\n\t\t\t\treturn date.getDate();\n\t\t\t}],\n\t\t\t[/^MM/, function() {\n\t\t\t\treturn date.getMonth() + 1;\n\t\t\t}],\n\t\t\t[/^WW/, function() {\n\t\t\t\treturn $tw.utils.getWeek(date);\n\t\t\t}],\n\t\t\t[/^YY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear() - 2000);\n\t\t\t}]\n\t\t];\n\t// If the user wants everything in UTC, shift the datestamp\n\t// Optimize for format string that essentially means\n\t// 'return raw UTC (tiddlywiki style) date string.'\n\tif(t.indexOf(\"[UTC]\") == 0 ) {\n\t\tif(t == \"[UTC]YYYY0MM0DD0hh0mm0ssXXX\")\n\t\t\treturn $tw.utils.stringifyDate(new Date());\n\t\tvar offset = date.getTimezoneOffset() ; // in minutes\n\t\tdate = new Date(date.getTime()+offset*60*1000) ;\n\t\tt = t.substr(5) ;\n\t}\n\twhile(t.length){\n\t\tvar matchString = \"\";\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tmatchString = m[1].call();\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(matchString) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.getAmPm = function(date) {\n\treturn $tw.language.getString(\"Date/Period/\" + (date.getHours() >= 12 ? \"pm\" : \"am\"));\n};\n\nexports.getDaySuffix = function(date) {\n\treturn $tw.language.getString(\"Date/DaySuffix/\" + date.getDate());\n};\n\nexports.getWeek = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\n\tvar x = new Date(dt.getFullYear(),0,1);\n\tvar n = Math.floor((dt.getTime() - x.getTime()) / 86400000);\n\treturn Math.floor(n / 7) + 1;\n};\n\nexports.getYearForWeekNo = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\n\treturn dt.getFullYear();\n};\n\nexports.getHours12 = function(date) {\n\tvar h = date.getHours();\n\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\n};\n\n/*\nConvert a date delta in milliseconds into a string representation of \"23 seconds ago\", \"27 minutes ago\" etc.\n\tdelta: delta in milliseconds\nReturns an object with these members:\n\tdescription: string describing the delta period\n\tupdatePeriod: time in millisecond until the string will be inaccurate\n*/\nexports.getRelativeDate = function(delta) {\n\tvar futurep = false;\n\tif(delta < 0) {\n\t\tdelta = -1 * delta;\n\t\tfuturep = true;\n\t}\n\tvar units = [\n\t\t{name: \"Years\", duration: 365 * 24 * 60 * 60 * 1000},\n\t\t{name: \"Months\", duration: (365/12) * 24 * 60 * 60 * 1000},\n\t\t{name: \"Days\", duration: 24 * 60 * 60 * 1000},\n\t\t{name: \"Hours\", duration: 60 * 60 * 1000},\n\t\t{name: \"Minutes\", duration: 60 * 1000},\n\t\t{name: \"Seconds\", duration: 1000}\n\t];\n\tfor(var t=0; t<units.length; t++) {\n\t\tvar result = Math.floor(delta / units[t].duration);\n\t\tif(result >= 2) {\n\t\t\treturn {\n\t\t\t\tdelta: delta,\n\t\t\t\tdescription: $tw.language.getString(\n\t\t\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/\" + units[t].name,\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{period: result.toString()}\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\tupdatePeriod: units[t].duration\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tdelta: delta,\n\t\tdescription: $tw.language.getString(\n\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/Second\",\n\t\t\t{variables:\n\t\t\t\t{period: \"1\"}\n\t\t\t}\n\t\t),\n\t\tupdatePeriod: 1000\n\t};\n};\n\n// Convert & to \"&\", < to \"<\", > to \">\", \" to \""\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&\").replace(/</mg,\"<\").replace(/>/mg,\">\").replace(/\\\"/mg,\""\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar converter = String.fromCodePoint || String.fromCharCode,\n\t\te = s.substr(1,s.length-2), // Strip the & and the ;\n\t\tc;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\tc = parseInt(e.substr(2),16);\n\t\t} else {\n\t\t\tc = parseInt(e.substr(1),10);\n\t\t}\n\t\tif(isNaN(c)) {\n\t\t\treturn s;\n\t\t} else {\n\t\t\treturn converter(c);\n\t\t}\n\t} else {\n\t\tc = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn converter(c);\n\t\t} else {\n\t\t\treturn s; // Couldn't convert it as an entity, just return it raw\n\t\t}\n\t}\n};\n\nexports.unescapeLineBreaks = function(s) {\n\treturn s.replace(/\\\\n/mg,\"\\n\").replace(/\\\\b/mg,\" \").replace(/\\\\s/mg,\"\\\\\").replace(/\\r/mg,\"\");\n};\n\n/*\n * Returns an escape sequence for given character. Uses \\x for characters <=\n * 0xFF to save space, \\u for the rest.\n *\n * The code needs to be in sync with th code template in the compilation\n * function for \"action\" nodes.\n */\n// Copied from peg.js, thanks to David Majda\nexports.escape = function(ch) {\n\tvar charCode = ch.charCodeAt(0);\n\tif(charCode <= 0xFF) {\n\t\treturn '\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\n\t} else {\n\t\treturn '\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\n\t}\n};\n\n// Turns a string into a legal JavaScript string\n// Copied from peg.js, thanks to David Majda\nexports.stringify = function(s) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape all non-ASCII characters.\n\t*/\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/'/g, \"\\\\'\") // single quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/[\\x00-\\x1f\\x80-\\uFFFF]/g, exports.escape); // non-ASCII characters\n};\n\n// Turns a string into a legal JSON string\n// Derived from peg.js, thanks to David Majda\nexports.jsonStringify = function(s) {\n\t// See http://www.json.org/\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/\\x08/g, '\\\\b') // backspace\n\t\t.replace(/\\x0c/g, '\\\\f') // formfeed\n\t\t.replace(/\\t/g, '\\\\t') // tab\n\t\t.replace(/[\\x00-\\x1f\\x80-\\uFFFF]/g,function(s) {\n\t\t\treturn '\\\\u' + $tw.utils.pad(s.charCodeAt(0).toString(16).toUpperCase(),4);\n\t\t}); // non-ASCII characters\n};\n\n/*\nEscape the RegExp special characters with a preceding backslash\n*/\nexports.escapeRegExp = function(s) {\n return s.replace(/[\\-\\/\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\[\\]\\{\\}]/g, '\\\\$&');\n};\n\n// Checks whether a link target is external, i.e. not a tiddler title\nexports.isLinkExternal = function(to) {\n\tvar externalRegExp = /^(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\n\nexports.nextTick = function(fn) {\n/*global window: false */\n\tif(typeof process === \"undefined\") {\n\t\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\n\t\twindow.setTimeout(fn,4);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\tname = name.toLowerCase().trim();\n\tvar fieldValidatorRegEx = /^[a-z0-9\\-\\._]+$/mg;\n\treturn fieldValidatorRegEx.test(name);\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10) || 0;\n};\n\n/*\nHash a string to a number\nDerived from http://stackoverflow.com/a/15710692\n*/\nexports.hashString = function(str) {\n\treturn str.split(\"\").reduce(function(a,b) {\n\t\ta = ((a << 5) - a) + b.charCodeAt(0);\n\t\treturn a & a;\n\t},0);\n};\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64) {\n\treturn base64utf8.base64.decode.call(base64utf8,string64);\n};\n\n/*\nEncode a string to base64\n*/\nexports.base64Encode = function(string64) {\n\treturn base64utf8.base64.encode.call(base64utf8,string64);\n};\n\n/*\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\n*/\nexports.makeTiddlerDictionary = function(data) {\n\tvar output = [];\n\tfor(var name in data) {\n\t\toutput.push(name + \": \" + data[name]);\n\t}\n\treturn output.join(\"\\n\");\n};\n\n/*\nHigh resolution microsecond timer for profiling\n*/\nexports.timer = function(base) {\n\tvar m;\n\tif($tw.node) {\n\t\tvar r = process.hrtime();\n\t\tm = r[0] * 1e3 + (r[1] / 1e6);\n\t} else if(window.performance) {\n\t\tm = performance.now();\n\t} else {\n\t\tm = Date.now();\n\t}\n\tif(typeof base !== \"undefined\") {\n\t\tm = m - base;\n\t}\n\treturn m;\n};\n\n/*\nConvert text and content type to a data URI\n*/\nexports.makeDataUri = function(text,type,_canonical_uri) {\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\"text/plain\"],\n\t\tisBase64 = typeInfo.encoding === \"base64\",\n\t\tparts = [];\n\tif(_canonical_uri) {\n\t\tparts.push(_canonical_uri);\n\t} else {\n\t\tparts.push(\"data:\");\n\t\tparts.push(type);\n\t\tparts.push(isBase64 ? \";base64\" : \"\");\n\t\tparts.push(\",\");\n\t\tparts.push(isBase64 ? text : encodeURIComponent(text));\t\t\n\t}\n\treturn parts.join(\"\");\n};\n\n/*\nUseful for finding out the fully escaped CSS selector equivalent to a given tag. For example:\n\n$tw.utils.tagToCssSelector(\"$:/tags/Stylesheet\") --> tc-tagged-\\%24\\%3A\\%2Ftags\\%2FStylesheet\n*/\nexports.tagToCssSelector = function(tagName) {\n\treturn \"tc-tagged-\" + encodeURIComponent(tagName).replace(/[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^`{\\|}~,]/mg,function(c) {\n\t\treturn \"\\\\\" + c;\n\t});\n};\n\n/*\nIE does not have sign function\n*/\nexports.sign = Math.sign || function(x) {\n\tx = +x; // convert to a number\n\tif (x === 0 || isNaN(x)) {\n\t\treturn x;\n\t}\n\treturn x > 0 ? 1 : -1;\n};\n\n/*\nIE does not have an endsWith function\n*/\nexports.strEndsWith = function(str,ending,position) {\n\tif(str.endsWith) {\n\t\treturn str.endsWith(ending,position);\n\t} else {\n\t\tif (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > str.length) {\n\t\t\tposition = str.length;\n\t\t}\n\t\tposition -= ending.length;\n\t\tvar lastIndex = str.indexOf(ending, position);\n\t\treturn lastIndex !== -1 && lastIndex === position;\n\t}\n};\n\n/*\nReturn system information useful for debugging\n*/\nexports.getSystemInfo = function(str,ending,position) {\n\tvar results = [],\n\t\tsave = function(desc,value) {\n\t\t\tresults.push(desc + \": \" + value);\n\t\t};\n\tif($tw.browser) {\n\t\tsave(\"User Agent\",navigator.userAgent);\n\t\tsave(\"Online Status\",window.navigator.onLine);\n\t}\n\tif($tw.node) {\n\t\tsave(\"Node Version\",process.version);\n\t}\n\treturn results.join(\"\\n\");\n};\n\nexports.parseNumber = function(str) {\n\treturn parseFloat(str) || 0;\n};\n\nexports.parseInt = function(str) {\n\treturn parseInt(str,10) || 0;\n};\n\nexports.stringifyNumber = function(num) {\n\treturn num + \"\";\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/widgets/action-createtiddler.js": {
"title": "$:/core/modules/widgets/action-createtiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-createtiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to create a new tiddler with a unique name and specified fields.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw:false, require:false, exports:false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CreateTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCreateTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCreateTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nCreateTiddlerWidget.prototype.execute = function() {\n\tthis.actionBaseTitle = this.getAttribute(\"$basetitle\");\n\tthis.hasBase = !!this.actionBaseTitle;\n\tthis.actionSaveTitle = this.getAttribute(\"$savetitle\");\n\tthis.actionSaveDraftTitle = this.getAttribute(\"$savedrafttitle\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n\t//Following params are new since 5.1.22\n\tthis.actionTemplate = this.getAttribute(\"$template\");\n\tthis.useTemplate = !!this.actionTemplate;\n\tthis.actionOverwrite = this.getAttribute(\"$overwrite\",\"no\");\n\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nCreateTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nCreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar title = this.wiki.getTiddlerText(\"$:/language/DefaultNewTiddlerTitle\"), // Get the initial new-tiddler title\n\t\tfields = {},\n\t\tcreationFields,\n\t\tmodificationFields;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tfields[name] = attribute;\n\t\t}\n\t});\n\tif(this.actionTimestamp) {\n\t\tcreationFields = this.wiki.getCreationFields();\n\t\tmodificationFields = this.wiki.getModificationFields();\n\t}\n\tif(this.hasBase && this.actionOverwrite === \"no\") {\n\t\ttitle = this.wiki.generateNewTitle(this.actionBaseTitle);\n\t} else if (this.hasBase && this.actionOverwrite === \"yes\") {\n\t\ttitle = this.actionBaseTitle\n\t}\n\t// NO $basetitle BUT $template parameter is available\n\t// the title MUST be unique, otherwise the template would be overwritten\n\tif (!this.hasBase && this.useTemplate) {\n\t\ttitle = this.wiki.generateNewTitle(this.actionTemplate);\n\t} else if (!this.hasBase && !this.useTemplate) {\n\t\t// If NO $basetitle AND NO $template use initial title\n\t\t// DON'T overwrite any stuff\n\t\ttitle = this.wiki.generateNewTitle(title);\n\t}\n\tvar templateTiddler = this.wiki.getTiddler(this.actionTemplate) || {};\n\tvar tiddler = this.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title}));\n\tif(this.actionSaveTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.actionSaveDraftTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveDraftTitle,this.wiki.generateDraftTitle(title),this.getVariable(\"currentTiddler\"));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-createtiddler\"] = CreateTiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-deletefield.js": {
"title": "$:/core/modules/widgets/action-deletefield.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletefield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete fields of a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\ttiddler = this.wiki.getTiddler(self.actionTiddler),\n\t\tremoveFields = {},\n\t\thasChanged = false;\n\tif(this.actionField && tiddler) {\n\t\tremoveFields[this.actionField] = undefined;\n\t\tif(this.actionField in tiddler.fields) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(tiddler) {\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\" && name !== \"title\") {\n\t\t\t\tremoveFields[name] = undefined;\n\t\t\t\thasChanged = true;\n\t\t\t}\n\t\t});\n\t\tif(hasChanged) {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,removeFields,this.wiki.getModificationFields()));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-deletetiddler.js": {
"title": "$:/core/modules/widgets/action-deletetiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteTiddlerWidget.prototype.execute = function() {\n\tthis.actionFilter = this.getAttribute(\"$filter\");\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$filter\"] || changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddlers = [];\n\tif(this.actionFilter) {\n\t\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\n\t}\n\tif(this.actionTiddler) {\n\t\ttiddlers.push(this.actionTiddler);\n\t}\n\tfor(var t=0; t<tiddlers.length; t++) {\n\t\tthis.wiki.deleteTiddler(tiddlers[t]);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletetiddler\"] = DeleteTiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-listops.js": {
"title": "$:/core/modules/widgets/action-listops.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-listops.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to apply list operations to any tiddler field (defaults to the 'list' field of the current tiddler)\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar ActionListopsWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n/**\n * Inherit from the base widget class\n */\nActionListopsWidget.prototype = new Widget();\n/**\n * Render this widget into the DOM\n */\nActionListopsWidget.prototype.render = function(parent, nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n/**\n * Compute the internal state of the widget\n */\nActionListopsWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.target = this.getAttribute(\"$tiddler\", this.getVariable(\n\t\t\"currentTiddler\"));\n\tthis.filter = this.getAttribute(\"$filter\");\n\tthis.subfilter = this.getAttribute(\"$subfilter\");\n\tthis.listField = this.getAttribute(\"$field\", \"list\");\n\tthis.listIndex = this.getAttribute(\"$index\");\n\tthis.filtertags = this.getAttribute(\"$tags\");\n};\n/**\n * \tRefresh the widget by ensuring our attributes are up to date\n */\nActionListopsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.$tiddler || changedAttributes.$filter ||\n\t\tchangedAttributes.$subfilter || changedAttributes.$field ||\n\t\tchangedAttributes.$index || changedAttributes.$tags) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n/**\n * \tInvoke the action associated with this widget\n */\nActionListopsWidget.prototype.invokeAction = function(triggeringWidget,\n\tevent) {\n\t//Apply the specified filters to the lists\n\tvar field = this.listField,\n\t\tindex,\n\t\ttype = \"!!\",\n\t\tlist = this.listField;\n\tif(this.listIndex) {\n\t\tfield = undefined;\n\t\tindex = this.listIndex;\n\t\ttype = \"##\";\n\t\tlist = this.listIndex;\n\t}\n\tif(this.filter) {\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(this.filter, this)));\n\t}\n\tif(this.subfilter) {\n\t\tvar subfilter = \"[list[\" + this.target + type + list + \"]] \" + this.subfilter;\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(subfilter, this)));\n\t}\n\tif(this.filtertags) {\n\t\tvar tiddler = this.wiki.getTiddler(this.target),\n\t\t\toldtags = tiddler ? (tiddler.fields.tags || []).slice(0) : [],\n\t\t\ttagfilter = \"[list[\" + this.target + \"!!tags]] \" + this.filtertags,\n\t\t\tnewtags = this.wiki.filterTiddlers(tagfilter,this);\n\t\tif($tw.utils.stringifyList(oldtags.sort()) !== $tw.utils.stringifyList(newtags.sort())) {\n\t\t\tthis.wiki.setText(this.target,\"tags\",undefined,$tw.utils.stringifyList(newtags));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-listops\"] = ActionListopsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-navigate.js": {
"title": "$:/core/modules/widgets/action-navigate.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-navigate.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to navigate to a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigateWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigateWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigateWidget.prototype.execute = function() {\n\tthis.actionTo = this.getAttribute(\"$to\");\n\tthis.actionScroll = this.getAttribute(\"$scroll\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$to\"] || changedAttributes[\"$scroll\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tevent = event || {};\n\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\n\t\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\n\tif(this.actionScroll === \"yes\") {\n\t\tsuppressNavigation = false;\n\t} else if(this.actionScroll === \"no\") {\n\t\tsuppressNavigation = true;\n\t}\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.actionTo === undefined ? this.getVariable(\"currentTiddler\") : this.actionTo,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: triggeringWidget,\n\t\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: suppressNavigation\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-navigate\"] = NavigateWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-popup.js": {
"title": "$:/core/modules/widgets/action-popup.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-popup.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to trigger a popup.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ActionPopupWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nActionPopupWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nActionPopupWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nActionPopupWidget.prototype.execute = function() {\n\tthis.actionState = this.getAttribute(\"$state\");\n\tthis.actionCoords = this.getAttribute(\"$coords\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nActionPopupWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$state\"] || changedAttributes[\"$coords\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Trigger the popup\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(this.actionCoords);\n\tif(match) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: null,\n\t\t\tdomNodeRect: {\n\t\t\t\tleft: parseFloat(match[1]),\n\t\t\t\ttop: parseFloat(match[2]),\n\t\t\t\twidth: parseFloat(match[3]),\n\t\t\t\theight: parseFloat(match[4])\n\t\t\t},\n\t\t\ttitle: this.actionState,\n\t\t\twiki: this.wiki\n\t\t});\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-popup\"] = ActionPopupWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-sendmessage.js": {
"title": "$:/core/modules/widgets/action-sendmessage.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to send a message\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SendMessageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSendMessageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSendMessageWidget.prototype.execute = function() {\n\tthis.actionMessage = this.getAttribute(\"$message\");\n\tthis.actionParam = this.getAttribute(\"$param\");\n\tthis.actionName = this.getAttribute(\"$name\");\n\tthis.actionValue = this.getAttribute(\"$value\",\"\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSendMessageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Get the string parameter\n\tvar param = this.actionParam;\n\t// Assemble the attributes as a hashmap\n\tvar paramObject = Object.create(null);\n\tvar count = 0;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparamObject[name] = attribute;\n\t\t\tcount++;\n\t\t}\n\t});\n\t// Add name/value pair if present\n\tif(this.actionName) {\n\t\tparamObject[this.actionName] = this.actionValue;\n\t}\n\t// Dispatch the message\n\tthis.dispatchEvent({\n\t\ttype: this.actionMessage,\n\t\tparam: param,\n\t\tparamObject: paramObject,\n\t\ttiddlerTitle: this.getVariable(\"currentTiddler\"),\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tevent: event\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-setfield.js": {
"title": "$:/core/modules/widgets/action-setfield.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-setfield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\tthis.actionValue = this.getAttribute(\"$value\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$field\"] || changedAttributes[\"$index\"] || changedAttributes[\"$value\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\toptions = {};\n\toptions.suppressTimestamp = !this.actionTimestamp;\n\tif((typeof this.actionField == \"string\") || (typeof this.actionIndex == \"string\") || (typeof this.actionValue == \"string\")) {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue,options);\n\t}\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute,options);\n\t\t}\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setfield\"] = SetFieldWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/browse.js": {
"title": "$:/core/modules/widgets/browse.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/browse.js\ntype: application/javascript\nmodule-type: widget\n\nBrowse widget for browsing for files to import\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar BrowseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nBrowseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nBrowseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"file\");\n\tif(this.browseMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\t// Nw.js supports \"nwsaveas\" to force a \"save as\" dialogue that allows a new or existing file to be selected\n\tif(this.nwsaveas) {\n\t\tdomNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n\t}\n\t// Nw.js supports \"webkitdirectory\" and \"nwdirectory\" to allow a directory to be selected\n\tif(this.webkitdirectory) {\n\t\tdomNode.setAttribute(\"webkitdirectory\",this.webkitdirectory);\n\t}\n\tif(this.nwdirectory) {\n\t\tdomNode.setAttribute(\"nwdirectory\",this.nwdirectory);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"change\",function (event) {\n\t\tif(self.message) {\n\t\t\tself.dispatchEvent({type: self.message, param: self.param, files: event.target.files});\n\t\t} else {\n\t\t\tself.wiki.readFiles(event.target.files,{\n\t\t\t\tcallback: function(tiddlerFieldsArray) {\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t\t},\n\t\t\t\tdeserializer: self.deserializer\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nBrowseWidget.prototype.execute = function() {\n\tthis.browseMultiple = this.getAttribute(\"multiple\");\n\tthis.deserializer = this.getAttribute(\"deserializer\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.nwsaveas = this.getAttribute(\"nwsaveas\");\n\tthis.webkitdirectory = this.getAttribute(\"webkitdirectory\");\n\tthis.nwdirectory = this.getAttribute(\"nwdirectory\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.browse = BrowseWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/button.js": {
"title": "$:/core/modules/widgets/button.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar tag = \"button\";\n\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif((this.set || this.setTitle) && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\t\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(self,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup || self.popupTitle) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set || self.setTitle) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.actions) {\n\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Make it draggable if required\n\tif(this.dragTiddler || this.dragFilter) {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.dragTiddler;},\n\t\t\tdragFilterFn: function() {return self.dragFilter;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nWe don't allow actions to propagate because we trigger actions ourselves\n*/\nButtonWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n};\n\nButtonWidget.prototype.isSelected = function() {\n return this.setTitle ? (this.setField ? this.wiki.getTiddler(this.setTitle).getFieldString(this.setField) === this.setTo :\n\t\t(this.setIndex ? this.wiki.extractTiddlerDataItem(this.setTitle,this.setIndex) === this.setTo :\n\t\t\tthis.wiki.getTiddlerText(this.setTitle))) || this.defaultSetValue || this.getVariable(\"currentTiddler\") :\n\t\tthis.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\"currentTiddler\")) === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.popupTitle ? this.wiki.getTiddler(this.popupTitle) : this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tevent: event\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\"), event: event});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\tif(this.popupTitle) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popupTitle,\n\t\t\twiki: this.wiki,\n\t\t\tnoStateReference: true\n\t\t});\n\t} else {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popup,\n\t\t\twiki: this.wiki\n\t\t});\n\t}\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tif(this.setTitle) {\n\t\tthis.setField ? this.wiki.setText(this.setTitle,this.setField,undefined,this.setTo) :\n\t\t\t\t(this.setIndex ? this.wiki.setText(this.setTitle,undefined,this.setIndex,this.setTo) :\n\t\t\t\tthis.wiki.setText(this.setTitle,\"text\",undefined,this.setTo));\n\t} else {\n\t\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\");\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\",\"\");\n\tthis.buttonTag = this.getAttribute(\"tag\");\n\tthis.dragTiddler = this.getAttribute(\"dragTiddler\");\n\tthis.dragFilter = this.getAttribute(\"dragFilter\");\n\tthis.setTitle = this.getAttribute(\"setTitle\");\n\tthis.setField = this.getAttribute(\"setField\");\n\tthis.setIndex = this.getAttribute(\"setIndex\");\n\tthis.popupTitle = this.getAttribute(\"popupTitle\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes[\"class\"] || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/checkbox.js": {
"title": "$:/core/modules/widgets/checkbox.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/checkbox.js\ntype: application/javascript\nmodule-type: widget\n\nCheckbox widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CheckboxWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCheckboxWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.checkboxClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tif(this.getValue()) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nCheckboxWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\n\tif(tiddler) {\n\t\tif(this.checkboxTag) {\n\t\t\tif(this.checkboxInvertTag) {\n\t\t\t\treturn !tiddler.hasTag(this.checkboxTag);\n\t\t\t} else {\n\t\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tvar value;\n\t\t\tif($tw.utils.hop(tiddler.fields,this.checkboxField)) {\n\t\t\t\tvalue = tiddler.fields[this.checkboxField] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.checkboxDefault || \"\";\n\t\t\t}\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxIndex) {\n\t\t\tvar value = this.wiki.extractTiddlerDataItem(tiddler,this.checkboxIndex,this.checkboxDefault || \"\");\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif(this.checkboxTag) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tif(this.checkboxDefault === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(this.checkboxDefault === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\n\tvar checked = this.inputDomNode.checked,\n\t\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\n\t\tfallbackFields = {text: \"\"},\n\t\tnewFields = {title: this.checkboxTitle},\n\t\thasChanged = false,\n\t\ttagCheck = false,\n\t\thasTag = tiddler && tiddler.hasTag(this.checkboxTag),\n\t\tvalue = checked ? this.checkboxChecked : this.checkboxUnchecked;\n\tif(this.checkboxTag && this.checkboxInvertTag === \"yes\") {\n\t\ttagCheck = hasTag === checked;\n\t} else {\n\t\ttagCheck = hasTag !== checked;\n\t}\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tagCheck)) {\n\t\tnewFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];\n\t\tvar pos = newFields.tags.indexOf(this.checkboxTag);\n\t\tif(pos !== -1) {\n\t\t\tnewFields.tags.splice(pos,1);\n\t\t}\n\t\tif(this.checkboxInvertTag === \"yes\" && !checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t} else if(this.checkboxInvertTag !== \"yes\" && checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t}\n\t\thasChanged = true;\n\t}\n\t// Set the field if specified\n\tif(this.checkboxField) {\n\t\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\n\t\t\tnewFields[this.checkboxField] = value;\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\t// Set the index if specified\n\tif(this.checkboxIndex) {\n\t\tvar indexValue = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxIndex);\n\t\tif(!tiddler || indexValue !== value) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(hasChanged) {\n\t\tif(this.checkboxIndex) {\n\t\t\tthis.wiki.setText(this.checkboxTitle,\"\",this.checkboxIndex,value);\n\t\t} else {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t\t}\n\t}\n\t// Trigger actions\n\tif(this.checkboxActions) {\n\t\tthis.invokeActionString(this.checkboxActions,this,event);\n\t}\n\tif(this.checkboxCheckActions && checked) {\n\t\tthis.invokeActionString(this.checkboxCheckActions,this,event);\n\t}\n\tif(this.checkboxUncheckActions && !checked) {\n\t\tthis.invokeActionString(this.checkboxUncheckActions,this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCheckboxWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.checkboxActions = this.getAttribute(\"actions\");\n\tthis.checkboxCheckActions = this.getAttribute(\"checkactions\");\n\tthis.checkboxUncheckActions = this.getAttribute(\"uncheckactions\");\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxIndex = this.getAttribute(\"index\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\tthis.checkboxClass = this.getAttribute(\"class\",\"\");\n\tthis.checkboxInvertTag = this.getAttribute(\"invertTag\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCheckboxWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.index || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/codeblock.js": {
"title": "$:/core/modules/widgets/codeblock.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/codeblock.js\ntype: application/javascript\nmodule-type: widget\n\nCode block node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CodeBlockWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCodeBlockWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar codeNode = this.document.createElement(\"code\"),\n\t\tdomNode = this.document.createElement(\"pre\");\n\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\"code\")));\n\tdomNode.appendChild(codeNode);\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCodeBlockWidget.prototype.execute = function() {\n\tthis.language = this.getAttribute(\"language\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.codeblock = CodeBlockWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/count.js": {
"title": "$:/core/modules/widgets/count.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/count.js\ntype: application/javascript\nmodule-type: widget\n\nCount widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CountWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCountWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCountWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.currentCount);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCountWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Execute the filter\n\tif(this.filter) {\n\t\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\n\t} else {\n\t\tthis.currentCount = \"0\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCountWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldCount = this.currentCount;\n\tthis.execute();\n\tif(this.currentCount !== oldCount) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.count = CountWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/diff-text.js": {
"title": "$:/core/modules/widgets/diff-text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/diff-text.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display a diff between two texts\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget,\n\tdmp = require(\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\");\n\nvar DiffTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDiffTextWidget.prototype = new Widget();\n\nDiffTextWidget.prototype.invisibleCharacters = {\n\t\"\\n\": \"↩︎\\n\",\n\t\"\\r\": \"⇠\",\n\t\"\\t\": \"⇥\\t\"\n};\n\n/*\nRender this widget into the DOM\n*/\nDiffTextWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create the diff\n\tvar dmpObject = new dmp.diff_match_patch(),\n\t\tdiffs = dmpObject.diff_main(this.getAttribute(\"source\"),this.getAttribute(\"dest\"));\n\t// Apply required cleanup\n\tswitch(this.getAttribute(\"cleanup\",\"semantic\")) {\n\t\tcase \"none\":\n\t\t\t// No cleanup\n\t\t\tbreak;\n\t\tcase \"efficiency\":\n\t\t\tdmpObject.diff_cleanupEfficiency(diffs);\n\t\t\tbreak;\n\t\tdefault: // case \"semantic\"\n\t\t\tdmpObject.diff_cleanupSemantic(diffs);\n\t\t\tbreak;\n\t}\n\t// Create the elements\n\tvar domContainer = this.document.createElement(\"div\"), \n\t\tdomDiff = this.createDiffDom(diffs);\n\tparent.insertBefore(domContainer,nextSibling);\n\t// Set variables\n\tthis.setVariable(\"diff-count\",diffs.reduce(function(acc,diff) {\n\t\tif(diff[0] !== dmp.DIFF_EQUAL) {\n\t\t\tacc++;\n\t\t}\n\t\treturn acc;\n\t},0).toString());\n\t// Render child widgets\n\tthis.renderChildren(domContainer,null);\n\t// Render the diff\n\tdomContainer.appendChild(domDiff);\n\t// Save our container\n\tthis.domNodes.push(domContainer);\n};\n\n/*\nCreate DOM elements representing a list of diffs\n*/\nDiffTextWidget.prototype.createDiffDom = function(diffs) {\n\tvar self = this;\n\t// Create the element and assign the attributes\n\tvar domPre = this.document.createElement(\"pre\"),\n\t\tdomCode = this.document.createElement(\"code\");\n\t$tw.utils.each(diffs,function(diff) {\n\t\tvar tag = diff[0] === dmp.DIFF_INSERT ? \"ins\" : (diff[0] === dmp.DIFF_DELETE ? \"del\" : \"span\"),\n\t\t\tclassName = diff[0] === dmp.DIFF_INSERT ? \"tc-diff-insert\" : (diff[0] === dmp.DIFF_DELETE ? \"tc-diff-delete\" : \"tc-diff-equal\"),\n\t\t\tdom = self.document.createElement(tag),\n\t\t\ttext = diff[1],\n\t\t\tcurrPos = 0,\n\t\t\tre = /([\\x00-\\x1F])/mg,\n\t\t\tmatch = re.exec(text),\n\t\t\tspan,\n\t\t\tprintable;\n\t\tdom.className = className;\n\t\twhile(match) {\n\t\t\tif(currPos < match.index) {\n\t\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos,match.index)));\n\t\t\t}\n\t\t\tspan = self.document.createElement(\"span\");\n\t\t\tspan.className = \"tc-diff-invisible\";\n\t\t\tprintable = self.invisibleCharacters[match[0]] || (\"[0x\" + match[0].charCodeAt(0).toString(16) + \"]\");\n\t\t\tspan.appendChild(self.document.createTextNode(printable));\n\t\t\tdom.appendChild(span);\n\t\t\tcurrPos = match.index + match[0].length;\n\t\t\tmatch = re.exec(text);\n\t\t}\n\t\tif(currPos < text.length) {\n\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos)));\n\t\t}\n\t\tdomCode.appendChild(dom);\n\t});\n\tdomPre.appendChild(domCode);\n\treturn domPre;\n};\n\n/*\nCompute the internal state of the widget\n*/\nDiffTextWidget.prototype.execute = function() {\n\t// Make child widgets\n\tvar parseTreeNodes;\n\tif(this.parseTreeNode && this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: \"$:/language/Diffs/CountMessage\"}\n\t\t\t}\n\t\t}];\n\t}\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDiffTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.dest || changedAttributes.cleanup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports[\"diff-text\"] = DiffTextWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/draggable.js": {
"title": "$:/core/modules/widgets/draggable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/draggable.js\ntype: application/javascript\nmodule-type: widget\n\nDraggable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DraggableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDraggableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDraggableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Sanitise the specified tag\n\tvar tag = this.draggableTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"div\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [\"tc-draggable\"];\n\tif(this.draggableClasses) {\n\t\tclasses.push(this.draggableClasses);\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Add event handlers\n\t$tw.utils.makeDraggable({\n\t\tdomNode: domNode,\n\t\tdragTiddlerFn: function() {return self.getAttribute(\"tiddler\");},\n\t\tdragFilterFn: function() {return self.getAttribute(\"filter\");},\n\t\tstartActions: self.startActions,\n\t\tendActions: self.endActions,\n\t\twidget: this\n\t});\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nDraggableWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.draggableTag = this.getAttribute(\"tag\",\"div\");\n\tthis.draggableClasses = this.getAttribute(\"class\");\n\tthis.startActions = this.getAttribute(\"startactions\");\n\tthis.endActions = this.getAttribute(\"endactions\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDraggableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.draggable = DraggableWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/droppable.js": {
"title": "$:/core/modules/widgets/droppable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/droppable.js\ntype: application/javascript\nmodule-type: widget\n\nDroppable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DroppableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDroppableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDroppableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.droppableTag && $tw.config.htmlUnsafeElements.indexOf(this.droppableTag) === -1) {\n\t\ttag = this.droppableTag;\n\t}\n\t// Create element and assign classes\n\tvar domNode = this.document.createElement(tag),\n\t\tclasses = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-droppable\");\n\tdomNode.className = classes.join(\" \");\n\t// Add event handlers\n\tif(this.droppableEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"}\n\t\t]);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDroppableWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDroppableWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally. The hacky second condition is to resolve a problem with Firefox whereby there is an erroneous dragenter event if the node being dragged is within the dropzone\n\tif(this.currentlyEntered.length === 0 || (this.currentlyEntered.length === 1 && this.currentlyEntered[0] === $tw.dragInProgress)) {\n\t\tthis.currentlyEntered = [];\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDroppableWidget.prototype.handleDragEnterEvent = function(event) {\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\t// Set the drop effect\n\tevent.dataTransfer.dropEffect = this.droppableEffect;\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag(event);\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDropEvent = function(event) {\n\tvar self = this;\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\tvar dataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Try to import the various data types we understand\n\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\n\t\tfieldsArray.forEach(function(fields) {\n\t\t\tself.performActions(fields.title || fields.text,event);\n\t\t});\n\t});\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.performActions = function(title,event) {\n\tif(this.droppableActions) {\n\t\tvar modifierKey = event.ctrlKey && ! event.shiftKey ? \"ctrl\" : event.shiftKey && !event.ctrlKey ? \"shift\" : \n\t\t\t\tevent.ctrlKey && event.shiftKey ? \"ctrl-shift\" : \"normal\" ;\n\t\tthis.invokeActionString(this.droppableActions,this,event,{actionTiddler: title, modifier: modifierKey});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDroppableWidget.prototype.execute = function() {\n\tthis.droppableActions = this.getAttribute(\"actions\");\n\tthis.droppableEffect = this.getAttribute(\"effect\",\"copy\");\n\tthis.droppableTag = this.getAttribute(\"tag\");\n\tthis.droppableClass = this.getAttribute(\"class\");\n\tthis.droppableEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDroppableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"] || changedAttributes.tag || changedAttributes.enable) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.droppable = DroppableWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/dropzone.js": {
"title": "$:/core/modules/widgets/dropzone.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/dropzone.js\ntype: application/javascript\nmodule-type: widget\n\nDropzone widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DropZoneWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDropZoneWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tdomNode.className = this.dropzoneClass || \"tc-dropzone\";\n\t// Add event handlers\n\tif(this.dropzoneEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"},\n\t\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t\t]);\t\t\n\t}\n\tdomNode.addEventListener(\"click\",function (event) {\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDropZoneWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally\n\tif(this.currentlyEntered.length === 0) {\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent = function(event) {\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag(event);\n};\n\nDropZoneWidget.prototype.handleDragEndEvent = function(event) {\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.handleDropEvent = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t};\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Import any files in the drop\n\tvar numFiles = 0;\n\tif(dataTransfer.files) {\n\t\tnumFiles = this.wiki.readFiles(dataTransfer.files,{\n\t\t\tcallback: readFileCallback,\n\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t});\n\t}\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\t$tw.utils.importDataTransfer(dataTransfer,this.wiki.generateNewTitle(\"Untitled\"),readFileCallback);\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handlePasteEvent = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t};\n\t// Let the browser handle it if we're in a textarea or input box\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) == -1 && !event.target.isContentEditable) {\n\t\tvar self = this,\n\t\t\titems = event.clipboardData.items;\n\t\t// Enumerate the clipboard items\n\t\tfor(var t = 0; t<items.length; t++) {\n\t\t\tvar item = items[t];\n\t\t\tif(item.kind === \"file\") {\n\t\t\t\t// Import any files\n\t\t\t\tthis.wiki.readFile(item.getAsFile(),{\n\t\t\t\t\tcallback: readFileCallback,\n\t\t\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t\t\t});\n\t\t\t} else if(item.kind === \"string\") {\n\t\t\t\t// Create tiddlers from string items\n\t\t\t\tvar type = item.type;\n\t\t\t\titem.getAsString(function(str) {\n\t\t\t\t\tvar tiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled\"),\n\t\t\t\t\t\ttext: str,\n\t\t\t\t\t\ttype: type\n\t\t\t\t\t};\n\t\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\t\tconsole.log(\"Importing string '\" + str + \"', type: '\" + type + \"'\");\n\t\t\t\t\t}\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields])});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Tell the browser that we've handled the paste\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDropZoneWidget.prototype.execute = function() {\n\tthis.dropzoneClass = this.getAttribute(\"class\");\n\tthis.dropzoneDeserializer = this.getAttribute(\"deserializer\");\n\tthis.dropzoneEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.enable) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-binary.js": {
"title": "$:/core/modules/widgets/edit-binary.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-binary.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-binary widget; placeholder for editing binary tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBinaryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBinaryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBinaryWidget.prototype.execute = function() {\n\t// Get our parameters\n\tvar editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tvar tiddler = this.wiki.getTiddler(editTitle);\n\tvar type = tiddler.fields.type;\n\tvar text = tiddler.fields.text;\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on draft tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!draft.title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!draft.title\"}\n\t\t},\n\t\tchildren: [{\n\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to internal data URI (no external)\n\tif(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets([element]);\n};\n\n/*\nRefresh by refreshing our child widget\n*/\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"edit-binary\"] = EditBinaryWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-bitmap.js": {
"title": "$:/core/modules/widgets/edit-bitmap.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-bitmap widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Default image sizes\nvar DEFAULT_IMAGE_WIDTH = 600,\n\tDEFAULT_IMAGE_HEIGHT = 370,\n\tDEFAULT_IMAGE_TYPE = \"image/png\";\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\",\n\tLINE_OPACITY_TITLE = \"$:/config/BitmapEditor/Opacity\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBitmapWidget = function(parseTreeNode,options) {\n\t// Initialise the editor operations if they've not been done already\n\tif(!this.editorOperations) {\n\t\tEditBitmapWidget.prototype.editorOperations = {};\n\t\t$tw.modules.applyMethods(\"bitmapeditoroperation\",this.editorOperations);\n\t}\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create the wrapper for the toolbar and render its content\n\tthis.toolbarNode = this.document.createElement(\"div\");\n\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\tparent.insertBefore(this.toolbarNode,nextSibling);\n\tthis.domNodes.push(this.toolbarNode);\n\t// Create the on-screen canvas\n\tthis.canvasDomNode = $tw.utils.domMaker(\"canvas\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor\",\n\t\teventListeners: [{\n\t\t\tname: \"touchstart\", handlerObject: this, handlerMethod: \"handleTouchStartEvent\"\n\t\t},{\n\t\t\tname: \"touchmove\", handlerObject: this, handlerMethod: \"handleTouchMoveEvent\"\n\t\t},{\n\t\t\tname: \"touchend\", handlerObject: this, handlerMethod: \"handleTouchEndEvent\"\n\t\t},{\n\t\t\tname: \"mousedown\", handlerObject: this, handlerMethod: \"handleMouseDownEvent\"\n\t\t},{\n\t\t\tname: \"mousemove\", handlerObject: this, handlerMethod: \"handleMouseMoveEvent\"\n\t\t},{\n\t\t\tname: \"mouseup\", handlerObject: this, handlerMethod: \"handleMouseUpEvent\"\n\t\t}]\n\t});\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Render toolbar child widgets\n\tthis.renderChildren(this.toolbarNode,null);\n\t// // Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n\t// Add widget message listeners\n\tthis.addEventListeners([\n\t\t{type: \"tm-edit-bitmap-operation\", handler: \"handleEditBitmapOperationMessage\"}\n\t]);\n};\n\n/*\nHandle an edit bitmap operation message from the toolbar\n*/\nEditBitmapWidget.prototype.handleEditBitmapOperationMessage = function(event) {\n\t// Invoke the handler\n\tvar handler = this.editorOperations[event.param];\n\tif(handler) {\n\t\thandler.call(this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBitmapWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nJust refresh the toolbar\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nSet the bitmap size variables and refresh the toolbar\n*/\nEditBitmapWidget.prototype.refreshToolbar = function() {\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Refresh each of our child widgets\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.refreshSelf();\n\t});\n};\n\nEditBitmapWidget.prototype.loadCanvas = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle),\n\t\tcurrImage = new Image();\n\t// Set up event handlers for loading the image\n\tvar self = this;\n\tcurrImage.onload = function() {\n\t\t// Copy the image to the on-screen canvas\n\t\tself.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\n\t\t// And also copy the current bitmap to the off-screen canvas\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\tcurrImage.onerror = function() {\n\t\t// Set the on-screen canvas size and clear it\n\t\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the off-screen canvas size and clear it\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\t// Get the current bitmap into an image object\n\tif(tiddler && tiddler.fields.type && tiddler.fields.text) {\n\t\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\t\t\n\t} else {\n\t\tcurrImage.width = DEFAULT_IMAGE_WIDTH;\n\t\tcurrImage.height = DEFAULT_IMAGE_HEIGHT;\n\t\tcurrImage.onerror();\n\t}\n};\n\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif(image) {\n\t\tctx.drawImage(image,0,0);\n\t} else {\n\t\tctx.fillStyle = \"#fff\";\n\t\tctx.fillRect(0,0,canvas.width,canvas.height);\n\t}\n};\n\n/*\n** Change the size of the canvas, preserving the current image\n*/\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\");\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\n/*\n** Rotate the canvas left by 90 degrees\n*/\nEditBitmapWidget.prototype.rotateCanvasLeft = function() {\n\t// Get the current size of the image\n\tvar origWidth = this.currCanvas.width,\n\t\torigHeight = this.currCanvas.height;\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\"),\n\t\tnewWidth = origHeight,\n\t\tnewHeight = origWidth;\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.save();\n\tctx.translate(newWidth / 2,newHeight / 2);\n\tctx.rotate(-Math.PI / 2);\n\tctx.drawImage(this.currCanvas,-origWidth / 2,-origHeight / 2);\n\tctx.restore();\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\n\tthis.brushDown = true;\n\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.strokeStart(event.clientX,event.clientY);\n\tthis.brushDown = true;\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.clientX,event.clientY);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\n\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\n\t\tscale = this.canvasDomNode.width/canvasRect.width;\n\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\n};\n\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\n\t// Start off a new stroke\n\tthis.stroke = [this.adjustCoordinates(x,y)];\n};\n\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\"),\n\t\tt;\n\t// Add the new position to the end of the stroke\n\tthis.stroke.push(this.adjustCoordinates(x,y));\n\t// Redraw the previous image\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Render the stroke\n\tctx.globalAlpha = parseFloat(this.wiki.getTiddlerText(LINE_OPACITY_TITLE,\"1.0\"));\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseFloat(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"));\n\tctx.lineCap = \"round\";\n\tctx.lineJoin = \"round\";\n\tctx.beginPath();\n\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\n\tfor(t=1; t<this.stroke.length-1; t++) {\n\t\tvar s1 = this.stroke[t],\n\t\t\ts2 = this.stroke[t-1],\n\t\t\ttx = (s1.x + s2.x)/2,\n\t\t\tty = (s1.y + s2.y)/2;\n\t\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\n\t}\n\tctx.stroke();\n};\n\nEditBitmapWidget.prototype.strokeEnd = function() {\n\t// Copy the bitmap to the off-screen canvas\n\tvar ctx = this.currCanvas.getContext(\"2d\");\n\tctx.drawImage(this.canvasDomNode,0,0);\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\nEditBitmapWidget.prototype.saveChanges = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle) || new $tw.Tiddler({title: this.editTitle,type: DEFAULT_IMAGE_TYPE});\n\t// data URIs look like \"data:<type>;base64,<text>\"\n\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type),\n\t\tposColon = dataURL.indexOf(\":\"),\n\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\tposComma = dataURL.indexOf(\",\"),\n\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\ttext = dataURL.substring(posComma+1);\n\tvar update = {type: type, text: text};\n\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields()));\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-shortcut.js": {
"title": "$:/core/modules/widgets/edit-shortcut.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-shortcut.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display an editable keyboard shortcut\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditShortcutWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditShortcutWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditShortcutWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.inputNode = this.document.createElement(\"input\");\n\t// Assign classes\n\tif(this.shortcutClass) {\n\t\tthis.inputNode.className = this.shortcutClass;\t\t\n\t}\n\t// Assign other attributes\n\tif(this.shortcutStyle) {\n\t\tthis.inputNode.setAttribute(\"style\",this.shortcutStyle);\n\t}\n\tif(this.shortcutTooltip) {\n\t\tthis.inputNode.setAttribute(\"title\",this.shortcutTooltip);\n\t}\n\tif(this.shortcutPlaceholder) {\n\t\tthis.inputNode.setAttribute(\"placeholder\",this.shortcutPlaceholder);\n\t}\n\tif(this.shortcutAriaLabel) {\n\t\tthis.inputNode.setAttribute(\"aria-label\",this.shortcutAriaLabel);\n\t}\n\t// Assign the current shortcut\n\tthis.updateInputNode();\n\t// Add event handlers\n\t$tw.utils.addEventListeners(this.inputNode,[\n\t\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Link into the DOM\n\tparent.insertBefore(this.inputNode,nextSibling);\n\tthis.domNodes.push(this.inputNode);\n\t// Focus the input Node if focus === \"yes\" or focus === \"true\"\n\tif(this.shortcutFocus === \"yes\" || this.shortcutFocus === \"true\") {\n\t\tthis.focus();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditShortcutWidget.prototype.execute = function() {\n\tthis.shortcutTiddler = this.getAttribute(\"tiddler\");\n\tthis.shortcutField = this.getAttribute(\"field\");\n\tthis.shortcutIndex = this.getAttribute(\"index\");\n\tthis.shortcutPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.shortcutDefault = this.getAttribute(\"default\",\"\");\n\tthis.shortcutClass = this.getAttribute(\"class\");\n\tthis.shortcutStyle = this.getAttribute(\"style\");\n\tthis.shortcutTooltip = this.getAttribute(\"tooltip\");\n\tthis.shortcutAriaLabel = this.getAttribute(\"aria-label\");\n\tthis.shortcutFocus = this.getAttribute(\"focus\");\n};\n\n/*\nUpdate the value of the input node\n*/\nEditShortcutWidget.prototype.updateInputNode = function() {\n\tif(this.shortcutField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.shortcutTiddler);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,this.shortcutField)) {\n\t\t\tthis.inputNode.value = tiddler.getFieldString(this.shortcutField);\n\t\t} else {\n\t\t\tthis.inputNode.value = this.shortcutDefault;\n\t\t}\n\t} else if(this.shortcutIndex) {\n\t\tthis.inputNode.value = this.wiki.extractTiddlerDataItem(this.shortcutTiddler,this.shortcutIndex,this.shortcutDefault);\n\t} else {\n\t\tthis.inputNode.value = this.wiki.getTiddlerText(this.shortcutTiddler,this.shortcutDefault);\n\t}\n};\n\n/*\nHandle a dom \"keydown\" event\n*/\nEditShortcutWidget.prototype.handleKeydownEvent = function(event) {\n\t// Ignore shift, ctrl, meta, alt\n\tif(event.keyCode && $tw.keyboardManager.getModifierKeys().indexOf(event.keyCode) === -1) {\n\t\t// Get the shortcut text representation\n\t\tvar value = $tw.keyboardManager.getPrintableShortcuts([{\n\t\t\tctrlKey: event.ctrlKey,\n\t\t\tshiftKey: event.shiftKey,\n\t\t\taltKey: event.altKey,\n\t\t\tmetaKey: event.metaKey,\n\t\t\tkeyCode: event.keyCode\n\t\t}]);\n\t\tif(value.length > 0) {\n\t\t\tthis.wiki.setText(this.shortcutTiddler,this.shortcutField,this.shortcutIndex,value[0]);\n\t\t}\n\t\t// Ignore the keydown if it was already handled\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn true;\t\t\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nfocus the input node\n*/\nEditShortcutWidget.prototype.focus = function() {\n\tif(this.inputNode.focus && this.inputNode.select) {\n\t\tthis.inputNode.focus();\n\t\tthis.inputNode.select();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget needed re-rendering\n*/\nEditShortcutWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.placeholder || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.style || changedAttributes.tooltip || changedAttributes[\"aria-label\"] || changedAttributes.focus) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.shortcutTiddler]) {\n\t\tthis.updateInputNode();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports[\"edit-shortcut\"] = EditShortcutWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-text.js": {
"title": "$:/core/modules/widgets/edit-text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-text.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tFramedEngine = require(\"$:/core/modules/editor/engines/framed.js\").FramedEngine,\n\tSimpleEngine = require(\"$:/core/modules/editor/engines/simple.js\").SimpleEngine;\n\nexports[\"edit-text\"] = editTextWidgetFactory(FramedEngine,SimpleEngine);\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit.js": {
"title": "$:/core/modules/widgets/edit.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\tthis.editFocus = this.getAttribute(\"focus\",\"\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: this.editTitle},\n\t\t\tfield: {type: \"string\", value: this.editField},\n\t\t\tindex: {type: \"string\", value: this.editIndex},\n\t\t\t\"class\": {type: \"string\", value: this.editClass},\n\t\t\t\"placeholder\": {type: \"string\", value: this.editPlaceholder},\n\t\t\t\"tabindex\": {type: \"string\", value: this.editTabIndex},\n\t\t\t\"focus\": {type: \"string\", value: this.editFocus}\n\t\t},\n\t\tchildren: this.parseTreeNode.children\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/element.js": {
"title": "$:/core/modules/widgets/element.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/element.js\ntype: application/javascript\nmodule-type: widget\n\nElement widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ElementWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElementWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nElementWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Neuter blacklisted elements\n\tvar tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"safe-\" + tag;\n\t}\n\t// Adjust headings by the current base level\n\tvar headingLevel = [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"].indexOf(tag);\n\tif(headingLevel !== -1) {\n\t\tvar baseLevel = parseInt(this.getVariable(\"tv-adjust-heading-level\",\"0\"),10) || 0;\n\t\theadingLevel = Math.min(Math.max(headingLevel + 1 + baseLevel,1),6);\n\t\ttag = \"h\" + headingLevel;\n\t}\n\t// Create the DOM node\n\tvar domNode = this.document.createElementNS(this.namespace,tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nElementWidget.prototype.execute = function() {\n\t// Select the namespace for the tag\n\tvar tagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: \"http://www.w3.org/1999/xhtml\"\n\t\t};\n\tthis.namespace = tagNamespaces[this.parseTreeNode.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"});\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\t// Update our attributes\n\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/encrypt.js": {
"title": "$:/core/modules/widgets/encrypt.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/encrypt.js\ntype: application/javascript\nmodule-type: widget\n\nEncrypt widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EncryptWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEncryptWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEncryptWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.encryptedText);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEncryptWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\",\"[!is[system]]\");\n\t// Encrypt the filtered tiddlers\n\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\n\t\tjson = {},\n\t\tself = this;\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title),\n\t\t\tjsonTiddler = {};\n\t\tfor(var f in tiddler.fields) {\n\t\t\tjsonTiddler[f] = tiddler.getFieldString(f);\n\t\t}\n\t\tjson[title] = jsonTiddler;\n\t});\n\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\n\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\n\treturn false;\n};\n\nexports.encrypt = EncryptWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/entity.js": {
"title": "$:/core/modules/widgets/entity.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/entity.js\ntype: application/javascript\nmodule-type: widget\n\nHTML entity widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EntityWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEntityWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEntityWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar entityString = this.getAttribute(\"entity\",this.parseTreeNode.entity || \"\"),\n\t\ttextNode = this.document.createTextNode($tw.utils.entityDecode(entityString));\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEntityWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEntityWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.entity) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.entity = EntityWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fieldmangler.js": {
"title": "$:/core/modules/widgets/fieldmangler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/fieldmangler.js\ntype: application/javascript\nmodule-type: widget\n\nField mangler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\thadInvalidFieldName = false,\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.toLowerCase().trim();\n\t\t\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\t\t\tif(!hadInvalidFieldName) {\n\t\t\t\t\talert($tw.language.getString(\n\t\t\t\t\t\t\"InvalidFieldName\",\n\t\t\t\t\t\t{variables:\n\t\t\t\t\t\t\t{fieldName: trimmedName}\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t\thadInvalidFieldName = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!value && tiddler) {\n\t\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t\t}\n\t\t\t\taddition[trimmedName] = value || \"\";\n\t\t\t}\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t}\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\t$tw.utils.pushTop(modification.tags,tag);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\t\t\t\n\t\t}\n\t} else if(typeof event.param === \"string\" && event.param.trim() !== \"\" && this.mangleTitle.trim() !== \"\") {\n\t\tvar tag = [];\n\t\ttag.push(event.param.trim());\n\t\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.mangleTitle, tags: tag},modification));\n\t}\n\treturn true;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fields.js": {
"title": "$:/core/modules/widgets/fields.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/fields.js\ntype: application/javascript\nmodule-type: widget\n\nFields widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.sort = this.getAttribute(\"sort\",\"yes\") === \"yes\";\n\tthis.sortReverse = this.getAttribute(\"sortReverse\",\"no\") === \"yes\";\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.include = this.getAttribute(\"include\",null);\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\n\t// Get the inclusion and exclusion list\n\tvar excludeArr = (this.exclude) ? this.exclude.split(\" \") : [\"text\"];\n\t// Include takes precedence\n\tvar includeArr = (this.include) ? this.include.split(\" \") : null;\n\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tif (includeArr) { // Include takes precedence\n\t\t\tfor(var i=0; i<includeArr.length; i++) {\n\t\t\t\tif(tiddler.fields[includeArr[i]]) {\n\t\t\t\t\tfields.push(includeArr[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\tif(excludeArr.indexOf(fieldName) === -1) {\n\t\t\t\t\tfields.push(fieldName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.sort) fields.sort();\n\t\tif (this.sortReverse) fields.reverse();\n\t\tfor(var f=0, fmax=fields.length; f<fmax; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tvar row = this.template,\n\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\tif(reMatch) {\n\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t}\n\t\t\t}\n\t\t\trow = $tw.utils.replaceString(row,\"$name$\",fieldName);\n\t\t\trow = $tw.utils.replaceString(row,\"$value$\",value);\n\t\t\trow = $tw.utils.replaceString(row,\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\ttext.push(row);\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif( changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude ||\n\t\tchangedAttributes.include || changedAttributes.sort || changedAttributes.sortReverse ||\n\t\tchangedTiddlers[this.tiddlerTitle] || changedAttributes.stripTitlePrefix) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/image.js": {
"title": "$:/core/modules/widgets/image.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/image.js\ntype: application/javascript\nmodule-type: widget\n\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\n\n```\n<$image src=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\">\n```\n\nThe image source can be the title of an existing tiddler or the URL of an external image.\n\nExternal images always generate an HTML `<img>` tag.\n\nTiddlers that have a _canonical_uri field generate an HTML `<img>` tag with the src attribute containing the URI.\n\nTiddlers that contain image data generate an HTML `<img>` tag with the src attribute containing a base64 representation of the image.\n\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\t// Determine what type of image it is\n\tvar tag = \"img\", src = \"\",\n\t\ttiddler = this.wiki.getTiddler(this.imageSource);\n\tif(!tiddler) {\n\t\t// The source isn't the title of a tiddler, so we'll assume it's a URL\n\t\tsrc = this.getVariable(\"tv-get-export-image-link\",{params: [{name: \"src\",value: this.imageSource}],defaultValue: this.imageSource});\n\t} else {\n\t\t// Check if it is an image tiddler\n\t\tif(this.wiki.isImageTiddler(this.imageSource)) {\n\t\t\tvar type = tiddler.fields.type,\n\t\t\t\ttext = tiddler.fields.text,\n\t\t\t\t_canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t// If the tiddler has body text then it doesn't need to be lazily loaded\n\t\t\tif(text) {\n\t\t\t\t// Render the appropriate element for the image type\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = \"data:application/pdf;base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = \"data:image/svg+xml,\" + encodeURIComponent(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = \"data:\" + type + \";base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t} else {\n\t\t\t\t// Just trigger loading of the tiddler\n\t\t\t\tthis.wiki.getTiddlerText(this.imageSource);\n\t\t\t}\n\t\t}\n\t}\n\t// Create the element and assign the attributes\n\tvar domNode = this.document.createElement(tag);\n\tdomNode.setAttribute(\"src\",src);\n\tif(this.imageClass) {\n\t\tdomNode.setAttribute(\"class\",this.imageClass);\t\t\n\t}\n\tif(this.imageWidth) {\n\t\tdomNode.setAttribute(\"width\",this.imageWidth);\n\t}\n\tif(this.imageHeight) {\n\t\tdomNode.setAttribute(\"height\",this.imageHeight);\n\t}\n\tif(this.imageTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.imageTooltip);\t\t\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImageWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.imageSource = this.getAttribute(\"source\");\n\tthis.imageWidth = this.getAttribute(\"width\");\n\tthis.imageHeight = this.getAttribute(\"height\");\n\tthis.imageClass = this.getAttribute(\"class\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\"class\"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.image = ImageWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/importvariables.js": {
"title": "$:/core/modules/widgets/importvariables.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/importvariables.js\ntype: application/javascript\nmodule-type: widget\n\nImport variable definitions from other tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImportVariablesWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImportVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImportVariablesWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\n\tvar widgetPointer = this;\n\t// Get our parameters\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Compute the filter\n\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\n\t// Accumulate the <$set> widgets from each tiddler\n\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = widgetPointer.wiki.parseTiddler(title);\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && parseTreeNode.type === \"set\") {\n\t\t\t\tvar node = {\n\t\t\t\t\ttype: \"set\",\n\t\t\t\t\tattributes: parseTreeNode.attributes,\n\t\t\t\t\tparams: parseTreeNode.params,\n\t\t\t\t\tisMacroDefinition: parseTreeNode.isMacroDefinition\n\t\t\t\t};\n\t\t\t\tif (parseTreeNode.isMacroDefinition) {\n\t\t\t\t\t// Macro definitions can be folded into\n\t\t\t\t\t// current widget instead of adding\n\t\t\t\t\t// another link to the chain.\n\t\t\t\t\tvar widget = widgetPointer.makeChildWidget(node);\n\t\t\t\t\twidget.computeAttributes();\n\t\t\t\t\twidget.execute();\n\t\t\t\t\t// We SHALLOW copy over all variables\n\t\t\t\t\t// in widget. We can't use\n\t\t\t\t\t// $tw.utils.assign, because that copies\n\t\t\t\t\t// up the prototype chain, which we\n\t\t\t\t\t// don't want.\n\t\t\t\t\t$tw.utils.each(Object.keys(widget.variables), function(key) {\n\t\t\t\t\t\twidgetPointer.variables[key] = widget.variables[key];\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\twidgetPointer.makeChildWidgets([node]);\n\t\t\t\t\twidgetPointer = widgetPointer.children[0];\n\t\t\t\t}\n\t\t\t\tparseTreeNode = parseTreeNode.children && parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\n\tif (widgetPointer != this) {\n\t\twidgetPointer.parseTreeNode.children = this.parseTreeNode.children;\n\t} else {\n\t\twidgetPointer.makeChildWidgets();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\n\t// Recompute our attributes and the filter list\n\tvar changedAttributes = this.computeAttributes(),\n\t\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\"filter\"),this);\n\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\n\tfunction haveListedTiddlersChanged() {\n\t\tvar changed = false;\n\t\ttiddlerList.forEach(function(title) {\n\t\t\tif(changedTiddlers[title]) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\t\treturn changed;\n\t}\n\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\n\t\t// Compute the filter\n\t\tthis.removeChildDomNodes();\n\t\tthis.execute(tiddlerList);\n\t\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/keyboard.js": {
"title": "$:/core/modules/widgets/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/keyboard.js\ntype: application/javascript\nmodule-type: widget\n\nKeyboard shortcut widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar KeyboardWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKeyboardWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.tag && $tw.config.htmlUnsafeElements.indexOf(this.tag) === -1) {\n\t\ttag = this.tag;\n\t}\n\t// Create element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tdomNode.className = classes.join(\" \");\n\t// Add a keyboard event handler\n\tdomNode.addEventListener(\"keydown\",function (event) {\n\t\tif($tw.keyboardManager.checkKeyDescriptors(event,self.keyInfoArray)) {\n\t\t\tself.invokeActions(self,event);\n\t\t\tif(self.actions) {\n\t\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t\t}\n\t\t\tself.dispatchMessage(event);\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\",\"\");\n\tthis.message = this.getAttribute(\"message\",\"\");\n\tthis.param = this.getAttribute(\"param\",\"\");\n\tthis.key = this.getAttribute(\"key\",\"\");\n\tthis.tag = this.getAttribute(\"tag\",\"\");\n\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tif(this.key.substr(0,2) === \"((\" && this.key.substr(-2,2) === \"))\") {\n\t\tthis.shortcutTiddlers = [];\n\t\tvar name = this.key.substring(2,this.key.length -2);\n\t\t$tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {\n\t\t\tself.shortcutTiddlers.push(\"$:/config/\" + platformDescriptor + \"/\" + name);\n\t\t});\n\t}\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes[\"class\"] || changedAttributes.tag) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\t// Update the keyInfoArray if one of its shortcut-config-tiddlers has changed\n\tif(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers)) {\n\t\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/link.js": {
"title": "$:/core/modules/widgets/link.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true,\n\t\tmissingLinksEnabled = !(this.hideMissingLinks && this.isMissing && !this.isShadow);\n\t// Render the link if required\n\tif(useWikiLinks && missingLinksEnabled) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Sanitise the specified tag\n\tvar tag = this.linkTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"a\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [];\n\tif(this.overrideClasses === undefined) {\n\t\tclasses.push(\"tc-tiddlylink\");\n\t\tif(this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t\t}\n\t\tif(this.isMissing && !this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t\t} else {\n\t\t\tif(!this.isMissing) {\n\t\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t\t}\n\t\t}\n\t\tif(this.linkClasses) {\n\t\t\tclasses.push(this.linkClasses);\t\t\t\n\t\t}\n\t} else if(this.overrideClasses !== \"\") {\n\t\tclasses.push(this.overrideClasses)\n\t}\n\tif(classes.length > 0) {\n\t\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t}\n\t// Set an href\n\tvar wikilinkTransformFilter = this.getVariable(\"tv-filter-export-link\"),\n\t\twikiLinkText;\n\tif(wikilinkTransformFilter) {\n\t\t// Use the filter to construct the href\n\t\twikiLinkText = this.wiki.filterTiddlers(wikilinkTransformFilter,this,function(iterator) {\n\t\t\titerator(self.wiki.getTiddler(self.to),self.to)\n\t\t})[0];\n\t} else {\n\t\t// Expand the tv-wikilink-template variable to construct the href\n\t\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\";\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkTemplate,\"$uri_encoded$\",encodeURIComponent(this.to));\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkText,\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\t}\n\t// Override with the value of tv-get-export-link if defined\n\twikiLinkText = this.getVariable(\"tv-get-export-link\",{params: [{name: \"to\",value: this.to}],defaultValue: wikiLinkText});\n\tif(tag === \"a\") {\n\t\tdomNode.setAttribute(\"href\",wikiLinkText);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\t// Set the tooltip\n\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \"<$transclude field='tooltip'><$transclude field='title'/></$transclude>\"\n\tvar tooltipWikiText = this.tooltip || this.getVariable(\"tv-wikilink-tooltip\");\n\tif(tooltipWikiText) {\n\t\tvar tooltipText = this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",tooltipWikiText,{\n\t\t\t\tparseAsInline: true,\n\t\t\t\tvariables: {\n\t\t\t\t\tcurrentTiddler: this.to\n\t\t\t\t},\n\t\t\t\tparentWidget: this\n\t\t\t});\n\t\tdomNode.setAttribute(\"title\",tooltipText);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"click\", handlerObject: this, handlerMethod: \"handleClickEvent\"},\n\t]);\n\t// Make the link draggable if required\n\tif(this.draggable === \"yes\") {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.to;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nLinkWidget.prototype.handleClickEvent = function(event) {\n\t// Send the click on its way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tmetaKey: event.metaKey,\n\t\tctrlKey: event.ctrlKey,\n\t\taltKey: event.altKey,\n\t\tshiftKey: event.shiftKey\n\t});\n\tif(this.domNodes[0].hasAttribute(\"href\")) {\n\t\tevent.preventDefault();\n\t}\n\tevent.stopPropagation();\n\treturn false;\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.linkClasses = this.getAttribute(\"class\");\n\tthis.overrideClasses = this.getAttribute(\"overrideClass\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.draggable = this.getAttribute(\"draggable\",\"yes\");\n\tthis.linkTag = this.getAttribute(\"tag\",\"a\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\tthis.hideMissingLinks = (this.getVariable(\"tv-show-missing-links\") || \"yes\") === \"no\";\n\t// Make the child widgets\n\tvar templateTree;\n\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\ttemplateTree = this.parseTreeNode.children;\n\t} else {\n\t\t// Default template is a link to the title\n\t\ttemplateTree = [{type: \"text\", text: this.to}];\n\t}\n\tthis.makeChildWidgets(templateTree);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\"aria-label\"] || changedAttributes.tooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/linkcatcher.js": {
"title": "$:/core/modules/widgets/linkcatcher.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/linkcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nLinkcatcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\tthis.catchActions = this.getAttribute(\"actions\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n\t// When executing actions we avoid trapping navigate events, so that we don't trigger ourselves recursively\n\tthis.executingActions = false;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n/*\nHandle a tm-navigate event\n*/\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\n\tif(!this.executingActions) {\n\t\t// Execute the actions\n\t\tif(this.catchTo) {\n\t\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t\t}\n\t\tif(this.catchMessage && this.parentWidget) {\n\t\t\tthis.parentWidget.dispatchEvent({\n\t\t\t\ttype: this.catchMessage,\n\t\t\t\tparam: event.navigateTo,\n\t\t\t\tnavigateTo: event.navigateTo\n\t\t\t});\n\t\t}\n\t\tif(this.catchSet) {\n\t\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t\t}\n\t\tif(this.catchActions) {\n\t\t\tthis.executingActions = true;\n\t\t\tthis.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo});\n\t\t\tthis.executingActions = false;\n\t\t}\n\t} else {\n\t\t// This is a navigate event generated by the actions of this linkcatcher, so we don't trap it again, but just pass it to the parent\n\t\tthis.parentWidget.dispatchEvent({\n\t\t\ttype: \"tm-navigate\",\n\t\t\tparam: event.navigateTo,\n\t\t\tnavigateTo: event.navigateTo\n\t\t});\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/list.js": {
"title": "$:/core/modules/widgets/list.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/list.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar ListWidget = function(parseTreeNode,options) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(this.storyViewName && !StoryView) {\n\t\tStoryView = this.storyViews[\"classic\"];\n\t}\n\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\n\t\tthis.storyview = new StoryView(this);\n\t} else {\n\t\tthis.storyview = null;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function() {\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this;\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n\t// Clear the last history\n\tthis.history = [];\n};\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\treturn this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar emptyMessage = this.getAttribute(\"emptyMessage\",\"\"),\n\t\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\treturn {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tresult;\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshStart) {\n\t\tthis.storyview.refreshStart(changedTiddlers,changedAttributes);\n\t}\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\tresult = true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tresult = this.handleListChanges(changedTiddlers);\n\t\t// Handle any changes to the history stack\n\t\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\n\t\t\tthis.handleHistoryChanges();\n\t\t}\n\t}\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshEnd) {\n\t\tthis.storyview.refreshEnd(changedTiddlers,changedAttributes);\n\t}\n\treturn result;\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerDataCached(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// Cycle through the list, inserting and removing list items as needed\n\t\tvar hasRefreshed = false;\n\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\tif(index === undefined) {\n\t\t\t\t// The list item must be inserted\n\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\thasRefreshed = true;\n\t\t\t} else {\n\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t}\n\t\t\t\t// Refresh the item we're reusing\n\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n})();",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/macrocall.js": {
"title": "$:/core/modules/widgets/macrocall.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/macrocall.js\ntype: application/javascript\nmodule-type: widget\n\nMacrocall widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MacroCallWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMacroCallWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMacroCallWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMacroCallWidget.prototype.execute = function() {\n\t// Get the parse type if specified\n\tthis.parseType = this.getAttribute(\"$type\",\"text/vnd.tiddlywiki\");\n\tthis.renderOutput = this.getAttribute(\"$output\",\"text/html\");\n\t// Merge together the parameters specified in the parse tree with the specified attributes\n\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparams.push({name: name, value: attribute});\t\t\t\n\t\t}\n\t});\n\t// Get the macro value\n\tvar macroName = this.parseTreeNode.name || this.getAttribute(\"$name\"),\n\t\tvariableInfo = this.getVariableInfo(macroName,{params: params}),\n\t\ttext = variableInfo.text,\n\t\tparseTreeNodes;\n\t// Are we rendering to HTML?\n\tif(this.renderOutput === \"text/html\") {\n\t\t// If so we'll return the parsed macro\n\t\tvar parser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\tparseTreeNodes = parser ? parser.tree : [];\n\t\t// Wrap the parse tree in a vars widget assigning the parameters to variables named \"__paramname__\"\n\t\tvar attributes = {};\n\t\t$tw.utils.each(variableInfo.params,function(param) {\n\t\t\tvar name = \"__\" + param.name + \"__\";\n\t\t\tattributes[name] = {\n\t\t\t\tname: name,\n\t\t\t\ttype: \"string\",\n\t\t\t\tvalue: param.value\n\t\t\t};\n\t\t});\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"vars\",\n\t\t\tattributes: attributes,\n\t\t\tchildren: parseTreeNodes\n\t\t}];\n\t} else {\n\t\t// Otherwise, we'll render the text\n\t\tvar plainText = this.wiki.renderText(\"text/plain\",this.parseType,text,{parentWidget: this});\n\t\tparseTreeNodes = [{type: \"text\", text: plainText}];\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\t// Rerender ourselves\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.macrocall = MacroCallWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/navigator.js": {
"title": "$:/core/modules/widgets/navigator.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"},\n\t\t{type: \"tm-fold-tiddler\", handler: \"handleFoldTiddlerEvent\"},\n\t\t{type: \"tm-fold-other-tiddlers\", handler: \"handleFoldOtherTiddlersEvent\"},\n\t\t{type: \"tm-fold-all-tiddlers\", handler: \"handleFoldAllTiddlersEvent\"},\n\t\t{type: \"tm-unfold-all-tiddlers\", handler: \"handleUnfoldAllTiddlersEvent\"},\n\t\t{type: \"tm-rename-tiddler\", handler: \"handleRenameTiddlerEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\tthis.setVariable(\"tv-story-list\",this.storyTitle);\n\tthis.setVariable(\"tv-history-list\",this.historyTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tif(this.storyTitle) {\n\t\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t\t{title: this.storyTitle},\n\t\t\tstoryTiddler,\n\t\t\t{list: storyList}\n\t\t));\t\t\n\t}\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tif(storyList) {\n\t\tvar p = storyList.indexOf(title);\n\t\twhile(p !== -1) {\n\t\t\tstoryList.splice(p,1);\n\t\t\tp = storyList.indexOf(title);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tif(storyList) {\n\t\tvar pos = storyList.indexOf(oldTitle);\n\t\tif(pos !== -1) {\n\t\t\tstoryList[pos] = newTitle;\n\t\t\tdo {\n\t\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\t\tif(pos !== -1) {\n\t\t\t\t\tstoryList.splice(pos,1);\n\t\t\t\t}\n\t\t\t} while(pos !== -1);\n\t\t} else {\n\t\t\tstoryList.splice(0,0,newTitle);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tif(this.storyTitle) {\n\t\tthis.wiki.addToStory(title,fromTitle,this.storyTitle,{\n\t\t\topenLinkFromInsideRiver: this.getAttribute(\"openLinkFromInsideRiver\",\"top\"),\n\t\t\topenLinkFromOutsideRiver: this.getAttribute(\"openLinkFromOutsideRiver\",\"top\")\n\t\t});\n\t}\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.wiki.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-navigating\",event);\n\tif(event.navigateTo) {\n\t\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\t\tif(!event.navigateSuppressNavigation) {\n\t\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t\t}\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar editTiddler = $tw.hooks.invokeHook(\"th-editing-tiddler\",event);\n\tif(!editTiddler) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title);\n\t// Update the story and history if required\n\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\tvar draftTitle = draftTiddler.fields.title,\n\t\t\tstoryList = this.getStoryList();\n\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\tthis.saveStoryList(storyList);\n\t\treturn false;\n\t}\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler ? tiddler.fields[\"draft.of\"] : \"\",\n\t\toriginalTiddler = originalTitle ? this.wiki.getTiddler(originalTitle) : undefined,\n\t\tconfirmationTitle;\n\tif(!tiddler) {\n\t\treturn false;\n\t}\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tif(originalTiddler) {\n\t\t\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",originalTiddler);\n\t\t}\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Invoke the hook function and delete this tiddler\n\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",tiddler);\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler(\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\treturn this.wiki.generateDraftTitle(title);\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Create the new tiddler and pass it through the th-saving-tiddler hook\n\t\t\t\tvar newTiddler = new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields());\n\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-saving-tiddler\",newTiddler);\n\t\t\t\tthis.wiki.addTiddler(newTiddler);\n\t\t\t\t// If enabled, relink references to renamed tiddler\n\t\t\t\tvar shouldRelink = this.getAttribute(\"relinkOnRename\",\"no\").toLowerCase().trim() === \"yes\";\n\t\t\t\tif(isRename && shouldRelink && this.wiki.tiddlerExists(draftOf)) {\nconsole.log(\"Relinking '\" + draftOf + \"' to '\" + draftTitle + \"'\");\n\t\t\t\t\tthis.wiki.relinkTiddler(draftOf,draftTitle);\n\t\t\t\t}\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// #2381 always remove new title & old\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\tthis.removeTitleFromStory(storyList,draftOf);\n\t\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-cancelling-tiddler\", event);\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"];\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\tif(originalTiddler) {\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t\t} else {\n\t\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\t}\n\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-new-tiddler\", event);\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Make a copy of the additional fields excluding any blank ones\n\tvar filteredAdditionalFields = $tw.utils.extend({},additionalFields);\n\tObject.keys(filteredAdditionalFields).forEach(function(fieldName) {\n\t\tif(filteredAdditionalFields[fieldName] === \"\") {\n\t\t\tdelete filteredAdditionalFields[fieldName];\n\t\t}\n\t});\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags);\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\texistingTiddler,\n\t\tfilteredAdditionalFields,\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList && storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tif(slot === -1) {\n\t\t\tslot = this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\" ? storyList.length - 1 : slot;\n\t\t}\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList && storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTiddler = this.wiki.getTiddler(IMPORT_TITLE),\n\t\timportData = this.wiki.getTiddlerData(IMPORT_TITLE,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: IMPORT_TITLE,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\ttiddlerFields.title = $tw.utils.trim(tiddlerFields.title);\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tif(this.getVariable(\"tv-auto-open-on-import\") !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList && storyList.indexOf(IMPORT_TITLE) === -1) {\n\t\t\tstoryList.unshift(IMPORT_TITLE);\n\t\t}\n\t\t// And to history\n\t\thistory.push(IMPORT_TITLE);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\n\t}\n\treturn false;\n};\n\n//\nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push($tw.language.getString(\"Import/Imported/Hint\") + \"\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\t\t\ttiddler = $tw.hooks.invokeHook(\"th-importing-tiddler\",tiddler);\n\t\t\tself.wiki.addTiddler(tiddler);\n\t\t\timportReport.push(\"# [[\" + tiddlerFields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: event.param,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([event.param]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {};\n\tif(paramObject.foldedState) {\n\t\tvar foldedState = this.wiki.getTiddlerText(paramObject.foldedState,\"show\") === \"show\" ? \"hide\" : \"show\";\n\t\tthis.wiki.setText(paramObject.foldedState,\"text\",null,foldedState);\n\t}\n};\n\nNavigatorWidget.prototype.handleFoldOtherTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,event.param === title ? \"show\" : \"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleFoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix || \"$:/state/folded/\";\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"show\");\n\t});\n};\n\nNavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {},\n\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\tto = paramObject.to;\n\tthis.wiki.renameTiddler(from,to);\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/password.js": {
"title": "$:/core/modules/widgets/password.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/password.js\ntype: application/javascript\nmodule-type: widget\n\nPassword widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar PasswordWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nPasswordWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nPasswordWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the current password\n\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \"\" : \"\";\n\t// Create our element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"password\");\n\tdomNode.setAttribute(\"value\",password);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nPasswordWidget.prototype.handleChangeEvent = function(event) {\n\tvar password = this.domNodes[0].value;\n\treturn $tw.utils.savePassword(this.passwordName,password);\n};\n\n/*\nCompute the internal state of the widget\n*/\nPasswordWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.passwordName = this.getAttribute(\"name\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.password = PasswordWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/qualify.js": {
"title": "$:/core/modules/widgets/qualify.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/qualify.js\ntype: application/javascript\nmodule-type: widget\n\nQualify text to a variable \n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar QualifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nQualifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nQualifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nQualifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.qualifyName = this.getAttribute(\"name\");\n\tthis.qualifyTitle = this.getAttribute(\"title\");\n\t// Set context variable\n\tif(this.qualifyName) {\n\t\tthis.setVariable(this.qualifyName,this.qualifyTitle + \"-\" + this.getStateQualifier());\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nQualifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.title) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.qualify = QualifyWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/radio.js": {
"title": "$:/core/modules/widgets/radio.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nSet a field or index at a given tiddler via radio buttons\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tvar isChecked = this.getValue() === this.radioValue;\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",\n \t\t\"tc-radio \" + this.radioClass + (isChecked ? \" tc-radio-selected\" : \"\")\n \t);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tif(isChecked) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar value,\n\t\ttiddler = this.wiki.getTiddler(this.radioTitle);\n\tif (this.radioIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex);\n\t} else {\n\t\tvalue = tiddler && tiddler.getFieldString(this.radioField);\n\t}\n\treturn value;\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioIndex) {\n\t\tthis.wiki.setText(this.radioTitle,\"\",this.radioIndex,this.radioValue);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\n\t\t\taddition = {};\n\t\taddition[this.radioField] = this.radioValue;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),{title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\n\t}\n};\n\nRadioWidget.prototype.handleChangeEvent = function(event) {\n\tif(this.inputDomNode.checked) {\n\t\tthis.setValue();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRadioWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.radioTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.radioField = this.getAttribute(\"field\",\"text\");\n\tthis.radioIndex = this.getAttribute(\"index\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.radioTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue() === this.radioValue;\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/range.js": {
"title": "$:/core/modules/widgets/range.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/range.js\ntype: application/javascript\nmodule-type: widget\n\nRange widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RangeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRangeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRangeWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"range\");\n\tthis.inputDomNode.setAttribute(\"class\",this.elementClass);\n\tif(this.minValue){\n\t\tthis.inputDomNode.setAttribute(\"min\", this.minValue);\n\t}\n\tif(this.maxValue){\n\t\tthis.inputDomNode.setAttribute(\"max\", this.maxValue);\n\t}\n\tif(this.increment){\n\t\tthis.inputDomNode.setAttribute(\"step\", this.increment);\n\t}\n\tthis.inputDomNode.value = this.getValue();\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\t\t\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.inputDomNode,nextSibling);\n\tthis.domNodes.push(this.inputDomNode);\n};\n\nRangeWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle),\n\t\tfieldName = this.tiddlerField || \"text\",\n\t\tvalue = this.defaultValue;\n\tif(tiddler) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(tiddler,this.tiddlerIndex,this.defaultValue || \"\");\n\t\t} else {\n\t\t\tif($tw.utils.hop(tiddler.fields,fieldName)) {\n\t\t\t\tvalue = tiddler.fields[fieldName] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.defaultValue || \"\";\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nRangeWidget.prototype.handleInputEvent = function(event) {\n\tif(this.getValue() !== this.inputDomNode.value) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,\"\",this.tiddlerIndex,this.inputDomNode.value);\n\t\t} else {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,this.tiddlerField,null,this.inputDomNode.value);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRangeWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.tiddlerField = this.getAttribute(\"field\");\n\tthis.tiddlerIndex = this.getAttribute(\"index\");\n\tthis.minValue = this.getAttribute(\"min\");\n\tthis.maxValue = this.getAttribute(\"max\");\n\tthis.increment = this.getAttribute(\"increment\");\n\tthis.defaultValue = this.getAttribute(\"default\");\n\tthis.elementClass = this.getAttribute(\"class\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRangeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes['min'] || changedAttributes['max'] || changedAttributes['increment'] || changedAttributes[\"default\"] || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.tiddlerTitle]) {\n\t\t\tvar value = this.getValue();\n\t\t\tif(this.inputDomNode.value !== value) {\n\t\t\t\tthis.inputDomNode.value = value;\t\t\t\t\n\t\t\t}\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.range = RangeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/raw.js": {
"title": "$:/core/modules/widgets/raw.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nRaw widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar div = this.document.createElement(\"div\");\n\tdiv.innerHTML=this.parseTreeNode.html;\n\tparent.insertBefore(div,nextSibling);\n\tthis.domNodes.push(div);\t\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.raw = RawWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/reveal.js": {
"title": "$:/core/modules/widgets/reveal.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.revealTag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\n\t\ttag = this.revealTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tvar classes = this[\"class\"].split(\" \") || [];\n\tclasses.push(\"tc-reveal\");\n\tdomNode.className = classes.join(\" \");\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tvar left,top;\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"right\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tleft = this.popup.left + this.popup.width - domNode.offsetWidth;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t\tdefault: // Below\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t}\n\tif(!this.positionAllowNegative) {\n\t\tleft = Math.max(0,left);\n\t\ttop = Math.max(0,top);\n\t}\n\tdomNode.style.left = left + \"px\";\n\tdomNode.style.top = top + \"px\";\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.revealTag = this.getAttribute(\"tag\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis.positionAllowNegative = this.getAttribute(\"positionAllowNegative\") === \"yes\";\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis.style = this.getAttribute(\"style\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTiddlerTitle = this.state;\n\tthis.stateTitle = this.getAttribute(\"stateTitle\");\n\tthis.stateField = this.getAttribute(\"stateField\");\n\tthis.stateIndex = this.getAttribute(\"stateIndex\");\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state,\n\t defaultState = this[\"default\"];\n\tif(this.stateTitle) {\n\t\tvar stateTitleTiddler = this.wiki.getTiddler(this.stateTitle);\n\t\tif(this.stateField) {\n\t\t\tstate = stateTitleTiddler ? stateTitleTiddler.getFieldString(this.stateField) || defaultState : defaultState;\n\t\t} else if(this.stateIndex) {\n\t\t\tstate = stateTitleTiddler ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) || defaultState : defaultState;\n\t\t} else if(stateTitleTiddler) {\n\t\t\tstate = this.wiki.getTiddlerText(this.stateTitle) || defaultState;\n\t\t} else {\n\t\t\tstate = defaultState;\n\t\t}\n\t} else {\n\t\tstate = this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\t}\n\tif(state === null) {\n\t\tstate = this[\"default\"];\n\t}\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.isOpen = this.text === state;\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.isOpen = this.text !== state;\n\t\t\tbreak;\n\t\tcase \"lt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t\tcase \"gt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"lteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"gteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.compareStateText = function(state) {\n\treturn state.localeCompare(this.text,undefined,{numeric: true,sensitivity: \"case\"});\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(state);\n\t// Check if the state matches the location regexp\n\tif(match) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t\t// Get the location\n\t\tthis.popup = {\n\t\t\tleft: parseFloat(match[1]),\n\t\t\ttop: parseFloat(match[2]),\n\t\t\twidth: parseFloat(match[3]),\n\t\t\theight: parseFloat(match[4])\n\t\t};\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes.positionAllowNegative || changedAttributes[\"default\"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar currentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tthis.refreshSelf();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\tvar self = this;\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\t//make sure that the state hasn't changed during the close animation\n\t\t\tself.readState()\n\t\t\tif(!self.isOpen) {\n\t\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t\t\t}\n\t\t}});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/scrollable.js": {
"title": "$:/core/modules/widgets/scrollable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/scrollable.js\ntype: application/javascript\nmodule-type: widget\n\nScrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tthis.scrollIntoView(event.target);\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(window,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/select.js": {
"title": "$:/core/modules/widgets/select.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/select.js\ntype: application/javascript\nmodule-type: widget\n\nSelect widget:\n\n```\n<$select tiddler=\"MyTiddler\" field=\"text\">\n<$list filter=\"[tag[chapter]]\">\n<option value=<<currentTiddler>>>\n<$view field=\"description\"/>\n</option>\n</$list>\n</$select>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SelectWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSelectWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSelectWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tthis.setSelectValue();\n\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n};\n\n/*\nHandle a change event\n*/\nSelectWidget.prototype.handleChangeEvent = function(event) {\n\t// Get the new value and assign it to the tiddler\n\tif(this.selectMultiple == false) {\n\t\tvar value = this.getSelectDomNode().value;\n\t} else {\n\t\tvar value = this.getSelectValues()\n\t\t\t\tvalue = $tw.utils.stringifyList(value);\n\t}\n\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\n\t// Trigger actions\n\tif(this.selectActions) {\n\t\tthis.invokeActionString(this.selectActions,this,event);\n\t}\n};\n\n/*\nIf necessary, set the value of the select element to the current value\n*/\nSelectWidget.prototype.setSelectValue = function() {\n\tvar value = this.selectDefault;\n\t// Get the value\n\tif(this.selectIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex,value);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\n\t\tif(tiddler) {\n\t\t\tif(this.selectField === \"text\") {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.selectTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.selectField);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.selectField === \"title\") {\n\t\t\t\tvalue = this.selectTitle;\n\t\t\t}\n\t\t}\n\t}\n\t// Assign it to the select element if it's different than the current value\n\tif (this.selectMultiple) {\n\t\tvalue = value === undefined ? \"\" : value;\n\t\tvar select = this.getSelectDomNode();\n\t\tvar values = Array.isArray(value) ? value : $tw.utils.parseStringArray(value);\n\t\tfor(var i=0; i < select.children.length; i++){\n\t\t\tselect.children[i].selected = values.indexOf(select.children[i].value) !== -1\n\t\t}\n\t} else {\n\t\tvar domNode = this.getSelectDomNode();\n\t\tif(domNode.value !== value) {\n\t\t\tdomNode.value = value;\n\t\t}\n\t}\n};\n\n/*\nGet the DOM node of the select element\n*/\nSelectWidget.prototype.getSelectDomNode = function() {\n\treturn this.children[0].domNodes[0];\n};\n\n// Return an array of the selected opion values\n// select is an HTML select element\nSelectWidget.prototype.getSelectValues = function() {\n\tvar select, result, options, opt;\n\tselect = this.getSelectDomNode();\n\tresult = [];\n\toptions = select && select.options;\n\tfor (var i=0; i<options.length; i++) {\n\t\topt = options[i];\n\t\tif (opt.selected) {\n\t\t\tresult.push(opt.value || opt.text);\n\t\t}\n\t}\n\treturn result;\n}\n\n/*\nCompute the internal state of the widget\n*/\nSelectWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.selectActions = this.getAttribute(\"actions\");\n\tthis.selectTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.selectField = this.getAttribute(\"field\",\"text\");\n\tthis.selectIndex = this.getAttribute(\"index\");\n\tthis.selectClass = this.getAttribute(\"class\");\n\tthis.selectDefault = this.getAttribute(\"default\");\n\tthis.selectMultiple = this.getAttribute(\"multiple\", false);\n\tthis.selectSize = this.getAttribute(\"size\");\n\tthis.selectTooltip = this.getAttribute(\"tooltip\");\n\t// Make the child widgets\n\tvar selectNode = {\n\t\ttype: \"element\",\n\t\ttag: \"select\",\n\t\tchildren: this.parseTreeNode.children\n\t};\n\tif(this.selectClass) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"class\",this.selectClass);\n\t}\n\tif(this.selectMultiple) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"multiple\",\"multiple\");\n\t}\n\tif(this.selectSize) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"size\",this.selectSize);\n\t}\n\tif(this.selectTooltip) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"title\",this.selectTooltip);\n\t}\n\tthis.makeChildWidgets([selectNode]);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSelectWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// If we're using a different tiddler/field/index then completely refresh ourselves\n\tif(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex || changedAttributes.selectTooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t// If the target tiddler value has changed, just update setting and refresh the children\n\t} else {\n\t\tvar childrenRefreshed = this.refreshChildren(changedTiddlers);\n\t\tif(changedTiddlers[this.selectTitle] || childrenRefreshed) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn childrenRefreshed;\n\t}\n};\n\nexports.select = SelectWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/set.js": {
"title": "$:/core/modules/widgets/set.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/set.js\ntype: application/javascript\nmodule-type: widget\n\nSet variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.setName = this.getAttribute(\"name\",\"currentTiddler\");\n\tthis.setFilter = this.getAttribute(\"filter\");\n\tthis.setSelect = this.getAttribute(\"select\");\n\tthis.setTiddler = this.getAttribute(\"tiddler\");\n\tthis.setSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.setField = this.getAttribute(\"field\");\n\tthis.setIndex = this.getAttribute(\"index\");\n\tthis.setValue = this.getAttribute(\"value\");\n\tthis.setEmptyValue = this.getAttribute(\"emptyValue\");\n\t// Set context variable\n\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,!!this.parseTreeNode.isMacroDefinition);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nGet the value to be assigned\n*/\nSetWidget.prototype.getValue = function() {\n\tvar value = this.setValue;\n\tif(this.setTiddler) {\n\t\tvar tiddler;\n\t\tif(this.setSubTiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.setTiddler,this.setSubTiddler);\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.setTiddler);\t\t\t\n\t\t}\n\t\tif(!tiddler) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t} else if(this.setField) {\n\t\t\tvalue = tiddler.getFieldString(this.setField) || this.setEmptyValue;\n\t\t} else if(this.setIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.setTiddler,this.setIndex,this.setEmptyValue);\n\t\t} else {\n\t\t\tvalue = tiddler.fields.text || this.setEmptyValue ;\n\t\t}\n\t} else if(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(this.setValue == null) {\n\t\t\tvar select;\n\t\t\tif(this.setSelect) {\n\t\t\t\tselect = parseInt(this.setSelect,10);\n\t\t\t}\n\t\t\tif(select !== undefined) {\n\t\t\t\tvalue = results[select] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = $tw.utils.stringifyList(results);\t\t\t\n\t\t\t}\n\t\t}\n\t\tif(results.length === 0 && this.setEmptyValue !== undefined) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t}\n\t} else if(!value && this.setEmptyValue) {\n\t\tvalue = this.setEmptyValue;\n\t}\n\treturn value || \"\";\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.select || changedAttributes.tiddler || (this.setTiddler && changedTiddlers[this.setTiddler]) || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes.emptyValue ||\n\t (this.setFilter && this.getValue() != this.variables[this.setName].value)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.setvariable = SetWidget;\nexports.set = SetWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/text.js": {
"title": "$:/core/modules/widgets/text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/text.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TextNodeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTextNodeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\ttext = text.replace(/\\r/mg,\"\");\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTextNodeWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.text = TextNodeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/tiddler.js": {
"title": "$:/core/modules/widgets/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/tiddler.js\ntype: application/javascript\nmodule-type: widget\n\nTiddler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTiddlerWidget.prototype.execute = function() {\n\tthis.tiddlerState = this.computeTiddlerState();\n\tthis.setVariable(\"currentTiddler\",this.tiddlerState.currentTiddler);\n\tthis.setVariable(\"missingTiddlerClass\",this.tiddlerState.missingTiddlerClass);\n\tthis.setVariable(\"shadowTiddlerClass\",this.tiddlerState.shadowTiddlerClass);\n\tthis.setVariable(\"systemTiddlerClass\",this.tiddlerState.systemTiddlerClass);\n\tthis.setVariable(\"tiddlerTagClasses\",this.tiddlerState.tiddlerTagClasses);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nCompute the tiddler state flags\n*/\nTiddlerWidget.prototype.computeTiddlerState = function() {\n\t// Get our parameters\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Compute the state\n\tvar state = {\n\t\tcurrentTiddler: this.tiddlerTitle || \"\",\n\t\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \"tc-tiddler-exists\" : \"tc-tiddler-missing\",\n\t\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \"tc-tiddler-shadow\" : \"\",\n\t\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \"tc-tiddler-system\" : \"\",\n\t\ttiddlerTagClasses: this.getTagClasses()\n\t};\n\t// Compute a simple hash to make it easier to detect changes\n\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\n\treturn state;\n};\n\n/*\nCreate a string of CSS classes derived from the tags of the current tiddler\n*/\nTiddlerWidget.prototype.getTagClasses = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\tif(tiddler) {\n\t\tvar tags = [];\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\ttags.push(\"tc-tagged-\" + encodeURIComponent(tag));\n\t\t});\n\t\treturn tags.join(\" \");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tnewTiddlerState = this.computeTiddlerState();\n\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.tiddler = TiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/transclude.js": {
"title": "$:/core/modules/widgets/transclude.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/transclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.transcludeField = this.getAttribute(\"field\");\n\tthis.transcludeIndex = this.getAttribute(\"index\");\n\tthis.transcludeMode = this.getAttribute(\"mode\");\n\t// Parse the text reference\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\tvar parser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler\n\t\t\t\t\t\t}),\n\t\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Set context variables for recursion detection\n\tvar recursionMarker = this.makeRecursionMarker();\n\tthis.setVariable(\"transclusion\",recursionMarker);\n\t// Check for recursion\n\tif(parser) {\n\t\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: $tw.language.getString(\"Error/RecursiveTransclusion\")}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/vars.js": {
"title": "$:/core/modules/widgets/vars.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/vars.js\ntype: application/javascript\nmodule-type: widget\n\nThis widget allows multiple variables to be set in one go:\n\n```\n\\define helloworld() Hello world!\n<$vars greeting=\"Hi\" me={{!!title}} sentence=<<helloworld>>>\n <<greeting>>! I am <<me>> and I say: <<sentence>>\n</$vars>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar VarsWidget = function(parseTreeNode,options) {\n\t// Call the constructor\n\tWidget.call(this);\n\t// Initialise\t\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nVarsWidget.prototype = Object.create(Widget.prototype);\n\n/*\nRender this widget into the DOM\n*/\nVarsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nVarsWidget.prototype.execute = function() {\n\t// Parse variables\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(val,key) {\n\t\tif(key.charAt(0) !== \"$\") {\n\t\t\tself.setVariable(key,val);\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nVarsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"vars\"] = VarsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/view.js": {
"title": "$:/core/modules/widgets/view.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/view.js\ntype: application/javascript\nmodule-type: widget\n\nView widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ViewWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nViewWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nViewWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.text) {\n\t\tvar textNode = this.document.createTextNode(this.text);\n\t\tparent.insertBefore(textNode,nextSibling);\n\t\tthis.domNodes.push(textNode);\n\t} else {\n\t\tthis.makeChildWidgets();\n\t\tthis.renderChildren(parent,nextSibling);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nViewWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.viewTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.viewSubtiddler = this.getAttribute(\"subtiddler\");\n\tthis.viewField = this.getAttribute(\"field\",\"text\");\n\tthis.viewIndex = this.getAttribute(\"index\");\n\tthis.viewFormat = this.getAttribute(\"format\",\"text\");\n\tthis.viewTemplate = this.getAttribute(\"template\",\"\");\n\tthis.viewMode = this.getAttribute(\"mode\",\"block\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"plainwikified\":\n\t\t\tthis.text = this.getValueAsPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencodedplainwikified\":\n\t\t\tthis.text = this.getValueAsHtmlEncodedPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencoded\":\n\t\t\tthis.text = this.getValueAsHtmlEncoded();\n\t\t\tbreak;\n\t\tcase \"urlencoded\":\n\t\t\tthis.text = this.getValueAsUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"doubleurlencoded\":\n\t\t\tthis.text = this.getValueAsDoubleUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"date\":\n\t\t\tthis.text = this.getValueAsDate(this.viewTemplate);\n\t\t\tbreak;\n\t\tcase \"relativedate\":\n\t\t\tthis.text = this.getValueAsRelativeDate();\n\t\t\tbreak;\n\t\tcase \"stripcomments\":\n\t\t\tthis.text = this.getValueAsStrippedComments();\n\t\t\tbreak;\n\t\tcase \"jsencoded\":\n\t\t\tthis.text = this.getValueAsJsEncoded();\n\t\t\tbreak;\n\t\tdefault: // \"text\"\n\t\t\tthis.text = this.getValueAsText();\n\t\t\tbreak;\n\t}\n};\n\n/*\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\n*/\n\n/*\nRetrieve the value of the widget. Options are:\nasString: Optionally return the value as a string\n*/\nViewWidget.prototype.getValue = function(options) {\n\toptions = options || {};\n\tvar value = options.asString ? \"\" : undefined;\n\tif(this.viewIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\n\t} else {\n\t\tvar tiddler;\n\t\tif(this.viewSubtiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\t\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.viewTitle);\n\t\t}\n\t\tif(tiddler) {\n\t\t\tif(this.viewField === \"text\" && !this.viewSubtiddler) {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.viewTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\n\t\t\t\t\tif(options.asString) {\n\t\t\t\t\t\tvalue = tiddler.getFieldString(this.viewField);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = tiddler.fields[this.viewField];\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.viewField === \"title\") {\n\t\t\t\tvalue = this.viewTitle;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nViewWidget.prototype.getValueAsText = function() {\n\treturn this.getValue({asString: true});\n};\n\nViewWidget.prototype.getValueAsHtmlWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsPlainWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsHtmlEncodedPlainWikified = function(mode) {\n\treturn $tw.utils.htmlEncode(this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t}));\n};\n\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\n\treturn $tw.utils.htmlEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn encodeURIComponent(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn encodeURIComponent(encodeURIComponent(this.getValueAsText()));\n};\n\nViewWidget.prototype.getValueAsDate = function(format) {\n\tformat = format || \"YYYY MM DD 0hh:0mm\";\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.formatDateString(value,format);\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsStrippedComments = function() {\n\tvar lines = this.getValueAsText().split(\"\\n\"),\n\t\tout = [];\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar text = lines[line];\n\t\tif(!/^\\s*\\/\\/#/.test(text)) {\n\t\t\tout.push(text);\n\t\t}\n\t}\n\treturn out.join(\"\\n\");\n};\n\nViewWidget.prototype.getValueAsJsEncoded = function() {\n\treturn $tw.utils.stringify(this.getValueAsText());\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nViewWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.view = ViewWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/widget.js": {
"title": "$:/core/modules/widgets/widget.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/widget.js\ntype: application/javascript\nmodule-type: widget\n\nWidget base class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate a widget object for a parse tree node\n\tparseTreeNode: reference to the parse tree node to be rendered\n\toptions: see below\nOptions include:\n\twiki: mandatory reference to wiki associated with this render tree\n\tparentWidget: optional reference to a parent renderer node for the context chain\n\tdocument: optional document object to use instead of global document\n*/\nvar Widget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\n*/\nWidget.prototype.initialise = function(parseTreeNode,options) {\n\t// Bail if parseTreeNode is undefined, meaning that the widget constructor was called without any arguments so that it can be subclassed\n\tif(parseTreeNode === undefined) {\n\t\treturn;\n\t}\n\toptions = options || {};\n\t// Save widget info\n\tthis.parseTreeNode = parseTreeNode;\n\tthis.wiki = options.wiki;\n\tthis.parentWidget = options.parentWidget;\n\tthis.variablesConstructor = function() {};\n\tthis.variablesConstructor.prototype = this.parentWidget ? this.parentWidget.variables : {};\n\tthis.variables = new this.variablesConstructor();\n\tthis.document = options.document;\n\tthis.attributes = {};\n\tthis.children = [];\n\tthis.domNodes = [];\n\tthis.eventListeners = {};\n\t// Hashmap of the widget classes\n\tif(!this.widgetClasses) {\n\t\t// Get widget classes\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t\t// Process any subclasses\n\t\t$tw.modules.forEachModuleOfType(\"widget-subclass\",function(title,module) {\n\t\t\tif(module.baseClass) {\n\t\t\t\tvar baseClass = Widget.prototype.widgetClasses[module.baseClass];\n\t\t\t\tif(!baseClass) {\n\t\t\t\t\tthrow \"Module '\" + title + \"' is attemping to extend a non-existent base class '\" + module.baseClass + \"'\";\n\t\t\t\t}\n\t\t\t\tvar subClass = module.constructor;\n\t\t\t\tsubClass.prototype = new baseClass();\n\t\t\t\t$tw.utils.extend(subClass.prototype,module.prototype);\n\t\t\t\tWidget.prototype.widgetClasses[module.name || module.baseClass] = subClass;\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSet the value of a context variable\nname: name of the variable\nvalue: value of the variable\nparams: array of {name:, default:} for each parameter\nisMacroDefinition: true if the variable is set via a \\define macro pragma (and hence should have variable substitution performed)\n*/\nWidget.prototype.setVariable = function(name,value,params,isMacroDefinition) {\n\tthis.variables[name] = {value: value, params: params, isMacroDefinition: !!isMacroDefinition};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\n\nReturns an object with the following fields:\n\nparams: array of {name:,value:} of parameters passed to wikitext variables\ntext: text of variable, with parameters properly substituted\n*/\nWidget.prototype.getVariableInfo = function(name,options) {\n\toptions = options || {};\n\tvar actualParams = options.params || [],\n\t\tparentWidget = this.parentWidget;\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(parentWidget && name in parentWidget.variables) {\n\t\tvar variable = parentWidget.variables[name],\n\t\t\tvalue = variable.value,\n\t\t\tparams = this.resolveVariableParameters(variable.params,actualParams);\n\t\t// Substitute any parameters specified in the definition\n\t\t$tw.utils.each(params,function(param) {\n\t\t\tvalue = $tw.utils.replaceString(value,new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(param.name) + \"\\\\$\",\"mg\"),param.value);\n\t\t});\n\t\t// Only substitute variable references if this variable was defined with the \\define pragma\n\t\tif(variable.isMacroDefinition) {\n\t\t\tvalue = this.substituteVariableReferences(value);\t\t\t\n\t\t}\n\t\treturn {\n\t\t\ttext: value,\n\t\t\tparams: params\n\t\t};\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\treturn {\n\t\ttext: this.evaluateMacroModule(name,actualParams,options.defaultValue)\n\t};\n};\n\n/*\nSimplified version of getVariableInfo() that just returns the text\n*/\nWidget.prototype.getVariable = function(name,options) {\n\treturn this.getVariableInfo(name,options).text;\n};\n\nWidget.prototype.resolveVariableParameters = function(formalParams,actualParams) {\n\tformalParams = formalParams || [];\n\tactualParams = actualParams || [];\n\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\tparamInfo, paramValue,\n\t\tresults = [];\n\t// Step through each of the parameters in the macro definition\n\tfor(var p=0; p<formalParams.length; p++) {\n\t\t// Check if we've got a macro call parameter with the same name\n\t\tparamInfo = formalParams[p];\n\t\tparamValue = undefined;\n\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t}\n\t\t}\n\t\t// If not, use the next available anonymous macro call parameter\n\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\tnextAnonParameter++;\n\t\t}\n\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t}\n\t\t// If we've still not got a value, use the default, if any\n\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t// Store the parameter name and value\n\t\tresults.push({name: paramInfo.name, value: paramValue});\n\t}\n\treturn results;\n};\n\nWidget.prototype.substituteVariableReferences = function(text) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn self.getVariable(p1,{defaultValue: \"\"});\n\t});\n};\n\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\n\tif($tw.utils.hop($tw.macros,name)) {\n\t\tvar macro = $tw.macros[name],\n\t\t\targs = [];\n\t\tif(macro.params.length > 0) {\n\t\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\t\tparamInfo, paramValue;\n\t\t\t// Step through each of the parameters in the macro definition\n\t\t\tfor(var p=0; p<macro.params.length; p++) {\n\t\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\t\tparamInfo = macro.params[p];\n\t\t\t\tparamValue = undefined;\n\t\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\t\tnextAnonParameter++;\n\t\t\t\t}\n\t\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t\t}\n\t\t\t\t// If we've still not got a value, use the default, if any\n\t\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t\t// Save the parameter\n\t\t\t\targs.push(paramValue);\n\t\t\t}\n\t\t}\n\t\telse for(var i=0; i<actualParams.length; ++i) {\n\t\t\targs.push(actualParams[i].value);\n\t\t}\n\t\treturn (macro.run.apply(this,args) || \"\").toString();\n\t} else {\n\t\treturn defaultValue;\n\t}\n};\n\n/*\nCheck whether a given context variable value exists in the parent chain\n*/\nWidget.prototype.hasVariable = function(name,value) {\n\tvar node = this;\n\twhile(node) {\n\t\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn false;\n};\n\n/*\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\n*/\nWidget.prototype.getStateQualifier = function(name) {\n\tthis.qualifiers = this.qualifiers || Object.create(null);\n\tname = name || \"transclusion\";\n\tif(this.qualifiers[name]) {\n\t\treturn this.qualifiers[name];\n\t} else {\n\t\tvar output = [],\n\t\t\tnode = this;\n\t\twhile(node && node.parentWidget) {\n\t\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\t\toutput.push(node.getVariable(name));\n\t\t\t}\n\t\t\tnode = node.parentWidget;\n\t\t}\n\t\tvar value = $tw.utils.hashString(output.join(\"\"));\n\t\tthis.qualifiers[name] = value;\n\t\treturn value;\n\t}\n};\n\n/*\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed\n*/\nWidget.prototype.computeAttributes = function() {\n\tvar changedAttributes = {},\n\t\tself = this,\n\t\tvalue;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(attribute.type === \"filtered\") {\n\t\t\tvalue = self.wiki.filterTiddlers(attribute.filter,self)[0] || \"\";\n\t\t} else if(attribute.type === \"indirect\") {\n\t\t\tvalue = self.wiki.getTextReference(attribute.textReference,\"\",self.getVariable(\"currentTiddler\"));\n\t\t} else if(attribute.type === \"macro\") {\n\t\t\tvalue = self.getVariable(attribute.value.name,{params: attribute.value.params});\n\t\t} else { // String attribute\n\t\t\tvalue = attribute.value;\n\t\t}\n\t\t// Check whether the attribute has changed\n\t\tif(self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\n/*\nCheck for the presence of an attribute\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nGet the value of an attribute\n*/\nWidget.prototype.getAttribute = function(name,defaultText) {\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\treturn this.attributes[name];\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nAssign the computed attributes of the widget to a domNode\noptions include:\nexcludeEventAttributes: ignores attributes whose name begins with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(v,a) {\n\t\t// Check exclusions\n\t\tif(options.excludeEventAttributes && a.substr(0,2) === \"on\") {\n\t\t\tv = undefined;\n\t\t}\n\t\tif(v !== undefined) {\n\t\t\tvar b = a.split(\":\");\n\t\t\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\n\t\t\ttry {\n\t\t\t\tif (b.length == 2 && b[0] == \"xlink\"){\n\t\t\t\t\tdomNode.setAttributeNS(\"http://www.w3.org/1999/xlink\",b[1],v);\n\t\t\t\t} else {\n\t\t\t\t\tdomNode.setAttributeNS(null,a,v);\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes) {\n\tthis.children = [];\n\tvar self = this;\n\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\tself.children.push(self.makeChildWidget(childNode));\n\t});\n};\n\n/*\nConstruct the widget object for a parse tree node\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode) {\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tvariables: {},\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\tvar children = this.children;\n\tfor(var i = 0; i < children.length; i++) {\n\t\tchildren[i].render(parent,nextSibling);\n\t};\n};\n\n/*\nAdd a list of event listeners from an array [{type:,handler:},...]\n*/\nWidget.prototype.addEventListeners = function(listeners) {\n\tvar self = this;\n\t$tw.utils.each(listeners,function(listenerInfo) {\n\t\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\n\t});\n};\n\n/*\nAdd an event listener\n*/\nWidget.prototype.addEventListener = function(type,handler) {\n\tvar self = this;\n\tif(typeof handler === \"string\") { // The handler is a method name on this widget\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn self[handler].call(self,event);\n\t\t};\n\t} else { // The handler is a function\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn handler.call(self,event);\n\t\t};\n\t}\n};\n\n/*\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\n*/\nWidget.prototype.dispatchEvent = function(event) {\n\t// Dispatch the event if this widget handles it\n\tvar listener = this.eventListeners[event.type];\n\tif(listener) {\n\t\t// Don't propagate the event if the listener returned false\n\t\tif(!listener(event)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Dispatch the event to the parent widget\n\tif(this.parentWidget) {\n\t\treturn this.parentWidget.dispatchEvent(event);\n\t}\n\treturn true;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nRebuild a previously rendered widget\n*/\nWidget.prototype.refreshSelf = function() {\n\tvar nextSibling = this.findNextSiblingDomNode();\n\tthis.removeChildDomNodes();\n\tthis.render(this.parentDomNode,nextSibling);\n};\n\n/*\nRefresh all the children of a widget\n*/\nWidget.prototype.refreshChildren = function(changedTiddlers) {\n\tvar children = this.children,\n\t\trefreshed = false;\n\tfor (var i = 0; i < children.length; i++) {\n\t\trefreshed = children[i].refresh(changedTiddlers) || refreshed;\n\t}\n\treturn refreshed;\n};\n\n/*\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\n*/\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\n\t// Refer to this widget by its index within its parents children\n\tvar parent = this.parentWidget,\n\t\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\nif(index === -1) {\n\tthrow \"node not found in parents children\";\n}\n\t// Look for a DOM node in the later siblings\n\twhile(++index < parent.children.length) {\n\t\tvar domNode = parent.children[index].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\t// Go back and look for later siblings of our parent if it has the same parent dom node\n\tvar grandParent = parent.parentWidget;\n\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\n\t\tindex = grandParent.children.indexOf(parent);\n\t\tif(index !== -1) {\n\t\t\treturn parent.findNextSiblingDomNode(index);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nFind the first DOM node generated by a widget or its children\n*/\nWidget.prototype.findFirstDomNode = function() {\n\t// Return the first dom node of this widget, if we've got one\n\tif(this.domNodes.length > 0) {\n\t\treturn this.domNodes[0];\n\t}\n\t// Otherwise, recursively call our children\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar domNode = this.children[t].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRemove any DOM nodes created by this widget or its children\n*/\nWidget.prototype.removeChildDomNodes = function() {\n\t// If this widget has directly created DOM nodes, delete them and exit. This assumes that any child widgets are contained within the created DOM nodes, which would normally be the case\n\tif(this.domNodes.length > 0) {\n\t\t$tw.utils.each(this.domNodes,function(domNode) {\n\t\t\tdomNode.parentNode.removeChild(domNode);\n\t\t});\n\t\tthis.domNodes = [];\n\t} else {\n\t\t// Otherwise, ask the child widgets to delete their DOM nodes\n\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\tchildWidget.removeChildDomNodes();\n\t\t});\n\t}\n};\n\n/*\nInvoke the action widgets that are descendents of the current widget.\n*/\nWidget.prototype.invokeActions = function(triggeringWidget,event) {\n\tvar handled = false;\n\t// For each child widget\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar child = this.children[t];\n\t\t// Invoke the child if it is an action widget\n\t\tif(child.invokeAction) {\n\t\t\tchild.refreshSelf();\n\t\t\tif(child.invokeAction(triggeringWidget,event)) {\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\t\t// Propagate through through the child if it permits it\n\t\tif(child.allowActionPropagation() && child.invokeActions(triggeringWidget,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\n/*\nInvoke the action widgets defined in a string\n*/\nWidget.prototype.invokeActionString = function(actions,triggeringWidget,event,variables) {\n\tactions = actions || \"\";\n\tvar parser = this.wiki.parseText(\"text/vnd.tiddlywiki\",actions,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document\n\t\t}),\n\t\twidgetNode = this.wiki.makeWidget(parser,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document,\n\t\t\tvariables: variables\n\t\t});\n\tvar container = this.document.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn widgetNode.invokeActions(this,event);\n};\n\nWidget.prototype.allowActionPropagation = function() {\n\treturn true;\n};\n\nexports.widget = Widget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/wikify.js": {
"title": "$:/core/modules/widgets/wikify.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/wikify.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to wikify text into a variable\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar WikifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nWikifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nWikifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWikifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.wikifyName = this.getAttribute(\"name\");\n\tthis.wikifyText = this.getAttribute(\"text\");\n\tthis.wikifyType = this.getAttribute(\"type\");\n\tthis.wikifyMode = this.getAttribute(\"mode\",\"block\");\n\tthis.wikifyOutput = this.getAttribute(\"output\",\"text\");\n\t// Create the parse tree\n\tthis.wikifyParser = this.wiki.parseText(this.wikifyType,this.wikifyText,{\n\t\t\tparseAsInline: this.wikifyMode === \"inline\"\n\t\t});\n\t// Create the widget tree \n\tthis.wikifyWidgetNode = this.wiki.makeWidget(this.wikifyParser,{\n\t\t\tdocument: $tw.fakeDocument,\n\t\t\tparentWidget: this\n\t\t});\n\t// Render the widget tree to the container\n\tthis.wikifyContainer = $tw.fakeDocument.createElement(\"div\");\n\tthis.wikifyWidgetNode.render(this.wikifyContainer,null);\n\tthis.wikifyResult = this.getResult();\n\t// Set context variable\n\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nReturn the result string\n*/\nWikifyWidget.prototype.getResult = function() {\n\tvar result;\n\tswitch(this.wikifyOutput) {\n\t\tcase \"text\":\n\t\t\tresult = this.wikifyContainer.textContent;\n\t\t\tbreak;\n\t\tcase \"formattedtext\":\n\t\t\tresult = this.wikifyContainer.formattedTextContent;\n\t\t\tbreak;\n\t\tcase \"html\":\n\t\t\tresult = this.wikifyContainer.innerHTML;\n\t\t\tbreak;\n\t\tcase \"parsetree\":\n\t\t\tresult = JSON.stringify(this.wikifyParser.tree,0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t\tcase \"widgettree\":\n\t\t\tresult = JSON.stringify(this.getWidgetTree(),0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t}\n\treturn result;\n};\n\n/*\nReturn a string of the widget tree\n*/\nWikifyWidget.prototype.getWidgetTree = function() {\n\tvar copyNode = function(widgetNode,resultNode) {\n\t\t\tvar type = widgetNode.parseTreeNode.type;\n\t\t\tresultNode.type = type;\n\t\t\tswitch(type) {\n\t\t\t\tcase \"element\":\n\t\t\t\t\tresultNode.tag = widgetNode.parseTreeNode.tag;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tresultNode.text = widgetNode.parseTreeNode.text;\n\t\t\t\t\tbreak;\t\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.attributes || {}).length > 0) {\n\t\t\t\tresultNode.attributes = {};\n\t\t\t\t$tw.utils.each(widgetNode.attributes,function(attr,attrName) {\n\t\t\t\t\tresultNode.attributes[attrName] = widgetNode.getAttribute(attrName);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.children || {}).length > 0) {\n\t\t\t\tresultNode.children = [];\n\t\t\t\t$tw.utils.each(widgetNode.children,function(widgetChildNode) {\n\t\t\t\t\tvar node = {};\n\t\t\t\t\tresultNode.children.push(node);\n\t\t\t\t\tcopyNode(widgetChildNode,node);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresults = {};\n\tcopyNode(this.wikifyWidgetNode,results);\n\treturn results;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWikifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh ourselves entirely if any of our attributes have changed\n\tif(changedAttributes.name || changedAttributes.text || changedAttributes.type || changedAttributes.mode || changedAttributes.output) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\t// Refresh the widget tree\n\t\tif(this.wikifyWidgetNode.refresh(changedTiddlers)) {\n\t\t\t// Check if there was any change\n\t\t\tvar result = this.getResult();\n\t\t\tif(result !== this.wikifyResult) {\n\t\t\t\t// If so, save the change\n\t\t\t\tthis.wikifyResult = result;\n\t\t\t\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t\t\t\t// Refresh each of our child widgets\n\t\t\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\t\t\tchildWidget.refreshSelf();\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t// Just refresh the children\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.wikify = WikifyWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/wiki-bulkops.js": {
"title": "$:/core/modules/wiki-bulkops.js",
"text": "/*\\\ntitle: $:/core/modules/wiki-bulkops.js\ntype: application/javascript\nmodule-type: wikimethod\n\nBulk tiddler operations such as rename.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRename a tiddler, and relink any tags or lists that reference it.\n*/\nfunction renameTiddler(fromTitle,toTitle,options) {\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\t// Rename the tiddler itself\n\t\tvar oldTiddler = this.getTiddler(fromTitle),\n\t\t\tnewTiddler = new $tw.Tiddler(oldTiddler,{title: toTitle},this.getModificationFields());\n\t\tnewTiddler = $tw.hooks.invokeHook(\"th-renaming-tiddler\",newTiddler,oldTiddler);\n\t\tthis.addTiddler(newTiddler);\n\t\tthis.deleteTiddler(fromTitle);\n\t\t// Rename any tags or lists that reference it\n\t\tthis.relinkTiddler(fromTitle,toTitle,options)\n\t}\n}\n\n/*\nRelink any tags or lists that reference a given tiddler\n*/\nfunction relinkTiddler(fromTitle,toTitle,options) {\n\tvar self = this;\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\tthis.each(function(tiddler,title) {\n\t\t\tvar type = tiddler.fields.type || \"\";\n\t\t\t// Don't touch plugins or JavaScript modules\n\t\t\tif(!tiddler.fields[\"plugin-type\"] && type !== \"application/javascript\") {\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,\n\t\t\t\t\tlist = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,\n\t\t\t\t\tisModified = false;\n\t\t\t\tif(!options.dontRenameInTags) {\n\t\t\t\t\t// Rename tags\n\t\t\t\t\t$tw.utils.each(tags,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming tag '\" + tags[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\ttags[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(!options.dontRenameInLists) {\n\t\t\t\t\t// Rename lists\n\t\t\t\t\t$tw.utils.each(list,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming list item '\" + list[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\tlist[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(isModified) {\n\t\t\t\t\tvar newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields())\n\t\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-relinking-tiddler\",newTiddler,tiddler);\n\t\t\t\t\tself.addTiddler(newTiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\nexports.renameTiddler = renameTiddler;\nexports.relinkTiddler = relinkTiddler;\n\n})();\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/core/modules/wiki.js": {
"title": "$:/core/modules/wiki.js",
"text": "/*\\\ntitle: $:/core/modules/wiki.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\n* `eventListeners` is a hashmap by type of arrays of listener functions\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\n\tmodified: true/false\n\tdeleted: true/false\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar USER_NAME_TITLE = \"$:/status/UserName\",\n\tTIMESTAMP_DISABLE_TITLE = \"$:/config/TimestampDisable\";\n\n/*\nAdd available indexers to this wiki\n*/\nexports.addIndexersToWiki = function() {\n\tvar self = this;\n\t$tw.utils.each($tw.modules.applyMethods(\"indexer\"),function(Indexer,name) {\n\t\tself.addIndexer(new Indexer(self),name);\n\t});\n};\n\n/*\nGet the value of a text reference. Text references can have any of these forms:\n\t<tiddlertitle>\n\t<tiddlertitle>!!<fieldname>\n\t!!<fieldname> - specifies a field of the current tiddlers\n\t<tiddlertitle>##<index>\n*/\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tif(tr.field) {\n\t\tvar tiddler = this.getTiddler(title);\n\t\tif(tr.field === \"title\") { // Special case so we can return the title of a non-existent tiddler\n\t\t\treturn title;\n\t\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\treturn tiddler.getFieldString(tr.field);\n\t\t} else {\n\t\t\treturn defaultText;\n\t\t}\n\t} else if(tr.index) {\n\t\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\n\t} else {\n\t\treturn this.getTiddlerText(title,defaultText);\n\t}\n};\n\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tthis.setText(title,tr.field,tr.index,value);\n};\n\nexports.setText = function(title,field,index,value,options) {\n\toptions = options || {};\n\tvar creationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\n\t\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields();\n\t// Check if it is a reference to a tiddler field\n\tif(index) {\n\t\tvar data = this.getTiddlerData(title,Object.create(null));\n\t\tif(value !== undefined) {\n\t\t\tdata[index] = value;\n\t\t} else {\n\t\t\tdelete data[index];\n\t\t}\n\t\tthis.setTiddlerData(title,data,modificationFields);\n\t} else {\n\t\tvar tiddler = this.getTiddler(title),\n\t\t\tfields = {title: title};\n\t\tfields[field || \"text\"] = value;\n\t\tthis.addTiddler(new $tw.Tiddler(creationFields,tiddler,fields,modificationFields));\n\t}\n};\n\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle,tiddler,fields;\n\t// Check if it is a reference to a tiddler\n\tif(tr.title && !tr.field) {\n\t\tthis.deleteTiddler(tr.title);\n\t// Else check for a field reference\n\t} else if(tr.field) {\n\t\ttitle = tr.title || currTiddlerTitle;\n\t\ttiddler = this.getTiddler(title);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\tfields = Object.create(null);\n\t\t\tfields[tr.field] = undefined;\n\t\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t\t}\n\t}\n};\n\nexports.addEventListener = function(type,listener) {\n\tthis.eventListeners = this.eventListeners || {};\n\tthis.eventListeners[type] = this.eventListeners[type] || [];\n\tthis.eventListeners[type].push(listener);\t\n};\n\nexports.removeEventListener = function(type,listener) {\n\tvar listeners = this.eventListeners[type];\n\tif(listeners) {\n\t\tvar p = listeners.indexOf(listener);\n\t\tif(p !== -1) {\n\t\t\tlisteners.splice(p,1);\n\t\t}\n\t}\n};\n\nexports.dispatchEvent = function(type /*, args */) {\n\tvar args = Array.prototype.slice.call(arguments,1),\n\t\tlisteners = this.eventListeners[type];\n\tif(listeners) {\n\t\tfor(var p=0; p<listeners.length; p++) {\n\t\t\tvar listener = listeners[p];\n\t\t\tlistener.apply(listener,args);\n\t\t}\n\t}\n};\n\n/*\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\n\ttitle: Title of tiddler\n\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\n\t\ttrue if the tiddler has been deleted\n*/\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\n\t// Record the touch in the list of changed tiddlers\n\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\n\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\n\tthis.changedTiddlers[title][isDeleted ? \"deleted\" : \"modified\"] = true;\n\t// Increment the change count\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\tthis.changeCount[title]++;\n\t} else {\n\t\tthis.changeCount[title] = 1;\n\t}\n\t// Trigger events\n\tthis.eventListeners = this.eventListeners || {};\n\tif(!this.eventsTriggered) {\n\t\tvar self = this;\n\t\t$tw.utils.nextTick(function() {\n\t\t\tvar changes = self.changedTiddlers;\n\t\t\tself.changedTiddlers = Object.create(null);\n\t\t\tself.eventsTriggered = false;\n\t\t\tif($tw.utils.count(changes) > 0) {\n\t\t\t\tself.dispatchEvent(\"change\",changes);\n\t\t\t}\n\t\t});\n\t\tthis.eventsTriggered = true;\n\t}\n};\n\nexports.getSizeOfTiddlerEventQueue = function() {\n\treturn $tw.utils.count(this.changedTiddlers);\n};\n\nexports.clearTiddlerEventQueue = function() {\n\tthis.changedTiddlers = Object.create(null);\n\tthis.changeCount = Object.create(null);\n};\n\nexports.getChangeCount = function(title) {\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\treturn this.changeCount[title];\n\t} else {\n\t\treturn 0;\n\t}\n};\n\n/*\nGenerate an unused title from the specified base\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar c = 0,\n\t\ttitle = baseTitle;\n\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\ttitle = baseTitle + \n\t\t\t(options.prefix || \" \") + \n\t\t\t(++c);\n\t}\n\treturn title;\n};\n\nexports.isSystemTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/temp/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\"image\") !== -1;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.isBinaryTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.encoding === \"base64\";\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\n*/\nexports.importTiddler = function(tiddler) {\n\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\n\t// Check if we're dealing with a plugin\n\tif(tiddler && tiddler.hasField(\"plugin-type\") && tiddler.hasField(\"version\") && existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t// Reject the incoming plugin if it is older\n\t\tif(!$tw.utils.checkVersions(tiddler.fields.version,existingTiddler.fields.version)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Fall through to adding the tiddler\n\tthis.addTiddler(tiddler);\n\treturn true;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is created\n*/\nexports.getCreationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = {\n\t\t\t\tcreated: new Date()\n\t\t\t},\n\t\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\t\tif(creator) {\n\t\t\tfields.creator = creator;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = Object.create(null),\n\t\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\t\tfields.modified = new Date();\n\t\tif(modifier) {\n\t\t\tfields.modifier = modifier;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a sorted array of tiddler titles. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.getTiddlers = function(options) {\n\toptions = options || Object.create(null);\n\tvar self = this,\n\t\tsortField = options.sortField || \"title\",\n\t\ttiddlers = [], t, titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tif(options.includeSystem || !self.isSystemTiddler(title)) {\n\t\t\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t});\n\ttiddlers.sort(function(a,b) {\n\t\tvar aa = a.fields[sortField].toLowerCase() || \"\",\n\t\t\tbb = b.fields[sortField].toLowerCase() || \"\";\n\t\tif(aa < bb) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(aa > bb) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n\tfor(t=0; t<tiddlers.length; t++) {\n\t\ttitles.push(tiddlers[t].fields.title);\n\t}\n\treturn titles;\n};\n\nexports.countTiddlers = function(excludeTag) {\n\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\n\treturn $tw.utils.count(tiddlers);\n};\n\n/*\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\n*/\nexports.makeTiddlerIterator = function(titles) {\n\tvar self = this;\n\tif(!$tw.utils.isArray(titles)) {\n\t\ttitles = Object.keys(titles);\n\t} else {\n\t\ttitles = titles.slice(0);\n\t}\n\treturn function(callback) {\n\t\ttitles.forEach(function(title) {\n\t\t\tcallback(self.getTiddler(title),title);\n\t\t});\n\t};\n};\n\n/*\nSort an array of tiddler titles by a specified field\n\ttitles: array of titles (sorted in place)\n\tsortField: name of field to sort by\n\tisDescending: true if the sort should be descending\n\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\n*/\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric) {\n\tvar self = this;\n\ttitles.sort(function(a,b) {\n\t\tvar x,y,\n\t\t\tcompareNumbers = function(x,y) {\n\t\t\t\tvar result = \n\t\t\t\t\tisNaN(x) && !isNaN(y) ? (isDescending ? -1 : 1) :\n\t\t\t\t\t!isNaN(x) && isNaN(y) ? (isDescending ? 1 : -1) :\n\t\t\t\t\t\t\t\t\t\t\t(isDescending ? y - x : x - y);\n\t\t\t\treturn result;\n\t\t\t};\n\t\tif(sortField !== \"title\") {\n\t\t\tvar tiddlerA = self.getTiddler(a),\n\t\t\t\ttiddlerB = self.getTiddler(b);\n\t\t\tif(tiddlerA) {\n\t\t\t\ta = tiddlerA.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\ta = \"\";\n\t\t\t}\n\t\t\tif(tiddlerB) {\n\t\t\t\tb = tiddlerB.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\tb = \"\";\n\t\t\t}\n\t\t}\n\t\tx = Number(a);\n\t\ty = Number(b);\n\t\tif(isNumeric && (!isNaN(x) || !isNaN(y))) {\n\t\t\treturn compareNumbers(x,y);\n\t\t} else if(isAlphaNumeric) {\n\t\t\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t} else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else {\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t}\n\t});\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked within the given parse tree\n */\nexports.extractLinks = function(parseTreeRoot) {\n\t// Count up the links\n\tvar links = [],\n\t\tcheckParseTree = function(parseTree) {\n\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcheckParseTree(parseTreeRoot);\n\treturn links;\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinks = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\tif(parser) {\n\t\t\treturn self.extractLinks(parser.tree);\n\t\t}\n\t\treturn [];\n\t});\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbacklinksIndexer = this.getIndexer(\"BacklinksIndexer\"),\n\t\tbacklinks = backlinksIndexer && backlinksIndexer.lookup(targetTitle);\n\n\tif(!backlinks) {\n\t\tbacklinks = [];\n\t\tthis.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self.getTiddlerLinks(title);\n\t\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\t\tbacklinks.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn backlinks;\n};\n\n/*\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\n*/\nexports.getMissingTitles = function() {\n\tvar self = this,\n\t\tmissing = [];\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\n\t\t\t\tmissing.push(link);\n\t\t\t}\n\t\t});\n\t});\n\treturn missing;\n};\n\nexports.getOrphanTitles = function() {\n\tvar self = this,\n\t\torphans = this.getTiddlers();\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tvar p = orphans.indexOf(link);\n\t\t\tif(p !== -1) {\n\t\t\t\torphans.splice(p,1);\n\t\t\t}\n\t\t});\n\t});\n\treturn orphans; // Todo\n};\n\n/*\nRetrieves a list of the tiddler titles that are tagged with a given tag\n*/\nexports.getTiddlersWithTag = function(tag) {\n\t// Try to use the indexer\n\tvar self = this,\n\t\ttagIndexer = this.getIndexer(\"TagIndexer\"),\n\t\tresults = tagIndexer && tagIndexer.subIndexers[3].lookup(tag);\n\tif(!results) {\n\t\t// If not available, perform a manual scan\n\t\tresults = this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\t\tvar tagmap = self.getTagMap();\n\t\t\treturn self.sortByList(tagmap[tag],tag);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nGet a hashmap by tag of arrays of tiddler titles\n*/\nexports.getTagMap = function() {\n\tvar self = this;\n\treturn this.getGlobalCache(\"tagmap\",function() {\n\t\tvar tags = Object.create(null),\n\t\t\tstoreTags = function(tagArray,title) {\n\t\t\t\tif(tagArray) {\n\t\t\t\t\tfor(var index=0; index<tagArray.length; index++) {\n\t\t\t\t\t\tvar tag = tagArray[index];\n\t\t\t\t\t\tif($tw.utils.hop(tags,tag)) {\n\t\t\t\t\t\t\ttags[tag].push(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttags[tag] = [title];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttitle, tiddler;\n\t\t// Collect up all the tags\n\t\tself.eachShadow(function(tiddler,title) {\n\t\t\tif(!self.tiddlerExists(title)) {\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t\t}\n\t\t});\n\t\tself.each(function(tiddler,title) {\n\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t});\n\t\treturn tags;\n\t});\n};\n\n/*\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\n*/\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\n\tfieldName = fieldName || \"list\";\n\tvar titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\tif(list && list.indexOf(targetTitle) !== -1) {\n\t\t\ttitles.push(title);\n\t\t}\n\t});\n\treturn titles;\n};\n\n/*\nSorts an array of tiddler titles according to an ordered list\n*/\nexports.sortByList = function(array,listTitle) {\n\tvar self = this,\n\t\treplacedTitles = Object.create(null);\n\t// Given a title, this function will place it in the correct location\n\t// within titles.\n\tfunction moveItemInList(title) {\n\t\tif(!$tw.utils.hop(replacedTitles, title)) {\n\t\t\treplacedTitles[title] = true;\n\t\t\tvar newPos = -1,\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\tvar beforeTitle = tiddler.fields[\"list-before\"],\n\t\t\t\t\tafterTitle = tiddler.fields[\"list-after\"];\n\t\t\t\tif(beforeTitle === \"\") {\n\t\t\t\t\tnewPos = 0;\n\t\t\t\t} else if(afterTitle === \"\") {\n\t\t\t\t\tnewPos = titles.length;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\t// if this title is placed relative\n\t\t\t\t\t// to another title, make sure that\n\t\t\t\t\t// title is placed before we place\n\t\t\t\t\t// this one.\n\t\t\t\t\tmoveItemInList(beforeTitle);\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\t// Same deal\n\t\t\t\t\tmoveItemInList(afterTitle);\n\t\t\t\t\tnewPos = titles.indexOf(afterTitle);\n\t\t\t\t\tif(newPos >= 0) {\n\t\t\t\t\t\t++newPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If a new position is specified, let's move it\n\t\t\t\tif (newPos !== -1) {\n\t\t\t\t\t// get its current Pos, and make sure\n\t\t\t\t\t// sure that it's _actually_ in the list\n\t\t\t\t\t// and that it would _actually_ move\n\t\t\t\t\t// (#4275) We don't bother calling\n\t\t\t\t\t// indexOf unless we have a new\n\t\t\t\t\t// position to work with\n\t\t\t\t\tvar currPos = titles.indexOf(title);\n\t\t\t\t\tif(currPos >= 0 && newPos !== currPos) {\n\t\t\t\t\t\t// move it!\n\t\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvar list = this.getTiddlerList(listTitle);\n\tif(!array || array.length === 0) {\n\t\treturn [];\n\t} else {\n\t\tvar titles = [], t, title;\n\t\t// First place any entries that are present in the list\n\t\tfor(t=0; t<list.length; t++) {\n\t\t\ttitle = list[t];\n\t\t\tif(array.indexOf(title) !== -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Then place any remaining entries\n\t\tfor(t=0; t<array.length; t++) {\n\t\t\ttitle = array[t];\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Finally obey the list-before and list-after fields of each tiddler in turn\n\t\tvar sortedTitles = titles.slice(0);\n\t\tfor(t=0; t<sortedTitles.length; t++) {\n\t\t\ttitle = sortedTitles[t];\n\t\t\tmoveItemInList(title);\n\t\t}\n\t\treturn titles;\n\t}\n};\n\nexports.getSubTiddler = function(title,subTiddlerTitle) {\n\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerDataCached(title);\n\tif(bundleInfo && bundleInfo.tiddlers) {\n\t\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\n\t\tif(subTiddler) {\n\t\t\treturn new $tw.Tiddler(subTiddler);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRetrieve a tiddler as a JSON string of the fields\n*/\nexports.getTiddlerAsJson = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar fields = Object.create(null);\n\t\t$tw.utils.each(tiddler.fields,function(value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\treturn JSON.stringify(fields);\n\t} else {\n\t\treturn JSON.stringify({title: title});\n\t}\n};\n\nexports.getTiddlersAsJson = function(filter,spaces) {\n\tvar tiddlers = this.filterTiddlers(filter),\n\t\tspaces = (spaces === undefined) ? $tw.config.preferences.jsonSpaces : spaces,\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn JSON.stringify(data,null,spaces);\n};\n\n/*\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\n\napplication/json: the tiddler JSON is parsed into an object\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\n\nOther types currently just return null.\n\ntitleOrTiddler: string tiddler title or a tiddler object\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\n\nNote that the same value is returned for repeated calls for the same tiddler data. The value is frozen to prevent modification; otherwise modifications would be visible to all callers\n*/\nexports.getTiddlerDataCached = function(titleOrTiddler,defaultData) {\n\tvar self = this,\n\t\ttiddler = titleOrTiddler;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler) {\n\t\treturn this.getCacheForTiddler(tiddler.fields.title,\"data\",function() {\n\t\t\t// Return the frozen value\n\t\t\tvar value = self.getTiddlerData(tiddler.fields.title,undefined);\n\t\t\t$tw.utils.deepFreeze(value);\n\t\t\treturn value;\n\t\t}) || defaultData;\n\t} else {\n\t\treturn defaultData;\n\t}\n};\n\n/*\nAlternative, uncached version of getTiddlerDataCached(). The return value can be mutated freely and reused\n*/\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\n\tvar tiddler = titleOrTiddler,\n\t\tdata;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler && tiddler.fields.text) {\n\t\tswitch(tiddler.fields.type) {\n\t\t\tcase \"application/json\":\n\t\t\t\t// JSON tiddler\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(tiddler.fields.text);\n\t\t\t\t} catch(ex) {\n\t\t\t\t\treturn defaultData;\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\treturn $tw.utils.parseFields(tiddler.fields.text);\n\t\t}\n\t}\n\treturn defaultData;\n};\n\n/*\nExtract an indexed field from within a data tiddler\n*/\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\n\tvar data = this.getTiddlerDataCached(titleOrTiddler,Object.create(null)),\n\t\ttext;\n\tif(data && $tw.utils.hop(data,index)) {\n\t\ttext = data[index];\n\t}\n\tif(typeof text === \"string\" || typeof text === \"number\") {\n\t\treturn text.toString();\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \"application/json\" and setting the text to the JSON text of the data.\ntitle: title of tiddler\ndata: object that can be serialised to JSON\nfields: optional hashmap of additional tiddler fields to be set\n*/\nexports.setTiddlerData = function(title,data,fields) {\n\tvar existingTiddler = this.getTiddler(title),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t};\n\tif(existingTiddler && existingTiddler.fields.type === \"application/x-tiddler-dictionary\") {\n\t\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\n\t} else {\n\t\tnewFields.type = \"application/json\";\n\t\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n\t}\n\tthis.addTiddler(new $tw.Tiddler(this.getCreationFields(),existingTiddler,fields,newFields,this.getModificationFields()));\n};\n\n/*\nReturn the content of a tiddler as an array containing each line\n*/\nexports.getTiddlerList = function(title,field,index) {\n\tif(index) {\n\t\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\"\"));\n\t}\n\tfield = field || \"list\";\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\n\t}\n\treturn [];\n};\n\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\nexports.getGlobalCache = function(cacheName,initializer) {\n\tthis.globalCache = this.globalCache || Object.create(null);\n\tif($tw.utils.hop(this.globalCache,cacheName)) {\n\t\treturn this.globalCache[cacheName];\n\t} else {\n\t\tthis.globalCache[cacheName] = initializer();\n\t\treturn this.globalCache[cacheName];\n\t}\n};\n\nexports.clearGlobalCache = function() {\n\tthis.globalCache = Object.create(null);\n};\n\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\n\tthis.caches = this.caches || Object.create(null);\n\tvar caches = this.caches[title];\n\tif(caches && caches[cacheName]) {\n\t\treturn caches[cacheName];\n\t} else {\n\t\tif(!caches) {\n\t\t\tcaches = Object.create(null);\n\t\t\tthis.caches[title] = caches;\n\t\t}\n\t\tcaches[cacheName] = initializer();\n\t\treturn caches[cacheName];\n\t}\n};\n\n// Clear all caches associated with a particular tiddler, or, if the title is null, clear all the caches for all the tiddlers\nexports.clearCache = function(title) {\n\tif(title) {\n\t\tthis.caches = this.caches || Object.create(null);\n\t\tif($tw.utils.hop(this.caches,title)) {\n\t\t\tdelete this.caches[title];\n\t\t}\n\t} else {\n\t\tthis.caches = Object.create(null);\n\t}\n};\n\nexports.initParsers = function(moduleType) {\n\t// Install the parser modules\n\t$tw.Wiki.parsers = {};\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(\"parser\",function(title,module) {\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\n\t\t\t}\n\t\t}\n\t});\n\t// Use the generic binary parser for any binary types not registered so far\n\tif($tw.Wiki.parsers[\"application/octet-stream\"]) {\n\t\tObject.keys($tw.config.contentTypeInfo).forEach(function(type) {\n\t\t\tif(!$tw.utils.hop($tw.Wiki.parsers,type) && $tw.config.contentTypeInfo[type].encoding === \"base64\") {\n\t\t\t\t$tw.Wiki.parsers[type] = $tw.Wiki.parsers[\"application/octet-stream\"];\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n\t_canonical_uri: optional string of the canonical URI of this content\n*/\nexports.parseText = function(type,text,options) {\n\ttext = text || \"\";\n\toptions = options || {};\n\t// Select a parser\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.utils.getFileExtensionInfo(type)) {\n\t\tParser = $tw.Wiki.parsers[$tw.utils.getFileExtensionInfo(type).type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri\n\t});\n};\n\n/*\nParse a tiddler according to its MIME type\n*/\nexports.parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"inlineParseTree\" : \"blockParseTree\",\n\t\ttiddler = this.getTiddler(title),\n\t\tself = this;\n\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\n\t\t\tif(tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t\toptions._canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t}\n\t\t\treturn self.parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\n};\n\nexports.parseTextReference = function(title,field,index,options) {\n\tvar tiddler,text;\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t\tif(field === \"text\" || (!field && !index)) {\n\t\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\t\treturn this.parseTiddler(title,options);\n\t\t}\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\treturn this.parseText(tiddler.fields.type,tiddler.fields.text,options);\t\t\t\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\ttext = title;\n\t\t} else {\n\t\t\tif(!tiddler || !tiddler.hasField(field)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttext = tiddler.fields[field];\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text.toString(),options);\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\ttext = this.extractTiddlerDataItem(tiddler,index,undefined);\n\t\tif(text === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text,options);\n\t}\n};\n\n/*\nMake a widget tree for a parse tree\nparser: parser object\noptions: see below\nOptions include:\ndocument: optional document to use\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.makeWidget = function(parser,options) {\n\toptions = options || {};\n\tvar widgetNode = {\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},\n\t\tcurrWidgetNode = widgetNode;\n\t// Create set variable widgets for each variable\n\t$tw.utils.each(options.variables,function(value,name) {\n\t\tvar setVariableWidget = {\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\tcurrWidgetNode.children = [setVariableWidget];\n\t\tcurrWidgetNode = setVariableWidget;\n\t});\n\t// Add in the supplied parse tree nodes\n\tcurrWidgetNode.children = parser ? parser.tree : [];\n\t// Create the widget\n\treturn new widget.widget(widgetNode,{\n\t\twiki: this,\n\t\tdocument: options.document || $tw.fakeDocument,\n\t\tparentWidget: options.parentWidget\n\t});\n};\n\n/*\nMake a widget tree for transclusion\ntitle: target tiddler title\noptions: as for wiki.makeWidget() plus:\noptions.field: optional field to transclude (defaults to \"text\")\noptions.mode: transclusion mode \"inline\" or \"block\"\noptions.children: optional array of children for the transclude widget\noptions.importVariables: optional importvariables filter string for macros to be included\noptions.importPageMacros: optional boolean; if true, equivalent to passing \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\" to options.importVariables\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTreeDiv = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: []}]},\n\t\tparseTreeImportVariables = {\n\t\t\ttype: \"importvariables\",\n\t\t\tattributes: {\n\t\t\t\tfilter: {\n\t\t\t\t\tname: \"filter\",\n\t\t\t\t\ttype: \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: false,\n\t\t\tchildren: []},\n\t\tparseTreeTransclude = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {\n\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title}},\n\t\t\tisBlock: !options.parseAsInline};\n\tif(options.importVariables || options.importPageMacros) {\n\t\tif(options.importVariables) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = options.importVariables;\n\t\t} else if(options.importPageMacros) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\";\n\t\t}\n\t\tparseTreeDiv.tree[0].children.push(parseTreeImportVariables);\n\t\tparseTreeImportVariables.children.push(parseTreeTransclude);\n\t} else {\n\t\tparseTreeDiv.tree[0].children.push(parseTreeTransclude);\n\t}\n\tif(options.field) {\n\t\tparseTreeTransclude.attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.mode) {\n\t\tparseTreeTransclude.attributes.mode = {type: \"string\", value: options.mode};\n\t}\n\tif(options.children) {\n\t\tparseTreeTransclude.children = options.children;\n\t}\n\treturn $tw.wiki.makeWidget(parseTreeDiv,options);\n};\n\n/*\nParse text in a specified format and render it into another format\n\toutputType: content type for the output\n\ttextType: content type of the input text\n\ttext: input text\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderText = function(outputType,textType,text,options) {\n\toptions = options || {};\n\tvar parser = this.parseText(textType,text,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : container.textContent;\n};\n\n/*\nParse text from a tiddler and render it into another format\n\toutputType: content type for the output\n\ttitle: title of the tiddler to be rendered\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderTiddler = function(outputType,title,options) {\n\toptions = options || {};\n\tvar parser = this.parseTiddler(title,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : (outputType === \"text/plain-formatted\" ? container.formattedTextContent : container.textContent);\n};\n\n/*\nReturn an array of tiddler titles that match a search string\n\ttext: The text string to search for\n\toptions: see below\nOptions available:\n\tsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\n\texclude: An array of tiddler titles to exclude from the search\n\tinvert: If true returns tiddlers that do not contain the specified string\n\tcaseSensitive: If true forces a case sensitive search\n\tfield: If specified, restricts the search to the specified field, or an array of field names\n\tanchored: If true, forces all but regexp searches to be anchored to the start of text\n\texcludeField: If true, the field options are inverted to specify the fields that are not to be searched\n\tThe search mode is determined by the first of these boolean flags to be true\n\t\tliteral: searches for literal string\n\t\twhitespace: same as literal except runs of whitespace are treated as a single space\n\t\tregexp: treats the search term as a regular expression\n\t\twords: (default) treats search string as a list of tokens, and matches if all tokens are found, regardless of adjacency or ordering\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tinvert = !!options.invert;\n\t// Convert the search string into a regexp for each term\n\tvar terms, searchTermsRegExps,\n\t\tflags = options.caseSensitive ? \"\" : \"i\",\n\t\tanchor = options.anchored ? \"^\" : \"\";\n\tif(options.literal) {\n\t\tif(text.length === 0) {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else if(options.whitespace) {\n\t\tterms = [];\n\t\t$tw.utils.each(text.split(/\\s+/g),function(term) {\n\t\t\tif(term) {\n\t\t\t\tterms.push($tw.utils.escapeRegExp(term));\n\t\t\t}\n\t\t});\n\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + terms.join(\"\\\\s+\") + \")\",flags)];\n\t} else if(options.regexp) {\n\t\ttry {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + text + \")\",flags)];\t\t\t\n\t\t} catch(e) {\n\t\t\tsearchTermsRegExps = null;\n\t\t\tconsole.log(\"Regexp error parsing /(\" + text + \")/\" + flags + \": \",e);\n\t\t}\n\t} else {\n\t\tterms = text.split(/ +/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n\t// Accumulate the array of fields to be searched or excluded from the search\n\tvar fields = [];\n\tif(options.field) {\n\t\tif($tw.utils.isArray(options.field)) {\n\t\t\t$tw.utils.each(options.field,function(fieldName) {\n\t\t\t\tif(fieldName) {\n\t\t\t\t\tfields.push(fieldName);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tfields.push(options.field);\n\t\t}\n\t}\n\t// Use default fields if none specified and we're not excluding fields (excluding fields with an empty field array is the same as searching all fields)\n\tif(fields.length === 0 && !options.excludeField) {\n\t\tfields.push(\"title\");\n\t\tfields.push(\"tags\");\n\t\tfields.push(\"text\");\n\t}\n\t// Function to check a given tiddler for the search term\n\tvar searchTiddler = function(title) {\n\t\tif(!searchTermsRegExps) {\n\t\t\treturn true;\n\t\t}\n\t\tvar notYetFound = searchTermsRegExps.slice();\n\n\t\tvar tiddler = self.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\ttiddler = new $tw.Tiddler({title: title, text: \"\", type: \"text/vnd.tiddlywiki\"});\n\t\t}\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"],\n\t\t\tsearchFields;\n\t\t// Get the list of fields we're searching\n\t\tif(options.excludeField) {\n\t\t\tsearchFields = Object.keys(tiddler.fields);\n\t\t\t$tw.utils.each(fields,function(fieldName) {\n\t\t\t\tvar p = searchFields.indexOf(fieldName);\n\t\t\t\tif(p !== -1) {\n\t\t\t\t\tsearchFields.splice(p,1);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsearchFields = fields;\n\t\t}\n\t\tfor(var fieldIndex=0; notYetFound.length>0 && fieldIndex<searchFields.length; fieldIndex++) {\n\t\t\t// Don't search the text field if the content type is binary\n\t\t\tvar fieldName = searchFields[fieldIndex];\n\t\t\tif(fieldName === \"text\" && contentTypeInfo.encoding !== \"utf8\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar str = tiddler.fields[fieldName],\n\t\t\t\tt;\n\t\t\tif(str) {\n\t\t\t\tif($tw.utils.isArray(str)) {\n\t\t\t\t\t// If the field value is an array, test each regexp against each field array entry and fail if each regexp doesn't match at least one field array entry\n\t\t\t\t\tfor(var s=0; s<str.length; s++) {\n\t\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\t\tif(notYetFound[t].test(str[s])) {\n\t\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// If the field isn't an array, force it to a string and test each regexp against it and fail if any do not match\n\t\t\t\t\tstr = tiddler.getFieldString(fieldName);\n\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\tif(notYetFound[t].test(str)) {\n\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn notYetFound.length == 0;\n\t};\n\t// Loop through all the tiddlers doing the search\n\tvar results = [],\n\t\tsource = options.source || this.each;\n\tsource(function(tiddler,title) {\n\t\tif(searchTiddler(title) !== options.invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(!tiddler.hasField(\"_is_skinny\")) {\n\t\t// Just return the text if we've got it\n\t\treturn tiddler.fields.text || \"\";\n\t} else {\n\t\t// Tell any listeners about the need to lazily load this tiddler\n\t\tthis.dispatchEvent(\"lazyLoad\",title);\n\t\t// Indicate that the text is being loaded\n\t\treturn null;\n\t}\n};\n\n/*\nCheck whether the text of a tiddler matches a given value. By default, the comparison is case insensitive, and any spaces at either end of the tiddler text is trimmed\n*/\nexports.checkTiddlerText = function(title,targetText,options) {\n\toptions = options || {};\n\tvar text = this.getTiddlerText(title,\"\");\n\tif(!options.noTrim) {\n\t\ttext = text.trim();\n\t}\n\tif(!options.caseSensitive) {\n\t\ttext = text.toLowerCase();\n\t\ttargetText = targetText.toLowerCase();\n\t}\n\treturn text === targetText;\n}\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\tvar result = [],\n\t\toutstanding = files.length,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tresult.push.apply(result,tiddlerFieldsArray);\n\t\t\tif(--outstanding === 0) {\n\t\t\t\tcallback(result);\n\t\t\t}\n\t\t};\n\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],$tw.utils.extend({},options,{callback: readFileCallback}));\n\t}\n\treturn files.length;\n};\n\n/*\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFile = function(file,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\t// Get the type, falling back to the filename extension\n\tvar self = this,\n\t\ttype = file.type;\n\tif(type === \"\" || !type) {\n\t\tvar dotPos = file.name.lastIndexOf(\".\");\n\t\tif(dotPos !== -1) {\n\t\t\tvar fileExtensionInfo = $tw.utils.getFileExtensionInfo(file.name.substr(dotPos));\n\t\t\tif(fileExtensionInfo) {\n\t\t\t\ttype = fileExtensionInfo.type;\n\t\t\t}\n\t\t}\n\t}\n\t// Figure out if we're reading a binary file\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\n\t\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \"base64\" : false;\n\t// Log some debugging information\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Importing file '\" + file.name + \"', type: '\" + type + \"', isBinary: \" + isBinary);\n\t}\n\t// Give the hook a chance to process the drag\n\tif($tw.hooks.invokeHook(\"th-importing-file\",{\n\t\tfile: file,\n\t\ttype: type,\n\t\tisBinary: isBinary,\n\t\tcallback: callback\n\t}) !== true) {\n\t\tthis.readFileContent(file,type,isBinary,options.deserializer,callback);\n\t}\n};\n\n/*\nLower level utility to read the content of a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFileContent = function(file,type,isBinary,deserializer,callback) {\n\tvar self = this;\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\", type: type};\n\t\tif(isBinary) {\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttext = text.substr(commaPos + 1);\n\t\t\t}\n\t\t}\n\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedJson) {\n\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\tcallback(tiddlers);\n\t\t\t});\n\t\t} else {\n\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields,{deserializer: deserializer}));\n\t\t}\n\t};\n\t// Kick off the read\n\tif(isBinary) {\n\t\treader.readAsDataURL(file);\n\t} else {\n\t\treader.readAsText(file);\n\t}\n};\n\n/*\nFind any existing draft of a specified tiddler\n*/\nexports.findDraft = function(targetTitle) {\n\tvar draftTitle = undefined;\n\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\n\t\tif(tiddler.fields[\"draft.title\"] && tiddler.fields[\"draft.of\"] === targetTitle) {\n\t\t\tdraftTitle = title;\n\t\t}\n\t});\n\treturn draftTitle;\n}\n\n/*\nCheck whether the specified draft tiddler has been modified.\nIf the original tiddler doesn't exist, create a vanilla tiddler variable,\nto check if additional fields have been added.\n*/\nexports.isDraftModified = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(!tiddler.isDraft()) {\n\t\treturn false;\n\t}\n\tvar ignoredFields = [\"created\", \"modified\", \"title\", \"draft.title\", \"draft.of\"],\n\t\torigTiddler = this.getTiddler(tiddler.fields[\"draft.of\"]) || new $tw.Tiddler({text:\"\", tags:[]}),\n\t\ttitleModified = tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"];\n\treturn titleModified || !tiddler.isEqual(origTiddler,ignoredFields);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\n*/\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\n\tvar story = new $tw.Story({wiki: this, historyTitle: historyTitle});\n\tstory.addToHistory(title,fromPageRect);\t\t\n};\n\n/*\nAdd a new tiddler to the story river\ntitle: a title string or an array of title strings\nfromTitle: the title of the tiddler from which the navigation originated\nstoryTitle: title of story tiddler (defaults to $:/StoryList)\noptions: see story.js\n*/\nexports.addToStory = function(title,fromTitle,storyTitle,options) {\n\tvar story = new $tw.Story({wiki: this, storyTitle: storyTitle});\n\tstory.addToStory(title,fromTitle,options);\t\t\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nexports.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle,\n\t\tusername = this.getTiddlerText(\"$:/status/UserName\"),\n\t\tattribution = username ? \" by \" + username : \"\";\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\" + attribution;\n\t\tc++;\n\t} while(this.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n/*\nInvoke the available upgrader modules\ntitles: array of tiddler titles to be processed\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\nReturns a hashmap of messages keyed by tiddler title.\n*/\nexports.invokeUpgraders = function(titles,tiddlers) {\n\t// Collect up the available upgrader modules\n\tvar self = this;\n\tif(!this.upgraderModules) {\n\t\tthis.upgraderModules = [];\n\t\t$tw.modules.forEachModuleOfType(\"upgrader\",function(title,module) {\n\t\t\tif(module.upgrade) {\n\t\t\t\tself.upgraderModules.push(module);\n\t\t\t}\n\t\t});\n\t}\n\t// Invoke each upgrader in turn\n\tvar messages = {};\n\tfor(var t=0; t<this.upgraderModules.length; t++) {\n\t\tvar upgrader = this.upgraderModules[t],\n\t\t\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\n\t\t$tw.utils.extend(messages,upgraderMessages);\n\t}\n\treturn messages;\n};\n\n// Determine whether a plugin by title is dynamically loadable\nexports.doesPluginRequireReload = function(title) {\n\treturn this.doesPluginInfoRequireReload(this.getPluginInfo(title) || this.getTiddlerDataCached(title));\n};\n\n// Determine whether a plugin info structure is dynamically loadable\nexports.doesPluginInfoRequireReload = function(pluginInfo) {\n\tif(pluginInfo) {\n\t\tvar foundModule = false;\n\t\t$tw.utils.each(pluginInfo.tiddlers,function(tiddler) {\n\t\t\tif(tiddler.type === \"application/javascript\" && $tw.utils.hop(tiddler,\"module-type\")) {\n\t\t\t\tfoundModule = true;\n\t\t\t}\n\t\t});\n\t\treturn foundModule;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n})();\n\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/palettes/Blanca": {
"title": "$:/palettes/Blanca",
"name": "Blanca",
"description": "A clean white palette to let you focus",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ffffff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #7897f3\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ccc\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #7897f3\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #eee\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #ff9900\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Blue": {
"title": "$:/palettes/Blue",
"name": "Blue",
"description": "A blue theme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333353\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ddddff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #5959c0\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: #ccccdd\ntab-border-selected: #ccccdd\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #eeeeff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #666666\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #ffffff\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #ffffff\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #5959c0\ntoolbar-new-button: #5eb95e\ntoolbar-options-button: rgb(128, 88, 165)\ntoolbar-save-button: #0e90d2\ntoolbar-info-button: #0e90d2\ntoolbar-edit-button: rgb(243, 123, 29)\ntoolbar-close-button: #dd514c\ntoolbar-delete-button: #dd514c\ntoolbar-cancel-button: rgb(243, 123, 29)\ntoolbar-done-button: #5eb95e\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Muted": {
"title": "$:/palettes/Muted",
"name": "Muted",
"description": "Bright tiddlers on a muted background",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #6f6f70\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #29a6ee\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #c2c1c2\nsidebar-foreground-shadow: rgba(255,255,255,0)\nsidebar-foreground: #d3d2d4\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #6f6f70\nsidebar-tab-background: #666667\nsidebar-tab-border-selected: #999\nsidebar-tab-border: #515151\nsidebar-tab-divider: #999\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #999\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #d1d0d2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/ContrastLight": {
"title": "$:/palettes/ContrastLight",
"name": "Contrast (Light)",
"description": "High contrast and unambiguous (light version)",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #000\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #000\ntag-foreground: #fff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
},
"$:/palettes/ContrastDark": {
"title": "$:/palettes/ContrastDark",
"name": "Contrast (Dark)",
"description": "High contrast and unambiguous (dark version)",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #000\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #fff\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #fff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
},
"$:/palettes/DarkPhotos": {
"title": "$:/palettes/DarkPhotos",
"created": "20150402111612188",
"description": "Good with dark photo backgrounds",
"modified": "20150402112344080",
"name": "DarkPhotos",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: \nbutton-foreground: \nbutton-border: \ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #ddd\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #336438\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #ccf\nsidebar-controls-foreground: #fff\nsidebar-foreground-shadow: rgba(0,0,0, 0.5)\nsidebar-foreground: #fff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #eee\nsidebar-tab-background-selected: rgba(255,255,255, 0.8)\nsidebar-tab-background: rgba(255,255,255, 0.4)\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: rgba(255,255,255, 0.2)\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #aaf\nsidebar-tiddler-link-foreground: #ddf\nsite-title-foreground: #fff\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/GruvboxDark": {
"title": "$:/palettes/GruvboxDark",
"name": "Gruvbox Dark",
"description": "Retro groove color scheme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"license": "https://github.com/morhetz/gruvbox",
"text": "alert-background: #cc241d\nalert-border: #cc241d\nalert-highlight: #d79921\nalert-muted-foreground: #504945\nbackground: #3c3836\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: #504945\nbutton-foreground: #fbf1c7\nbutton-border: transparent\ncode-background: #504945\ncode-border: #504945\ncode-foreground: #fb4934\ndiff-delete-background: #fb4934\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #b8bb26\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #fb4934\ndownload-background: #b8bb26\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #665c54\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ebdbb2\ndropdown-tab-background: #665c54\ndropzone-background: #98971a\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #d3869b\nexternal-link-foreground: #8ec07c\nforeground: #fbf1c7\nmenubar-background: #504945\nmenubar-foreground: <<colour foreground>>\nmessage-background: #83a598\nmessage-border: #83a598\nmessage-foreground: #3c3836\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #504945\nmodal-footer-background: #3c3836\nmodal-footer-border: #3c3836\nmodal-header-border: #3c3836\nmuted-foreground: #d5c4a1\nnotification-background: <<colour primary>>\nnotification-border: <<colour primary>>\npage-background: #282828\npre-background: #504945\npre-border: #504945\nprimary: #d79921\nselect-tag-background: #665c54\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #7c6f64\nsidebar-controls-foreground: #504945\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #fbf1c7\nsidebar-muted-foreground-hover: #7c6f64\nsidebar-muted-foreground: #504945\nsidebar-tab-background-selected: #bdae93\nsidebar-tab-background: #3c3836\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #bdae93\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #282828\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #458588\nsidebar-tiddler-link-foreground: #98971a\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ebdbb2\ntab-background: #665c54\ntab-border-selected: #665c54\ntab-border: #665c54\ntab-divider: #bdae93\ntab-foreground-selected: #282828\ntab-foreground: #ebdbb2\ntable-border: #7c6f64\ntable-footer-background: #665c54\ntable-header-background: #504945\ntag-background: #d3869b\ntag-foreground: #282828\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #7c6f64\ntiddler-controls-foreground-selected: #7c6f64\ntiddler-controls-foreground: #665c54\ntiddler-editor-background: #282828\ntiddler-editor-border-image: #282828\ntiddler-editor-border: #282828\ntiddler-editor-fields-even: #504945\ntiddler-editor-fields-odd: #7c6f64\ntiddler-info-background: #32302f\ntiddler-info-border: #ebdbb2\ntiddler-info-tab-background: #ebdbb2\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #7c6f64\ntiddler-title-foreground: #a89984\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #504945\nvery-muted-foreground: #bdae93\nwikilist-background: <<colour page-background>>\nwikilist-button-background: <<colour button-background>>\nwikilist-button-foreground: <<colour button-foreground>>\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: <<colour muted-foreground>>\nwikilist-button-open-hover: <<colour primary>>\nwikilist-button-open: <<colour dropzone-background>>\nwikilist-button-remove: <<colour dirty-indicator>>\nwikilist-button-remove-hover: <<colour alert-background>>\nwikilist-droplink-dragover: <<colour dropzone-background>>\nwikilist-button-reveal: <<colour sidebar-tiddler-link-foreground-hover>>\nwikilist-button-reveal-hover: <<colour message-background>>"
},
"$:/palettes/Nord": {
"title": "$:/palettes/Nord",
"name": "Nord",
"description": "An arctic, north-bluish color palette.",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"license": "MIT, arcticicestudio, https://github.com/arcticicestudio/nord/blob/develop/LICENSE.md",
"text": "alert-background: #D08770\nalert-border: #D08770\nalert-highlight: #B48EAD\nalert-muted-foreground: #4C566A\nbackground: #3b4252\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: #4C566A\nbutton-foreground: #D8DEE9\nbutton-border: transparent\ncode-background: #2E3440\ncode-border: #2E3440\ncode-foreground: #BF616A\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #A3BE8C\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #BF616A\ndownload-background: #A3BE8C\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ECEFF4\ndropdown-tab-background: #4C566A\ndropzone-background: #A3BE8C\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #5E81AC\nexternal-link-foreground: #8FBCBB\nforeground: #d8dee9\nmenubar-background: #2E3440\nmenubar-foreground: #d8dee9\nmessage-background: #2E3440\nmessage-border: #2E3440\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #3b4252\nmodal-footer-background: #3b4252\nmodal-footer-border: #3b4252\nmodal-header-border: #3b4252\nmuted-foreground: #4C566A\nnotification-background: <<colour primary>>\nnotification-border: #EBCB8B\npage-background: #2e3440\npre-background: #2E3440\npre-border: #2E3440\nprimary: #5E81AC\nselect-tag-background: #3b4252\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #D8DEE9\nsidebar-controls-foreground: #4C566A\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #D8DEE9\nsidebar-muted-foreground-hover: #4C566A\nsidebar-muted-foreground: #4C566A\nsidebar-tab-background-selected: #ECEFF4\nsidebar-tab-background: #4C566A\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #4C566A\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #4C566A\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #A3BE8C\nsidebar-tiddler-link-foreground: #81A1C1\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ECEFF4\ntab-background: #4C566A\ntab-border-selected: #4C566A\ntab-border: #4C566A\ntab-divider: #4C566A\ntab-foreground-selected: #4C566A\ntab-foreground: #D8DEE9\ntable-border: #4C566A\ntable-footer-background: #2e3440\ntable-header-background: #2e3440\ntag-background: #A3BE8C\ntag-foreground: #4C566A\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: \ntiddler-controls-foreground-selected: #EBCB8B\ntiddler-controls-foreground: #4C566A\ntiddler-editor-background: #2e3440\ntiddler-editor-border-image: #2e3440\ntiddler-editor-border: #2e3440\ntiddler-editor-fields-even: #2e3440\ntiddler-editor-fields-odd: #2e3440\ntiddler-info-background: #2e3440\ntiddler-info-border: #2e3440\ntiddler-info-tab-background: #2e3440\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #4C566A\ntiddler-title-foreground: #81A1C1\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #2d3038\nvery-muted-foreground: #2d3038\n"
},
"$:/palettes/Rocker": {
"title": "$:/palettes/Rocker",
"name": "Rocker",
"description": "A dark theme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #cc0000\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #000\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #ffbb99\nsidebar-tiddler-link-foreground: #cc0000\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffbb99\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #cc0000\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/SolarFlare": {
"title": "$:/palettes/SolarFlare",
"name": "Solar Flare",
"description": "Warm, relaxing earth colours",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": ": Background Tones\n\nbase03: #002b36\nbase02: #073642\n\n: Content Tones\n\nbase01: #586e75\nbase00: #657b83\nbase0: #839496\nbase1: #93a1a1\n\n: Background Tones\n\nbase2: #eee8d5\nbase3: #fdf6e3\n\n: Accent Colors\n\nyellow: #b58900\norange: #cb4b16\nred: #dc322f\nmagenta: #d33682\nviolet: #6c71c4\nblue: #268bd2\ncyan: #2aa198\ngreen: #859900\n\n: Additional Tones (RA)\n\nbase10: #c0c4bb\nviolet-muted: #7c81b0\nblue-muted: #4e7baa\n\nyellow-hot: #ffcc44\norange-hot: #eb6d20\nred-hot: #ff2222\nblue-hot: #2298ee\ngreen-hot: #98ee22\n\n: Palette\n\n: Do not use colour macro for background and foreground\nbackground: #fdf6e3\n download-foreground: <<colour background>>\n dragger-foreground: <<colour background>>\n dropdown-background: <<colour background>>\n modal-background: <<colour background>>\n sidebar-foreground-shadow: <<colour background>>\n tiddler-background: <<colour background>>\n tiddler-border: <<colour background>>\n tiddler-link-background: <<colour background>>\n tab-background-selected: <<colour background>>\n dropdown-tab-background-selected: <<colour tab-background-selected>>\nforeground: #657b83\n dragger-background: <<colour foreground>>\n tab-foreground: <<colour foreground>>\n tab-foreground-selected: <<colour tab-foreground>>\n sidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\n sidebar-tab-foreground: <<colour tab-foreground>>\n sidebar-button-foreground: <<colour foreground>>\n sidebar-controls-foreground: <<colour foreground>>\n sidebar-foreground: <<colour foreground>>\n: base03\n: base02\n: base01\n alert-muted-foreground: <<colour base01>>\n: base00\n code-foreground: <<colour base00>>\n message-foreground: <<colour base00>>\n tag-foreground: <<colour base00>>\n: base0\n sidebar-tiddler-link-foreground: <<colour base0>>\n: base1\n muted-foreground: <<colour base1>>\n blockquote-bar: <<colour muted-foreground>>\n dropdown-border: <<colour muted-foreground>>\n sidebar-muted-foreground: <<colour muted-foreground>>\n tiddler-title-foreground: <<colour muted-foreground>>\n site-title-foreground: <<colour tiddler-title-foreground>>\n: base2\n modal-footer-background: <<colour base2>>\n page-background: <<colour base2>>\n modal-backdrop: <<colour page-background>>\n notification-background: <<colour page-background>>\n code-background: <<colour page-background>>\n code-border: <<colour code-background>>\n pre-background: <<colour page-background>>\n pre-border: <<colour pre-background>>\n sidebar-tab-background-selected: <<colour page-background>>\n table-header-background: <<colour base2>>\n tag-background: <<colour base2>>\n tiddler-editor-background: <<colour base2>>\n tiddler-info-background: <<colour base2>>\n tiddler-info-tab-background: <<colour base2>>\n tab-background: <<colour base2>>\n dropdown-tab-background: <<colour tab-background>>\n: base3\n alert-background: <<colour base3>>\n message-background: <<colour base3>>\n: yellow\n: orange\n: red\n: magenta\n alert-highlight: <<colour magenta>>\n: violet\n external-link-foreground: <<colour violet>>\n: blue\n: cyan\n: green\n: base10\n tiddler-controls-foreground: <<colour base10>>\n: violet-muted\n external-link-foreground-visited: <<colour violet-muted>>\n: blue-muted\n primary: <<colour blue-muted>>\n download-background: <<colour primary>>\n tiddler-link-foreground: <<colour primary>>\n\nalert-border: #b99e2f\ndirty-indicator: #ff0000\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nmessage-border: #cfd6e6\nmodal-border: #999999\nselect-tag-background:\nselect-tag-foreground:\nsidebar-controls-foreground-hover:\nsidebar-muted-foreground-hover:\nsidebar-tab-background: #ded8c5\nsidebar-tiddler-link-foreground-hover:\nstatic-alert-foreground: #aaaaaa\ntab-border: #cccccc\n modal-footer-border: <<colour tab-border>>\n modal-header-border: <<colour tab-border>>\n notification-border: <<colour tab-border>>\n sidebar-tab-border: <<colour tab-border>>\n tab-border-selected: <<colour tab-border>>\n sidebar-tab-border-selected: <<colour tab-border-selected>>\ntab-divider: #d8d8d8\n sidebar-tab-divider: <<colour tab-divider>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-border: #dddddd\ntiddler-subtitle-foreground: #c0c0c0\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/SolarizedLight": {
"title": "$:/palettes/SolarizedLight",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Precision colors for machines and people",
"license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE",
"name": "SolarizedLight",
"text": "alert-background: #eee8d5\nalert-border: #073642\nalert-highlight: #cb4b16\nalert-muted-foreground: #586e75\nbackground: #fdf6e3\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: #cb4b16\nbutton-foreground: #fdf6e3\nbutton-border: transparent\ncode-background: #eee8d5\ncode-border: #93a1a1\ncode-foreground: #d33682\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #859900\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #D08770\ndownload-background: #859900\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #fdf6e3\ndropdown-tab-background: #93a1a1\ndropzone-background: #859900\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: #d33682\nexternal-link-foreground-visited: #b58900\nexternal-link-foreground: #cb4b16\nforeground: #839496\nmessage-background: #586e75\nmessage-border: #586e75\nmessage-foreground: #eee8d5\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #eee8d5\nmodal-footer-background: #eee8d5\nmodal-footer-border: #eee8d5\nmodal-header-border: #eee8d5\nmuted-foreground: #93a1a1\nnotification-background: #EBCB8B\nnotification-border: #D08770\npage-background: #eee8d5\npre-background: #eee8d5\npre-border: #93a1a1\nprimary: #2aa198\nselect-tag-background: #eee8d5\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: #eee8d5\nsidebar-controls-foreground-hover: #268bd2\nsidebar-controls-foreground: #586e75\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #839496\nsidebar-muted-foreground-hover: #657b83\nsidebar-muted-foreground: #93a1a1\nsidebar-tab-background-selected: #eee8d5\nsidebar-tab-background: #839496\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #657b83\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #839496\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #859900\nsidebar-tiddler-link-foreground: #268bd2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #dc322f\ntab-background-selected: #fdf6e3\ntab-background: #839496\ntab-border-selected: #93a1a1\ntab-border: #93a1a1\ntab-divider: #fdf6e3\ntab-foreground-selected: #839496\ntab-foreground: #eee8d5\ntable-border: #657b83\ntable-footer-background: #657b83\ntable-header-background: #93a1a1\ntag-background: #6c71c4\ntag-foreground: #eee8d5\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #b58900\ntiddler-controls-foreground-selected: #b58900\ntiddler-controls-foreground: #073642\ntiddler-editor-background: #eee8d5\ntiddler-editor-border-image: #eee8d5\ntiddler-editor-border: #eee8d5\ntiddler-editor-fields-even: #eee8d5\ntiddler-editor-fields-odd: #fdf6e3\ntiddler-info-background: #eee8d5\ntiddler-info-border: #eee8d5\ntiddler-info-tab-background: #586e75\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #586e75\ntiddler-title-foreground: #073642\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #839496\nvery-muted-foreground: #93a1a1\n"
},
"$:/palettes/SpartanDay": {
"title": "$:/palettes/SpartanDay",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Cold, spartan day colors",
"name": "Spartan Day",
"text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #FAFAFA\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: #ececec\ncode-border: #ececec\ncode-foreground: \ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #FFFFFF\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #F5F5F5\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: \nexternal-link-foreground: \nforeground: rgba(0, 0, 0, 0.87)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(0, 0, 0, 0.54)\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour very-muted-foreground>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(0, 0, 0, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #f4f4f4\npre-background: #ececec\npre-border: #ececec\nprimary: #3949ab\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #aeaeae\nsidebar-controls-foreground: #c6c6c6\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground-hover: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground: rgba(0, 0, 0, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(0, 0, 0, 0.87)\nsidebar-tab-foreground: rgba(0, 0, 0, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(0, 0, 0, 0.87)\nsidebar-tiddler-link-foreground: rgba(0, 0, 0, 0.54)\nsite-title-foreground: rgba(0, 0, 0, 0.87)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(0, 0, 0, 0.87)\ntab-foreground: rgba(0, 0, 0, 0.54)\ntable-border: #d8d8d8\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: #f9f9f9\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: #e8e7e7\ntiddler-editor-fields-even: rgba(0, 0, 0, 0.1)\ntiddler-editor-fields-odd: rgba(0, 0, 0, 0.04)\ntiddler-info-background: #F5F5F5\ntiddler-info-border: #F5F5F5\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #000000\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(0, 0, 0, 0.12)\n"
},
"$:/palettes/SpartanNight": {
"title": "$:/palettes/SpartanNight",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Dark spartan colors",
"name": "Spartan Night",
"text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #303030\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #424242\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #050505\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #7c318c\nexternal-link-foreground: #9e3eb3\nforeground: rgba(255, 255, 255, 0.7)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(255, 255, 255, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #212121\npre-background: #2a2a2a\npre-border: transparent\nprimary: #5656f3\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #494949\nsidebar-controls-foreground: #5d5d5d\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: rgba(255, 255, 255, 0.7)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #3a3a3a\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: rgb(55,55,55)\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #454545\ntiddler-info-border: #454545\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(255, 255, 255, 0.12)\n"
},
"$:/palettes/Twilight": {
"title": "$:/palettes/Twilight",
"tags": "$:/tags/Palette",
"author": "Thomas Elmiger",
"type": "application/x-tiddler-dictionary",
"name": "Twilight",
"description": "Delightful, soft darkness.",
"text": "alert-background: rgb(255, 255, 102)\nalert-border: rgb(232, 232, 125)\nalert-highlight: rgb(255, 51, 51)\nalert-muted-foreground: rgb(224, 82, 82)\nbackground: rgb(38, 38, 38)\nblockquote-bar: rgba(240, 196, 117, 0.7)\nbutton-background: rgb(63, 63, 63)\nbutton-border: rgb(127, 127, 127)\nbutton-foreground: rgb(179, 179, 179)\ncode-background: rgba(0,0,0,0.03)\ncode-border: rgba(0,0,0,0.08)\ncode-foreground: rgb(255, 94, 94)\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: rgb(255, 94, 94)\ndownload-background: #19a974\ndownload-foreground: rgb(38, 38, 38)\ndragger-background: rgb(179, 179, 179)\ndragger-foreground: rgb(38, 38, 38)\ndropdown-background: rgb(38, 38, 38)\ndropdown-border: rgb(255, 255, 255)\ndropdown-tab-background: rgba(0,0,0,.1)\ndropdown-tab-background-selected: rgba(255,255,255,1)\ndropzone-background: #9eebcf\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: rgb(179, 179, 255)\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: rgb(153, 153, 255)\nforeground: rgb(179, 179, 179)\nmessage-background: <<colour tag-foreground>>\nmessage-border: #96ccff\nmessage-foreground: <<colour tag-background>>\nmodal-backdrop: rgb(179, 179, 179)\nmodal-background: rgb(38, 38, 38)\nmodal-border: rgba(0,0,0,.5)\nmodal-footer-background: #f4f4f4\nmodal-footer-border: rgba(0,0,0,.1)\nmodal-header-border: rgba(0,0,0,.2)\nmuted-foreground: rgb(255, 255, 255)\nnotification-background: <<colour tag-foreground>>\nnotification-border: <<colour tag-background>>\npage-background: rgb(26, 26, 26)\npre-background: rgb(25, 25, 25)\npre-border: rgba(0,0,0,.2)\nprimary: rgb(255, 201, 102)\nselect-tag-background: \nselect-tag-foreground: \nsidebar-button-foreground: rgb(179, 179, 179)\nsidebar-controls-foreground: rgb(153, 153, 153)\nsidebar-controls-foreground-hover: <<colour tiddler-controls-foreground-hover>>\nsidebar-foreground: rgb(141, 141, 141)\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: rgba(0, 0, 0, 0.5)\nsidebar-muted-foreground-hover: rgb(141, 141, 141)\nsidebar-tab-background: rgba(141, 141, 141, 0.2)\nsidebar-tab-background-selected: rgb(26, 26, 26)\nsidebar-tab-border: rgb(127, 127, 127)\nsidebar-tab-border-selected: rgb(127, 127, 127)\nsidebar-tab-divider: rgb(127, 127, 127)\nsidebar-tab-foreground: rgb(179, 179, 179)\nsidebar-tab-foreground-selected: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground-hover: rgb(115, 115, 115)\nsite-title-foreground: rgb(255, 201, 102)\nstatic-alert-foreground: rgba(0,0,0,.3)\ntab-background: rgba(0,0,0,0.125)\ntab-background-selected: rgb(38, 38, 38)\ntab-border: rgb(255, 201, 102)\ntab-border-selected: rgb(255, 201, 102)\ntab-divider: rgb(255, 201, 102)\ntab-foreground: rgb(179, 179, 179)\ntab-foreground-selected: rgb(179, 179, 179)\ntable-border: rgba(255,255,255,.3)\ntable-footer-background: rgba(0,0,0,.4)\ntable-header-background: rgba(0,0,0,.1)\ntag-background: rgb(255, 201, 102)\ntag-foreground: rgb(25, 25, 25)\ntiddler-background: rgb(38, 38, 38)\ntiddler-border: rgba(240, 196, 117, 0.7)\ntiddler-controls-foreground: rgb(128, 128, 128)\ntiddler-controls-foreground-hover: rgba(255, 255, 255, 0.8)\ntiddler-controls-foreground-selected: rgba(255, 255, 255, 0.9)\ntiddler-editor-background: rgb(33, 33, 33)\ntiddler-editor-border: rgb(63, 63, 63)\ntiddler-editor-border-image: rgb(25, 25, 25)\ntiddler-editor-fields-even: rgb(33, 33, 33)\ntiddler-editor-fields-odd: rgb(28, 28, 28)\ntiddler-info-background: rgb(43, 43, 43)\ntiddler-info-border: rgb(25, 25, 25)\ntiddler-info-tab-background: rgb(43, 43, 43)\ntiddler-link-background: rgb(38, 38, 38)\ntiddler-link-foreground: rgb(204, 204, 255)\ntiddler-subtitle-foreground: rgb(255, 255, 255)\ntiddler-title-foreground: rgb(255, 192, 76)\ntoolbar-cancel-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-done-button: \ntoolbar-edit-button: \ntoolbar-info-button: \ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \nuntagged-background: rgb(255, 255, 255)\nvery-muted-foreground: rgba(240, 196, 117, 0.7)\n"
},
"$:/palettes/Vanilla": {
"title": "$:/palettes/Vanilla",
"name": "Vanilla",
"description": "Pale and unobtrusive",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f4f4f4\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #f4f4f4\nsidebar-tab-background: #e0e0e0\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected:\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\nwikilist-background: #e5e5e5\nwikilist-item: #fff\nwikilist-info: #000\nwikilist-title: #666\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #aaa\nwikilist-button-open: #4fb82b\nwikilist-button-open-hover: green\nwikilist-button-reveal: #5778d8\nwikilist-button-reveal-hover: blue\nwikilist-button-remove: #d85778\nwikilist-button-remove-hover: red\nwikilist-toolbar-background: #d3d3d3\nwikilist-toolbar-foreground: #888\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #acacac\nwikilist-button-foreground: #000\n"
},
"$:/core/readme": {
"title": "$:/core/readme",
"text": "This plugin contains TiddlyWiki's core components, comprising:\n\n* JavaScript code modules\n* Icons\n* Templates needed to create TiddlyWiki's user interface\n* British English (''en-GB'') translations of the localisable strings used by the core\n"
},
"$:/library/sjcl.js/license": {
"title": "$:/library/sjcl.js/license",
"type": "text/plain",
"text": "SJCL is open. You can use, modify and redistribute it under a BSD\nlicense or under the GNU GPL, version 2.0.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/BSD-2-Clause\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/GPL-2.0\n\nThe Stanford Javascript Crypto Library (hosted here on GitHub) is a\nproject by the Stanford Computer Security Lab to build a secure,\npowerful, fast, small, easy-to-use, cross-browser library for\ncryptography in Javascript.\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University.\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation; either version 2 of the License, or (at your\noption) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"
},
"$:/core/templates/MOTW.html": {
"title": "$:/core/templates/MOTW.html",
"text": "\\rules only filteredtranscludeinline transcludeinline entity\n<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\n<!-- saved from url=(0021)https://tiddlywiki.com --> "
},
"$:/core/templates/alltiddlers.template.html": {
"title": "$:/core/templates/alltiddlers.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "<!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\n\n<$set name=\"exportFilter\" value=\"[!is[system]sort[title]]\">\n\n{{$:/core/templates/exporters/StaticRiver}}\n\n</$set>\n"
},
"$:/core/templates/canonical-uri-external-image": {
"title": "$:/core/templates/canonical-uri-external-image",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external images.\n\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./images/<$view field=\"title\" format=\"doubleurlencoded\"/>"
},
"$:/core/templates/canonical-uri-external-raw": {
"title": "$:/core/templates/canonical-uri-external-raw",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external raw files that are stored in the same directory\n\n-->\n<$view field=\"title\" format=\"doubleurlencoded\"/>"
},
"$:/core/templates/canonical-uri-external-text": {
"title": "$:/core/templates/canonical-uri-external-text",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external text files.\n\nChange the `./text/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./text/<$view field=\"title\" format=\"doubleurlencoded\"/>.tid"
},
"$:/core/templates/css-tiddler": {
"title": "$:/core/templates/css-tiddler",
"text": "<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`"
},
"$:/core/templates/exporters/CsvFile": {
"title": "$:/core/templates/exporters/CsvFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/CsvFile}}",
"extension": ".csv",
"text": "\\define renderContent()\n<$text text=<<csvtiddlers filter:\"\"\"$(exportFilter)$\"\"\" format:\"quoted-comma-sep\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/JsonFile": {
"title": "$:/core/templates/exporters/JsonFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/JsonFile}}",
"extension": ".json",
"text": "\\define renderContent()\n<$text text=<<jsontiddlers filter:\"\"\"$(exportFilter)$\"\"\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/StaticRiver": {
"title": "$:/core/templates/exporters/StaticRiver",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/StaticRiver}}",
"extension": ".html",
"text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n"
},
"$:/core/templates/exporters/StaticRiver/Content": {
"title": "$:/core/templates/exporters/StaticRiver/Content",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>\n"
},
"$:/core/templates/exporters/TidFile": {
"title": "$:/core/templates/exporters/TidFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/TidFile}}",
"extension": ".tid",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>"
},
"$:/core/save/all-external-js": {
"title": "$:/core/save/all-external-js",
"text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5-external-js.html}}\n"
},
"$:/core/templates/tiddlywiki5.js": {
"title": "$:/core/templates/tiddlywiki5.js",
"text": "\\rules only filteredtranscludeinline transcludeinline codeinline\n\n/*\n{{ $:/core/copyright.txt ||$:/core/templates/plain-text-tiddler}}\n`*/\n`<!--~~ Library modules ~~-->\n{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/plain-text-tiddler}}}\n<!--~~ Boot prefix ~~-->\n{{ $:/boot/bootprefix.js ||$:/core/templates/plain-text-tiddler}}\n<!--~~ Core plugin ~~-->\n{{$:/core/templates/tiddlywiki5.js/tiddlers}}\n<!--~~ Boot kernel ~~-->\n{{ $:/boot/boot.js ||$:/core/templates/plain-text-tiddler}}\n"
},
"$:/core/templates/tiddlywiki5.js/tiddlers": {
"title": "$:/core/templates/tiddlywiki5.js/tiddlers",
"text": "`\n$tw.preloadTiddlerArray(`<$text text=<<jsontiddlers \"[[$:/core]]\">>/>`);\n$tw.preloadTiddlerArray([{\n\ttitle: \"$:/config/SaveWikiButton/Template\",\n\ttext: \"$:/core/save/all-external-js\"\n}]);\n`\n"
},
"$:/core/templates/tiddlywiki5-external-js.html": {
"title": "$:/core/templates/tiddlywiki5-external-js.html",
"text": "\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n{{$:/core/templates/MOTW.html}}<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"{{$:/core/copyright.txt}}\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/core/wiki/rawmarkup]] [all[shadows+tiddlers]tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n{{$:/core/templates/static.area}}\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n{{$:/core/templates/store.area.template.html}}\n<!--~~ Raw markup for the bottom of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}\n</body>\n<script src=\"%24%3A%2Fcore%2Ftemplates%2Ftiddlywiki5.js\" onerror=\"alert('Error: Cannot load tiddlywiki.js');\"></script>\n</html>\n"
},
"$:/core/templates/html-div-skinny-tiddler": {
"title": "$:/core/templates/html-div-skinny-tiddler",
"text": "<!--\n\nThis template is a variant of $:/core/templates/html-div-tiddler used for saving skinny tiddlers (with no text field)\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre></pre>\n</div>`\n"
},
"$:/core/templates/html-div-tiddler": {
"title": "$:/core/templates/html-div-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre>`<$view field=\"text\" format=\"htmlencoded\" />`</pre>\n</div>`\n"
},
"$:/core/templates/html-tiddler": {
"title": "$:/core/templates/html-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as raw HTML\n\n--><$view field=\"text\" format=\"htmlwikified\" />"
},
"$:/core/templates/javascript-tiddler": {
"title": "$:/core/templates/javascript-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`"
},
"$:/core/templates/json-tiddler": {
"title": "$:/core/templates/json-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as raw JSON\n\n--><$text text=<<jsontiddler>>/>"
},
"$:/core/templates/module-tiddler": {
"title": "$:/core/templates/module-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\" data-module=\"yes\">$tw.modules.define(\"`<$view field=\"title\" format=\"jsencoded\" />`\",\"`<$view field=\"module-type\" format=\"jsencoded\" />`\",function(module,exports,require) {`<$view field=\"text\" format=\"text\" />`});\n</script>`"
},
"$:/core/templates/plain-text-tiddler": {
"title": "$:/core/templates/plain-text-tiddler",
"text": "<$view field=\"text\" format=\"text\" />"
},
"$:/core/templates/raw-static-tiddler": {
"title": "$:/core/templates/raw-static-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as static HTML\n\n--><$view field=\"text\" format=\"plainwikified\" />"
},
"$:/core/save/all": {
"title": "$:/core/save/all",
"text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/empty": {
"title": "$:/core/save/empty",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/lazy-all": {
"title": "$:/core/save/lazy-all",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[!is[system]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/lazy-images": {
"title": "$:/core/save/lazy-images",
"text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[is[image]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/templates/server/static.sidebar.wikitext": {
"title": "$:/core/templates/server/static.sidebar.wikitext",
"text": "\\whitespace trim\n<div class=\"tc-sidebar-scrollable\" style=\"overflow: auto;\">\n<div class=\"tc-sidebar-header\">\n<h1 class=\"tc-site-title\">\n<$transclude tiddler=\"$:/SiteTitle\"/>\n</h1>\n<div class=\"tc-site-subtitle\">\n<$transclude tiddler=\"$:/SiteSubtitle\"/>\n</div>\n<h2>\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$list filter={{$:/DefaultTiddlers}}>\n<div class=\"tc-menu-list-subitem\">\n<$link><$text text=<<currentTiddler>>/></$link>\n</div>\n</$list>\n</div>\n<!-- Currently disabled the recent list as it is unweildy when the responsive narrow view kicks in\n<h2>\n{{$:/language/SideBar/Recent/Caption}}\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n</div>\n</div>\n</div>\n-->\n"
},
"$:/core/templates/server/static.tiddler.html": {
"title": "$:/core/templates/server/static.tiddler.html",
"text": "\\whitespace trim\n\\define tv-wikilink-template() $uri_encoded$\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content={{$:/core/templates/version}} />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"%24%3A%2Fcore%2Ftemplates%2Fstatic.template.css\">\n<title><$view field=\"caption\" format=\"plainwikified\"><$view field=\"title\"/></$view>: <$view tiddler=\"$:/core/wiki/title\" format=\"plainwikified\"/></title>\n</head>\n<body class=\"tc-body\">\n<$transclude tiddler=\"$:/core/templates/server/static.sidebar.wikitext\" mode=\"inline\"/>\n<section class=\"tc-story-river\">\n<div class=\"tc-tiddler-frame\">\n<$transclude tiddler=\"$:/core/templates/server/static.tiddler.wikitext\" mode=\"inline\"/>\n</div>\n</section>\n</body>\n</html>"
},
"$:/core/templates/server/static.tiddler.wikitext": {
"title": "$:/core/templates/server/static.tiddler.wikitext",
"text": "\\whitespace trim\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<h2><$text text=<<currentTiddler>>/></h2>\n</div>\n</div>\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n<div class=\"tc-tags-wrapper\">\n<$list filter=\"[all[current]tags[]sort[title]]\">\n<a href={{{ [<currentTiddler>encodeuricomponent[]] }}}>\n<$macrocall $name=\"tag-pill\" tag=<<currentTiddler>>/>\n</a>\n</$list>\n</div>\n<div class=\"tc-tiddler-body\">\n<$transclude mode=\"block\"/>\n</div>\n"
},
"$:/core/templates/single.tiddler.window": {
"title": "$:/core/templates/single.tiddler.window",
"text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"tv-config-toolbar-icons\" value={{$:/config/Toolbar/Icons}}>\n\n<$set name=\"tv-config-toolbar-text\" value={{$:/config/Toolbar/Text}}>\n\n<$set name=\"tv-config-toolbar-class\" value={{$:/config/Toolbar/ButtonClass}}>\n\n<$set name=\"tv-show-missing-links\" value={{$:/config/MissingLinks}}>\n\n<$set name=\"storyviewTitle\" value={{$:/view}}>\n\n<$set name=\"languageTitle\" value={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$transclude mode=\"block\"/>\n\n</$navigator>\n\n</div>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/templates/split-recipe": {
"title": "$:/core/templates/split-recipe",
"text": "<$list filter=\"[!is[system]]\">\ntiddler: <$view field=\"title\" format=\"urlencoded\"/>.tid\n</$list>\n"
},
"$:/core/templates/static-tiddler": {
"title": "$:/core/templates/static-tiddler",
"text": "<a name=<<currentTiddler>>>\n<$transclude tiddler=\"$:/core/ui/ViewTemplate\"/>\n</a>"
},
"$:/core/templates/static.area": {
"title": "$:/core/templates/static.area",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawStaticContent]!has[draft.of]] ||$:/core/templates/raw-static-tiddler}}}\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\n</$reveal>\n<!-- ensure splash screen isn't shown when JS is disabled -->\n`<style>\n.tc-remove-when-wiki-loaded {display: none;}\n</style>`\n"
},
"$:/core/templates/static.content": {
"title": "$:/core/templates/static.content",
"text": "<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|https://tiddlywiki.com]] contains the following tiddlers:\n\n<ul>\n<$list filter=<<saveTiddlerFilter>>>\n<li><$view field=\"title\" format=\"text\"></$view></li>\n</$list>\n</ul>\n"
},
"$:/core/templates/static.template.css": {
"title": "$:/core/templates/static.template.css",
"text": "{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\n\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n"
},
"$:/core/templates/static.template.html": {
"title": "$:/core/templates/static.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "\\define tv-wikilink-template() static/$uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\n</body>\n</html>\n"
},
"$:/core/templates/static.tiddler.html": {
"title": "$:/core/templates/static.tiddler.html",
"text": "\\define tv-wikilink-template() $uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n`<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"static.css\">\n<title>`<$view field=\"caption\"><$view field=\"title\"/></$view>: {{$:/core/wiki/title}}`</title>\n</head>\n<body class=\"tc-body\">\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\n<section class=\"tc-story-river\">\n`<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>`\n</section>\n</body>\n</html>\n`"
},
"$:/core/templates/store.area.template.html": {
"title": "$:/core/templates/store.area.template.html",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n`<div id=\"storeArea\" style=\"display:none;\">`\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n<$list filter={{{ [<skinnySaveTiddlerFilter>] }}} template=\"$:/core/templates/html-div-skinny-tiddler\"/>\n`</div>`\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n`<!--~~ Encrypted tiddlers ~~-->`\n`<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n<$encrypt filter=<<saveTiddlerFilter>>/>\n`</pre>`\n</$reveal>"
},
"$:/core/templates/tid-tiddler": {
"title": "$:/core/templates/tid-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>`\n`<$view field=\"text\" format=\"text\" />"
},
"$:/core/templates/tiddler-metadata": {
"title": "$:/core/templates/tiddler-metadata",
"text": "<!--\n\nThis template is used for saving tiddler metadata *.meta files\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>"
},
"$:/core/templates/tiddlywiki5.html": {
"title": "$:/core/templates/tiddlywiki5.html",
"text": "<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n`<!doctype html>\n`{{$:/core/templates/MOTW.html}}`<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n`{{{ [<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"`{{$:/core/copyright.txt}}`\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>`{{$:/core/wiki/title}}`</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n`{{$:/boot/boot.css||$:/core/templates/css-tiddler}}`\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n`{{$:/core/templates/static.area}}`\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n`{{$:/core/templates/store.area.template.html}}`\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}`\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n`{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n`{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Raw markup for the bottom of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\n</body>\n</html>`\n"
},
"$:/core/templates/version": {
"title": "$:/core/templates/version",
"text": "<<version>>"
},
"$:/core/templates/wikified-tiddler": {
"title": "$:/core/templates/wikified-tiddler",
"text": "<$transclude />"
},
"$:/core/ui/AboveStory/tw2-plugin-check": {
"title": "$:/core/ui/AboveStory/tw2-plugin-check",
"tags": "$:/tags/AboveStory",
"text": "\\define lingo-base() $:/language/AboveStory/ClassicPlugin/\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]limit[1]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n<ul>\n\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]]\">\n\n<li>\n\n<$link><$view field=\"title\"/></$link>\n\n</li>\n\n</$list>\n\n</ul>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/Actions/new-image": {
"title": "$:/core/ui/Actions/new-image",
"tags": "$:/tags/Actions",
"description": "create a new image tiddler",
"text": "\\define get-type()\nimage/$(imageType)$\n\\end\n<$vars imageType={{$:/config/NewImageType}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=<<get-type>> tags={{$:/config/NewTiddler/Tags!!tags}}/>\n</$vars>\n"
},
"$:/core/ui/Actions/new-journal": {
"title": "$:/core/ui/Actions/new-journal",
"tags": "$:/tags/Actions",
"description": "create a new journal tiddler",
"text": "<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$reveal type=\"nomatch\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalTags>> text={{{ [<journalTitle>get[]] }}}/>\n</$reveal>\n<$reveal type=\"match\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalTags>> text=<<journalText>>/>\n</$reveal>\n</$wikify>\n</$vars>\n"
},
"$:/core/ui/Actions/new-tiddler": {
"title": "$:/core/ui/Actions/new-tiddler",
"tags": "$:/tags/Actions",
"description": "create a new empty tiddler",
"text": "<$action-sendmessage $message=\"tm-new-tiddler\" tags={{$:/config/NewTiddler/Tags!!tags}}/>\n"
},
"$:/core/ui/AdvancedSearch/Filter": {
"title": "$:/core/ui/AdvancedSearch/Filter",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Filter/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]\"><$transclude/></$list>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}} template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button popup=<<qualify \"$:/state/filterDeleteDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}\n</$button>\n</$reveal>\n\n<$reveal state=<<qualify \"$:/state/filterDeleteDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<div class=\"tc-dropdown-item-plain\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\nAre you sure you wish to delete <<resultCount>> tiddler(s)?\n</$set>\n</div>\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn\">\n<$action-deletetiddler $filter={{$:/temp/advancedsearch}}/>\nDelete these tiddlers\n</$button>\n</div>\n</div>\n</div>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</span>\n\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</div>\n</$linkcatcher>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/export": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Shadows": {
"title": "$:/core/ui/AdvancedSearch/Shadows",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Shadows/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Standard": {
"title": "$:/core/ui/AdvancedSearch/Standard",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Standard/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$set name=\"searchTiddler\" value=\"$:/temp/advancedsearch\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n</$set>\n</$list>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/System": {
"title": "$:/core/ui/AdvancedSearch/System",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/System/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/AdvancedSearch": {
"title": "$:/AdvancedSearch",
"icon": "$:/core/images/advanced-search-button",
"color": "#bbb",
"text": "<div class=\"tc-advanced-search\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" \"$:/core/ui/AdvancedSearch/System\">>\n</div>\n"
},
"$:/core/ui/AlertTemplate": {
"title": "$:/core/ui/AlertTemplate",
"text": "<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button class=\"tc-btn-invisible\"><$action-deletetiddler $tiddler=<<currentTiddler>>/>{{$:/core/images/cancel-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$wikify name=\"format\" text=<<lingo Tiddler/DateFormat>>>\n<$view field=\"component\"/> - <$view field=\"modified\" format=\"date\" template=<<format>>/> <$reveal type=\"nomatch\" state=\"!!count\" text=\"\"><span class=\"tc-alert-highlight\">({{$:/language/Count}}: <$view field=\"count\"/>)</span></$reveal>\n</$wikify>\n</div>\n<div class=\"tc-alert-body\">\n\n<$transclude/>\n\n</div>\n</div>\n"
},
"$:/core/ui/BinaryWarning": {
"title": "$:/core/ui/BinaryWarning",
"text": "\\define lingo-base() $:/language/BinaryWarning/\n<<lingo Prompt>>\n"
},
"$:/core/ui/Components/plugin-info": {
"title": "$:/core/ui/Components/plugin-info",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\n\\define plugin-table-body(type,disabledMessage,default-popup-state)\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1>\n''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$view field=\"description\"><$view field=\"title\"/></$view> $disabledMessage$\n</h1>\n<h2>\n<$view field=\"title\"/>\n</h2>\n<h2>\n<div><em><$view field=\"version\"/></em></div>\n</h2>\n</div>\n\\end\n\n\\define plugin-info(type,default-popup-state)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>> default=\"\"\"$default-popup-state$\"\"\">\n<div class=\"tc-plugin-info-dropdown\">\n<div class=\"tc-plugin-info-dropdown-body\">\n<$list filter=\"[all[current]] -[[$:/core]]\">\n<div style=\"float:right;\">\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n<<lingo Disable/Caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n<<lingo Enable/Caption>>\n</$button>\n</$reveal>\n</div>\n</$list>\n<$set name=\"tabsList\" filter=\"[<currentTiddler>list[]] contents\">\n<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList=<<tabsList>> default={{{ [enlist<tabsList>] }}} template=\"$:/core/ui/PluginInfo\"/>\n</$set>\n</div>\n</div>\n</$reveal>\n</$set>\n\\end\n\n<$macrocall $name=\"plugin-info\" type=<<plugin-type>> default-popup-state=<<default-popup-state>>/>\n"
},
"$:/core/ui/Components/tag-link": {
"title": "$:/core/ui/Components/tag-link",
"text": "<$link>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\"/>\n</span>\n</$set>\n</$link>"
},
"$:/core/ui/ControlPanel/Advanced": {
"title": "$:/core/ui/ControlPanel/Advanced",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Advanced/Caption}}",
"text": "{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" \"$:/core/ui/ControlPanel/TiddlerFields\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Appearance": {
"title": "$:/core/ui/ControlPanel/Appearance",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Appearance/Caption}}",
"text": "{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Theme\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Basics": {
"title": "$:/core/ui/ControlPanel/Basics",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Basics/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\n\n\\define show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n''<$count filter=\"\"\"$filter$\"\"\"/>''\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\" class=\"tc-edit-texteditor\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/language/DefaultNewTiddlerTitle\"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/language/DefaultNewTiddlerTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Title\"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Title\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Text\"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler=\"$:/config/NewJournal/Text\" tag=\"textarea\" class=\"tc-edit-texteditor\" default=\"\"/> |\n|<$link to=\"$:/config/NewTiddler/Tags\"><<lingo NewTiddler/Tags/Prompt>></$link> |<$list filter=\"[[$:/config/NewTiddler/Tags]]\" template=\"$:/core/ui/EditTemplate/tags\"/> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$list filter=\"[[$:/config/NewJournal/Tags]]\" template=\"$:/core/ui/EditTemplate/tags\"/> |\n|<$link to=\"$:/config/AutoFocus\"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} |\n|<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\n|<<lingo Tiddlers/Prompt>> |<<show-filter-count \"[!is[system]sort[title]]\">> |\n|<<lingo Tags/Prompt>> |<<show-filter-count \"[tags[]sort[title]]\">> |\n|<<lingo SystemTiddlers/Prompt>> |<<show-filter-count \"[is[system]sort[title]]\">> |\n|<<lingo ShadowTiddlers/Prompt>> |<<show-filter-count \"[all[shadows]sort[title]]\">> |\n|<<lingo OverriddenShadowTiddlers/Prompt>> |<<show-filter-count \"[is[tiddler]is[shadow]sort[title]]\">> |\n"
},
"$:/core/ui/ControlPanel/EditorTypes": {
"title": "$:/core/ui/ControlPanel/EditorTypes",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/EditorTypes/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/EditorTypes/\n\n<<lingo Hint>>\n\n<table>\n<tbody>\n<tr>\n<th><<lingo Type/Caption>></th>\n<th><<lingo Editor/Caption>></th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\">\n<tr>\n<td>\n<$link>\n<$list filter=\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\">\n<$text text={{!!title}}/>\n</$list>\n</$link>\n</td>\n<td>\n<$view field=\"text\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ControlPanel/Info": {
"title": "$:/core/ui/ControlPanel/Info",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Info/Caption}}",
"text": "{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Basics\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/KeyboardShortcuts": {
"title": "$:/core/ui/ControlPanel/KeyboardShortcuts",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/KeyboardShortcuts/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/KeyboardShortcuts/\n\n\\define new-shortcut(title)\n<div class=\"tc-dropdown-item-plain\">\n<$edit-shortcut tiddler=\"$title$\" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} focus=\"true\" style=\"width:auto;\"/> <$button>\n<<lingo Add/Caption>>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"[{$title$}]\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"$title$\"\n/>\n</$button>\n</div>\n\\end\n\n\\define shortcut-list-item(caption)\n<td>\n</td>\n<td style=\"text-align:right;font-size:0.7em;\">\n<<lingo Platform/$caption$>>\n</td>\n<td>\n<div style=\"position:relative;\">\n<$button popup=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> class=\"tc-btn-invisible\">\n{{$:/core/images/edit-button}}\n</$button>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutTitle)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\n<$reveal state=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown tc-popup-keep\">\n<$list filter=\"[list[$(shortcutTitle)$!!text]sort[title]]\" variable=\"shortcut\" emptyMessage=\"\"\"\n<div class=\"tc-dropdown-item-plain\">\n//<<lingo NoShortcuts/Caption>>//\n</div>\n\"\"\">\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint}}>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"+[remove<shortcut>]\"\n/>\n<small>{{$:/core/images/close-button}}</small>\n</$button>\n<kbd>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts=<<shortcut>>/>\n</kbd>\n</div>\n</$list>\n<hr/>\n<$macrocall $name=\"new-shortcut\" title=<<qualify \"$:/state/new-shortcut/$(shortcutTitle)$\">>/>\n</div>\n</div>\n</$reveal>\n</div>\n</td>\n\\end\n\n\\define shortcut-list(caption,prefix)\n<tr>\n<$list filter=\"[[$prefix$$(shortcutName)$]]\" variable=\"shortcutTitle\">\n<<shortcut-list-item \"$caption$\">>\n</$list>\n</tr>\n\\end\n\n\\define shortcut-editor()\n<<shortcut-list \"All\" \"$:/config/shortcuts/\">>\n<<shortcut-list \"Mac\" \"$:/config/shortcuts-mac/\">>\n<<shortcut-list \"NonMac\" \"$:/config/shortcuts-not-mac/\">>\n<<shortcut-list \"Linux\" \"$:/config/shortcuts-linux/\">>\n<<shortcut-list \"NonLinux\" \"$:/config/shortcuts-not-linux/\">>\n<<shortcut-list \"Windows\" \"$:/config/shortcuts-windows/\">>\n<<shortcut-list \"NonWindows\" \"$:/config/shortcuts-not-windows/\">>\n\\end\n\n\\define shortcut-preview()\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutPrefix)$$(shortcutName)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\\end\n\n\\define shortcut-item-inner()\n<tr>\n<td>\n<$reveal type=\"nomatch\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"open\"\n/>\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"close\"\n/>\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n''<$text text=<<shortcutName>>/>''\n</td>\n<td>\n<$transclude tiddler=\"$:/config/ShortcutInfo/$(shortcutName)$\"/>\n</td>\n<td>\n<$list filter=\"$:/config/shortcuts/ $:/config/shortcuts-mac/ $:/config/shortcuts-not-mac/ $:/config/shortcuts-linux/ $:/config/shortcuts-not-linux/ $:/config/shortcuts-windows/ $:/config/shortcuts-not-windows/\" variable=\"shortcutPrefix\">\n<<shortcut-preview>>\n</$list>\n</td>\n</tr>\n<$set name=\"dropdownState\" value={{$(dropdownStateTitle)$}}>\n<$list filter=\"[<dropdownState>match[open]]\" variable=\"listItem\">\n<<shortcut-editor>>\n</$list>\n</$set>\n\\end\n\n\\define shortcut-item()\n<$set name=\"dropdownStateTitle\" value=<<qualify \"$:/state/dropdown/keyboardshortcut/$(shortcutName)$\">>>\n<<shortcut-item-inner>>\n</$set>\n\\end\n\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]removeprefix[$:/config/ShortcutInfo/]]\" variable=\"shortcutName\">\n<<shortcut-item>>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ControlPanel/LoadedModules": {
"title": "$:/core/ui/ControlPanel/LoadedModules",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/LoadedModules/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n<<lingo LoadedModules/Hint>>\n\n{{$:/snippets/modules}}\n"
},
"$:/core/ui/ControlPanel/Modals/AddPlugins": {
"title": "$:/core/ui/ControlPanel/Modals/AddPlugins",
"subtitle": "{{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/Add/Caption}}",
"text": "\\define install-plugin-actions()\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url={{!!url}} title={{$(assetInfo)$!!original-title}}/>\n<$set name=\"url\" value={{!!url}}>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[title]]\" variable=\"dependency\">\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url=<<url>> title=<<dependency>>/>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define install-plugin-button()\n<div>\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$set name=\"reinstall-type\" value={{{ [<libraryVersion>compare:version:eq<installedVersion>then[tc-reinstall]] [<libraryVersion>compare:version:gt<installedVersion>then[tc-reinstall-upgrade]] [<libraryVersion>compare:version:lt<installedVersion>then[tc-reinstall-downgrade]] }}}>\n<$button actions=<<install-plugin-actions>> class={{{ [<assetInfo>get[original-title]has[version]then<reinstall-type>] tc-btn-invisible tc-install-plugin +[join[ ]] }}}>\n{{$:/core/images/download-button}}\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Install/Caption}}\">\n<$list filter=\"[<libraryVersion>compare:version:gt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[<libraryVersion>compare:version:lt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Reinstall/Caption}}\">\n{{$:/language/ControlPanel/Plugins/Downgrade/Caption}}\n</$list>\n\"\"\">\n{{$:/language/ControlPanel/Plugins/Update/Caption}}\n</$list>\n</$list>\n</$button>\n<div>\n</div>\n<$reveal stateTitle=<<assetInfo>> stateField=\"requires-reload\" type=\"match\" text=\"yes\">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal>\n</$set>\n</$set>\n</$set>\n</div>\n\\end\n\n\\define popup-state-macro()\n$:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$\n\\end\n\n\\define display-plugin-info(type)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<div class=\"tc-plugin-info\">\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$list filter=\"[<assetInfo>has[icon]]\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\"\"\">\n<img src={{$(assetInfo)$!!icon}}/>\n</$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1><strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$view tiddler=<<assetInfo>> field=\"description\"/></h1>\n<h2><$view tiddler=<<assetInfo>> field=\"original-title\"/></h2>\n<div><em><$view tiddler=<<assetInfo>> field=\"version\"/></em></div>\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\"><div><em>{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}</em></div></$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-buttons\">\n<<install-plugin-button>>\n</div>\n</div>\n<$set name=\"original-title\" value={{{ [<assetInfo>get[original-title]] }}}>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]] ~[<assetInfo>get[original-title]!is[tiddler]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-dropdown-message\">\n<$list filter=\"[<assetInfo>get[original-title]!is[tiddler]]\">\n{{$:/language/ControlPanel/Plugins/NotInstalled/Hint}}\n</$list>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]]\" variable=\"ignore\">\n<div>\n{{$:/language/ControlPanel/Plugins/AlsoRequires}}\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[title]]\" variable=\"dependency\">\n<$text text=<<dependency>>/>\n</$list>\n</div>\n</$list>\n</$set>\n</div>\n</$list>\n<div class=\"tc-plugin-info-dropdown-body\">\n<$transclude tiddler=<<assetInfo>> field=\"readme\" mode=\"block\"/>\n</div>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-sub-plugins\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[title]]\" variable=\"assetInfo\">\n<<display-plugin-info \"$type$\">>\n</$list>\n</div>\n</$list>\n</div>\n</$reveal>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<$reveal type=\"nomatch\" text=\"yes\" state=<<popup-state>> tag=\"div\" class=\"tc-plugin-info-sub-plugin-indicator\">\n<$wikify name=\"count\" text=\"\"\"<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>]\"/>\"\"\">\n<$button class=\"tc-btn-invisible\" set=<<popup-state>> setTo=\"yes\">\n{{$:/language/ControlPanel/Plugins/SubPluginPrompt}}\n</$button>\n</$wikify>\n</$reveal>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define load-plugin-library-button()\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-load-plugin-library\" url={{!!url}} infoTitlePrefix=\"$:/temp/RemoteAssetInfo/\"/>\n{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Plugins/OpenPluginLibrary}}\n</$button>\n\\end\n\n\\define display-server-assets(type)\n{{$:/language/Search/Search}}: <$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<div class=\"tc-plugin-library-listing\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[title]]\" variable=\"assetInfo\">\n<$list filter=\"[[$:/temp/RemoteAssetSearch/$(currentTiddler)$]has[text]] ~[<assetInfo>!has[parent-plugin]]\" variable=\"ignore\"><!-- Hide sub-plugins if we're not searching -->\n<<display-plugin-info \"$type$\">>\n</$list>\n</$list>\n</div>\n\\end\n\n\\define display-server-connection()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]\" variable=\"connectionTiddler\" emptyMessage=<<load-plugin-library-button>>>\n\n<$set name=\"transclusion\" value=<<connectionTiddler>>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Add/Plugins\">>\n\n</$set>\n\n</$list>\n\\end\n\n\\define close-library-button()\n<$reveal type='nomatch' state='$:/temp/ServerConnection/$(PluginLibraryURL)$' text=''>\n<$button class='tc-btn-big-green'>\n<$action-sendmessage $message=\"tm-unload-plugin-library\" url={{!!url}}/>\n{{$:/core/images/chevron-left}} {{$:/language/ControlPanel/Plugins/ClosePluginLibrary}}\n<$action-deletetiddler $filter=\"[prefix[$:/temp/ServerConnection/$(PluginLibraryURL)$]][prefix[$:/temp/RemoteAssetInfo/$(PluginLibraryURL)$]]\"/>\n</$button>\n</$reveal>\n\\end\n\n\\define plugin-library-listing()\n<div class=\"tc-tab-set\">\n<$set name=\"defaultTab\" value={{{ [all[tiddlers+shadows]tag[$:/tags/PluginLibrary]] }}}>\n<div class=\"tc-tab-buttons\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$button set=<<qualify \"$:/state/addplugins/tab\">> setTo=<<currentTiddler>> default=<<defaultTab>> selectedClass=\"tc-tab-selected\">\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude field=\"caption\"/>\n</$set>\n</$button>\n</$list>\n</div>\n<div class=\"tc-tab-divider\"/>\n<div class=\"tc-tab-content\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$reveal type=\"match\" state=<<qualify \"$:/state/addplugins/tab\">> text=<<currentTiddler>> default=<<defaultTab>>>\n<h2><$link><$transclude field=\"caption\"><$view field=\"title\"/></$transclude></$link></h2>\n//<$view field=\"url\"/>//\n<$transclude mode=\"block\"/>\n<$set name=PluginLibraryURL value={{!!url}}>\n<<close-library-button>>\n</$set>\n<<display-server-connection>>\n</$reveal>\n</$list>\n</div>\n</$set>\n</div>\n\\end\n\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<div>\n<<plugin-library-listing>>\n</div>\n"
},
"$:/core/ui/ControlPanel/Palette": {
"title": "$:/core/ui/ControlPanel/Palette",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Palette/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n\n{{$:/snippets/paletteswitcher}}\n\n<$reveal type=\"nomatch\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"yes\"><<lingo ShowEditor/Caption>></$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"no\"><<lingo HideEditor/Caption>></$button>\n{{$:/PaletteManager}}\n\n</$reveal>\n\n"
},
"$:/core/ui/ControlPanel/Parsing": {
"title": "$:/core/ui/ControlPanel/Parsing",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/Parsing/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Parsing/\n\n\\define toggle(Type)\n<$checkbox\ntiddler=\"\"\"$:/config/WikiParserRules/$Type$/$(rule)$\"\"\"\nfield=\"text\"\nchecked=\"enable\"\nunchecked=\"disable\"\ndefault=\"enable\">\n<<rule>>\n</$checkbox>\n\\end\n\n\\define rules(type,Type)\n<$list filter=\"[wikiparserrules[$type$]]\" variable=\"rule\">\n<dd><<toggle $Type$>></dd>\n</$list>\n\\end\n\n<<lingo Hint>>\n\n<dl>\n<dt><<lingo Pragma/Caption>></dt>\n<<rules pragma Pragma>>\n<dt><<lingo Inline/Caption>></dt>\n<<rules inline Inline>>\n<dt><<lingo Block/Caption>></dt>\n<<rules block Block>>\n</dl>"
},
"$:/core/ui/ControlPanel/Plugins/Add/Languages": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Languages",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[language]]\"/>)",
"text": "<<display-server-assets language>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Add/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[plugin]]\"/>)",
"text": "<<display-server-assets plugin>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Add/Themes": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Themes",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[theme]]\"/>)",
"text": "<<display-server-assets theme>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Add/Updates": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Updates",
"caption": "<$importvariables filter=\"$:/core/ui/ControlPanel/Plugins/Add/Updates\">{{$:/language/ControlPanel/Plugins/Updates/Caption}} (<<update-count>>)</$importvariables>",
"text": "\\define each-updateable-plugin(body)\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}sort[title]]\" variable=\"assetInfo\">\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$list filter=\"[<assetInfo>get[original-title]has[version]!version<libraryVersion>]\" variable=\"ignore\">\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$list filter=\"[<installedversion>!match<libraryVersion>]\" variable=\"ignore\">\n$body$\n</$list>\n</$set>\n</$list>\n</$set>\n</$list>\n\\end\n\n\\define update-all-actions()\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<<install-plugin-actions>>\n\"\"\"/>\n\\end\n\n\\define update-count()\n<$wikify name=\"count-filter\" text=<<each-updateable-plugin \"[[<$text text=<<assetInfo>>/>]]\">>><$count filter=<<count-filter>>/></$wikify>\n\\end\n\n<$button actions=<<update-all-actions>> class=\"tc-btn-invisible tc-install-plugin tc-reinstall-upgrade\">\n{{$:/core/images/download-button}} {{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}}\n</$button>\n\n<div class=\"tc-plugin-library-listing\">\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<$macrocall $name=\"display-plugin-info\" type={{{ [<assetInfo>get[original-plugin-type]] }}}/>\n\"\"\"/>\n</div>\n"
},
"$:/core/ui/ControlPanel/Plugins/AddPlugins": {
"title": "$:/core/ui/ControlPanel/Plugins/AddPlugins",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n<$button message=\"tm-modal\" param=\"$:/core/ui/ControlPanel/Modals/AddPlugins\" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class=\"tc-btn-big-green tc-primary-btn\">\n{{$:/core/images/download-button}} <<lingo Add/Caption>>\n</$button>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Languages": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Languages",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[language]]\"/>)",
"text": "<<plugin-table language>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[plugin]]\"/>)",
"text": "<<plugin-table plugin>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Themes": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Themes",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[theme]]\"/>)",
"text": "<<plugin-table theme>>\n"
},
"$:/core/ui/ControlPanel/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define plugin-table(type)\n<$set name=\"plugin-type\" value=\"\"\"$type$\"\"\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[title]]\" emptyMessage=<<lingo \"Empty/Hint\">> template=\"$:/core/ui/Components/plugin-info\"/>\n</$set>\n</$set>\n\\end\n\n{{$:/core/ui/ControlPanel/Plugins/AddPlugins}}\n\n<<lingo Installed/Hint>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\">>\n"
},
"$:/core/ui/ControlPanel/Saving/DownloadSaver": {
"title": "$:/core/ui/ControlPanel/Saving/DownloadSaver",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/DownloadSaver/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/DownloadSaver/\n\n<<lingo Hint>>\n\n!! <$link to=\"$:/config/DownloadSaver/AutoSave\"><<lingo AutoSave/Hint>></$link>\n\n<$checkbox tiddler=\"$:/config/DownloadSaver/AutoSave\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <<lingo AutoSave/Description>> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Saving/General": {
"title": "$:/core/ui/ControlPanel/Saving/General",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/General/Caption}}",
"list-before": "",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n{{$:/language/ControlPanel/Saving/General/Hint}}\n\n!! <$link to=\"$:/config/AutoSave\"><<lingo AutoSave/Caption>></$link>\n\n<<lingo AutoSave/Hint>>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\"> <<lingo AutoSave/Enabled/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\"> <<lingo AutoSave/Disabled/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Saving/GitHub": {
"title": "$:/core/ui/ControlPanel/Saving/GitHub",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/GitService/GitHub/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitHub\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitHub/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitHub/Password>> |<$password name=\"github\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitHub/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitHub/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitHub/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitHub/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitHub/ServerURL\" default=\"https://api.github.com\" tag=\"input\"/> |"
},
"$:/core/ui/ControlPanel/Saving/GitLab": {
"title": "$:/core/ui/ControlPanel/Saving/GitLab",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/GitService/GitLab/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitLab\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitLab/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitLab/Password>> |<$password name=\"gitlab\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitLab/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitLab/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitLab/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitLab/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitLab/ServerURL\" default=\"https://gitlab.com/api/v4\" tag=\"input\"/> |"
},
"$:/core/ui/ControlPanel/Saving/TiddlySpot": {
"title": "$:/core/ui/ControlPanel/Saving/TiddlySpot",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/TiddlySpot/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/TiddlySpot/\n\n\\define backupURL()\nhttp://$(userName)$.tiddlyspot.com/backup/\n\\end\n\\define backupLink()\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<backupURL>>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/UploadURL\" text=\"\">\n<$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}>>\n</$reveal>\n</$set>\n</$reveal>\n\\end\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo Password>> |<$password name=\"upload\"/> |\n|<<lingo Backups>> |<<backupLink>> |\n\n''<<lingo Advanced/Heading>>''\n\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>"
},
"$:/core/ui/ControlPanel/Saving/Gitea": {
"title": "$:/core/ui/ControlPanel/Saving/Gitea",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/GitService/Gitea/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~Gitea\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/Gitea/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo Gitea/Password>> |<$password name=\"Gitea\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/Gitea/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/Gitea/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/Gitea/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/Gitea/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/Gitea/ServerURL\" default=\"https://gitea/api/v1\" tag=\"input\"/> |\n"
},
"$:/core/ui/ControlPanel/Saving": {
"title": "$:/core/ui/ControlPanel/Saving",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Saving/Caption}}",
"text": "{{$:/language/ControlPanel/Saving/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Saving/General\">>\n</div>\n"
},
"$:/core/buttonstyles/Borderless": {
"title": "$:/core/buttonstyles/Borderless",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless}}",
"text": "tc-btn-invisible"
},
"$:/core/buttonstyles/Boxed": {
"title": "$:/core/buttonstyles/Boxed",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed}}",
"text": "tc-btn-boxed"
},
"$:/core/buttonstyles/Rounded": {
"title": "$:/core/buttonstyles/Rounded",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded}}",
"text": "tc-btn-rounded"
},
"$:/core/ui/ControlPanel/Settings/CamelCase": {
"title": "$:/core/ui/ControlPanel/Settings/CamelCase",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/CamelCase/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/CamelCase/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/WikiParserRules/Inline/wikilink\" field=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"> <$link to=\"$:/config/WikiParserRules/Inline/wikilink\"><<lingo Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab": {
"title": "$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab",
"caption": "{{$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption}}",
"tags": "$:/tags/ControlPanel/Settings",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/\n\n<$link to=\"$:/config/DefaultMoreSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultMoreSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/DefaultSidebarTab": {
"title": "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab",
"caption": "{{$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption}}",
"tags": "$:/tags/ControlPanel/Settings",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultSidebarTab/\n\n<$link to=\"$:/config/DefaultSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/EditorToolbar": {
"title": "$:/core/ui/ControlPanel/Settings/EditorToolbar",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/EditorToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/EditorToolbar/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/TextEditor/EnableToolbar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/TextEditor/EnableToolbar\"><<lingo Description>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/InfoPanelMode": {
"title": "$:/core/ui/ControlPanel/Settings/InfoPanelMode",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/InfoPanelMode/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/InfoPanelMode/\n<$link to=\"$:/config/TiddlerInfo/Mode\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"popup\"> <<lingo Popup/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"sticky\"> <<lingo Sticky/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/LinkToBehaviour": {
"title": "$:/core/ui/ControlPanel/Settings/LinkToBehaviour",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/LinkToBehaviour/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/LinkToBehaviour/\n\n<$link to=\"$:/config/Navigation/openLinkFromInsideRiver\"><<lingo \"InsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromInsideRiver\">\n <option value=\"above\"><<lingo \"OpenAbove\">></option>\n <option value=\"below\"><<lingo \"OpenBelow\">></option>\n <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n\n<$link to=\"$:/config/Navigation/openLinkFromOutsideRiver\"><<lingo \"OutsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromOutsideRiver\">\n <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/MissingLinks": {
"title": "$:/core/ui/ControlPanel/Settings/MissingLinks",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/MissingLinks/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/MissingLinks/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/MissingLinks\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/MissingLinks\"><<lingo Description>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationAddressBar": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationAddressBar",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\n\n<$link to=\"$:/config/Navigation/UpdateAddressBar\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permaview\"> <<lingo Permaview/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permalink\"> <<lingo Permalink/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationHistory": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationHistory",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\n<$link to=\"$:/config/Navigation/UpdateHistory\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationPermalinkviewMode/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/CopyToClipboard\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/CopyToClipboard\"><<lingo CopyToClipboard/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\"><<lingo UpdateAddressBar/Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation": {
"title": "$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/PerformanceInstrumentation/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Performance/Instrumentation\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Performance/Instrumentation\"><<lingo Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/TitleLinks": {
"title": "$:/core/ui/ControlPanel/Settings/TitleLinks",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/TitleLinks/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/TitleLinks/\n<$link to=\"$:/config/Tiddlers/TitleLinks\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle": {
"title": "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtonStyle/\n<$link to=\"$:/config/Toolbar/ButtonClass\"><<lingo \"Hint\">></$link>\n\n<$select tiddler=\"$:/config/Toolbar/ButtonClass\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ToolbarButtonStyle]]\">\n<option value={{!!text}}>{{!!caption}}</option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/ToolbarButtons": {
"title": "$:/core/ui/ControlPanel/Settings/ToolbarButtons",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Toolbar/Icons\"><<lingo Icons/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Toolbar/Text\"><<lingo Text/Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings": {
"title": "$:/core/ui/ControlPanel/Settings",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Settings/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ControlPanel/StoryView": {
"title": "$:/core/ui/ControlPanel/StoryView",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/StoryView/Caption}}",
"text": "{{$:/snippets/viewswitcher}}\n"
},
"$:/core/ui/ControlPanel/Stylesheets": {
"title": "$:/core/ui/ControlPanel/Stylesheets",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/Stylesheets/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo Stylesheets/Hint>>\n\n{{$:/snippets/peek-stylesheets}}\n"
},
"$:/core/ui/ControlPanel/Theme": {
"title": "$:/core/ui/ControlPanel/Theme",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Theme/Caption}}",
"text": "{{$:/snippets/themeswitcher}}\n"
},
"$:/core/ui/ControlPanel/TiddlerFields": {
"title": "$:/core/ui/ControlPanel/TiddlerFields",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/TiddlerFields/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo TiddlerFields/Hint>>\n\n{{$:/snippets/allfields}}"
},
"$:/core/ui/ControlPanel/Toolbars/EditToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>"
},
"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate",
"text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"><$transclude tiddler={{!!icon}}/></span> <$transclude field=\"caption\"/> -- <i class=\"tc-muted\"><$transclude field=\"description\"/></i>\n</$draggable>\n"
},
"$:/core/ui/ControlPanel/Toolbars/EditorToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditorToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/EditorToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditorToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditorToolbar/Hint}}\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditorToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate\"/>\n"
},
"$:/core/ui/ControlPanel/Toolbars/ItemTemplate": {
"title": "$:/core/ui/ControlPanel/Toolbars/ItemTemplate",
"text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"> <$transclude field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude field=\"description\"/></i></span>\n</$draggable>\n"
},
"$:/core/ui/ControlPanel/Toolbars/PageControls": {
"title": "$:/core/ui/ControlPanel/Toolbars/PageControls",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/PageControlButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/PageControls\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars/ViewToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/ViewToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/ViewToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/ViewToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars": {
"title": "$:/core/ui/ControlPanel/Toolbars",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Toolbars/Caption}}",
"text": "{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" \"$:/state/tabs/controlpanel/toolbars\" \"tc-vertical\">>\n</div>\n"
},
"$:/ControlPanel": {
"title": "$:/ControlPanel",
"icon": "$:/core/images/options-button",
"color": "#bbb",
"text": "<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Info\">>\n</div>\n"
},
"$:/core/ui/DefaultSearchResultList": {
"title": "$:/core/ui/DefaultSearchResultList",
"tags": "$:/tags/SearchResults",
"caption": "{{$:/language/Search/DefaultResults/Caption}}",
"text": "\\define searchResultList()\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n\n<$list filter=\"[!is[system]search:title{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n//<small>{{$:/language/Search/Matches/All}}</small>//\n\n<$list filter=\"[!is[system]search{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n\\end\n<<searchResultList>>\n"
},
"$:/core/ui/EditTemplate/body/preview/diffs-current": {
"title": "$:/core/ui/EditTemplate/body/preview/diffs-current",
"tags": "$:/tags/EditPreview",
"caption": "differences from current",
"list-after": "$:/core/ui/EditTemplate/body/preview/output",
"text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
},
"$:/core/ui/EditTemplate/body/preview/diffs-shadow": {
"title": "$:/core/ui/EditTemplate/body/preview/diffs-shadow",
"tags": "$:/tags/EditPreview",
"caption": "differences from shadow (if any)",
"list-after": "$:/core/ui/EditTemplate/body/preview/output",
"text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{{ [{!!draft.of}shadowsource[]] }}} sourceSubTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
},
"$:/core/ui/EditTemplate/body/preview/output": {
"title": "$:/core/ui/EditTemplate/body/preview/output",
"tags": "$:/tags/EditPreview",
"caption": "{{$:/language/EditTemplate/Body/Preview/Type/Output}}",
"text": "\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$set name=\"tv-tiddler-preview\" value=\"yes\">\n\n<$transclude />\n\n</$set>\n"
},
"$:/state/showeditpreview": {
"title": "$:/state/showeditpreview",
"text": "no"
},
"$:/core/ui/EditTemplate/body/editor": {
"title": "$:/core/ui/EditTemplate/body/editor",
"text": "<$edit\n\n field=\"text\"\n class=\"tc-edit-texteditor tc-edit-texteditor-body\"\n placeholder={{$:/language/EditTemplate/Body/Placeholder}}\n tabindex={{$:/config/EditTabIndex}}\n focus={{{ [{$:/config/AutoFocus}match[text]then[true]] ~[[false]] }}}\n\n><$set\n\n name=\"targetTiddler\"\n value=<<currentTiddler>>\n\n><$list\n\n filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\"\n\n><$reveal\n\n type=\"nomatch\"\n state=<<config-visibility-title>>\n text=\"hide\"\n class=\"tc-text-editor-toolbar-item-wrapper\"\n\n><$transclude\n\n tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\"\n mode=\"inline\"\n\n/></$reveal></$list></$set></$edit>\n"
},
"$:/core/ui/EditTemplate/body/toolbar/button": {
"title": "$:/core/ui/EditTemplate/body/toolbar/button",
"text": "\\define toolbar-button-icon()\n<$list\n\n filter=\"[all[current]!has[custom-icon]]\"\n variable=\"no-custom-icon\"\n\n><$transclude\n\n tiddler={{!!icon}}\n\n/></$list>\n\\end\n\n\\define toolbar-button-tooltip()\n{{!!description}}<$macrocall $name=\"displayshortcuts\" $output=\"text/plain\" shortcuts={{!!shortcuts}} prefix=\"` - [\" separator=\"] [\" suffix=\"]`\"/>\n\\end\n\n\\define toolbar-button()\n<$list\n\n filter={{!!condition}}\n variable=\"list-condition\"\n\n><$wikify\n\n name=\"tooltip-text\"\n text=<<toolbar-button-tooltip>>\n mode=\"inline\"\n output=\"text\"\n\n><$list\n\n filter=\"[all[current]!has[dropdown]]\"\n variable=\"no-dropdown\"\n\n><$button\n\n class=\"tc-btn-invisible $(buttonClasses)$\"\n tooltip=<<tooltip-text>>\n actions={{!!actions}}\n\n><span\n\n data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n tiddler=<<currentTiddler>>\n field=\"text\"\n\n/></$button></$list><$list\n\n filter=\"[all[current]has[dropdown]]\"\n variable=\"dropdown\"\n\n><$set\n\n name=\"dropdown-state\"\n value=<<qualify \"$:/state/EditorToolbarDropdown\">>\n\n><$button\n\n popup=<<dropdown-state>>\n class=\"tc-popup-keep tc-btn-invisible $(buttonClasses)$\"\n selectedClass=\"tc-selected\"\n tooltip=<<tooltip-text>>\n actions={{!!actions}}\n\n><span\n\n data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n tiddler=<<currentTiddler>>\n field=\"text\"\n\n/></$button><$reveal\n\n state=<<dropdown-state>>\n type=\"popup\"\n position=\"below\"\n animate=\"yes\"\n tag=\"span\"\n\n><div\n\n class=\"tc-drop-down tc-popup-keep\"\n\n><$transclude\n\n tiddler={{!!dropdown}}\n mode=\"block\"\n\n/></div></$reveal></$set></$list></$wikify></$list>\n\\end\n\n\\define toolbar-button-outer()\n<$set\n\n name=\"buttonClasses\"\n value={{!!button-classes}}\n\n><<toolbar-button>></$set>\n\\end\n\n<<toolbar-button-outer>>"
},
"$:/core/ui/EditTemplate/body": {
"title": "$:/core/ui/EditTemplate/body",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Body/\n\\define config-visibility-title()\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\n\\end\n<$list filter=\"[all[current]has[_canonical_uri]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\" tabindex={{$:/config/EditTabIndex}}></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[all[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<div class=\"tc-tiddler-preview\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n<div class=\"tc-tiddler-preview-preview\">\n\n<$transclude tiddler={{$:/state/editpreviewtype}} mode=\"inline\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/preview/output\" mode=\"inline\"/>\n\n</$transclude>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n"
},
"$:/core/ui/EditTemplate/controls": {
"title": "$:/core/ui/EditTemplate/controls",
"tags": "$:/tags/EditTemplate",
"text": "\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title tc-tiddler-edit-title\">\n<$view field=\"title\"/>\n<span class=\"tc-tiddler-controls tc-titlebar\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list></span>\n<div style=\"clear: both;\"></div>\n</div>\n"
},
"$:/core/ui/EditTemplate/fields": {
"title": "$:/core/ui/EditTemplate/fields",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\define config-title()\n$:/config/EditTemplateFields/Visibility/$(currentField)$\n\\end\n\n\\define config-filter()\n[[hide]] -[title{$(config-title)$}]\n\\end\n\n\\define current-tiddler-new-field-selector()\n[data-tiddler-title=\"$(currentTiddlerCSSescaped)$\"] .tc-edit-field-add-name input\n\\end\n\n\\define new-field-actions()\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/>\n<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/>\n\\end\n\n\\define new-field()\n<$vars name={{{ [<newFieldNameTiddler>get[text]] }}}>\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button tooltip=<<lingo Fields/Add/Button/Hint>>>\n<$action-sendmessage $message=\"tm-add-field\"\n$name=<<name>>\n$value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/>\n<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=<<name>>>\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n</$vars>\n\\end\n\\whitespace trim\n\n<div class=\"tc-edit-fields\">\n<table class=\"tc-edit-fields\">\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\" storyview=\"pop\">\n<$list filter=<<config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}}/>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit\">\n<<lingo Fields/Add/Prompt>> \n</em>\n<span class=\"tc-edit-field-add-name\">\n<$edit-text tiddler=<<newFieldNameTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}}/>\n</span> \n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> \n<$reveal state=<<qualify \"$:/state/popup/field-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=<<newFieldNameTiddler>>>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/User>>\n</div>\n<$set name=\"newFieldName\" value={{{ [<newFieldNameTiddler>get[text]] }}}>\n<$list filter=\"[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\" variable=\"currentField\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$set>\n</$linkcatcher>\n</$set>\n</div>\n</$reveal>\n<span class=\"tc-edit-field-add-value\">\n<$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}>\n<$keyboard key=\"((add-field))\" actions=<<new-field-actions>>>\n<$edit-text tiddler=<<newFieldValueTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\" tabindex={{$:/config/EditTabIndex}}/>\n</$keyboard>\n</$set>\n</span> \n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\"/>\n</span>\n</div>\n</$fieldmangler>\n"
},
"$:/core/ui/EditTemplate/shadow": {
"title": "$:/core/ui/EditTemplate/shadow",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Shadow/\n\\define pluginLinkBody()\n<$link to=\"\"\"$(pluginTitle)$\"\"\">\n<$text text=\"\"\"$(pluginTitle)$\"\"\"/>\n</$link>\n\\end\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>"
},
"$:/core/ui/EditTemplate/tags": {
"title": "$:/core/ui/EditTemplate/tags",
"tags": "$:/tags/EditTemplate",
"text": "\\whitespace trim\n\n\\define lingo-base() $:/language/EditTemplate/\n\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon)\n\\whitespace trim\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<span style=<<tag-styles>> class=\"tc-tag-label tc-tag-list-item\">\n<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view field=\"title\" format=\"text\" />\n<$button message=\"tm-remove-tag\" param={{!!title}} class=\"tc-btn-invisible tc-remove-tag-button\">{{$:/core/images/close-button}}</$button>\n</span>\n</$vars>\n\\end\n\n\\define tag-body(colour,palette,icon)\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon=\"\"\"$icon$\"\"\"/>\n\\end\n\n<div class=\"tc-edit-tags\">\n<$fieldmangler>\n<$list filter=\"[all[current]tags[]sort[title]]\" storyview=\"pop\">\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}}/>\n</$list>\n<$set name=\"tabIndex\" value={{$:/config/EditTabIndex}}>\n<$macrocall $name=\"tag-picker\"/>\n</$set>\n</$fieldmangler>\n</div>\n"
},
"$:/core/ui/EditTemplate/title": {
"title": "$:/core/ui/EditTemplate/title",
"tags": "$:/tags/EditTemplate",
"text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}}/>\n\n<$vars pattern=\"\"\"[\\|\\[\\]{}]\"\"\" bad-chars=\"\"\"`| [ ] { }`\"\"\">\n\n<$list filter=\"[all[current]regexp:draft.title<pattern>]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/BadCharacterWarning}}\n\n</div>\n\n</$list>\n\n</$vars>\n\n<$reveal state=\"!!draft.title\" type=\"nomatch\" text={{!!draft.of}} tag=\"div\">\n\n<$list filter=\"[{!!draft.title}!is[missing]]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}}\n\n</div>\n\n</$list>\n\n<$list filter=\"[{!!draft.of}!is[missing]]\" variable=\"listItem\">\n\n<$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\n\n<$checkbox tiddler=\"$:/config/RelinkOnRename\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> {{$:/language/EditTemplate/Title/Relink/Prompt}}</$checkbox>\n\n<$list filter=\"[title<fromTitle>backlinks[]limit[1]]\" variable=\"listItem\">\n\n<$vars stateTiddler=<<qualify \"$:/state/edit/references\">> >\n\n<$reveal type=\"nomatch\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"show\" class=\"tc-btn-invisible\">{{$:/core/images/right-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"hide\" class=\"tc-btn-invisible\">{{$:/core/images/down-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$tiddler tiddler=<<fromTitle>> >\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo/References\"/>\n</$tiddler>\n</$reveal>\n\n</$vars>\n\n</$list>\n\n</$vars>\n\n</$list>\n\n</$reveal>\n"
},
"$:/core/ui/EditTemplate/type": {
"title": "$:/core/ui/EditTemplate/type",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\whitespace trim\n<div class=\"tc-type-selector\"><$fieldmangler>\n<em class=\"tc-edit\"><<lingo Type/Prompt>></em> <$edit-text field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}}/> <$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group-sort]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]]\"><$link to={{!!name}}><$view field=\"description\"/> (<$view field=\"name\"/>)</$link>\n</$list>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</$set>\n</div>\n"
},
"$:/core/ui/EditTemplate": {
"title": "$:/core/ui/EditTemplate",
"text": "\\define save-tiddler-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newFieldNameTiddler>>/>\n<$action-deletetiddler $tiddler=<<newFieldValueTiddler>>/>\n<$action-sendmessage $message=\"tm-save-tiddler\"/>\n\\end\n<div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-edit-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}>\n<$fieldmangler>\n<$vars storyTiddler=<<currentTiddler>> newTagNameTiddler=<<qualify \"$:/temp/NewTagName\">> newFieldNameTiddler=<<qualify \"$:/temp/NewFieldName\">> newFieldValueTiddler=<<qualify \"$:/temp/NewFieldValue\">>>\n<$keyboard key=\"((cancel-edit-tiddler))\" message=\"tm-cancel-tiddler\">\n<$keyboard key=\"((save-tiddler))\" actions=<<save-tiddler-actions>>>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>>/>\n</$set>\n</$list>\n</$keyboard>\n</$keyboard>\n</$vars>\n</$fieldmangler>\n</div>\n"
},
"$:/core/ui/Buttons/cancel": {
"title": "$:/core/ui/Buttons/cancel",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}",
"description": "{{$:/language/Buttons/Cancel/Hint}}",
"text": "<$button message=\"tm-cancel-tiddler\" tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/cancel-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/delete": {
"title": "$:/core/ui/Buttons/delete",
"tags": "$:/tags/EditToolbar $:/tags/ViewToolbar",
"caption": "{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}",
"description": "{{$:/language/Buttons/Delete/Hint}}",
"text": "<$button message=\"tm-delete-tiddler\" tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/delete-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save": {
"title": "$:/core/ui/Buttons/save",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}",
"description": "{{$:/language/Buttons/Save/Hint}}",
"text": "\\define save-tiddler-button()\n<$fieldmangler><$button tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<<save-tiddler-actions>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/done-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n</$list>\n</$button></$fieldmangler>\n\\end\n<<save-tiddler-button>>\n"
},
"$:/core/ui/EditorToolbar/bold": {
"title": "$:/core/ui/EditorToolbar/bold",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/bold",
"caption": "{{$:/language/Buttons/Bold/Caption}}",
"description": "{{$:/language/Buttons/Bold/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((bold))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"''\"\n\tsuffix=\"''\"\n/>\n"
},
"$:/core/ui/EditorToolbar/clear-dropdown": {
"title": "$:/core/ui/EditorToolbar/clear-dropdown",
"text": "''{{$:/language/Buttons/Clear/Hint}}''\n\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"clear\"\n\tcolour=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n\n</div>\n"
},
"$:/core/ui/EditorToolbar/clear": {
"title": "$:/core/ui/EditorToolbar/clear",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/erase",
"caption": "{{$:/language/Buttons/Clear/Caption}}",
"description": "{{$:/language/Buttons/Clear/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/clear-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/editor-height-dropdown": {
"title": "$:/core/ui/EditorToolbar/editor-height-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/EditorHeight/\n''<<lingo Hint>>''\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"auto\"> {{$:/core/images/auto-height}} <<lingo Caption/Auto>></$radio>\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"fixed\"> {{$:/core/images/fixed-height}} <<lingo Caption/Fixed>> <$edit-text tag=\"input\" tiddler=\"$:/config/TextEditor/EditorHeight/Height\" default=\"100px\"/></$radio>\n"
},
"$:/core/ui/EditorToolbar/editor-height": {
"title": "$:/core/ui/EditorToolbar/editor-height",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/fixed-height",
"custom-icon": "yes",
"caption": "{{$:/language/Buttons/EditorHeight/Caption}}",
"description": "{{$:/language/Buttons/EditorHeight/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] +[first[]]",
"dropdown": "$:/core/ui/EditorToolbar/editor-height-dropdown",
"text": "<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n{{$:/core/images/fixed-height}}\n</$reveal>\n<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n{{$:/core/images/auto-height}}\n</$reveal>\n"
},
"$:/core/ui/EditorToolbar/excise-dropdown": {
"title": "$:/core/ui/EditorToolbar/excise-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Excise/\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<<lingo Caption/NewTitle>> <$edit-text tag=\"input\" tiddler=\"$config-title$/new-title\" default=\"\" focus=\"true\"/>\n\n<$set name=\"new-title\" value={{$config-title$/new-title}}>\n<$list filter=\"\"\"[<new-title>is[tiddler]]\"\"\">\n<div class=\"tc-error\">\n<<lingo Caption/TiddlerExists>>\n</div>\n</$list>\n</$set>\n\n<$checkbox tiddler=\"\"\"$config-title$/tagnew\"\"\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"false\"> <<lingo Caption/Tag>></$checkbox>\n\n<<lingo Caption/Replace>> <$select tiddler=\"\"\"$config-title$/type\"\"\" default=\"transclude\">\n<option value=\"link\"><<lingo Caption/Replace/Link>></option>\n<option value=\"transclude\"><<lingo Caption/Replace/Transclusion>></option>\n<option value=\"macro\"><<lingo Caption/Replace/Macro>></option>\n</$select>\n\n<$reveal state=\"\"\"$config-title$/type\"\"\" type=\"match\" text=\"macro\">\n<<lingo Caption/MacroName>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/macro-title\"\"\" default=\"translink\"/>\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"excise\"\n\ttitle={{$config-title$/new-title}}\n\ttype={{$config-title$/type}}\n\tmacro={{$config-title$/macro-title}}\n\ttagnew={{$config-title$/tagnew}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"$config-title$/new-title\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Excise>>\n</$button>\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Excise/\">>/>\n"
},
"$:/core/ui/EditorToolbar/excise": {
"title": "$:/core/ui/EditorToolbar/excise",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/excise",
"caption": "{{$:/language/Buttons/Excise/Caption}}",
"description": "{{$:/language/Buttons/Excise/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>type[text/vnd.tiddlywiki]] +[first[]]",
"shortcuts": "((excise))",
"dropdown": "$:/core/ui/EditorToolbar/excise-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/heading-1": {
"title": "$:/core/ui/EditorToolbar/heading-1",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-1",
"caption": "{{$:/language/Buttons/Heading1/Caption}}",
"description": "{{$:/language/Buttons/Heading1/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((heading-1))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-2": {
"title": "$:/core/ui/EditorToolbar/heading-2",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-2",
"caption": "{{$:/language/Buttons/Heading2/Caption}}",
"description": "{{$:/language/Buttons/Heading2/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-2))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"2\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-3": {
"title": "$:/core/ui/EditorToolbar/heading-3",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-3",
"caption": "{{$:/language/Buttons/Heading3/Caption}}",
"description": "{{$:/language/Buttons/Heading3/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-3))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"3\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-4": {
"title": "$:/core/ui/EditorToolbar/heading-4",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-4",
"caption": "{{$:/language/Buttons/Heading4/Caption}}",
"description": "{{$:/language/Buttons/Heading4/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-4))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"4\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-5": {
"title": "$:/core/ui/EditorToolbar/heading-5",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-5",
"caption": "{{$:/language/Buttons/Heading5/Caption}}",
"description": "{{$:/language/Buttons/Heading5/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-5))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"5\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-6": {
"title": "$:/core/ui/EditorToolbar/heading-6",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-6",
"caption": "{{$:/language/Buttons/Heading6/Caption}}",
"description": "{{$:/language/Buttons/Heading6/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-6))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"6\"\n/>\n"
},
"$:/core/ui/EditorToolbar/italic": {
"title": "$:/core/ui/EditorToolbar/italic",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/italic",
"caption": "{{$:/language/Buttons/Italic/Caption}}",
"description": "{{$:/language/Buttons/Italic/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((italic))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"//\"\n\tsuffix=\"//\"\n/>\n"
},
"$:/core/ui/EditorToolbar/line-width-dropdown": {
"title": "$:/core/ui/EditorToolbar/line-width-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/LineWidth/\n\n\\define toolbar-line-width-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(line-width)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/LineWidth\"\n\t$value=\"$(line-width)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; margin: 4px calc(80px - $(line-width)$); background-color: #000; width: calc(100px + $(line-width)$ * 2); height: $(line-width)$; border-radius: 120px; vertical-align: middle;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(line-width)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/LineWidth\" type=\"match\" text=\"\"\"$(line-width)$\"\"\" tag=\"span\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/LineWidths}} variable=\"line-width\">\n\n<<toolbar-line-width-inner>>\n\n</$list>\n"
},
"$:/core/ui/EditorToolbar/line-width": {
"title": "$:/core/ui/EditorToolbar/line-width",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/line-width",
"caption": "{{$:/language/Buttons/LineWidth/Caption}}",
"description": "{{$:/language/Buttons/LineWidth/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/line-width-dropdown",
"text": "<$text text={{$:/config/BitmapEditor/LineWidth}}/>"
},
"$:/core/ui/EditorToolbar/link-dropdown": {
"title": "$:/core/ui/EditorToolbar/link-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Link/\n\n\\define add-link-actions()\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"make-link\" text={{$(linkTiddler)$}} />\n<$action-deletetiddler $tiddler=<<dropdown-state>> />\n<$action-deletetiddler $tiddler=<<searchTiddler>> />\n<$action-deletetiddler $tiddler=<<linkTiddler>> />\n\\end\n\n\\define external-link()\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\" actions=<<add-link-actions>>>\n{{$:/core/images/chevron-right}}\n</$button>\n\\end\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<$vars searchTiddler=\"\"\"$config-title$/search\"\"\" linkTiddler=\"\"\"$config-title$/link\"\"\" linktext=\"\" >\n\n<$vars linkTiddler=<<searchTiddler>>>\n<$keyboard key=\"ENTER\" actions=<<add-link-actions>>>\n<$edit-text tiddler=<<searchTiddler>> type=\"search\" tag=\"input\" focus=\"true\" placeholder={{$:/language/Search/Search}} default=\"\"/>\n<$reveal tag=\"span\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n<<external-link>>\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\">\n<$action-setfield $tiddler=<<searchTiddler>> text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$keyboard>\n</$vars>\n\n<$reveal tag=\"div\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n\n<$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>>\n\n{{$:/core/ui/SearchResults}}\n\n</$linkcatcher>\n\n</$reveal>\n\n</$vars>\n\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Link/\">>/>"
},
"$:/core/ui/EditorToolbar/link": {
"title": "$:/core/ui/EditorToolbar/link",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/link",
"caption": "{{$:/language/Buttons/Link/Caption}}",
"description": "{{$:/language/Buttons/Link/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((link))",
"dropdown": "$:/core/ui/EditorToolbar/link-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/linkify": {
"title": "$:/core/ui/EditorToolbar/linkify",
"caption": "{{$:/language/Buttons/Linkify/Caption}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Buttons/Linkify/Hint}}",
"icon": "$:/core/images/linkify",
"list-before": "$:/core/ui/EditorToolbar/mono-block",
"shortcuts": "((linkify))",
"tags": "$:/tags/EditorToolbar",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"[[\"\n\tsuffix=\"]]\"\n/>\n"
},
"$:/core/ui/EditorToolbar/list-bullet": {
"title": "$:/core/ui/EditorToolbar/list-bullet",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-bullet",
"caption": "{{$:/language/Buttons/ListBullet/Caption}}",
"description": "{{$:/language/Buttons/ListBullet/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((list-bullet))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"*\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/list-number": {
"title": "$:/core/ui/EditorToolbar/list-number",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-number",
"caption": "{{$:/language/Buttons/ListNumber/Caption}}",
"description": "{{$:/language/Buttons/ListNumber/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((list-number))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/mono-block": {
"title": "$:/core/ui/EditorToolbar/mono-block",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/mono-block",
"caption": "{{$:/language/Buttons/MonoBlock/Caption}}",
"description": "{{$:/language/Buttons/MonoBlock/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((mono-block))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n```\"\n\tsuffix=\"```\"\n/>\n"
},
"$:/core/ui/EditorToolbar/mono-line": {
"title": "$:/core/ui/EditorToolbar/mono-line",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/mono-line",
"caption": "{{$:/language/Buttons/MonoLine/Caption}}",
"description": "{{$:/language/Buttons/MonoLine/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((mono-line))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n/>\n"
},
"$:/core/ui/EditorToolbar/more-dropdown": {
"title": "$:/core/ui/EditorToolbar/more-dropdown",
"text": "\\define config-title()\n$:/config/EditorToolbarButtons/Visibility/$(toolbarItem)$\n\\end\n\n\\define conditional-button()\n<$list filter={{$(toolbarItem)$!!condition}} variable=\"condition\">\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\" mode=\"inline\"/> <$transclude tiddler=<<toolbarItem>> field=\"description\"/>\n</$list>\n\\end\n\n<div class=\"tc-text-editor-toolbar-more\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]] -[[$:/core/ui/EditorToolbar/more]]\">\n<$reveal type=\"match\" state=<<config-visibility-title>> text=\"hide\" tag=\"div\">\n<<conditional-button>>\n</$reveal>\n</$list>\n</div>\n"
},
"$:/core/ui/EditorToolbar/more": {
"title": "$:/core/ui/EditorToolbar/more",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/down-arrow",
"caption": "{{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"condition": "[<targetTiddler>]",
"dropdown": "$:/core/ui/EditorToolbar/more-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/opacity-dropdown": {
"title": "$:/core/ui/EditorToolbar/opacity-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Opacity/\n\n\\define toolbar-opacity-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(opacity)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Opacity\"\n\t$value=\"$(opacity)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(current-paint-colour)$; opacity: $(opacity)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(opacity)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/Opacity\" type=\"match\" text=\"\"\"$(opacity)$\"\"\" tag=\"span\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n\\define toolbar-opacity()\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/Opacities}} variable=\"opacity\">\n\n<<toolbar-opacity-inner>>\n\n</$list>\n\\end\n\n<$set name=\"current-paint-colour\" value={{$:/config/BitmapEditor/Colour}}>\n\n<$set name=\"current-opacity\" value={{$:/config/BitmapEditor/Opacity}}>\n\n<<toolbar-opacity>>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/EditorToolbar/opacity": {
"title": "$:/core/ui/EditorToolbar/opacity",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/opacity",
"caption": "{{$:/language/Buttons/Opacity/Caption}}",
"description": "{{$:/language/Buttons/Opacity/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/opacity-dropdown",
"text": "<$text text={{$:/config/BitmapEditor/Opacity}}/>\n"
},
"$:/core/ui/EditorToolbar/paint-dropdown": {
"title": "$:/core/ui/EditorToolbar/paint-dropdown",
"text": "''{{$:/language/Buttons/Paint/Hint}}''\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Colour\"\n\t$value=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
},
"$:/core/ui/EditorToolbar/paint": {
"title": "$:/core/ui/EditorToolbar/paint",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/paint",
"caption": "{{$:/language/Buttons/Paint/Caption}}",
"description": "{{$:/language/Buttons/Paint/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/paint-dropdown",
"text": "\\define toolbar-paint()\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(colour-picker-value)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\\end\n<$set name=\"colour-picker-value\" value={{$:/config/BitmapEditor/Colour}}>\n<<toolbar-paint>>\n</$set>\n"
},
"$:/core/ui/EditorToolbar/picture-dropdown": {
"title": "$:/core/ui/EditorToolbar/picture-dropdown",
"text": "\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n''{{$:/language/Buttons/Picture/Hint}}''\n\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext=<<replacement-text>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
},
"$:/core/ui/EditorToolbar/picture": {
"title": "$:/core/ui/EditorToolbar/picture",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/picture",
"caption": "{{$:/language/Buttons/Picture/Caption}}",
"description": "{{$:/language/Buttons/Picture/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((picture))",
"dropdown": "$:/core/ui/EditorToolbar/picture-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/preview-type-dropdown": {
"title": "$:/core/ui/EditorToolbar/preview-type-dropdown",
"text": "\\define preview-type-button()\n<$button tag=\"a\">\n\n<$action-setfield $tiddler=\"$:/state/editpreviewtype\" $value=\"$(previewType)$\"/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<previewType>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<previewType>> field=\"title\" mode=\"inline\"/>\n\n</$transclude> \n\n<$reveal tag=\"span\" state=\"$:/state/editpreviewtype\" type=\"match\" text=<<previewType>> default=\"$:/core/ui/EditTemplate/body/preview/output\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]]\" variable=\"previewType\">\n\n<<preview-type-button>>\n\n</$list>\n"
},
"$:/core/ui/EditorToolbar/preview-type": {
"title": "$:/core/ui/EditorToolbar/preview-type",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/chevron-down",
"caption": "{{$:/language/Buttons/PreviewType/Caption}}",
"description": "{{$:/language/Buttons/PreviewType/Hint}}",
"condition": "[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]butfirst[]limit[1]]",
"button-classes": "tc-text-editor-toolbar-item-adjunct",
"dropdown": "$:/core/ui/EditorToolbar/preview-type-dropdown"
},
"$:/core/ui/EditorToolbar/preview": {
"title": "$:/core/ui/EditorToolbar/preview",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/preview-open",
"custom-icon": "yes",
"caption": "{{$:/language/Buttons/Preview/Caption}}",
"description": "{{$:/language/Buttons/Preview/Hint}}",
"condition": "[<targetTiddler>]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((preview))",
"text": "<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-open}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"no\"/>\n</$reveal>\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-closed}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"yes\"/>\n</$reveal>\n"
},
"$:/core/ui/EditorToolbar/quote": {
"title": "$:/core/ui/EditorToolbar/quote",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/quote",
"caption": "{{$:/language/Buttons/Quote/Caption}}",
"description": "{{$:/language/Buttons/Quote/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((quote))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n<<<\"\n\tsuffix=\"<<<\"\n/>\n"
},
"$:/core/ui/EditorToolbar/rotate-left": {
"title": "$:/core/ui/EditorToolbar/rotate-left",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/rotate-left",
"caption": "{{$:/language/Buttons/RotateLeft/Caption}}",
"description": "{{$:/language/Buttons/RotateLeft/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"rotate-left\"\n/>\n"
},
"$:/core/ui/EditorToolbar/size-dropdown": {
"title": "$:/core/ui/EditorToolbar/size-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Size/\n\n\\define toolbar-button-size-preset(config-title)\n<$set name=\"width\" filter=\"$(sizePair)$ +[first[]]\">\n\n<$set name=\"height\" filter=\"$(sizePair)$ +[last[]]\">\n\n<$button tag=\"a\">\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n\t$value=<<width>>\n/>\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n\t$value=<<height>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/presets-popup\"\"\"\n/>\n\n<$text text=<<width>>/> × <$text text=<<height>>/>\n\n</$button>\n\n</$set>\n\n</$set>\n\\end\n\n\\define toolbar-button-size(config-title)\n''{{$:/language/Buttons/Size/Hint}}''\n\n<<lingo Caption/Width>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-width\"\"\" default=<<tv-bitmap-editor-width>> focus=\"true\" size=\"8\"/> <<lingo Caption/Height>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-height\"\"\" default=<<tv-bitmap-editor-height>> size=\"8\"/> <$button popup=\"\"\"$config-title$/presets-popup\"\"\" class=\"tc-btn-invisible tc-popup-keep\" style=\"width: auto; display: inline-block; background-colour: inherit;\" selectedClass=\"tc-selected\">\n{{$:/core/images/down-arrow}}\n</$button>\n\n<$reveal tag=\"span\" state=\"\"\"$config-title$/presets-popup\"\"\" type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down tc-popup-keep\">\n\n<$list filter={{$:/config/BitmapEditor/ImageSizes}} variable=\"sizePair\">\n\n<$macrocall $name=\"toolbar-button-size-preset\" config-title=\"$config-title$\"/>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"resize\"\n\twidth={{$config-title$/new-width}}\n\theight={{$config-title$/new-height}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Resize>>\n</$button>\n\\end\n\n<$macrocall $name=\"toolbar-button-size\" config-title=<<qualify \"$:/state/Size/\">>/>\n"
},
"$:/core/ui/EditorToolbar/size": {
"title": "$:/core/ui/EditorToolbar/size",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/size",
"caption": "{{$:/language/Buttons/Size/Caption}}",
"description": "{{$:/language/Buttons/Size/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/size-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/stamp-dropdown": {
"title": "$:/core/ui/EditorToolbar/stamp-dropdown",
"text": "\\define toolbar-button-stamp-inner()\n<$button tag=\"a\">\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext={{$(snippetTitle)$}}\n/>\n\n</$list>\n\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix={{{ [[$(snippetTitle)$]addsuffix[/prefix]get[text]] }}}\nsuffix={{{ [[$(snippetTitle)$]addsuffix[/suffix]get[text]] }}}\n/>\n\n</$list>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<snippetTitle>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<snippetTitle>> field=\"title\" />\n\n</$transclude>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TextEditor/Snippet]!has[draft.of]sort[caption]]\" variable=\"snippetTitle\">\n\n<<toolbar-button-stamp-inner>>\n\n</$list>\n\n----\n\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-new-tiddler\"\n\ttags=\"$:/tags/TextEditor/Snippet\"\n\tcaption={{$:/language/Buttons/Stamp/New/Title}}\n\ttext={{$:/language/Buttons/Stamp/New/Text}}\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<em>\n\n<$text text={{$:/language/Buttons/Stamp/Caption/New}}/>\n\n</em>\n\n</$button>\n"
},
"$:/core/ui/EditorToolbar/stamp": {
"title": "$:/core/ui/EditorToolbar/stamp",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/stamp",
"caption": "{{$:/language/Buttons/Stamp/Caption}}",
"description": "{{$:/language/Buttons/Stamp/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] +[first[]]",
"shortcuts": "((stamp))",
"dropdown": "$:/core/ui/EditorToolbar/stamp-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/strikethrough": {
"title": "$:/core/ui/EditorToolbar/strikethrough",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/strikethrough",
"caption": "{{$:/language/Buttons/Strikethrough/Caption}}",
"description": "{{$:/language/Buttons/Strikethrough/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((strikethrough))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"~~\"\n\tsuffix=\"~~\"\n/>\n"
},
"$:/core/ui/EditorToolbar/subscript": {
"title": "$:/core/ui/EditorToolbar/subscript",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/subscript",
"caption": "{{$:/language/Buttons/Subscript/Caption}}",
"description": "{{$:/language/Buttons/Subscript/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((subscript))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\",,\"\n\tsuffix=\",,\"\n/>\n"
},
"$:/core/ui/EditorToolbar/superscript": {
"title": "$:/core/ui/EditorToolbar/superscript",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/superscript",
"caption": "{{$:/language/Buttons/Superscript/Caption}}",
"description": "{{$:/language/Buttons/Superscript/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((superscript))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"^^\"\n\tsuffix=\"^^\"\n/>\n"
},
"$:/core/ui/EditorToolbar/transcludify": {
"title": "$:/core/ui/EditorToolbar/transcludify",
"caption": "{{$:/language/Buttons/Transcludify/Caption}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Buttons/Transcludify/Hint}}",
"icon": "$:/core/images/transcludify",
"list-before": "$:/core/ui/EditorToolbar/mono-block",
"shortcuts": "((transcludify))",
"tags": "$:/tags/EditorToolbar",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"{{\"\n\tsuffix=\"}}\"\n/>\n"
},
"$:/core/ui/EditorToolbar/underline": {
"title": "$:/core/ui/EditorToolbar/underline",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/underline",
"caption": "{{$:/language/Buttons/Underline/Caption}}",
"description": "{{$:/language/Buttons/Underline/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((underline))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"__\"\n\tsuffix=\"__\"\n/>\n"
},
"$:/core/Filters/AllTags": {
"title": "$:/core/Filters/AllTags",
"tags": "$:/tags/Filter",
"filter": "[tags[]!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTags}}",
"text": ""
},
"$:/core/Filters/AllTiddlers": {
"title": "$:/core/Filters/AllTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTiddlers}}",
"text": ""
},
"$:/core/Filters/Drafts": {
"title": "$:/core/Filters/Drafts",
"tags": "$:/tags/Filter",
"filter": "[has[draft.of]sort[title]]",
"description": "{{$:/language/Filters/Drafts}}",
"text": ""
},
"$:/core/Filters/Missing": {
"title": "$:/core/Filters/Missing",
"tags": "$:/tags/Filter",
"filter": "[all[missing]sort[title]]",
"description": "{{$:/language/Filters/Missing}}",
"text": ""
},
"$:/core/Filters/Orphans": {
"title": "$:/core/Filters/Orphans",
"tags": "$:/tags/Filter",
"filter": "[all[orphans]sort[title]]",
"description": "{{$:/language/Filters/Orphans}}",
"text": ""
},
"$:/core/Filters/OverriddenShadowTiddlers": {
"title": "$:/core/Filters/OverriddenShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[shadow]]",
"description": "{{$:/language/Filters/OverriddenShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentSystemTiddlers": {
"title": "$:/core/Filters/RecentSystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentSystemTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentTiddlers": {
"title": "$:/core/Filters/RecentTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentTiddlers}}",
"text": ""
},
"$:/core/Filters/SessionTiddlers": {
"title": "$:/core/Filters/SessionTiddlers",
"tags": "$:/tags/Filter",
"filter": "[haschanged[]]",
"description": "{{$:/language/Filters/SessionTiddlers}}",
"text": ""
},
"$:/core/Filters/ShadowTiddlers": {
"title": "$:/core/Filters/ShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[all[shadows]sort[title]]",
"description": "{{$:/language/Filters/ShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/StoryList": {
"title": "$:/core/Filters/StoryList",
"tags": "$:/tags/Filter",
"filter": "[list[$:/StoryList]] -$:/AdvancedSearch",
"description": "{{$:/language/Filters/StoryList}}",
"text": ""
},
"$:/core/Filters/SystemTags": {
"title": "$:/core/Filters/SystemTags",
"tags": "$:/tags/Filter",
"filter": "[all[shadows+tiddlers]tags[]is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTags}}",
"text": ""
},
"$:/core/Filters/SystemTiddlers": {
"title": "$:/core/Filters/SystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTiddlers}}",
"text": ""
},
"$:/core/Filters/TypedTiddlers": {
"title": "$:/core/Filters/TypedTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Filters/TypedTiddlers}}",
"text": ""
},
"$:/core/ui/ImportListing": {
"title": "$:/core/ui/ImportListing",
"text": "\\define lingo-base() $:/language/Import/\n\n\\define messageField()\nmessage-$(payloadTiddler)$\n\\end\n\n\\define selectionField()\nselection-$(payloadTiddler)$\n\\end\n\n\\define previewPopupState()\n$(currentTiddler)$!!popup-$(payloadTiddler)$\n\\end\n\n\\define select-all-actions()\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<$action-setfield $field={{{ [<payloadTiddler>addprefix[selection-]] }}} $value={{$:/state/import/select-all}}/>\n</$list>\n\\end\n\n<table>\n<tbody>\n<tr>\n<th>\n<$checkbox tiddler=\"$:/state/import/select-all\" field=\"text\" checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" actions=<<select-all-actions>>>\n<<lingo Listing/Select/Caption>>\n</$checkbox>\n</th>\n<th>\n<<lingo Listing/Title/Caption>>\n</th>\n<th>\n<<lingo Listing/Status/Caption>>\n</th>\n</tr>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<tr>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\"/>\n</td>\n<td>\n<$reveal type=\"nomatch\" stateTitle=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" setTitle=<<previewPopupState>> setTo=\"yes\">\n{{$:/core/images/right-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" setTitle=<<previewPopupState>> setTo=\"no\">\n{{$:/core/images/down-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n</td>\n</tr>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" stateTitle=<<previewPopupState>> tag=\"div\">\n<$list filter=\"[{$:/state/importpreviewtype}has[text]]\" variable=\"listItem\" emptyMessage={{$:/core/ui/ImportPreviews/Text}}>\n<$transclude tiddler={{$:/state/importpreviewtype}}/>\n</$list>\n</$reveal>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ImportPreviews/Diff": {
"title": "$:/core/ui/ImportPreviews/Diff",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Diff}}",
"text": "<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>>/>\n"
},
"$:/core/ui/ImportPreviews/DiffFields": {
"title": "$:/core/ui/ImportPreviews/DiffFields",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/DiffFields}}",
"text": "<$macrocall $name=\"compareTiddlers\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>> exclude=\"text\"/>\n"
},
"$:/core/ui/ImportPreviews/Fields": {
"title": "$:/core/ui/ImportPreviews/Fields",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Fields}}",
"text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[<payloadTiddler>subtiddlerfields<currentTiddler>sort[]] -text\" variable=\"fieldName\">\n<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<fieldName>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<fieldName>> tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>>/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ImportPreviews/Text": {
"title": "$:/core/ui/ImportPreviews/Text",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Text}}",
"text": "<$transclude tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> mode=\"block\"/>\n"
},
"$:/core/ui/ImportPreviews/TextRaw": {
"title": "$:/core/ui/ImportPreviews/TextRaw",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/TextRaw}}",
"text": "<pre><code><$view tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> /></code></pre>"
},
"$:/core/ui/KeyboardShortcuts/advanced-search": {
"title": "$:/core/ui/KeyboardShortcuts/advanced-search",
"tags": "$:/tags/KeyboardShortcut",
"key": "((advanced-search))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\"/>\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/new-image": {
"title": "$:/core/ui/KeyboardShortcuts/new-image",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-image))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-image}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/new-journal": {
"title": "$:/core/ui/KeyboardShortcuts/new-journal",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-journal))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-journal}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/new-tiddler": {
"title": "$:/core/ui/KeyboardShortcuts/new-tiddler",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-tiddler))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-tiddler}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/sidebar-search": {
"title": "$:/core/ui/KeyboardShortcuts/sidebar-search",
"tags": "$:/tags/KeyboardShortcut",
"key": "((sidebar-search))",
"text": "<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n"
},
"$:/core/ui/KeyboardShortcut/toggle-sidebar": {
"title": "$:/core/ui/KeyboardShortcut/toggle-sidebar",
"tags": "$:/tags/KeyboardShortcut",
"key": "((toggle-sidebar))",
"text": "<$list filter=\"[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]\" emptyMessage=\"\"\"\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"yes\"/>\n\"\"\">\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"no\"/>\n</$list>\n"
},
"$:/core/ui/ListItemTemplate": {
"title": "$:/core/ui/ListItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link />\n</div>"
},
"$:/Manager/ItemMain/Fields": {
"title": "$:/Manager/ItemMain/Fields",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/Fields}}",
"text": "<table>\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
},
"$:/Manager/ItemMain/RawText": {
"title": "$:/Manager/ItemMain/RawText",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/RawText}}",
"text": "<pre><code><$view/></code></pre>\n"
},
"$:/Manager/ItemMain/WikifiedText": {
"title": "$:/Manager/ItemMain/WikifiedText",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/WikifiedText}}",
"text": "<$transclude mode=\"block\"/>\n"
},
"$:/Manager/ItemSidebar/Colour": {
"title": "$:/Manager/ItemSidebar/Colour",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Colour}}",
"text": "\\define swatch-styles()\nheight: 1em;\nbackground-color: $(colour)$\n\\end\n\n<$vars colour={{!!color}}>\n<p style=<<swatch-styles>>/>\n</$vars>\n<p>\n<$edit-text field=\"color\" tag=\"input\" type=\"color\"/> / <$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/>\n</p>\n"
},
"$:/Manager/ItemSidebar/Icon": {
"title": "$:/Manager/ItemSidebar/Icon",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Icon}}",
"text": "<p>\n<div class=\"tc-manager-icon-editor\">\n<$button popup=<<qualify \"$:/state/popup/image-picker\">> class=\"tc-btn-invisible\">\n<$transclude tiddler={{!!icon}}>\n{{$:/language/Manager/Item/Icon/None}}\n</$transclude>\n</$button>\n<div class=\"tc-block-dropdown-wrapper\" style=\"position: static;\">\n<$reveal state=<<qualify \"$:/state/popup/image-picker\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-popup\">\n<div class=\"tc-block-dropdown tc-popup-keep\" style=\"width: 80%; left: 10%; right: 10%; padding: 0.5em;\">\n<$macrocall $name=\"image-picker-include-tagged-images\" actions=\"\"\"\n<$action-setfield $field=\"icon\" $value=<<imageTitle>>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/image-picker\">>/>\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n</div>\n</p>\n"
},
"$:/Manager/ItemSidebar/Tags": {
"title": "$:/Manager/ItemSidebar/Tags",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Tags}}",
"text": "\\define tag-checkbox-actions()\n<$action-listops\n\t$tiddler=\"$:/config/Manager/RecentTags\"\n\t$subfilter=\"[<tag>] [list[$:/config/Manager/RecentTags]] +[limit[12]]\"\n/>\n\\end\n\n\\define tag-picker-actions()\n<<tag-checkbox-actions>>\n<$action-listops\n\t$tiddler=<<currentTiddler>>\n\t$field=\"tags\"\n\t$subfilter=\"[<tag>] [all[current]tags[]]\"\n/>\n\\end\n\n<p>\n<$list filter=\"[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] \" variable=\"tag\">\n<div>\n<$checkbox tiddler=<<currentTiddler>> tag=<<tag>> actions=<<tag-checkbox-actions>>>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$checkbox>\n</div>\n</$list>\n</p>\n<p>\n<$macrocall $name=\"tag-picker\" actions=<<tag-picker-actions>>/>\n</p>\n"
},
"$:/Manager/ItemSidebar/Tools": {
"title": "$:/Manager/ItemSidebar/Tools",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Tools}}",
"text": "<p>\n<$button to=<<currentTiddler>>>{{$:/core/images/link}} open</$button>\n</p>\n<p>\n<$button message=\"tm-edit-tiddler\" param=<<currentTiddler>>>{{$:/core/images/edit-button}} edit</$button>\n</p>\n"
},
"$:/Manager": {
"title": "$:/Manager",
"icon": "$:/core/images/list",
"color": "#bbb",
"text": "\\define lingo-base() $:/language/Manager/\n\n\\define list-item-content-item()\n<div class=\"tc-manager-list-item-content-item\">\n\t<$vars state-title=\"\"\"$:/state/popup/manager/item/$(listItem)$\"\"\">\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"hide\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/down-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"nomatch\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"show\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/right-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\" class=\"tc-manager-list-item-content-item-body\">\n\t\t\t<$transclude tiddler=<<listItem>>/>\n\t\t</$reveal>\n\t</$vars>\n</div>\n\\end\n\n<div class=\"tc-manager-wrapper\">\n\t<div class=\"tc-manager-controls\">\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Show/Prompt>> <$select tiddler=\"$:/config/Manager/Show\" default=\"tiddlers\">\n\t\t\t\t<option value=\"tiddlers\"><<lingo Controls/Show/Option/Tiddlers>></option>\n\t\t\t\t<option value=\"tags\"><<lingo Controls/Show/Option/Tags>></option>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Search/Prompt>> <$edit-text tiddler=\"$:/config/Manager/Filter\" tag=\"input\" default=\"\" placeholder={{$:/language/Manager/Controls/Search/Placeholder}}/>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/FilterByTag/Prompt>> <$select tiddler=\"$:/config/Manager/Tag\" default=\"\">\n\t\t\t\t<option value=\"\"><<lingo Controls/FilterByTag/None>></option>\n\t\t\t\t<$list filter=\"[!is{$:/config/Manager/System}tags[]!is[system]sort[title]]\" variable=\"tag\">\n\t\t\t\t\t<option value=<<tag>>><$text text=<<tag>>/></option>\n\t\t\t\t</$list>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Sort/Prompt>> <$select tiddler=\"$:/config/Manager/Sort\" default=\"title\">\n\t\t\t\t<optgroup label=\"Common\">\n\t\t\t\t\t<$list filter=\"title modified modifier created creator created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t\t<optgroup label=\"All\">\n\t\t\t\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}fields[]sort[title]] -title -modified -modifier -created -creator -created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t</$select>\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/Order\" field=\"text\" checked=\"reverse\" unchecked=\"forward\" default=\"forward\">\n\t\t\t\t<<lingo Controls/Order/Prompt>>\n\t\t\t</$checkbox>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/System\" field=\"text\" checked=\"\" unchecked=\"system\" default=\"system\">\n\t\t\t\t{{$:/language/SystemTiddlers/Include/Prompt}}\n\t\t\t</$checkbox>\n\t\t</div>\n\t</div>\n\t<div class=\"tc-manager-list\">\n\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}search{$:/config/Manager/Filter}tag:strict{$:/config/Manager/Tag}sort{$:/config/Manager/Sort}order{$:/config/Manager/Order}]\">\n\t\t\t<$vars transclusion=<<currentTiddler>>>\n\t\t\t\t<div style=\"tc-manager-list-item\">\n\t\t\t\t\t<$button popup=<<qualify \"$:/state/manager/popup\">> class=\"tc-btn-invisible tc-manager-list-item-heading\" selectedClass=\"tc-manager-list-item-heading-selected\">\n\t\t\t\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t\t\t</$button>\n\t\t\t\t\t<$reveal state=<<qualify \"$:/state/manager/popup\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-manager-list-item-content tc-popup-handle\">\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-tiddler\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemMain]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-sidebar\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemSidebar]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</$reveal>\n\t\t\t\t</div>\n\t\t\t</$vars>\n\t\t</$list>\n\t</div>\n</div>\n"
},
"$:/core/ui/MissingTemplate": {
"title": "$:/core/ui/MissingTemplate",
"text": "<div class=\"tc-tiddler-missing\">\n<$button popup=<<qualify \"$:/state/popup/missing\">> class=\"tc-btn-invisible tc-missing-tiddler-label\">\n<$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/missing\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]backlinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</div>\n"
},
"$:/core/ui/MoreSideBar/All": {
"title": "$:/core/ui/MoreSideBar/All",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/All/Caption}}",
"text": "<$list filter={{$:/core/Filters/AllTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Drafts": {
"title": "$:/core/ui/MoreSideBar/Drafts",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Drafts/Caption}}",
"text": "<$list filter={{$:/core/Filters/Drafts!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Explorer": {
"title": "$:/core/ui/MoreSideBar/Explorer",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Explorer/Caption}}",
"text": "<<tree \"$:/\">>\n"
},
"$:/core/ui/MoreSideBar/Missing": {
"title": "$:/core/ui/MoreSideBar/Missing",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Missing/Caption}}",
"text": "<$list filter={{$:/core/Filters/Missing!!filter}} template=\"$:/core/ui/MissingTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Orphans": {
"title": "$:/core/ui/MoreSideBar/Orphans",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Orphans/Caption}}",
"text": "<$list filter={{$:/core/Filters/Orphans!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Plugins": {
"title": "$:/core/ui/MoreSideBar/Plugins",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
"text": "\n{{$:/language/ControlPanel/Plugins/Installed/Hint}}\n\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]\" \"$:/core/ui/MoreSideBar/Plugins/Plugins\">>\n"
},
"$:/core/ui/MoreSideBar/Recent": {
"title": "$:/core/ui/MoreSideBar/Recent",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/MoreSideBar/Shadows": {
"title": "$:/core/ui/MoreSideBar/Shadows",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Shadows/Caption}}",
"text": "<$list filter={{$:/core/Filters/ShadowTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/System": {
"title": "$:/core/ui/MoreSideBar/System",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/System/Caption}}",
"text": "<$list filter={{$:/core/Filters/SystemTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Tags": {
"title": "$:/core/ui/MoreSideBar/Tags",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Tags/Caption}}",
"text": "<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n{{$:/core/ui/Buttons/tag-manager}}\n\n</$set>\n\n</$set>\n\n</$set>\n\n<$list filter={{$:/core/Filters/AllTags!!filter}}>\n\n<$transclude tiddler=\"$:/core/ui/TagTemplate\"/>\n\n</$list>\n\n<hr class=\"tc-untagged-separator\">\n\n{{$:/core/ui/UntaggedTemplate}}\n"
},
"$:/core/ui/MoreSideBar/Types": {
"title": "$:/core/ui/MoreSideBar/Types",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Types/Caption}}",
"text": "<$list filter={{$:/core/Filters/TypedTiddlers!!filter}}>\n<div class=\"tc-menu-list-item\">\n<$view field=\"type\"/>\n<$list filter=\"[type{!!type}!is[system]sort[title]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><$view field=\"title\"/></$link>\n</div>\n</$list>\n</div>\n</$list>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Languages": {
"title": "$:/core/ui/MoreSideBar/Plugins/Languages",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[language]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Plugins": {
"title": "$:/core/ui/MoreSideBar/Plugins/Plugins",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[plugin]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}>>/>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Theme": {
"title": "$:/core/ui/MoreSideBar/Plugins/Theme",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[theme]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
},
"$:/core/ui/Buttons/advanced-search": {
"title": "$:/core/ui/Buttons/advanced-search",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}",
"description": "{{$:/language/Buttons/AdvancedSearch/Hint}}",
"text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/advanced-search-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/close-all": {
"title": "$:/core/ui/Buttons/close-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}",
"description": "{{$:/language/Buttons/CloseAll/Hint}}",
"text": "<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/control-panel": {
"title": "$:/core/ui/Buttons/control-panel",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}",
"description": "{{$:/language/Buttons/ControlPanel/Hint}}",
"text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/options-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/ControlPanel]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/encryption": {
"title": "$:/core/ui/Buttons/encryption",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}",
"description": "{{$:/language/Buttons/Encryption/Hint}}",
"text": "\\whitespace trim\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-clear-password\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/locked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-set-password\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/unlocked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
},
"$:/core/ui/Buttons/export-page": {
"title": "$:/core/ui/Buttons/export-page",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}",
"description": "{{$:/language/Buttons/ExportPage/Hint}}",
"text": "<$macrocall $name=\"exportButton\" exportFilter=\"[!is[system]sort[title]]\" lingoBase=\"$:/language/Buttons/ExportPage/\"/>"
},
"$:/core/ui/Buttons/fold-all": {
"title": "$:/core/ui/Buttons/fold-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/fold-all-button}} {{$:/language/Buttons/FoldAll/Caption}}",
"description": "{{$:/language/Buttons/FoldAll/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/FoldAll/Hint}} aria-label={{$:/language/Buttons/FoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FoldAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/full-screen": {
"title": "$:/core/ui/Buttons/full-screen",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}",
"description": "{{$:/language/Buttons/FullScreen/Hint}}",
"text": "<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/full-screen-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/home": {
"title": "$:/core/ui/Buttons/home",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}",
"description": "{{$:/language/Buttons/Home/Hint}}",
"text": "<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/home-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Home/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/import": {
"title": "$:/core/ui/Buttons/import",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}",
"description": "{{$:/language/Buttons/Import/Hint}}",
"text": "<div class=\"tc-file-input-wrapper\">\n<$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/import-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Import/Caption}}/></span>\n</$list>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>"
},
"$:/core/ui/Buttons/language": {
"title": "$:/core/ui/Buttons/language",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}",
"description": "{{$:/language/Buttons/Language/Hint}}",
"text": "\\whitespace trim\n\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/language\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value={{$:/language}}>\n<$image source=<<flag-title>>/>\n</$set>\n</span>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/language\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/languageswitcher}}\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/manager": {
"title": "$:/core/ui/Buttons/manager",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/list}} {{$:/language/Buttons/Manager/Caption}}",
"description": "{{$:/language/Buttons/Manager/Hint}}",
"text": "\\whitespace trim\n\\define manager-button(class)\n<$button to=\"$:/Manager\" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/list}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Manager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/Manager]]\" emptyMessage=<<manager-button>>>\n<<manager-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/more-page-actions": {
"title": "$:/core/ui/Buttons/more-page-actions",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button><$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
},
"$:/core/ui/Buttons/new-image": {
"title": "$:/core/ui/Buttons/new-image",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-image-button}} {{$:/language/Buttons/NewImage/Caption}}",
"description": "{{$:/language/Buttons/NewImage/Hint}}",
"text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/NewImage/Hint}} aria-label={{$:/language/Buttons/NewImage/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-image}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-image-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewImage/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/core/ui/Buttons/new-journal": {
"title": "$:/core/ui/Buttons/new-journal",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}",
"description": "{{$:/language/Buttons/NewJournal/Hint}}",
"text": "\\whitespace trim\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<journalButton>>\n"
},
"$:/core/ui/Buttons/new-tiddler": {
"title": "$:/core/ui/Buttons/new-tiddler",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}",
"description": "{{$:/language/Buttons/NewTiddler/Hint}}",
"text": "\\whitespace trim\n<$button actions={{$:/core/ui/Actions/new-tiddler}} tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/core/ui/Buttons/palette": {
"title": "$:/core/ui/Buttons/palette",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/palette}} {{$:/language/Buttons/Palette/Caption}}",
"description": "{{$:/language/Buttons/Palette/Hint}}",
"text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/palette\">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/palette}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Palette/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/palette\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\" style=\"font-size:0.7em;\">\n{{$:/snippets/paletteswitcher}}\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/print": {
"title": "$:/core/ui/Buttons/print",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/print-button}} {{$:/language/Buttons/Print/Caption}}",
"description": "{{$:/language/Buttons/Print/Hint}}",
"text": "<$button message=\"tm-print\" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/print-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Print/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/refresh": {
"title": "$:/core/ui/Buttons/refresh",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}",
"description": "{{$:/language/Buttons/Refresh/Hint}}",
"text": "<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/refresh-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save-wiki": {
"title": "$:/core/ui/Buttons/save-wiki",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/save-button}} {{$:/language/Buttons/SaveWiki/Caption}}",
"description": "{{$:/language/Buttons/SaveWiki/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span>\n</$list>\n</span>\n</$button>"
},
"$:/core/ui/Buttons/storyview": {
"title": "$:/core/ui/Buttons/storyview",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}",
"description": "{{$:/language/Buttons/StoryView/Hint}}",
"text": "\\whitespace trim\n\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/storyview\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=<<icon>>/>\n</$set>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/storyview\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/viewswitcher}}\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/tag-manager": {
"title": "$:/core/ui/Buttons/tag-manager",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}",
"description": "{{$:/language/Buttons/TagManager/Hint}}",
"text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/tag-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/TagManager]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/theme": {
"title": "$:/core/ui/Buttons/theme",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}",
"description": "{{$:/language/Buttons/Theme/Hint}}",
"text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/theme\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/theme-button}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/theme\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/theme\">\n{{$:/snippets/themeswitcher}}\n</$linkcatcher>\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/timestamp": {
"title": "$:/core/ui/Buttons/timestamp",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/timestamp-on}} {{$:/language/Buttons/Timestamp/Caption}}",
"description": "{{$:/language/Buttons/Timestamp/Hint}}",
"text": "\\whitespace trim\n<$reveal type=\"nomatch\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/On/Hint}} aria-label={{$:/language/Buttons/Timestamp/On/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"yes\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-on}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/On/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/Off/Hint}} aria-label={{$:/language/Buttons/Timestamp/Off/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"no\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-off}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
},
"$:/core/ui/Buttons/unfold-all": {
"title": "$:/core/ui/Buttons/unfold-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/unfold-all-button}} {{$:/language/Buttons/UnfoldAll/Caption}}",
"description": "{{$:/language/Buttons/UnfoldAll/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/UnfoldAll/Hint}} aria-label={{$:/language/Buttons/UnfoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-unfold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/UnfoldAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/PageTemplate/pagecontrols": {
"title": "$:/core/ui/PageTemplate/pagecontrols",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-page-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"hidden\" value=<<config-title>>>\n<$list filter=\"[<hidden>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$set>\n</$list>\n</$set>\n</$list>\n</div>\n"
},
"$:/core/ui/PageStylesheet": {
"title": "$:/core/ui/PageStylesheet",
"text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/PageTemplate/alerts": {
"title": "$:/core/ui/PageTemplate/alerts",
"tags": "$:/tags/PageTemplate",
"text": "<div class=\"tc-alerts\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n</div>\n"
},
"$:/core/ui/PageTemplate/drafts": {
"title": "$:/core/ui/PageTemplate/drafts",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n<$reveal state=\"$:/status/IsReadOnly\" type=\"nomatch\" text=\"yes\" tag=\"div\" class=\"tc-drafts-list\">\n<$list filter=\"[has[draft.of]!sort[modified]] -[list[$:/StoryList]]\">\n<$link>\n{{$:/core/images/edit-button}} <$text text=<<currentTiddler>>/>\n</$link>\n</$list>\n</$reveal>\n"
},
"$:/core/ui/PageTemplate/pluginreloadwarning": {
"title": "$:/core/ui/PageTemplate/pluginreloadwarning",
"tags": "$:/tags/PageTemplate",
"text": "\\define lingo-base() $:/language/\n\n<$list filter=\"[{$:/status/RequireReloadDueToPluginChange}match[yes]]\">\n\n<$reveal type=\"nomatch\" state=\"$:/temp/HidePluginWarning\" text=\"yes\">\n\n<div class=\"tc-plugin-reload-warning\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<<lingo PluginReloadWarning>> <$button set=\"$:/temp/HidePluginWarning\" setTo=\"yes\" class=\"tc-btn-invisible\">{{$:/core/images/close-button}}</$button>\n\n</$set>\n\n</div>\n\n</$reveal>\n\n</$list>\n"
},
"$:/core/ui/PageTemplate/sidebar": {
"title": "$:/core/ui/PageTemplate/sidebar",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/SideBarSegments/Visibility/$(listItem)$\n\\end\n\n<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBarSegment]!has[draft.of]]\" variable=\"listItem\">\n\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\" tag=\"div\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\n</$reveal>\n\n</$list>\n\n</$reveal>\n\n</div>\n\n</$scrollable>\n"
},
"$:/core/ui/PageTemplate/story": {
"title": "$:/core/ui/PageTemplate/story",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n<section class=\"tc-story-river\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template={{$:/config/ui/ViewTemplate}} editTemplate={{$:/config/ui/EditTemplate}} storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n"
},
"$:/core/ui/PageTemplate/topleftbar": {
"title": "$:/core/ui/PageTemplate/topleftbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-left\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate/toprightbar": {
"title": "$:/core/ui/PageTemplate/toprightbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-right\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate": {
"title": "$:/core/ui/PageTemplate",
"text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"tv-config-toolbar-icons\" value={{$:/config/Toolbar/Icons}}>\n\n<$set name=\"tv-config-toolbar-text\" value={{$:/config/Toolbar/Text}}>\n\n<$set name=\"tv-config-toolbar-class\" value={{$:/config/Toolbar/ButtonClass}}>\n\n<$set name=\"tv-enable-drag-and-drop\" value={{$:/config/DragAndDrop/Enable}}>\n\n<$set name=\"tv-show-missing-links\" value={{$:/config/MissingLinks}}>\n\n<$set name=\"storyviewTitle\" value={{$:/view}}>\n\n<$set name=\"languageTitle\" value={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n\n<$dropzone enable=<<tv-enable-drag-and-drop>>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n\n</$dropzone>\n\n</$navigator>\n\n</div>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/PaletteManager": {
"title": "$:/PaletteManager",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\n\\define describePaletteColour(colour)\n<$transclude tiddler=\"$:/language/Docs/PaletteColours/$colour$\"><$text text=\"$colour$\"/></$transclude>\n\\end\n\\define edit-colour-placeholder()\n edit $(colourName)$\n\\end\n\\define colour-tooltip(showhide) $showhide$ editor for $(newColourName)$ \n\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define delete-colour-index-actions() <$action-setfield $index=<<colourName>>/>\n\\define palette-manager-colour-row-segment()\n\\whitespace trim\n<$edit-text index=<<colourName>> tag=\"input\" placeholder=<<edit-colour-placeholder>> default=\"\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\" class=\"tc-palette-manager-colour-input\"/>\n<$list filter=\"[<currentTiddler>getindex<colourName>removeprefix[<<]removesuffix[>>]] [<currentTiddler>getindex<colourName>removeprefix[<$]removesuffix[/>]]\" variable=\"ignore\">\n<$set name=\"state\" value={{{ [[$:/state/palettemanager/]addsuffix<currentTiddler>addsuffix[/]addsuffix<colourName>] }}}>\n<$wikify name=\"newColourName\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall={{{ [<currentTiddler>getindex<colourName>] }}}/>\"\"\">\n<$reveal state=<<state>> type=\"nomatch\" text=\"show\">\n<$button tooltip=<<colour-tooltip show>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" set=<<state>> setTo=\"show\">{{$:/core/images/down-arrow}} <$text text=<<newColourName>>/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$button tooltip=<<colour-tooltip hide>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" actions=\"\"\"<$action-deletetiddler $tiddler=<<state>>/>\"\"\">{{$:/core/images/up-arrow}} <$text text=<<newColourName>>/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$set name=\"colourName\" value=<<newColourName>>>\n<br>\n<<palette-manager-colour-row-segment>>\n<br><br>\n</$set>\n</$reveal>\n</$wikify>\n</$set>\n</$list>\n\\end\n\\define palette-manager-colour-row()\n\\whitespace trim\n<tr>\n<td>\n<span style=\"float:right;\">\n<$button tooltip=<<lingo Delete/Hint>> aria-label=<<lingo Delete/Hint>> class=\"tc-btn-invisible\" actions=<<delete-colour-index-actions>>>\n{{$:/core/images/delete-button}}</$button>\n</span>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<<palette-manager-colour-row-segment>>\n</td>\n</tr>\n\\end\n\\define palette-manager-table()\n\\whitespace trim\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]indexes[]]\" variable=\"colourName\">\n<$list filter=\"[<currentTiddler>indexes[]removeprefix<colourName>suffix[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[{$:/state/palettemanager/showexternal}removeprefix[yes]suffix[]]\" variable=\"ignore\">\n<<palette-manager-colour-row>>\n</$list>\n\"\"\">\n<<palette-manager-colour-row>>\n</$list>\n</$list>\n</tbody>\n</table>\n\\end\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n\n<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name=\"currentTiddler\" $output=\"text/plain\"/></$link>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\" variable=\"listItem\">\n<<lingo Prompt/Modified>>\n<$button message=\"tm-delete-tiddler\" param={{$:/palette}}><<lingo Reset/Caption>></$button>\n</$list>\n\n<$list filter=\"[all[current]is[shadow]!is[tiddler]]\" variable=\"listItem\">\n<<lingo Clone/Prompt>>\n</$list>\n\n<$button message=\"tm-new-tiddler\" param={{$:/palette}}><<lingo Clone/Caption>></$button>\n\n<$checkbox tiddler=\"$:/state/palettemanager/showexternal\" field=\"text\" checked=\"yes\" unchecked=\"no\"> <<lingo Names/External/Show>></$checkbox>\n\n<<palette-manager-table>>\n"
},
"$:/core/ui/PluginInfo": {
"title": "$:/core/ui/PluginInfo",
"text": "\\define localised-info-tiddler-title()\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\n\\end\n\\define info-tiddler-title()\n$(currentTiddler)$/$(currentTab)$\n\\end\n\\define default-tiddler-title()\n$:/core/ui/PluginInfo/Default/$(currentTab)$\n\\end\n<$transclude tiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<default-tiddler-title>> mode=\"block\">\n{{$:/language/ControlPanel/Plugin/NoInfoFound/Hint}}\n</$transclude>\n</$transclude>\n</$transclude>\n</$transclude>\n"
},
"$:/core/ui/PluginInfo/Default/contents": {
"title": "$:/core/ui/PluginInfo/Default/contents",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link />\n</li>\n</$list>\n</ul>\n"
},
"$:/core/ui/PluginListItemTemplate": {
"title": "$:/core/ui/PluginListItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}><$view field=\"description\"><$view field=\"title\"/></$view></$link>\n</div>"
},
"$:/core/ui/SearchResults": {
"title": "$:/core/ui/SearchResults",
"text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n\n</$list>\n\n</div>\n"
},
"$:/core/ui/SideBar/More": {
"title": "$:/core/ui/SideBar/More",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/More/Caption}}",
"text": "<div class=\"tc-more-sidebar\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" default={{$:/config/DefaultMoreSidebarTab}} state=\"$:/state/tab/moresidebar\" class=\"tc-vertical tc-sidebar-tabs-more\" />\n</div>"
},
"$:/core/ui/SideBar/Open": {
"title": "$:/core/ui/SideBar/Open",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Open/Caption}}",
"text": "\\whitespace trim\n\\define lingo-base() $:/language/CloseAll/\n\n\\define drop-actions()\n<$action-listops $tiddler=<<tv-story-list>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define placeholder()\n<div class=\"tc-droppable-placeholder\"/>\n\\end\n\n\\define droppable-item(button)\n\\whitespace trim\n<$droppable actions=<<drop-actions>> enable=<<tv-allow-drag-and-drop>>>\n<<placeholder>>\n<div>\n$button$\n</div>\n</$droppable>\n\\end\n\n<div class=\"tc-sidebar-tab-open\">\n<$list filter=\"[list<tv-story-list>]\" history=<<tv-history-list>> storyview=\"pop\">\n<div class=\"tc-sidebar-tab-open-item\">\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini\">{{$:/core/images/close-button}}</$button> <$link to={{!!title}}><$view field=\"title\"/></$link>\"\"\"/>\n</div>\n</$list>\n<$tiddler tiddler=\"\">\n<div>\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\"\"\"/>\n</div>\n</$tiddler>\n</div>\n"
},
"$:/core/ui/SideBar/Recent": {
"title": "$:/core/ui/SideBar/Recent",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/SideBar/Tools": {
"title": "$:/core/ui/SideBar/Tools",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n<<lingo Basics/Version/Prompt>> <<version>>\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<div style=\"position:relative;\" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</div>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/SideBarLists": {
"title": "$:/core/ui/SideBarLists",
"text": "<$transclude tiddler=\"$:/core/ui/SideBarSegments/search\"/>\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\"/>\n\n"
},
"$:/core/ui/SideBarSegments/page-controls": {
"title": "$:/core/ui/SideBarSegments/page-controls",
"tags": "$:/tags/SideBarSegment",
"text": "{{||$:/core/ui/PageTemplate/pagecontrols}}\n"
},
"$:/core/ui/SideBarSegments/search": {
"title": "$:/core/ui/SideBarSegments/search",
"tags": "$:/tags/SideBarSegment",
"text": "\\whitespace trim\n<div class=\"tc-sidebar-lists tc-sidebar-search\">\n\n<$set name=\"searchTiddler\" value=\"$:/temp/search\">\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/search\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-popup-handle\"/>\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search}}/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[{$:/temp/search}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$set name=\"searchTerm\" value={{{ [<searchTiddler>get[text]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[!is[system]search<searchTerm>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$set>\n</$list>\n</$button>\n</$reveal>\n<$reveal state=\"$:/temp/search\" type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown tc-search-drop-down tc-popup-handle\" state=<<qualify \"$:/state/popup/search-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n\n<$list filter=\"[{$:/temp/search}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n{{$:/core/ui/SearchResults}}\n\n</$list>\n\n</$reveal>\n\n</$reveal>\n\n</$set>\n\n</div>\n"
},
"$:/core/ui/SideBarSegments/site-subtitle": {
"title": "$:/core/ui/SideBarSegments/site-subtitle",
"tags": "$:/tags/SideBarSegment",
"text": "<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n"
},
"$:/core/ui/SideBarSegments/site-title": {
"title": "$:/core/ui/SideBarSegments/site-title",
"tags": "$:/tags/SideBarSegment",
"text": "<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n"
},
"$:/core/ui/SideBarSegments/tabs": {
"title": "$:/core/ui/SideBarSegments/tabs",
"tags": "$:/tags/SideBarSegment",
"text": "<div class=\"tc-sidebar-lists tc-sidebar-tabs\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" default={{$:/config/DefaultSidebarTab}} state=\"$:/state/tab/sidebar\" class=\"tc-sidebar-tabs-main\"/>\n\n</div>\n"
},
"$:/TagManager": {
"title": "$:/TagManager",
"icon": "$:/core/images/tag-button",
"color": "#bbb",
"text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n\\whitespace trim\n<$link to=\"\"><<lingo Icons/None>></$link>\n<$list filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n\\end\n\\define iconEditor(title)\n\\whitespace trim\n<div class=\"tc-drop-down-wrapper\">\n<$button popupTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal stateTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=<<__title__>> icon=<<navigateTo>>/>\"\"\">\n<<iconEditorTab type:\"!\">>\n<hr/>\n<<iconEditorTab type:\"\">>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\\define toggleButton(state)\n\\whitespace trim\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"closed\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"open\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n\\end\n\\whitespace trim\n<table class=\"tc-tag-manager-table\">\n<tbody>\n<tr>\n<th><<lingo Colour/Heading>></th>\n<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n<th><<lingo Count/Heading>></th>\n<th><<lingo Icon/Heading>></th>\n<th><<lingo Info/Heading>></th>\n</tr>\n<$list filter=\"[tags[]!is[system]sort[title]]\">\n<tr>\n<td><$edit-text field=\"color\" tag=\"input\" type=\"color\"/></td>\n<td>{{||$:/core/ui/TagTemplate}}</td>\n<td><$count filter=\"[all[current]tagging[]]\"/></td>\n<td>\n<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n</td>\n<td>\n<$macrocall $name=\"toggleButton\" state={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} /> \n</td>\n</tr>\n<tr>\n<td></td>\n<td colspan=\"4\">\n<$reveal stateTitle={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} type=\"match\" text=\"open\" default=\"\">\n<table>\n<tbody>\n<tr><td><<lingo Colour/Heading>></td><td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td></tr>\n<tr><td><<lingo Icon/Heading>></td><td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td></tr>\n</tbody>\n</table>\n</$reveal>\n</td>\n</tr>\n</$list>\n<tr>\n<td></td>\n<td style=\"position:relative;\">\n{{$:/core/ui/UntaggedTemplate}}\n</td>\n<td>\n<small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n</td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n"
},
"$:/core/ui/TagTemplate": {
"title": "$:/core/ui/TagTemplate",
"text": "\\whitespace trim\n<span class=\"tc-tag-list-item\">\n<$set name=\"transclusion\" value=<<currentTiddler>>>\n<$macrocall $name=\"tag-pill-body\" tag=<<currentTiddler>> icon={{!!icon}} colour={{!!color}} palette={{$:/palette}} element-tag=\"\"\"$button\"\"\" element-attributes=\"\"\"popup=<<qualify \"$:/state/popup/tag\">> dragFilter='[all[current]tagging[]]' tag='span'\"\"\"/>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\" class=\"tc-drop-down\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</$set>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]\" variable=\"listItem\"> \n<$transclude tiddler=<<listItem>>/> \n</$list>\n<hr>\n<$macrocall $name=\"list-tagged-draggable\" tag=<<currentTiddler>>/>\n</$reveal>\n</$set>\n</span>\n"
},
"$:/core/ui/TiddlerFieldTemplate": {
"title": "$:/core/ui/TiddlerFieldTemplate",
"text": "<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>"
},
"$:/core/ui/TiddlerFields": {
"title": "$:/core/ui/TiddlerFields",
"text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/PluginInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/PluginInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/ShadowInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n"
},
"$:/core/ui/TiddlerInfo/Advanced": {
"title": "$:/core/ui/TiddlerInfo/Advanced",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Advanced/Caption}}",
"text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Fields": {
"title": "$:/core/ui/TiddlerInfo/Fields",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Fields/Caption}}",
"text": "<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n"
},
"$:/core/ui/TiddlerInfo/List": {
"title": "$:/core/ui/TiddlerInfo/List",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/List/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Listed": {
"title": "$:/core/ui/TiddlerInfo/Listed",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Listed/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/References": {
"title": "$:/core/ui/TiddlerInfo/References",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/References/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>"
},
"$:/core/ui/TiddlerInfo/Tagging": {
"title": "$:/core/ui/TiddlerInfo/Tagging",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tagging/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]tagging[]]\" emptyMessage=<<lingo Tagging/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Tools": {
"title": "$:/core/ui/TiddlerInfo/Tools",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/TiddlerInfo": {
"title": "$:/core/ui/TiddlerInfo",
"text": "<div style=\"position:relative;\">\n<div class=\"tc-tiddler-controls\" style=\"position:absolute;right:0;\">\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n</div>\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>"
},
"$:/core/ui/TopBar/menu": {
"title": "$:/core/ui/TopBar/menu",
"tags": "$:/tags/TopRightBar",
"text": "<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}}</$button>\n</$list>\n<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-left}}</$button>\n</$list>\n"
},
"$:/core/ui/UntaggedTemplate": {
"title": "$:/core/ui/UntaggedTemplate",
"text": "\\define lingo-base() $:/language/SideBar/\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/body": {
"title": "$:/core/ui/ViewTemplate/body",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal tag=\"div\" class=\"tc-tiddler-body\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]!has[plugin-type]!field:hide-body[yes]]\">\n\n<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n\n</$list>\n\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/classic": {
"title": "$:/core/ui/ViewTemplate/classic",
"tags": "$:/tags/ViewTemplate $:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/ClassicWarning/\n<$list filter=\"[all[current]type[text/x-tiddlywiki]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Hint>>\n\n<$button set=\"!!type\" setTo=\"text/vnd.tiddlywiki\"><<lingo Upgrade/Caption>></$button>\n\n</div>\n</$list>\n"
},
"$:/core/ui/ViewTemplate/import": {
"title": "$:/core/ui/ViewTemplate/import",
"tags": "$:/tags/ViewTemplate",
"text": "\\define lingo-base() $:/language/Import/\n\n\\define buttons()\n<$button message=\"tm-delete-tiddler\" param=<<currentTiddler>>><<lingo Listing/Cancel/Caption>></$button>\n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n<<lingo Listing/Preview>> <$select tiddler=\"$:/state/importpreviewtype\" default=\"$:/core/ui/ImportPreviews/Text\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ImportPreview]!has[draft.of]]\">\n<option value=<<currentTiddler>>>{{!!caption}}</option>\n</$list>\n</$select>\n\\end\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n<<buttons>>\n\n{{||$:/core/ui/ImportListing}}\n\n<<buttons>>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ViewTemplate/plugin": {
"title": "$:/core/ui/ViewTemplate/plugin",
"tags": "$:/tags/ViewTemplate",
"text": "<$list filter=\"[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]\">\n<$set name=\"plugin-type\" value={{!!plugin-type}}>\n<$set name=\"default-popup-state\" value=\"yes\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n{{||$:/core/ui/Components/plugin-info}}\n</$set>\n</$set>\n</$set>\n</$list>\n"
},
"$:/core/ui/ViewTemplate/subtitle": {
"title": "$:/core/ui/ViewTemplate/subtitle",
"tags": "$:/tags/ViewTemplate",
"text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}} />\n<$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/tags": {
"title": "$:/core/ui/ViewTemplate/tags",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-tags-wrapper\"><$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/></div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/title": {
"title": "$:/core/ui/ViewTemplate/title",
"tags": "$:/tags/ViewTemplate",
"text": "\\whitespace trim\n\\define title-styles()\nfill:$(foregroundColor)$;\n\\end\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<span class=\"tc-tiddler-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>\n</span>\n<$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n<$link>\n<$set name=\"foregroundColor\" value={{!!color}}>\n<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}>\n<$transclude tiddler={{$:/config/DefaultTiddlerIcon}}/>\n</$transclude>\n</span>\n</$set>\n<$list filter=\"[all[current]removeprefix[$:/]]\">\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n</h2>\n</$list>\n<$list filter=\"[all[current]!prefix[$:/]]\">\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n</$list>\n</$link>\n</$set>\n</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>> mode=\"block\"/></$list>\n\n</$reveal>\n</div>"
},
"$:/core/ui/ViewTemplate/unfold": {
"title": "$:/core/ui/ViewTemplate/unfold",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal tag=\"div\" type=\"nomatch\" state=\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar\" text=\"hide\">\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=\"tc-fold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-up}}\n</$button>\n</$reveal>\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"show\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=\"tc-unfold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate": {
"title": "$:/core/ui/ViewTemplate",
"text": "\\define folded-state()\n$:/state/folded/$(currentTiddler)$\n\\end\n\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify \"$:/state/popup/tiddler-info\">>><div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-view-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[shadow]is[tiddler]then[tc-tiddler-overridden-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\n</$vars>\n"
},
"$:/core/ui/Buttons/clone": {
"title": "$:/core/ui/Buttons/clone",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}",
"description": "{{$:/language/Buttons/Clone/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-new-tiddler\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/clone-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Clone/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close-others": {
"title": "$:/core/ui/Buttons/close-others",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}",
"description": "{{$:/language/Buttons/CloseOthers/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-close-other-tiddlers\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/CloseOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close": {
"title": "$:/core/ui/Buttons/close",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}",
"description": "{{$:/language/Buttons/Close/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Close/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/edit": {
"title": "$:/core/ui/Buttons/edit",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}",
"description": "{{$:/language/Buttons/Edit/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-edit-tiddler\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/edit-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Edit/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/export-tiddler": {
"title": "$:/core/ui/Buttons/export-tiddler",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}",
"description": "{{$:/language/Buttons/ExportTiddler/Hint}}",
"text": "\\define makeExportFilter()\n[[$(currentTiddler)$]]\n\\end\n<$macrocall $name=\"exportButton\" exportFilter=<<makeExportFilter>> lingoBase=\"$:/language/Buttons/ExportTiddler/\" baseFilename=<<currentTiddler>>/>"
},
"$:/core/ui/Buttons/fold-bar": {
"title": "$:/core/ui/Buttons/fold-bar",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/chevron-up}} {{$:/language/Buttons/Fold/FoldBar/Caption}}",
"description": "{{$:/language/Buttons/Fold/FoldBar/Hint}}",
"text": "<!-- This dummy toolbar button is here to allow visibility of the fold-bar to be controlled as if it were a toolbar button -->"
},
"$:/core/ui/Buttons/fold-others": {
"title": "$:/core/ui/Buttons/fold-others",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/fold-others-button}} {{$:/language/Buttons/FoldOthers/Caption}}",
"description": "{{$:/language/Buttons/FoldOthers/Hint}}",
"text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/FoldOthers/Hint}} aria-label={{$:/language/Buttons/FoldOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-other-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/FoldOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/fold": {
"title": "$:/core/ui/Buttons/fold",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/fold-button}} {{$:/language/Buttons/Fold/Caption}}",
"description": "{{$:/language/Buttons/Fold/Hint}}",
"text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Fold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Unfold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n"
},
"$:/core/ui/Buttons/info": {
"title": "$:/core/ui/Buttons/info",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}",
"description": "{{$:/language/Buttons/Info/Hint}}",
"text": "\\whitespace trim\n\\define button-content()\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Info/Caption}}/>\n</span>\n</$list>\n\\end\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"popup\">\n<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$reveal state=<<tiddlerInfoState>> type=\"match\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"yes\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=<<tiddlerInfoState>> type=\"nomatch\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n</$reveal>"
},
"$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/core/ui/Buttons/more-tiddler-actions",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/More/Caption}}/>\n</span>\n</$list>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
},
"$:/core/ui/Buttons/new-here": {
"title": "$:/core/ui/Buttons/new-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}",
"description": "{{$:/language/Buttons/NewHere/Hint}}",
"text": "\\whitespace trim\n\\define newHereActions()\n<$set name=\"tags\" filter=\"[<currentTiddler>] [{$:/config/NewTiddler/Tags!!tags}]\">\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<tags>>/>\n</$set>\n\\end\n\\define newHereButton()\n<$button actions=<<newHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-here-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewHere/Caption}}/>\n</span>\n</$list>\n</$button>\n\\end\n<<newHereButton>>\n"
},
"$:/core/ui/Buttons/new-journal-here": {
"title": "$:/core/ui/Buttons/new-journal-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}",
"description": "{{$:/language/Buttons/NewJournalHere/Hint}}",
"text": "\\whitespace trim\n\\define journalButtonTags()\n[[$(currentTiddlerTag)$]] $(journalTags)$\n\\end\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>\n</span>\n</$list>\n</$wikify>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags!!tags}}>\n<$set name=\"currentTiddlerTag\" value=<<currentTiddler>>>\n<<journalButton>>\n</$set>\n</$set>\n</$set>\n"
},
"$:/core/ui/Buttons/open-window": {
"title": "$:/core/ui/Buttons/open-window",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/open-window}} {{$:/language/Buttons/OpenWindow/Caption}}",
"description": "{{$:/language/Buttons/OpenWindow/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-open-window\" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/open-window}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/OpenWindow/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/permalink": {
"title": "$:/core/ui/Buttons/permalink",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}",
"description": "{{$:/language/Buttons/Permalink/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-permalink\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permalink-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permalink/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/permaview": {
"title": "$:/core/ui/Buttons/permaview",
"tags": "$:/tags/ViewToolbar $:/tags/PageControls",
"caption": "{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}",
"description": "{{$:/language/Buttons/Permaview/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-permaview\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permaview-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permaview/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/DefaultTiddlers": {
"title": "$:/DefaultTiddlers",
"text": "GettingStarted\n"
},
"$:/temp/advancedsearch": {
"title": "$:/temp/advancedsearch",
"text": ""
},
"$:/snippets/allfields": {
"title": "$:/snippets/allfields",
"text": "\\define renderfield(title)\n<tr class=\"tc-view-field\"><td class=\"tc-view-field-name\">''$title$'':</td><td class=\"tc-view-field-value\">//{{$:/language/Docs/Fields/$title$}}//</td></tr>\n\\end\n<table class=\"tc-view-field-table\"><tbody><$list filter=\"[fields[]sort[title]]\" variable=\"listItem\"><$macrocall $name=\"renderfield\" title=<<listItem>>/></$list>\n</tbody></table>\n"
},
"$:/config/AnimationDuration": {
"title": "$:/config/AnimationDuration",
"text": "400"
},
"$:/config/AutoFocus": {
"title": "$:/config/AutoFocus",
"text": "title"
},
"$:/config/AutoSave": {
"title": "$:/config/AutoSave",
"text": "yes"
},
"$:/config/BitmapEditor/Colour": {
"title": "$:/config/BitmapEditor/Colour",
"text": "#444"
},
"$:/config/BitmapEditor/ImageSizes": {
"title": "$:/config/BitmapEditor/ImageSizes",
"text": "[[62px 100px]] [[100px 62px]] [[124px 200px]] [[200px 124px]] [[248px 400px]] [[371px 600px]] [[400px 248px]] [[556px 900px]] [[600px 371px]] [[742px 1200px]] [[900px 556px]] [[1200px 742px]]"
},
"$:/config/BitmapEditor/LineWidth": {
"title": "$:/config/BitmapEditor/LineWidth",
"text": "3px"
},
"$:/config/BitmapEditor/LineWidths": {
"title": "$:/config/BitmapEditor/LineWidths",
"text": "0.25px 0.5px 1px 2px 3px 4px 6px 8px 10px 16px 20px 28px 40px 56px 80px"
},
"$:/config/BitmapEditor/Opacities": {
"title": "$:/config/BitmapEditor/Opacities",
"text": "0.01 0.025 0.05 0.075 0.1 0.15 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0"
},
"$:/config/BitmapEditor/Opacity": {
"title": "$:/config/BitmapEditor/Opacity",
"text": "1.0"
},
"$:/config/DefaultMoreSidebarTab": {
"title": "$:/config/DefaultMoreSidebarTab",
"text": "$:/core/ui/MoreSideBar/Tags"
},
"$:/config/DefaultSidebarTab": {
"title": "$:/config/DefaultSidebarTab",
"text": "$:/core/ui/SideBar/Open"
},
"$:/config/DownloadSaver/AutoSave": {
"title": "$:/config/DownloadSaver/AutoSave",
"text": "no"
},
"$:/config/Drafts/TypingTimeout": {
"title": "$:/config/Drafts/TypingTimeout",
"text": "400"
},
"$:/config/EditTemplateFields/Visibility/title": {
"title": "$:/config/EditTemplateFields/Visibility/title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/tags": {
"title": "$:/config/EditTemplateFields/Visibility/tags",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/text": {
"title": "$:/config/EditTemplateFields/Visibility/text",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/creator": {
"title": "$:/config/EditTemplateFields/Visibility/creator",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/created": {
"title": "$:/config/EditTemplateFields/Visibility/created",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modified": {
"title": "$:/config/EditTemplateFields/Visibility/modified",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modifier": {
"title": "$:/config/EditTemplateFields/Visibility/modifier",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/type": {
"title": "$:/config/EditTemplateFields/Visibility/type",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.title": {
"title": "$:/config/EditTemplateFields/Visibility/draft.title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.of": {
"title": "$:/config/EditTemplateFields/Visibility/draft.of",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/revision": {
"title": "$:/config/EditTemplateFields/Visibility/revision",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/bag": {
"title": "$:/config/EditTemplateFields/Visibility/bag",
"text": "hide"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4",
"text": "hide"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5",
"text": "hide"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6",
"text": "hide"
},
"$:/config/EditorTypeMappings/image/gif": {
"title": "$:/config/EditorTypeMappings/image/gif",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/webp": {
"title": "$:/config/EditorTypeMappings/image/webp",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/heic": {
"title": "$:/config/EditorTypeMappings/image/heic",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/heif": {
"title": "$:/config/EditorTypeMappings/image/heif",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpeg": {
"title": "$:/config/EditorTypeMappings/image/jpeg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpg": {
"title": "$:/config/EditorTypeMappings/image/jpg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/png": {
"title": "$:/config/EditorTypeMappings/image/png",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/x-icon": {
"title": "$:/config/EditorTypeMappings/image/x-icon",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
"text": "text"
},
"$:/config/Manager/Show": {
"title": "$:/config/Manager/Show",
"text": "tiddlers"
},
"$:/config/Manager/Filter": {
"title": "$:/config/Manager/Filter",
"text": ""
},
"$:/config/Manager/Order": {
"title": "$:/config/Manager/Order",
"text": "forward"
},
"$:/config/Manager/Sort": {
"title": "$:/config/Manager/Sort",
"text": "title"
},
"$:/config/Manager/System": {
"title": "$:/config/Manager/System",
"text": "system"
},
"$:/config/Manager/Tag": {
"title": "$:/config/Manager/Tag",
"text": ""
},
"$:/state/popup/manager/item/$:/Manager/ItemMain/RawText": {
"title": "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText",
"text": "hide"
},
"$:/config/MissingLinks": {
"title": "$:/config/MissingLinks",
"text": "yes"
},
"$:/config/Navigation/UpdateAddressBar": {
"title": "$:/config/Navigation/UpdateAddressBar",
"text": "no"
},
"$:/config/Navigation/UpdateHistory": {
"title": "$:/config/Navigation/UpdateHistory",
"text": "no"
},
"$:/config/NewImageType": {
"title": "$:/config/NewImageType",
"text": "jpeg"
},
"$:/config/OfficialPluginLibrary": {
"title": "$:/config/OfficialPluginLibrary",
"tags": "$:/tags/PluginLibrary",
"url": "https://tiddlywiki.com/library/v5.1.22/index.html",
"caption": "{{$:/language/OfficialPluginLibrary}}",
"text": "{{$:/language/OfficialPluginLibrary/Hint}}\n"
},
"$:/config/Navigation/openLinkFromInsideRiver": {
"title": "$:/config/Navigation/openLinkFromInsideRiver",
"text": "below"
},
"$:/config/Navigation/openLinkFromOutsideRiver": {
"title": "$:/config/Navigation/openLinkFromOutsideRiver",
"text": "top"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all",
"text": "hide"
},
"$:/config/Performance/Instrumentation": {
"title": "$:/config/Performance/Instrumentation",
"text": "no"
},
"$:/config/RegisterPluginType/plugin": {
"title": "$:/config/RegisterPluginType/plugin",
"text": "yes"
},
"$:/config/RegisterPluginType/theme": {
"title": "$:/config/RegisterPluginType/theme",
"text": "no"
},
"$:/config/RegisterPluginType/language": {
"title": "$:/config/RegisterPluginType/language",
"text": "no"
},
"$:/config/RegisterPluginType/info": {
"title": "$:/config/RegisterPluginType/info",
"text": "no"
},
"$:/config/RegisterPluginType/import": {
"title": "$:/config/RegisterPluginType/import",
"text": "no"
},
"$:/config/SaveWikiButton/Template": {
"title": "$:/config/SaveWikiButton/Template",
"text": "$:/core/save/all"
},
"$:/config/SaverFilter": {
"title": "$:/config/SaverFilter",
"text": "[all[]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]]"
},
"$:/config/Search/AutoFocus": {
"title": "$:/config/Search/AutoFocus",
"text": "true"
},
"$:/config/Search/MinLength": {
"title": "$:/config/Search/MinLength",
"text": "3"
},
"$:/config/SearchResults/Default": {
"title": "$:/config/SearchResults/Default",
"text": "$:/core/ui/DefaultSearchResultList"
},
"$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]": {
"title": "$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]",
"text": "yes"
},
"$:/config/ShortcutInfo/add-field": {
"title": "$:/config/ShortcutInfo/add-field",
"text": "{{$:/language/EditTemplate/Fields/Add/Button/Hint}}"
},
"$:/config/ShortcutInfo/advanced-search": {
"title": "$:/config/ShortcutInfo/advanced-search",
"text": "{{$:/language/Buttons/AdvancedSearch/Hint}}"
},
"$:/config/ShortcutInfo/bold": {
"title": "$:/config/ShortcutInfo/bold",
"text": "{{$:/language/Buttons/Bold/Hint}}"
},
"$:/config/ShortcutInfo/cancel-edit-tiddler": {
"title": "$:/config/ShortcutInfo/cancel-edit-tiddler",
"text": "{{$:/language/Buttons/Cancel/Hint}}"
},
"$:/config/ShortcutInfo/excise": {
"title": "$:/config/ShortcutInfo/excise",
"text": "{{$:/language/Buttons/Excise/Hint}}"
},
"$:/config/ShortcutInfo/heading-1": {
"title": "$:/config/ShortcutInfo/heading-1",
"text": "{{$:/language/Buttons/Heading1/Hint}}"
},
"$:/config/ShortcutInfo/heading-2": {
"title": "$:/config/ShortcutInfo/heading-2",
"text": "{{$:/language/Buttons/Heading2/Hint}}"
},
"$:/config/ShortcutInfo/heading-3": {
"title": "$:/config/ShortcutInfo/heading-3",
"text": "{{$:/language/Buttons/Heading3/Hint}}"
},
"$:/config/ShortcutInfo/heading-4": {
"title": "$:/config/ShortcutInfo/heading-4",
"text": "{{$:/language/Buttons/Heading4/Hint}}"
},
"$:/config/ShortcutInfo/heading-5": {
"title": "$:/config/ShortcutInfo/heading-5",
"text": "{{$:/language/Buttons/Heading5/Hint}}"
},
"$:/config/ShortcutInfo/heading-6": {
"title": "$:/config/ShortcutInfo/heading-6",
"text": "{{$:/language/Buttons/Heading6/Hint}}"
},
"$:/config/ShortcutInfo/italic": {
"title": "$:/config/ShortcutInfo/italic",
"text": "{{$:/language/Buttons/Italic/Hint}}"
},
"$:/config/ShortcutInfo/link": {
"title": "$:/config/ShortcutInfo/link",
"text": "{{$:/language/Buttons/Link/Hint}}"
},
"$:/config/ShortcutInfo/list-bullet": {
"title": "$:/config/ShortcutInfo/list-bullet",
"text": "{{$:/language/Buttons/ListBullet/Hint}}"
},
"$:/config/ShortcutInfo/list-number": {
"title": "$:/config/ShortcutInfo/list-number",
"text": "{{$:/language/Buttons/ListNumber/Hint}}"
},
"$:/config/ShortcutInfo/mono-block": {
"title": "$:/config/ShortcutInfo/mono-block",
"text": "{{$:/language/Buttons/MonoBlock/Hint}}"
},
"$:/config/ShortcutInfo/mono-line": {
"title": "$:/config/ShortcutInfo/mono-line",
"text": "{{$:/language/Buttons/MonoLine/Hint}}"
},
"$:/config/ShortcutInfo/new-image": {
"title": "$:/config/ShortcutInfo/new-image",
"text": "{{$:/language/Buttons/NewImage/Hint}}"
},
"$:/config/ShortcutInfo/new-journal": {
"title": "$:/config/ShortcutInfo/new-journal",
"text": "{{$:/language/Buttons/NewJournal/Hint}}"
},
"$:/config/ShortcutInfo/new-tiddler": {
"title": "$:/config/ShortcutInfo/new-tiddler",
"text": "{{$:/language/Buttons/NewTiddler/Hint}}"
},
"$:/config/ShortcutInfo/picture": {
"title": "$:/config/ShortcutInfo/picture",
"text": "{{$:/language/Buttons/Picture/Hint}}"
},
"$:/config/ShortcutInfo/preview": {
"title": "$:/config/ShortcutInfo/preview",
"text": "{{$:/language/Buttons/Preview/Hint}}"
},
"$:/config/ShortcutInfo/quote": {
"title": "$:/config/ShortcutInfo/quote",
"text": "{{$:/language/Buttons/Quote/Hint}}"
},
"$:/config/ShortcutInfo/save-tiddler": {
"title": "$:/config/ShortcutInfo/save-tiddler",
"text": "{{$:/language/Buttons/Save/Hint}}"
},
"$:/config/ShortcutInfo/sidebar-search": {
"title": "$:/config/ShortcutInfo/sidebar-search",
"text": "{{$:/language/Buttons/SidebarSearch/Hint}}"
},
"$:/config/ShortcutInfo/stamp": {
"title": "$:/config/ShortcutInfo/stamp",
"text": "{{$:/language/Buttons/Stamp/Hint}}"
},
"$:/config/ShortcutInfo/strikethrough": {
"title": "$:/config/ShortcutInfo/strikethrough",
"text": "{{$:/language/Buttons/Strikethrough/Hint}}"
},
"$:/config/ShortcutInfo/subscript": {
"title": "$:/config/ShortcutInfo/subscript",
"text": "{{$:/language/Buttons/Subscript/Hint}}"
},
"$:/config/ShortcutInfo/superscript": {
"title": "$:/config/ShortcutInfo/superscript",
"text": "{{$:/language/Buttons/Superscript/Hint}}"
},
"$:/config/ShortcutInfo/toggle-sidebar": {
"title": "$:/config/ShortcutInfo/toggle-sidebar",
"text": "{{$:/language/Buttons/ToggleSidebar/Hint}}"
},
"$:/config/ShortcutInfo/underline": {
"title": "$:/config/ShortcutInfo/underline",
"text": "{{$:/language/Buttons/Underline/Hint}}"
},
"$:/config/SyncFilter": {
"title": "$:/config/SyncFilter",
"text": "[is[tiddler]] -[[$:/HistoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]"
},
"$:/config/Tags/MinLength": {
"title": "$:/config/Tags/MinLength",
"text": "0"
},
"$:/config/TextEditor/EditorHeight/Height": {
"title": "$:/config/TextEditor/EditorHeight/Height",
"text": "400px"
},
"$:/config/TextEditor/EditorHeight/Mode": {
"title": "$:/config/TextEditor/EditorHeight/Mode",
"text": "auto"
},
"$:/config/TiddlerInfo/Default": {
"title": "$:/config/TiddlerInfo/Default",
"text": "$:/core/ui/TiddlerInfo/Fields"
},
"$:/config/TiddlerInfo/Mode": {
"title": "$:/config/TiddlerInfo/Mode",
"text": "popup"
},
"$:/config/Tiddlers/TitleLinks": {
"title": "$:/config/Tiddlers/TitleLinks",
"text": "no"
},
"$:/config/Toolbar/ButtonClass": {
"title": "$:/config/Toolbar/ButtonClass",
"text": "tc-btn-invisible"
},
"$:/config/Toolbar/Icons": {
"title": "$:/config/Toolbar/Icons",
"text": "yes"
},
"$:/config/Toolbar/Text": {
"title": "$:/config/Toolbar/Text",
"text": "no"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions",
"text": "show"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others",
"text": "hide"
},
"$:/config/shortcuts-mac/bold": {
"title": "$:/config/shortcuts-mac/bold",
"text": "meta-B"
},
"$:/config/shortcuts-mac/italic": {
"title": "$:/config/shortcuts-mac/italic",
"text": "meta-I"
},
"$:/config/shortcuts-mac/underline": {
"title": "$:/config/shortcuts-mac/underline",
"text": "meta-U"
},
"$:/config/shortcuts-mac/new-image": {
"title": "$:/config/shortcuts-mac/new-image",
"text": "ctrl-I"
},
"$:/config/shortcuts-mac/new-journal": {
"title": "$:/config/shortcuts-mac/new-journal",
"text": "ctrl-J"
},
"$:/config/shortcuts-mac/new-tiddler": {
"title": "$:/config/shortcuts-mac/new-tiddler",
"text": "ctrl-N"
},
"$:/config/shortcuts-not-mac/bold": {
"title": "$:/config/shortcuts-not-mac/bold",
"text": "ctrl-B"
},
"$:/config/shortcuts-not-mac/italic": {
"title": "$:/config/shortcuts-not-mac/italic",
"text": "ctrl-I"
},
"$:/config/shortcuts-not-mac/underline": {
"title": "$:/config/shortcuts-not-mac/underline",
"text": "ctrl-U"
},
"$:/config/shortcuts-not-mac/new-image": {
"title": "$:/config/shortcuts-not-mac/new-image",
"text": "alt-I"
},
"$:/config/shortcuts-not-mac/new-journal": {
"title": "$:/config/shortcuts-not-mac/new-journal",
"text": "alt-J"
},
"$:/config/shortcuts-not-mac/new-tiddler": {
"title": "$:/config/shortcuts-not-mac/new-tiddler",
"text": "alt-N"
},
"$:/config/shortcuts/add-field": {
"title": "$:/config/shortcuts/add-field",
"text": "enter"
},
"$:/config/shortcuts/advanced-search": {
"title": "$:/config/shortcuts/advanced-search",
"text": "ctrl-shift-A"
},
"$:/config/shortcuts/cancel-edit-tiddler": {
"title": "$:/config/shortcuts/cancel-edit-tiddler",
"text": "escape"
},
"$:/config/shortcuts/excise": {
"title": "$:/config/shortcuts/excise",
"text": "ctrl-E"
},
"$:/config/shortcuts/sidebar-search": {
"title": "$:/config/shortcuts/sidebar-search",
"text": "ctrl-shift-F"
},
"$:/config/shortcuts/heading-1": {
"title": "$:/config/shortcuts/heading-1",
"text": "ctrl-1"
},
"$:/config/shortcuts/heading-2": {
"title": "$:/config/shortcuts/heading-2",
"text": "ctrl-2"
},
"$:/config/shortcuts/heading-3": {
"title": "$:/config/shortcuts/heading-3",
"text": "ctrl-3"
},
"$:/config/shortcuts/heading-4": {
"title": "$:/config/shortcuts/heading-4",
"text": "ctrl-4"
},
"$:/config/shortcuts/heading-5": {
"title": "$:/config/shortcuts/heading-5",
"text": "ctrl-5"
},
"$:/config/shortcuts/heading-6": {
"title": "$:/config/shortcuts/heading-6",
"text": "ctrl-6"
},
"$:/config/shortcuts/link": {
"title": "$:/config/shortcuts/link",
"text": "ctrl-L"
},
"$:/config/shortcuts/linkify": {
"title": "$:/config/shortcuts/linkify",
"text": "alt-shift-L"
},
"$:/config/shortcuts/list-bullet": {
"title": "$:/config/shortcuts/list-bullet",
"text": "ctrl-shift-L"
},
"$:/config/shortcuts/list-number": {
"title": "$:/config/shortcuts/list-number",
"text": "ctrl-shift-N"
},
"$:/config/shortcuts/mono-block": {
"title": "$:/config/shortcuts/mono-block",
"text": "ctrl-shift-M"
},
"$:/config/shortcuts/mono-line": {
"title": "$:/config/shortcuts/mono-line",
"text": "ctrl-M"
},
"$:/config/shortcuts/picture": {
"title": "$:/config/shortcuts/picture",
"text": "ctrl-shift-I"
},
"$:/config/shortcuts/preview": {
"title": "$:/config/shortcuts/preview",
"text": "alt-P"
},
"$:/config/shortcuts/quote": {
"title": "$:/config/shortcuts/quote",
"text": "ctrl-Q"
},
"$:/config/shortcuts/save-tiddler": {
"title": "$:/config/shortcuts/save-tiddler",
"text": "ctrl+enter"
},
"$:/config/shortcuts/stamp": {
"title": "$:/config/shortcuts/stamp",
"text": "ctrl-S"
},
"$:/config/shortcuts/strikethrough": {
"title": "$:/config/shortcuts/strikethrough",
"text": "ctrl-T"
},
"$:/config/shortcuts/subscript": {
"title": "$:/config/shortcuts/subscript",
"text": "ctrl-shift-B"
},
"$:/config/shortcuts/superscript": {
"title": "$:/config/shortcuts/superscript",
"text": "ctrl-shift-P"
},
"$:/config/shortcuts/toggle-sidebar": {
"title": "$:/config/shortcuts/toggle-sidebar",
"text": "alt-shift-S"
},
"$:/config/shortcuts/transcludify": {
"title": "$:/config/shortcuts/transcludify",
"text": "alt-shift-T"
},
"$:/config/ui/EditTemplate": {
"title": "$:/config/ui/EditTemplate",
"text": "$:/core/ui/EditTemplate"
},
"$:/config/ui/ViewTemplate": {
"title": "$:/config/ui/ViewTemplate",
"text": "$:/core/ui/ViewTemplate"
},
"$:/config/WikiParserRules/Inline/wikilink": {
"title": "$:/config/WikiParserRules/Inline/wikilink",
"text": "enable"
},
"$:/snippets/currpalettepreview": {
"title": "$:/snippets/currpalettepreview",
"text": "\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch()\n<$set name=\"swatchColour\" value={{##$(colour)$}}\n><div class=\"tc-swatch\" style=<<swatchStyle>> title=<<colour>>/></$set>\n\\end\n<div class=\"tc-swatches-horiz\"><$list filter=\"\nforeground\nbackground\nmuted-foreground\nprimary\npage-background\ntab-background\ntiddler-info-background\n\" variable=\"colour\"><<swatch>></$list></div>"
},
"$:/snippets/download-wiki-button": {
"title": "$:/snippets/download-wiki-button",
"text": "\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" filename=\"index.html\"/>\n<<lingo Full/Caption>> {{$:/core/images/save-button}}\n</$button>"
},
"$:/language": {
"title": "$:/language",
"text": "$:/languages/en-GB"
},
"$:/snippets/languageswitcher": {
"title": "$:/snippets/languageswitcher",
"text": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n\n<$linkcatcher to=\"$:/language\">\n<div class=\"tc-chooser tc-language-chooser\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/language}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link>\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value=<<currentTiddler>>>\n<$transclude subtiddler=<<flag-title>>>\n<$list filter=\"[all[current]field:title[$:/languages/en-GB]]\">\n<$transclude tiddler=\"$:/languages/en-GB/icon\"/>\n</$list>\n</$transclude>\n</$set>\n</span>\n<$view field=\"description\">\n<$view field=\"name\">\n<$view field=\"title\"/>\n</$view>\n</$view>\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
},
"$:/core/macros/CSS": {
"title": "$:/core/macros/CSS",
"tags": "$:/tags/Macro",
"text": "\\define colour(name)\n<$transclude tiddler={{$:/palette}} index=\"$name$\"><$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\"><$transclude tiddler=\"$:/config/DefaultColourMappings/$name$\"/></$transclude></$transclude>\n\\end\n\n\\define color(name)\n<<colour $name$>>\n\\end\n\n\\define box-shadow(shadow)\n``\n -webkit-box-shadow: $shadow$;\n -moz-box-shadow: $shadow$;\n box-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n -webkit-filter: $filter$;\n -moz-filter: $filter$;\n filter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n -webkit-transition: $transition$;\n -moz-transition: $transition$;\n transition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n -webkit-transform-origin: $origin$;\n -moz-transform-origin: $origin$;\n transform-origin: $origin$;\n``\n\\end\n\n\\define background-linear-gradient(gradient)\n``\nbackground-image: linear-gradient($gradient$);\nbackground-image: -o-linear-gradient($gradient$);\nbackground-image: -moz-linear-gradient($gradient$);\nbackground-image: -webkit-linear-gradient($gradient$);\nbackground-image: -ms-linear-gradient($gradient$);\n``\n\\end\n\n\\define column-count(columns)\n``\n-moz-column-count: $columns$;\n-webkit-column-count: $columns$;\ncolumn-count: $columns$;\n``\n\\end\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}} _canonical_uri={{$title$!!_canonical_uri}}/>\n\\end\n\n\\define if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-background-attachment(text)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" type=\"nomatch\" text=\"\">$text$</$reveal>\n\\end\n"
},
"$:/core/macros/colour-picker": {
"title": "$:/core/macros/colour-picker",
"tags": "$:/tags/Macro",
"text": "\\define colour-picker-update-recent()\n<$action-listops\n\t$tiddler=\"$:/config/ColourPicker/Recent\"\n\t$subfilter=\"$(colour-picker-value)$ [list[$:/config/ColourPicker/Recent]remove[$(colour-picker-value)$]] +[limit[8]]\"\n/>\n\\end\n\n\\define colour-picker-inner(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(colour-picker-value)$\"\"\">\n\n$(colour-picker-update-recent)$\n\n$actions$\n\n<span style=\"display:inline-block; background-color: $(colour-picker-value)$; width: 100%; height: 100%; border-radius: 50%;\"/>\n\n</$button>\n\\end\n\n\\define colour-picker-recent-inner(actions)\n<$set name=\"colour-picker-value\" value=\"$(recentColour)$\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\\end\n\n\\define colour-picker-recent(actions)\n{{$:/language/ColourPicker/Recent}} <$list filter=\"[list[$:/config/ColourPicker/Recent]]\" variable=\"recentColour\">\n<$macrocall $name=\"colour-picker-recent-inner\" actions=\"\"\"$actions$\"\"\"/></$list>\n\\end\n\n\\define colour-picker(actions)\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker-recent\" actions=\"\"\"$actions$\"\"\"/>\n\n---\n\n<$list filter=\"LightPink Pink Crimson LavenderBlush PaleVioletRed HotPink DeepPink MediumVioletRed Orchid Thistle Plum Violet Magenta Fuchsia DarkMagenta Purple MediumOrchid DarkViolet DarkOrchid Indigo BlueViolet MediumPurple MediumSlateBlue SlateBlue DarkSlateBlue Lavender GhostWhite Blue MediumBlue MidnightBlue DarkBlue Navy RoyalBlue CornflowerBlue LightSteelBlue LightSlateGrey SlateGrey DodgerBlue AliceBlue SteelBlue LightSkyBlue SkyBlue DeepSkyBlue LightBlue PowderBlue CadetBlue Azure LightCyan PaleTurquoise Cyan Aqua DarkTurquoise DarkSlateGrey DarkCyan Teal MediumTurquoise LightSeaGreen Turquoise Aquamarine MediumAquamarine MediumSpringGreen MintCream SpringGreen MediumSeaGreen SeaGreen Honeydew LightGreen PaleGreen DarkSeaGreen LimeGreen Lime ForestGreen Green DarkGreen Chartreuse LawnGreen GreenYellow DarkOliveGreen YellowGreen OliveDrab Beige LightGoldenrodYellow Ivory LightYellow Yellow Olive DarkKhaki LemonChiffon PaleGoldenrod Khaki Gold Cornsilk Goldenrod DarkGoldenrod FloralWhite OldLace Wheat Moccasin Orange PapayaWhip BlanchedAlmond NavajoWhite AntiqueWhite Tan BurlyWood Bisque DarkOrange Linen Peru PeachPuff SandyBrown Chocolate SaddleBrown Seashell Sienna LightSalmon Coral OrangeRed DarkSalmon Tomato MistyRose Salmon Snow LightCoral RosyBrown IndianRed Red Brown FireBrick DarkRed Maroon White WhiteSmoke Gainsboro LightGrey Silver DarkGrey Grey DimGrey Black\" variable=\"colour-picker-value\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\n---\n\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" tag=\"input\" default=\"\" placeholder=\"\"/>\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" type=\"color\" tag=\"input\"/>\n<$set name=\"colour-picker-value\" value={{$:/config/ColourPicker/New}}>\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\n</div>\n\n\\end\n"
},
"$:/core/macros/copy-to-clipboard": {
"title": "$:/core/macros/copy-to-clipboard",
"tags": "$:/tags/Macro",
"text": "\\define copy-to-clipboard(src,class:\"tc-btn-invisible\",style)\n<$button class=<<__class__>> style=<<__style__>> message=\"tm-copy-to-clipboard\" param=<<__src__>> tooltip={{$:/language/Buttons/CopyToClipboard/Hint}}>\n{{$:/core/images/copy-clipboard}} <$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>\n</$button>\n\\end\n\n\\define copy-to-clipboard-above-right(src,class:\"tc-btn-invisible\",style)\n<div style=\"position: relative;\">\n<div style=\"position: absolute; bottom: 0; right: 0;\">\n<$macrocall $name=\"copy-to-clipboard\" src=<<__src__>> class=<<__class__>> style=<<__style__>>/>\n</div>\n</div>\n\\end\n\n"
},
"$:/core/macros/diff": {
"title": "$:/core/macros/diff",
"tags": "$:/tags/Macro",
"text": "\\define compareTiddlerText(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle)\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>>>\n<$diff-text source=<<source>> dest=<<dest>>/>\n</$set>\n</$set>\n\\end\n\n\\define compareTiddlers(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle,exclude)\n<table class=\"tc-diff-tiddlers\">\n<tbody>\n<$set name=\"sourceFields\" filter=\"[<__sourceTiddlerTitle__>fields[]sort[]]\">\n<$set name=\"destFields\" filter=\"[<__destSubTiddlerTitle__>subtiddlerfields<__destTiddlerTitle__>sort[]]\">\n<$list filter=\"[enlist<sourceFields>] [enlist<destFields>] -[enlist<__exclude__>] +[sort[]]\" variable=\"fieldName\">\n<tr>\n<th>\n<$text text=<<fieldName>>/> \n</th>\n<td>\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>> field=<<fieldName>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>> field=<<fieldName>>>\n<$diff-text source=<<source>> dest=<<dest>>>\n</$diff-text>\n</$set>\n</$set>\n</td>\n</tr>\n</$list>\n</$set>\n</$set>\n</tbody>\n</table>\n\\end\n"
},
"$:/core/macros/dumpvariables": {
"title": "$:/core/macros/dumpvariables",
"tags": "$:/tags/Macro",
"text": "\\define dumpvariables()\n<ul>\n<$list filter=\"[variables[]]\" variable=\"varname\">\n<li>\n<strong><code><$text text=<<varname>>/></code></strong>:<br/>\n<$codeblock code={{{ [<varname>getvariable[]] }}}/>\n</li>\n</$list>\n</ul>\n\\end\n"
},
"$:/core/macros/export": {
"title": "$:/core/macros/export",
"tags": "$:/tags/Macro",
"text": "\\define exportButtonFilename(baseFilename)\n$baseFilename$$(extension)$\n\\end\n\n\\define exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n<span class=\"tc-popup-keep\"><$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$lingoBase$Caption}}/></span>\n</$list>\n</$button></span><$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$set name=\"extension\" value={{!!extension}}>\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=\"\"\"$exportFilter$\"\"\" filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$list>\n</div>\n</$reveal>\n\\end\n"
},
"$:/core/macros/image-picker": {
"title": "$:/core/macros/image-picker",
"created": "20170715180840889",
"modified": "20170715180914005",
"tags": "$:/tags/Macro",
"type": "text/vnd.tiddlywiki",
"text": "\\define image-picker-thumbnail(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(imageTitle)$\"\"\">\n$actions$\n<$transclude tiddler=<<imageTitle>>/>\n</$button>\n\\end\n\n\\define image-picker-list(filter,actions)\n<$list filter=\"\"\"$filter$\"\"\" variable=\"imageTitle\">\n<$macrocall $name=\"image-picker-thumbnail\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\\end\n\n\\define image-picker(actions,filter:\"[all[shadows+tiddlers]is[image]] -[type[application/pdf]] +[!has[draft.of]$subfilter$sort[title]]\",subfilter:\"\")\n<div class=\"tc-image-chooser\">\n<$vars state-system=<<qualify \"$:/state/image-picker/system\">>>\n<$checkbox tiddler=<<state-system>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"hide\">\n{{$:/language/SystemTiddlers/Include/Prompt}}\n</$checkbox>\n<$reveal state=<<state-system>> type=\"match\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$ +[!is[system]]\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n<$reveal state=<<state-system>> type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n</$vars>\n</div>\n\\end\n\n\\define image-picker-include-tagged-images(actions)\n<$macrocall $name=\"image-picker\" filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[!has[draft.of]sort[title]]\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n"
},
"$:/core/macros/lingo": {
"title": "$:/core/macros/lingo",
"tags": "$:/tags/Macro",
"text": "\\define lingo-base()\n$:/language/\n\\end\n\n\\define lingo(title)\n{{$(lingo-base)$$title$}}\n\\end\n"
},
"$:/core/macros/list": {
"title": "$:/core/macros/list",
"tags": "$:/tags/Macro",
"text": "\\define list-links(filter,type:\"ul\",subtype:\"li\",class:\"\",emptyMessage)\n\\whitespace trim\n<$type$ class=\"$class$\">\n<$list filter=\"$filter$\" emptyMessage=<<__emptyMessage__>>>\n<$subtype$>\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$subtype$>\n</$list>\n</$type$>\n\\end\n\n\\define list-links-draggable-drop-actions()\n<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define list-links-draggable(tiddler,field:\"list\",type:\"ul\",subtype:\"li\",class:\"\",itemTemplate)\n\\whitespace trim\n<span class=\"tc-links-draggable-list\">\n<$vars targetTiddler=\"\"\"$tiddler$\"\"\" targetField=\"\"\"$field$\"\"\">\n<$type$ class=\"$class$\">\n<$list filter=\"[list[$tiddler$!!$field$]]\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"\"\"$subtype$\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\"/>\n<div>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$transclude>\n</div>\n</$droppable>\n</$list>\n</$type$>\n<$tiddler tiddler=\"\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"div\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\">\n \n</div>\n<div style=\"height:0.5em;\"/>\n</$droppable>\n</$tiddler>\n</$vars>\n</span>\n\\end\n\n\\define list-tagged-draggable-drop-actions(tag)\n<!-- Save the current ordering of the tiddlers with this tag -->\n<$set name=\"order\" filter=\"[<__tag__>tagging[]]\">\n<!-- Remove any list-after or list-before fields from the tiddlers with this tag -->\n<$list filter=\"[<__tag__>tagging[]]\">\n<$action-deletefield $field=\"list-before\"/>\n<$action-deletefield $field=\"list-after\"/>\n</$list>\n<!-- Save the new order to the Tag Tiddler -->\n<$action-listops $tiddler=<<__tag__>> $field=\"list\" $filter=\"+[enlist<order>] +[insertbefore:currentTiddler<actionTiddler>]\"/>\n<!-- Make sure the newly added item has the right tag -->\n<!-- Removing this line makes dragging tags within the dropdown work as intended -->\n<!--<$action-listops $tiddler=<<actionTiddler>> $tags=<<__tag__>>/>-->\n<!-- Using the following 5 lines as replacement makes dragging titles from outside into the dropdown apply the tag -->\n<$list filter=\"[<actionTiddler>!contains:tags<__tag__>]\">\n<$fieldmangler tiddler=<<actionTiddler>>>\n<$action-sendmessage $message=\"tm-add-tag\" $param=<<__tag__>>/>\n</$fieldmangler>\n</$list>\n</$set>\n\\end\n\n\\define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:\"div\",storyview:\"\")\n\\whitespace trim\n<span class=\"tc-tagged-draggable-list\">\n<$set name=\"tag\" value=<<__tag__>>>\n<$list filter=\"[<__tag__>tagging[]$subFilter$]\" emptyMessage=<<__emptyMessage__>> storyview=<<__storyview__>>>\n<$elementTag$ class=\"tc-menu-list-item\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</$transclude>\n</$elementTag$>\n</$droppable>\n</$elementTag$>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$ style=\"height:0.5em;\">\n</$elementTag$>\n</$droppable>\n</$tiddler>\n</$set>\n</span>\n\\end\n"
},
"$:/core/macros/tabs": {
"title": "$:/core/macros/tabs",
"tags": "$:/tags/Macro",
"text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template,buttonTemplate,retain)\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\" storyview=\"pop\"><$set name=\"save-currentTiddler\" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<qualify \"$state$\">> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\" tooltip={{!!tooltip}}>\n<$tiddler tiddler=<<save-currentTiddler>>>\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude tiddler=\"$buttonTemplate$\" mode=\"inline\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$transclude>\n</$set></$tiddler></$button></$tiddler></$set></$list>\n</div>\n<div class=\"tc-tab-divider $class$\"/>\n<div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<qualify \"$state$\">> text=<<currentTab>> default=\"$default$\" retain=\"\"\"$retain$\"\"\">\n\n<$transclude tiddler=\"$template$\" mode=\"block\">\n\n<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\n</$transclude>\n\n</$reveal>\n\n</$list>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/tag-picker": {
"title": "$:/core/macros/tag-picker",
"tags": "$:/tags/Macro",
"text": "\\define add-tag-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n\\end\n\n\\define tag-button()\n<$button class=\"tc-btn-invisible\" tag=\"a\" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>\n<$action-sendmessage $message=\"tm-add-tag\" $param=<<tag>>/>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$button>\n\\end\n\n\\define tag-picker-inner()\n\\whitespace trim\n<div class=\"tc-edit-add-tag\">\n<span class=\"tc-add-tag-name\">\n<$keyboard key=\"ENTER\" actions=<<add-tag-actions>>>\n<$edit-text tiddler=<<newTagNameTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex=<<tabIndex>> focus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}}/>\n</$keyboard>\n</span> <$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class=\"tc-add-tag-button\">\n<$set name=\"tag\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$button set=\"$:/temp/NewTagName\" setTo=\"\" class=\"\">\n<<add-tag-actions>>\n<$action-deletetiddler $tiddler=<<newTagNameTiddler>>/>\n{{$:/language/EditTemplate/Tags/Add/Button}}\n</$button>\n</$set>\n</span>\n</div>\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown\">\n<$set name=\"newTagName\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$list filter=\"[<newTagName>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=\"[tags[]!is[system]search:title<newTagName>sort[]]\" variable=\"tag\">\n<<tag-button>>\n</$list></$list>\n<hr>\n<$list filter=\"[<newTagName>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=\"[tags[]is[system]search:title<newTagName>sort[]]\" variable=\"tag\">\n<<tag-button>>\n</$list></$list>\n</$set>\n</div>\n</$reveal>\n</div>\n\\end\n\\define tag-picker()\n\\whitespace trim\n<$list filter=\"[<newTagNameTiddler>match[]]\" emptyMessage=<<tag-picker-inner>>>\n<$set name=\"newTagNameTiddler\" value=<<qualify \"$:/temp/NewTagName\">>>\n<<tag-picker-inner>>\n</$set>\n</$list>\n\\end\n"
},
"$:/core/macros/tag": {
"title": "$:/core/macros/tag",
"tags": "$:/tags/Macro",
"text": "\\define tag-pill-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<$element-tag$ $element-attributes$ class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n$actions$<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view tiddler=<<__tag__>> field=\"title\" format=\"text\" />\n</$element-tag$>\n</$vars>\n\\end\n\n\\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)\n<$macrocall $name=\"tag-pill-inner\" tag=<<__tag__>> icon=\"\"\"$icon$\"\"\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n\n\\define tag-pill(tag,element-tag:\"span\",element-attributes:\"\",actions:\"\")\n<span class=\"tc-tag-list-item\">\n<$macrocall $name=\"tag-pill-body\" tag=<<__tag__>> icon={{{ [<__tag__>get[icon]] }}} colour={{{ [<__tag__>get[color]] }}} palette={{$:/palette}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</span>\n\\end\n\n\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n"
},
"$:/core/macros/thumbnails": {
"title": "$:/core/macros/thumbnails",
"tags": "$:/tags/Macro",
"text": "\\define thumbnail(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<$link to=\"\"\"$link$\"\"\"><div class=\"tc-thumbnail-wrapper\">\n<div class=\"tc-thumbnail-image\" style=\"width:$width$px;height:$height$px;\"><$reveal type=\"nomatch\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" style=\"width:$width$px;height:$height$px;\">\n[img[$image$]]\n</$reveal><$reveal type=\"match\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" class=\"tc-thumbnail-background\" style=\"width:$width$px;height:$height$px;background-color:$background-color$;\"></$reveal></div><div class=\"tc-thumbnail-icon\" style=\"fill:$color$;color:$color$;\">\n$icon$\n</div><div class=\"tc-thumbnail-caption\">\n$caption$\n</div>\n</div></$link>\n\\end\n\n\\define thumbnail-right(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<div class=\"tc-thumbnail-right-wrapper\"><<thumbnail \"\"\"$link$\"\"\" \"\"\"$icon$\"\"\" \"\"\"$color$\"\"\" \"\"\"$background-color$\"\"\" \"\"\"$image$\"\"\" \"\"\"$caption$\"\"\" \"\"\"$width$\"\"\" \"\"\"$height$\"\"\">></div>\n\\end\n\n\\define list-thumbnails(filter,width:\"280\",height:\"157\")\n<$list filter=\"\"\"$filter$\"\"\"><$macrocall $name=\"thumbnail\" link={{!!link}} icon={{!!icon}} color={{!!color}} background-color={{!!background-color}} image={{!!image}} caption={{!!caption}} width=\"\"\"$width$\"\"\" height=\"\"\"$height$\"\"\"/></$list>\n\\end\n"
},
"$:/core/macros/timeline": {
"title": "$:/core/macros/timeline",
"created": "20141212105914482",
"modified": "20141212110330815",
"tags": "$:/tags/Macro",
"text": "\\define timeline-title()\n\\whitespace trim\n<!-- Override this macro with a global macro \n of the same name if you need to change \n how titles are displayed on the timeline \n -->\n<$view field=\"title\"/>\n\\end\n\\define timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n<div class=\"tc-timeline\">\n<$list filter=\"[!is[system]$subfilter$has[$dateField$]!sort[$dateField$]limit[$limit$]eachday[$dateField$]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"$dateField$\" format=\"date\" template=\"$format$\"/>\n<$list filter=\"[sameday:$dateField${!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><<timeline-title>></$link>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n\\end\n"
},
"$:/core/macros/toc": {
"title": "$:/core/macros/toc",
"tags": "$:/tags/Macro",
"text": "\\define toc-caption()\n<$set name=\"tv-wikilinks\" value=\"no\">\n <$transclude field=\"caption\">\n <$view field=\"title\"/>\n </$transclude>\n</$set>\n\\end\n\n\\define toc-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<ol class=\"tc-toc\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$vars item=<<currentTiddler>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link><$view field='caption'><$view field='title'/></$view></$link>\">\n <<toc-caption>>\n </$list>\n <$macrocall $name=\"toc-body\" tag=<<item>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n </li>\n </$set>\n </$set>\n </$vars>\n </$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter:\"\")\n<$macrocall $name=\"toc-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> />\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$link>\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n </$button>\n </$reveal>\n <<toc-caption>>\n </$link>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-expandable-empty-message()\n<$macrocall $name=\"toc-linked-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter:\"\",exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <ol class=\"tc-toc toc-expandable\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=<<toc-expandable-empty-message>> >\n <$macrocall $name=\"toc-unlinked-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"\"\"itemClassFilter\"\"\" exclude=<<excluded>> path=<<path>> />\n </$list>\n </$list>\n </ol>\n </$set>\n</$vars>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\" >\n <li class=<<toc-item-class>>>\n <$link>\n <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n </$button>\n </$reveal>\n </$list>\n <<toc-caption>>\n </$link>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>\">\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n </$list>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-selective-expandable-empty-message()\n<$macrocall $name=\"toc-linked-selective-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter,exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <ol class=\"tc-toc toc-selective-expandable\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=<<toc-selective-expandable-empty-message>> >\n <$macrocall $name=\"toc-unlinked-selective-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n </$list>\n </$list>\n </ol>\n </$set>\n</$vars>\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$tiddler tiddler={{{ [<__selectedTiddler__>get[text]] }}}>\n <div class=\"tc-tabbed-table-of-contents\">\n <$linkcatcher to=<<__selectedTiddler__>>>\n <div class=\"tc-table-of-contents\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"[all[current]] -[<__selectedTiddler__>get[text]]\"/>\n </div>\n </$linkcatcher>\n <div class=\"tc-tabbed-table-of-contents-content\">\n <$reveal stateTitle=<<__selectedTiddler__>> type=\"nomatch\" text=\"\">\n <$transclude mode=\"block\" tiddler=<<__template__>>>\n <h1><<toc-caption>></h1>\n <$transclude mode=\"block\">$missingText$</$transclude>\n </$transclude>\n </$reveal>\n <$reveal stateTitle=<<__selectedTiddler__>> type=\"match\" text=\"\">\n $unselectedText$\n </$reveal>\n </div>\n </div>\n</$tiddler>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$linkcatcher to=<<__selectedTiddler__>>>\n <$macrocall $name=\"toc-tabbed-external-nav\" tag=<<__tag__>> sort=<<__sort__>> selectedTiddler=<<__selectedTiddler__>> unselectedText=<<__unselectedText__>> missingText=<<__missingText__>> template=<<__template__>>/>\n</$linkcatcher>\n\\end\n\n"
},
"$:/core/macros/translink": {
"title": "$:/core/macros/translink",
"tags": "$:/tags/Macro",
"text": "\\define translink(title,mode:\"block\")\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: black; foreground; white;\">\n<$link to=\"\"\"$title$\"\"\">\n<$text text=\"\"\"$title$\"\"\"/>\n</$link>\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: white; foreground; black;\">\n<$transclude tiddler=\"\"\"$title$\"\"\" mode=\"$mode$\">\n\"<$text text=\"\"\"$title$\"\"\"/>\" is missing\n</$transclude>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/tree": {
"title": "$:/core/macros/tree",
"tags": "$:/tags/Macro",
"text": "\\define leaf-link(full-title,chunk,separator: \"/\")\n<$link to=<<__full-title__>>><$text text=<<__chunk__>>/></$link>\n\\end\n\n\\define leaf-node(prefix,chunk)\n<li>\n<$list filter=\"[<__prefix__>addsuffix<__chunk__>is[shadow]] [<__prefix__>addsuffix<__chunk__>is[tiddler]]\" variable=\"full-title\">\n<$list filter=\"[<full-title>removeprefix<__prefix__>]\" variable=\"chunk\">\n<span>{{$:/core/images/file}}</span> <$macrocall $name=\"leaf-link\" full-title=<<full-title>> chunk=<<chunk>>/>\n</$list>\n</$list>\n</li>\n\\end\n\n\\define branch-node(prefix,chunk,separator: \"/\")\n<li>\n<$set name=\"reveal-state\" value={{{ [[$:/state/tree/]addsuffix<__prefix__>addsuffix<__chunk__>] }}}>\n<$reveal type=\"nomatch\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"show\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"hide\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<span>(<$count filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>removeprefix<__chunk__>] -[<__prefix__>addsuffix<__chunk__>]\"/>)</span>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$macrocall $name=\"tree-node\" prefix={{{ [<__prefix__>addsuffix<__chunk__>] }}} separator=<<__separator__>>/>\n</$reveal>\n</$set>\n</li>\n\\end\n\n\\define tree-node(prefix,separator: \"/\")\n<ol>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]!suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"leaf-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"branch-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n</ol>\n\\end\n\n\\define tree(prefix: \"$:/\",separator: \"/\")\n<div class=\"tc-tree\">\n<span><$text text=<<__prefix__>>/></span>\n<div>\n<$macrocall $name=\"tree-node\" prefix=<<__prefix__>> separator=<<__separator__>>/>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/utils": {
"title": "$:/core/macros/utils",
"text": "\\define colour(colour)\n$colour$\n\\end\n"
},
"$:/snippets/minifocusswitcher": {
"title": "$:/snippets/minifocusswitcher",
"text": "<$select tiddler=\"$:/config/AutoFocus\">\n<$list filter=\"title tags text type fields\">\n<option value=<<currentTiddler>>><<currentTiddler>></option>\n</$list>\n</$select>\n"
},
"$:/snippets/minilanguageswitcher": {
"title": "$:/snippets/minilanguageswitcher",
"text": "<$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/minithemeswitcher": {
"title": "$:/snippets/minithemeswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$select tiddler=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"name\"><$view field=\"title\"/></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/modules": {
"title": "$:/snippets/modules",
"text": "\\define describeModuleType(type)\n{{$:/language/Docs/ModuleTypes/$type$}}\n\\end\n<$list filter=\"[moduletypes[]]\">\n\n!! <$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n\n<$macrocall $name=\"describeModuleType\" type=<<currentTiddler>>/>\n\n<ul><$list filter=\"[all[current]modules[]]\"><li><$link><<currentTiddler>></$link>\n</li>\n</$list>\n</ul>\n</$list>\n"
},
"$:/palette": {
"title": "$:/palette",
"text": "$:/palettes/Vanilla"
},
"$:/snippets/paletteeditor": {
"title": "$:/snippets/paletteeditor",
"text": "<$transclude tiddler=\"$:/PaletteManager\"/>\n"
},
"$:/snippets/palettepreview": {
"title": "$:/snippets/palettepreview",
"text": "<$set name=\"currentTiddler\" value={{$:/palette}}>\n{{||$:/snippets/currpalettepreview}}\n</$set>\n"
},
"$:/snippets/paletteswitcher": {
"title": "$:/snippets/paletteswitcher",
"text": "<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]\"><$set name=\"cls\" filter=\"[all[current]prefix{$:/palette}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' - <$view field=\"description\" format=\"text\"/>{{||$:/snippets/currpalettepreview}}</$link>\n</div></$set>\n</$list>\n</div>\n</$linkcatcher>\n"
},
"$:/snippets/peek-stylesheets": {
"title": "$:/snippets/peek-stylesheets",
"text": "\\define expandable-stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$vars state=<<qualify \"$:/state/peek-stylesheets/open/\">>>\n<$set name=\"state\" value={{{ [<state>addsuffix<currentTiddler>] }}}>\n<li>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"no\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"yes\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"div\">\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</$reveal>\n</li>\n</$set>\n</$vars>\n</$list>\n</ol>\n\\end\n\n\\define stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<li>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</li>\n</$list>\n</ol>\n\\end\n\n<$vars modeState=<<qualify \"$:/state/peek-stylesheets/mode/\">>>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"expanded\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Stylesheets/Expand/Caption}}</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"restored\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}} {{$:/language/ControlPanel/Stylesheets/Restore/Caption}}</$button>\n</$reveal>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<expandable-stylesheets-list>>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<stylesheets-list>>\n</$reveal>\n\n</$vars>\n"
},
"$:/temp/search": {
"title": "$:/temp/search",
"text": ""
},
"$:/tags/AdvancedSearch": {
"title": "$:/tags/AdvancedSearch",
"list": "[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]"
},
"$:/tags/AdvancedSearch/FilterButton": {
"title": "$:/tags/AdvancedSearch/FilterButton",
"list": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown $:/core/ui/AdvancedSearch/Filter/FilterButtons/clear $:/core/ui/AdvancedSearch/Filter/FilterButtons/export $:/core/ui/AdvancedSearch/Filter/FilterButtons/delete"
},
"$:/tags/ControlPanel": {
"title": "$:/tags/ControlPanel",
"list": "$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals"
},
"$:/tags/ControlPanel/Info": {
"title": "$:/tags/ControlPanel/Info",
"list": "$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced"
},
"$:/tags/ControlPanel/Plugins": {
"title": "$:/tags/ControlPanel/Plugins",
"list": "[[$:/core/ui/ControlPanel/Plugins/Installed]] [[$:/core/ui/ControlPanel/Plugins/Add]]"
},
"$:/tags/EditTemplate": {
"title": "$:/tags/EditTemplate",
"list": "[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]"
},
"$:/tags/EditToolbar": {
"title": "$:/tags/EditToolbar",
"list": "[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]"
},
"$:/tags/EditorToolbar": {
"title": "$:/tags/EditorToolbar",
"list": "$:/core/ui/EditorToolbar/paint $:/core/ui/EditorToolbar/opacity $:/core/ui/EditorToolbar/line-width $:/core/ui/EditorToolbar/rotate-left $:/core/ui/EditorToolbar/clear $:/core/ui/EditorToolbar/bold $:/core/ui/EditorToolbar/italic $:/core/ui/EditorToolbar/strikethrough $:/core/ui/EditorToolbar/underline $:/core/ui/EditorToolbar/superscript $:/core/ui/EditorToolbar/subscript $:/core/ui/EditorToolbar/mono-line $:/core/ui/EditorToolbar/mono-block $:/core/ui/EditorToolbar/quote $:/core/ui/EditorToolbar/list-bullet $:/core/ui/EditorToolbar/list-number $:/core/ui/EditorToolbar/heading-1 $:/core/ui/EditorToolbar/heading-2 $:/core/ui/EditorToolbar/heading-3 $:/core/ui/EditorToolbar/heading-4 $:/core/ui/EditorToolbar/heading-5 $:/core/ui/EditorToolbar/heading-6 $:/core/ui/EditorToolbar/link $:/core/ui/EditorToolbar/excise $:/core/ui/EditorToolbar/picture $:/core/ui/EditorToolbar/stamp $:/core/ui/EditorToolbar/size $:/core/ui/EditorToolbar/editor-height $:/core/ui/EditorToolbar/more $:/core/ui/EditorToolbar/preview $:/core/ui/EditorToolbar/preview-type"
},
"$:/tags/Manager/ItemMain": {
"title": "$:/tags/Manager/ItemMain",
"list": "$:/Manager/ItemMain/WikifiedText $:/Manager/ItemMain/RawText $:/Manager/ItemMain/Fields"
},
"$:/tags/Manager/ItemSidebar": {
"title": "$:/tags/Manager/ItemSidebar",
"list": "$:/Manager/ItemSidebar/Tags $:/Manager/ItemSidebar/Colour $:/Manager/ItemSidebar/Icon $:/Manager/ItemSidebar/Tools"
},
"$:/tags/MoreSideBar": {
"title": "$:/tags/MoreSideBar",
"list": "[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]] [[$:/core/ui/MoreSideBar/Explorer]] [[$:/core/ui/MoreSideBar/Plugins]]",
"text": ""
},
"$:/tags/PageControls": {
"title": "$:/tags/PageControls",
"list": "[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/fold-all]] [[$:/core/ui/Buttons/unfold-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/new-image]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/manager]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/palette]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/timestamp]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/print]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]"
},
"$:/tags/PageTemplate": {
"title": "$:/tags/PageTemplate",
"list": "[[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]] [[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]]",
"text": ""
},
"$:/tags/PluginLibrary": {
"title": "$:/tags/PluginLibrary",
"list": "$:/config/OfficialPluginLibrary"
},
"$:/tags/SideBar": {
"title": "$:/tags/SideBar",
"list": "[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]",
"text": ""
},
"$:/tags/SideBarSegment": {
"title": "$:/tags/SideBarSegment",
"list": "[[$:/core/ui/SideBarSegments/site-title]] [[$:/core/ui/SideBarSegments/site-subtitle]] [[$:/core/ui/SideBarSegments/page-controls]] [[$:/core/ui/SideBarSegments/search]] [[$:/core/ui/SideBarSegments/tabs]]"
},
"$:/tags/TiddlerInfo": {
"title": "$:/tags/TiddlerInfo",
"list": "[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]",
"text": ""
},
"$:/tags/TiddlerInfo/Advanced": {
"title": "$:/tags/TiddlerInfo/Advanced",
"list": "[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]"
},
"$:/tags/ViewTemplate": {
"title": "$:/tags/ViewTemplate",
"list": "[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/unfold]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]]"
},
"$:/tags/ViewToolbar": {
"title": "$:/tags/ViewToolbar",
"list": "[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/open-window]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]] [[$:/core/ui/Buttons/fold-others]] [[$:/core/ui/Buttons/fold]]"
},
"$:/snippets/themeswitcher": {
"title": "$:/snippets/themeswitcher",
"text": "<$linkcatcher to=\"$:/theme\">\n<div class=\"tc-chooser\"><$list filter=\"[plugin-type[theme]sort[title]]\"><$set name=\"cls\" filter=\"[all[current]field:title{$:/theme}] [[$:/theme]!has[text]addsuffix[s/tiddlywiki/vanilla]field:title<currentTiddler>] +[limit[1]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' <$view field=\"description\" format=\"text\"/></$link></div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
},
"$:/core/wiki/title": {
"title": "$:/core/wiki/title",
"text": "{{$:/SiteTitle}} --- {{$:/SiteSubtitle}}"
},
"$:/view": {
"title": "$:/view",
"text": "classic"
},
"$:/snippets/viewswitcher": {
"title": "$:/snippets/viewswitcher",
"text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<$linkcatcher to=\"$:/view\">\n<div class=\"tc-chooser tc-viewswitcher\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$set name=\"cls\" filter=\"[<storyview>prefix{$:/view}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link to=<<storyview>>><$transclude tiddler=<<icon>>/><$text text=<<storyview>>/></$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
}
}
}
<$navigator story="$:/StoryList" history="$:/HistoryList">
<$action-navigate $to="$:/AdvancedSearch"/>
<$action-sendmessage $message="tm-focus-selector" $param="""[data-tiddler-title="$:/AdvancedSearch"] .tc-search input""" preventScroll="true"/>
</$navigator>
<$list filter="[{$:/themes/tiddlywiki/vanilla/options/sidebarlayout}match[fixed-fluid]]"
emptyMessage="""<$action-setfield $tiddler="$:/themes/tiddlywiki/vanilla/options/sidebarlayout" text="fixed-fluid"/>""">
<$action-setfield $tiddler="$:/themes/tiddlywiki/vanilla/options/sidebarlayout" text="fluid-fixed"/>
</$list>
<$navigator story="$:/StoryList" history="$:/HistoryList" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>
{{$:/core/ui/Actions/new-image}}
</$navigator>
<$navigator story="$:/StoryList" history="$:/HistoryList" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>
{{$:/core/ui/Actions/new-journal}}
</$navigator>
<$navigator story="$:/StoryList" history="$:/HistoryList" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>
{{$:/core/ui/Actions/new-tiddler}}
</$navigator>
<$wikify name="site-title" text={{$:/config/SaveWikiButton/Filename}}>
<$action-sendmessage $message="tm-save-wiki" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>
</$wikify>
<$action-sendmessage $message="tm-focus-selector" $param=".tc-search input"/>
<$action-sendmessage $message="tm-show-switcher" switch="layout"/>
<$list filter="[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]" emptyMessage="""
<$action-setfield $tiddler="$:/state/sidebar" text="yes"/>
""">
<$action-setfield $tiddler="$:/state/sidebar" text="no"/>
</$list>
\whitespace trim
\define lingo-base() $:/language/CloseAll/
\define drop-actions()
<$action-listops $tiddler="$:/StoryList" $subfilter="+[insertbefore:currentTiddler<actionTiddler>]"/>
\end
<$list filter="[list[$:/StoryList]]" history="$:/HistoryList" storyview="pop">
<div style="position: relative;">
<$droppable actions=<<drop-actions>>>
<div class="tc-droppable-placeholder">
</div>
<div>
<$button message="tm-close-tiddler" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class="tc-btn-invisible tc-btn-mini">×</$button> <$link to={{!!title}}><$view field="title"/></$link>
</div>
</$droppable>
</div>
</$list>
<$tiddler tiddler="">
<$droppable actions=<<drop-actions>>>
<div class="tc-droppable-placeholder">
</div>
<$button message="tm-close-all-tiddlers" class="tc-btn-invisible tc-btn-mini"><<lingo Button>></$button>
</$droppable>
</$tiddler>
<$macrocall $name="timeline" format={{$:/language/RecentChanges/DateFormat}}/>
\define lingo-base() $:/language/ControlPanel/
\define config-title()
$:/config/PageControlButtons/Visibility/$(listItem)$
\end
<<lingo Basics/Version/Prompt>> <<version>>
<$set name="tv-config-toolbar-icons" value="yes">
<$set name="tv-config-toolbar-text" value="yes">
<$set name="tv-config-toolbar-class" value="">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]" variable="listItem">
<div style="position:relative;" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>
<$checkbox tiddler=<<config-title>> field="text" checked="show" unchecked="hide" default="show"/> <$transclude tiddler=<<listItem>>/> <i class="tc-muted"><$transclude tiddler=<<listItem>> field="description"/></i>
</div>
</$list>
</$set>
</$set>
</$set>
The following tiddlers were imported:
# [[$:/config/EditorTypeMappings/text/vnd.tiddlywiki]]
Accept the selected item (variant)
Open the ~AdvancedSearch panel from within the sidebar search field
Change the sidebar layout
$:/palettes/MaarfapadContrast
alert-background: #f00
alert-border: <<colour background>>
alert-highlight: <<colour foreground>>
alert-muted-foreground: #800
background: #fff
blockquote-bar: <<colour muted-foreground>>
button-background: <<colour background>>
button-foreground: <<colour foreground>>
button-border: <<colour foreground>>
code-background: <<colour background>>
code-border: <<colour foreground>>
code-foreground: <<colour foreground>>
dirty-indicator: #f00
download-background: #080
download-foreground: <<colour background>>
dragger-background: <<colour foreground>>
dragger-foreground: <<colour background>>
dropdown-background: <<colour background>>
dropdown-border: <<colour muted-foreground>>
dropdown-tab-background-selected: <<colour foreground>>
dropdown-tab-background: <<colour foreground>>
dropzone-background: rgba(0,200,0,0.7)
external-link-background-hover: inherit
external-link-background-visited: inherit
external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #00a
external-link-foreground: #00e
foreground: #000
message-background: <<colour foreground>>
message-border: <<colour background>>
message-foreground: <<colour background>>
modal-backdrop: <<colour foreground>>
modal-background: <<colour background>>
modal-border: <<colour foreground>>
modal-footer-background: <<colour background>>
modal-footer-border: <<colour foreground>>
modal-header-border: <<colour foreground>>
muted-foreground: <<colour foreground>>
notification-background: <<colour background>>
notification-border: <<colour foreground>>
page-background: <<colour background>>
pre-background: <<colour background>>
pre-border: <<colour foreground>>
primary: #00f
sidebar-button-foreground: <<colour foreground>>
sidebar-controls-foreground-hover: #ff0000
sidebar-controls-foreground: <<colour foreground>>
sidebar-foreground-shadow: rgba(0,0,0, 0)
sidebar-foreground: <<colour foreground>>
sidebar-muted-foreground-hover: #444444
sidebar-muted-foreground: <<colour foreground>>
sidebar-tab-background-selected: <<colour background>>
sidebar-tab-background: <<colour tab-background>>
sidebar-tab-border-selected: <<colour tab-border-selected>>
sidebar-tab-border: <<colour tab-border>>
sidebar-tab-divider: <<colour tab-divider>>
sidebar-tab-foreground-selected: <<colour foreground>>
sidebar-tab-foreground: <<colour tab-foreground>>
sidebar-tiddler-link-foreground-hover: <<colour foreground>>
sidebar-tiddler-link-foreground: <<colour primary>>
site-title-foreground: <<colour tiddler-title-foreground>>
static-alert-foreground: #aaaaaa
tab-background-selected: <<colour background>>
tab-background: <<colour foreground>>
tab-border-selected: <<colour foreground>>
tab-border: <<colour foreground>>
tab-divider: <<colour foreground>>
tab-foreground-selected: <<colour foreground>>
tab-foreground: <<colour background>>
table-border: #dddddd
table-footer-background: #a8a8a8
table-header-background: #f0f0f0
tag-background: #d7d7d7
tag-foreground: #fff
tiddler-background: <<colour background>>
tiddler-border: <<colour foreground>>
tiddler-controls-foreground-hover: #ddd
tiddler-controls-foreground-selected: #fdd
tiddler-controls-foreground: <<colour foreground>>
tiddler-editor-background: <<colour background>>
tiddler-editor-border-image: <<colour foreground>>
tiddler-editor-border: #cccccc
tiddler-editor-fields-even: <<colour background>>
tiddler-editor-fields-odd: <<colour background>>
tiddler-info-background: <<colour background>>
tiddler-info-border: <<colour foreground>>
tiddler-info-tab-background: <<colour background>>
tiddler-link-background: <<colour background>>
tiddler-link-foreground: <<colour primary>>
tiddler-subtitle-foreground: <<colour foreground>>
tiddler-title-foreground: <<colour foreground>>
toolbar-new-button:
toolbar-options-button:
toolbar-save-button:
toolbar-info-button:
toolbar-edit-button:
toolbar-close-button:
toolbar-delete-button:
toolbar-cancel-button:
toolbar-done-button:
untagged-background: <<colour foreground>>
very-muted-foreground: #888888
alert-background: #ffe476
alert-border: #b99e2f
alert-highlight: #881122
alert-muted-foreground: #b99e2f
background: #ffffff
blockquote-bar: <<colour muted-foreground>>
button-background:
button-foreground:
button-border:
code-background: #f7f7f9
code-border: #e1e1e8
code-foreground: #dd1144
dirty-indicator: #ff0000
download-background: #66cccc
download-foreground: <<colour background>>
dragger-background: <<colour foreground>>
dragger-foreground: <<colour background>>
dropdown-background: <<colour background>>
dropdown-border: <<colour muted-foreground>>
dropdown-tab-background-selected: #fff
dropdown-tab-background: #ececec
dropzone-background: rgba(0,200,0,0.7)
external-link-background-hover: inherit
external-link-background-visited: inherit
external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee
foreground: #333333
message-background: #ecf2ff
message-border: #cfd6e6
message-foreground: #547599
modal-backdrop: <<colour foreground>>
modal-background: <<colour background>>
modal-border: #999999
modal-footer-background: #f5f5f5
modal-footer-border: #dddddd
modal-header-border: #eeeeee
muted-foreground: #999999
notification-background: #ffffdd
notification-border: #999999
page-background: #ffffff
pre-background: #f5f5f5
pre-border: #cccccc
primary: #7897f3
select-tag-background:
select-tag-foreground:
sidebar-button-foreground: <<colour foreground>>
sidebar-controls-foreground-hover: #000000
sidebar-controls-foreground: #ccc
sidebar-foreground-shadow: rgba(255,255,255, 0.8)
sidebar-foreground: #acacac
sidebar-muted-foreground-hover: #444444
sidebar-muted-foreground: #c0c0c0
sidebar-tab-background-selected: #ffffff
sidebar-tab-background: <<colour tab-background>>
sidebar-tab-border-selected: <<colour tab-border-selected>>
sidebar-tab-border: <<colour tab-border>>
sidebar-tab-divider: <<colour tab-divider>>
sidebar-tab-foreground-selected:
sidebar-tab-foreground: <<colour tab-foreground>>
sidebar-tiddler-link-foreground-hover: #444444
sidebar-tiddler-link-foreground: #7897f3
site-title-foreground: <<colour tiddler-title-foreground>>
static-alert-foreground: #aaaaaa
tab-background-selected: #ffffff
tab-background: #eeeeee
tab-border-selected: #cccccc
tab-border: #cccccc
tab-divider: #d8d8d8
tab-foreground-selected: <<colour tab-foreground>>
tab-foreground: #666666
table-border: #dddddd
table-footer-background: #a8a8a8
table-header-background: #f0f0f0
tag-background: #ffd9b3
tag-foreground: #000
tiddler-background: <<colour background>>
tiddler-border: #eee
tiddler-controls-foreground-hover: #888888
tiddler-controls-foreground-selected: #444444
tiddler-controls-foreground: #cccccc
tiddler-editor-background: #f8f8f8
tiddler-editor-border-image: #ffffff
tiddler-editor-border: #cccccc
tiddler-editor-fields-even: #e0e8e0
tiddler-editor-fields-odd: #f0f4f0
tiddler-info-background: #f8f8f8
tiddler-info-border: #dddddd
tiddler-info-tab-background: #f8f8f8
tiddler-link-background: <<colour background>>
tiddler-link-foreground: <<colour primary>>
tiddler-subtitle-foreground: #c0c0c0
tiddler-title-foreground: #060400
toolbar-new-button:
toolbar-options-button:
toolbar-save-button:
toolbar-info-button:
toolbar-edit-button:
toolbar-close-button:
toolbar-delete-button:
toolbar-cancel-button:
toolbar-done-button:
untagged-background: #999999
very-muted-foreground: #888888
<div class="tc-adjust-top-of-scroll">
<div class="tc-tab-buttons" >
<$list filter="[list[$:/StoryList]]" history="$:/HistoryList" variable="currentTab">
<$reveal type="match" state="$:/HistoryList!!current-tiddler" text=<<currentTab>>>
<div style="display:inline-block;">
<$button to=<<currentTab>> class="tc-tab-selected" style="margin-right: 0.0em; border-right: 0.0em">
<$macrocall $name="currentTab" $type="text/plain" $output="text/plain"/>
</$button>
<$button message="tm-close-tiddler" param=<<currentTab>> class="tc-tab-selected" style="border-left: 0.0em;">×</$button></div></$reveal>
<$reveal type="nomatch" state="$:/HistoryList!!current-tiddler" text=<<currentTab>>>
<div style="display:inline-block;">
<$button to=<<currentTab>> style="margin-right: 0.0em;" >
<$macrocall $name="currentTab" $type="text/plain" $output="text/plain"/>
</$button><$button message="tm-close-tiddler" param=<<currentTab>>>
×</$button></div></$reveal>
</$list>
</div>
</div>
<script src="//cdn.ckeditor.com/4.10.0/standard/ckeditor.js"></script>
{
"tiddlers": {
"$:/plugins/Abe/maarfapad/account.js": {
"created": "20171020134147072",
"text": "/*\\\ncreated: 20171020134147072\ntype: application/javascript\ntitle: $:/plugins/Abe/maarfapad/account.js\ntags: \nmodified: 20171020140915737\nmodule-type: macro\n\n<<mpad-account>>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"mpad-account\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n var _origin = location.origin;\n var html = '<a href=\"' + _origin + '/account\">My Account</a>\\n<p></p><a href=\"' + _origin + '/login\">Log out</a><p></p><details><summary><b>Delete account</b></summary><p>Are you sure you want to delete your account? <a href=\"' + _origin + '/delete_account\">Yes!</a></p></details>';\n\treturn html;\n};\n\n})();",
"type": "application/javascript",
"title": "$:/plugins/Abe/maarfapad/account.js",
"tags": "",
"module-type": "macro",
"modified": "20180814181418323"
},
"$:/plugins/Abe/maarfapad/controls": {
"created": "20170830122453833",
"caption": "Maarfapad Saver",
"modified": "20180825235012246",
"title": "$:/plugins/Abe/maarfapad/controls",
"type": "text/vnd.tiddlywiki",
"text": "!!''Maarfapad Saver Settings''\n\n{{$:/plugins/Abe/maarfapad/ToggleSaver}}",
"tags": "$:/tags/ControlPanel/Saving"
},
"$:/plugins/Abe/maarfapad/create-wiki": {
"created": "20170902091622518",
"text": "<div>\n<strong>Create a new notebook:</strong>\n</div>\n<br>\n<$edit-text tag='input' tiddler='$:/state/maarfapad/wiki-name' placeholder='Name your notebook' />\n\n<p>\n\nNotebook Edition: <$select tiddler='$:/state/maarfapad/wiki-type' default='empty'>\n<$list filter='[tag[$:/mpad/edition]each[edition]sort[edition]]'>\n<optgroup label={{!!edition}}>\n<$list filter='[tag[$:/mpad/edition]edition{!!edition}] +[sort[version]]'>\n<option value={{!!value}}>{{!!version}}</option>\n</$list>\n</optgroup>\n</$list>\n</$select>\n\n<p>\n\n<$button message='tm-notify' param='$:/plugins/Abe/maarfapad/create-working-notify'>\n<$action-sendmessage $message='create-wiki' />\nCreate Notebook\n</$button>\n\n🎁 <<mpad-route \"Explore a galaxy of community-made apps, themes and plugins for your notebook.\" \"/explore\">> Then join in the fun and make something! 🎉\n<$create />\n\n\n",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/Abe/maarfapad/create-wiki",
"tags": "",
"modified": "20180904145632503",
"caption": "Create Notebook"
},
"$:/plugins/Abe/maarfapad/create.js": {
"created": "20170902121035383",
"text": "/*\\\ncreated: 20170902121035383\ntype: application/javascript\ntitle: $:/plugins/Abe/maarfapad/create.js\ntags: \nmodified: 20170927122657412\nmodule-type: widget\n\nWidget for handling creation of a new notebook in Maarfapad's servers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CreateWidget = function(parseTreeNode,options) {\n this.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCreateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCreateWidget.prototype.render = function(parent,nextSibling) {\n var _origin = window.location.origin\n var self = this;\n // execute state\n this.execute();\n // Compute attributes\n this.computeAttributes();\n // start creation of wiki\n $tw.rootWidget.addEventListener(\"create-wiki\",function(){\n var wikiName = $tw.wiki.getTiddlerText(\"$:/state/maarfapad/wiki-name\",null);\n var wikiType = $tw.wiki.getTiddlerText(\"$:/state/maarfapad/wiki-type\",null) || \"empty\";\n // check if the input fields are not null\n if(wikiName.length > 0){\n // request latest revision\n $tw.utils.httpRequest({\n url: _origin + \"/user\",\n type: \"GET\",\n callback: function(err,data){\n if(!err){\n var doc = JSON.parse(data);\n self.revision = doc._rev;\n //check if wiki already exists\n for(var key in doc._attachments){\n if(key === wikiName){\n var sameName = true;\n break;\n }\n }\n if(sameName !== true){\n // insert copy of wikiType\n $tw.utils.httpRequest({\n url: _origin + \"/\" + wikiType + \"/\" + wikiName + \"/\" + self.revision,\n type: \"GET\",\n callback: function(err,data,xhr){\n if (err) {\n return $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/create-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Failed to create your notebook. \\n\\n Error: \" + err\n }));\n }\n if(xhr.status === 200){\n self.dispatchEvent({\n type: \"tm-notify\",\n param: \"$:/plugins/Abe/maarfapad/created-notify\"\n });\n $tw.wiki.setText(\"$:/state/maarfapad/wiki-name\",\"text\",null,\"\",null);\n } else if(xhr.status === 204){\n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/create-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Sorry. You are currently limited to two notebooks per account.\"\n }));\n }\n }\n });\n }else{\n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/create-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Operation stopped: A notebook with this name already exists. Try another name.\"\n }));\n }\n }else{\n switch(err) {\n case \"XMLHttpRequest error code: 401\":\n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/create-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Your session has expired. Please back up your notebook and log in again.\"\n }));\n break;\n default:\n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/create-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Failed to create your notebook. \\n\\n Error: \" + err\n }));\n }\n }\n }\n });\n } else alert(\"Please name your Notebook & select the type\");\n });\n}\n\n/*\nCompute the internal state of the widget\n*/\nCreateWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCreateWidget.prototype.refresh = function(changedTiddlers) {\n return false;\n};\n\nexports.create = CreateWidget;\n\n})();",
"type": "application/javascript",
"title": "$:/plugins/Abe/maarfapad/create.js",
"tags": "",
"module-type": "widget",
"modified": "20180828192237754"
},
"$:/plugins/Abe/maarfapad/created-notify": {
"created": "20170903141945795",
"modified": "20180828192700271",
"tags": "",
"title": "$:/plugins/Abe/maarfapad/created-notify",
"type": "text/vnd.tiddlywiki",
"text": "''Created notebook. Access it under //Maarfapad >> My Notebooks >> Manage notebooks// tab''"
},
"$:/plugins/Abe/maarfapad/delete-notify": {
"created": "20170905163730150",
"modified": "20180828192731395",
"tags": "",
"title": "$:/plugins/Abe/maarfapad/delete-notify",
"type": "text/vnd.tiddlywiki",
"text": "''Notebook deleted''"
},
"$:/plugins/Abe/maarfapad/history": {
"created": "20140902083720188",
"text": "* ''0.0.1 alpha'' -- First release of Maarfapad plugin.\n* ''0.5.15'' -- Second release of Maarfapad plugin\n* ''{{$:/plugins/Abe/maarfapad!!version}}'' -- Latest\n\n",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/Abe/maarfapad/history",
"modified": "20180908210833510"
},
"$:/plugins/Abe/maarfapad/license": {
"created": "20140902084022063",
"modified": "20180113102219661",
"title": "$:/plugins/Abe/maarfapad/license",
"type": "text/vnd.tiddlywiki",
"text": "The //Maarfapad// plugin is covered by the following licenses:\n\nMIT License\n\nCopyright (c) 2018 Abraham B. Samma\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
},
"$:/plugins/Abe/maarfapad/manage-wikis": {
"created": "20170902091808306",
"caption": "Manage notebook",
"modified": "20180828193153314",
"tags": "",
"title": "$:/plugins/Abe/maarfapad/manage-wikis",
"type": "text/vnd.tiddlywiki",
"text": "<span style=\"color:black\">Here are your notebooks:</span>\n<$wikimanager />"
},
"$:/plugins/Abe/maarfapad/my-account": {
"created": "20170927122800517",
"caption": "My Account",
"modified": "20180908224545420",
"tags": "",
"title": "$:/plugins/Abe/maarfapad/my-account",
"type": "text/vnd.tiddlywiki",
"text": "<<mpad-account>>\n\n,,[[Check for Maarfapad Plugin updates|https://abesamma.github.io/maarfapad-blog/index.html]],,"
},
"$:/plugins/Abe/maarfapad/my-wikis": {
"created": "20170830152515844",
"caption": "My Notebooks",
"modified": "20180828194733619",
"tags": "",
"title": "$:/plugins/Abe/maarfapad/my-wikis",
"type": "text/vnd.tiddlywiki",
"text": "<<tabs \"$:/plugins/Abe/maarfapad/manage-wikis $:/plugins/Abe/maarfapad/upload\" \"$:/plugins/Abe/maarfapad/manage-wikis\">>\n"
},
"$:/plugins/Abe/maarfapad/readme": {
"created": "20140902083641711",
"modified": "20180902123206878",
"title": "$:/plugins/Abe/maarfapad/readme",
"type": "text/vnd.tiddlywiki",
"text": "//Maarfapad// represents a certain way of using the [[TW5|https://tiddlywiki.com]] notebook. It uses it as a UI for a dedicated remote cloud service to easily manage multiple, private notebooks for different uses (seperation of thoughts). It is essentially a dedicated, personal archive for your thoughts, code and other knowledge artifacts.\n\nThis plugin allows this notebook to talk to the //Maarfapad.com// backend that manages and hosts notebooks.\n\n__What can it do?__\n\n* //Maarfapad// makes sure this hosted notebook is available to all connected devices at all times via a secure HTTPS connection. \n* It can work online as well as offline and allows the service to work as a [[progressive web app|https://en.wikipedia.org/wiki/Progressive_Web_Apps]].\n* Makes the notebook mobile friendly\n* //Maarfapad// ~~makes~~ //tries// to make sure you do not overwrite your thoughts from another device. It also notifies you of any updates made to the notebook from any device in real time while connected.\n\n__Note for Developers__\nAll Maarfapad related features automatically kick in when the notebook is served under the maarfapad domain, or at port `8000` or `3000` of the `localhost`. Otherwise, some of the features (specifically [[changeListener.js|$:/plugins/Abe/maarfapad/changeListener.js]] and the ability to automatically make Maarfapad Saver the default saver after booting) remain dormant.\n\n\nFYI //Maarfapad// is derived from the Arabic and Swahili word for Knowledge (\"Maarifa\" in Swahili & \"Maar'fah\" in Arabic)."
},
"$:/plugins/Abe/maarfapad/saver.js": {
"created": "20170722203934038",
"text": "/*\\\ncreated: 20170722203934038\ntype: application/javascript\ntitle: $:/plugins/Abe/maarfapad/saver.js\ntags: \nmodified: 20170927122619426\nmodule-type: saver\n\\*/\n(function () {\n \n var Saver = function(wiki){\n };\n \n Saver.prototype.save = function(text,method,callback){\n function overWriteCheck () {\n // returns true to allow save to proceed\n if (!sessionStorage) return true;\n var clientWikiName = location.pathname.replace(\"/wiki/\",\"\");\n if (sessionStorage.getItem(clientWikiName) === 'outdated') {\n var confirmOverwrite = confirm('Are you sure you want to overwrite your notebook with older data?');\n return confirmOverwrite;\n }\n return true;\n };\n var _origin = location.origin;\n var toggleSaverJSON = $tw.wiki.extractTiddlerDataItem(\"$:/state/maarfapad/ToggleSaverState\",\"toggleSaver\");\n var toggleSaver = JSON.parse(toggleSaverJSON);\n if(toggleSaver === true){\n // notify begining of save\n $tw.rootWidget.dispatchEvent({\n type: \"tm-notify\",\n param: \"$:/plugins/Abe/maarfapad/save-working-notify\"\n });\n // update revision\n $tw.utils.httpRequest({\n url: _origin + \"/user\",\n type: \"GET\",\n callback: function(err,data){\n if(!err){\n if (!overWriteCheck()){\n $tw.rootWidget.dispatchEvent({\n type: \"tm-notify\",\n param: \"$:/plugins/Abe/maarfapad/cancelled-action-notify\"\n });\n return;\n }\n new Promise(function (resolve,reject){\n var rev = JSON.parse(data)._rev;\n if (sessionStorage) {\n var wikiName = location.pathname.replace(\"/wiki/\",\"\");\n var revposString = rev.slice(0,rev.indexOf(\"-\"));\n var revposIntUpdate = parseInt(revposString) + 1;\n sessionStorage.setItem(wikiName,revposIntUpdate.toString());\n resolve(rev);\n } else resolve(rev);\n }).then(function (rev){\n return $tw.utils.httpRequest({\n url: _origin + location.pathname + \"/\" + JSON.parse(data)._rev,\n type: \"PUT\",\n headers: {\"Content-type\": \"text/html\"},\n data: text,\n callback: function(err,data,xhr){\n if(err){\n switch(err) {\n case \"XMLHttpRequest error code: 413\":\n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/failed-save\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"The notebook you're attempting to save exceeded 10mb! Consider creating another notebook or delete some data you do not need anymore and then save again.\"\n }));\n break;\n default: \n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/save-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Failed to save this Wiki. Back up your wiki for later saving by deselecting Maarfapad as your saver. \\n\\n Error: \" + err\n }));\n }\n }\n console.log(\"saved wiki!\");\n callback(null);\n }\n });\n });\n }else{\n switch(err) {\n case \"XMLHttpRequest error code: 401\":\n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/save-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Your session has expired. Please back up your notebook by deselecting Maarfapad as your saver, <a href='http://maarfapad.com' target='_self'>then log in again.</a>\"\n }));\n break;\n default:\n // we assume the notebook or server is offline\n var clientWikiName = location.pathname.replace(\"/wiki/\",\"\");\n sessionStorage.setItem(clientWikiName,\"offline\");\n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/save-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Failed to save this notebook. Back up your wiki for later saving by deselecting Maarfapad as your saver. \\n\\n Error: \" + err\n }));\n }\n }\n }\n });\n }\n return toggleSaver\n };\n\n /*\nInformation about this saver\n*/\nSaver.prototype.info = {\n name: \"Maarfapad saver\",\n priority: 3000,\n capabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n return true\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n return new Saver(wiki);\n};\n})()",
"type": "application/javascript",
"title": "$:/plugins/Abe/maarfapad/saver.js",
"tags": "",
"module-type": "saver",
"modified": "20180908210330434"
},
"$:/plugins/Abe/maarfapad/upload.js": {
"created": "20170828182221462",
"text": "/*\\\ncreated: 20170828182221462\ntype: application/javascript\ntitle: $:/plugins/Abe/maarfapad/upload.js\ntags: \nmodified: 20170927122453045\nmodule-type: widget\n\nUpload widget for uploading files to Maarfapad\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar UploadWidget = function(parseTreeNode,options) {\n this.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nUploadWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nUploadWidget.prototype.render = function(parent,nextSibling) {\n var _origin = window.location.origin;\n var self = this;\n // Remember parent\n this.parentDomNode = parent;\n // Compute attributes and execute state\n this.computeAttributes();\n this.execute();\n // Create element\n var domNode = this.document.createElement(\"input\");\n domNode.setAttribute(\"type\",\"file\");\n // Nw.js supports \"nwsaveas\" to force a \"save as\" dialogue that allows a new or existing file to be selected\n if(this.nwsaveas) {\n domNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n }\n // Nw.js supports \"webkitdirectory\" to allow a directory to be selected\n if(this.webkitdirectory) {\n domNode.setAttribute(\"webkitdirectory\",this.webkitdirectory);\n }\n // Add a click event handler\n domNode.addEventListener(\"change\",function (event) {\n if(event.target.files){\n var fileType = event.target.files[0].type;\n var fileNameExt = event.target.files[0].name;\n var fileName = fileNameExt.substr(0,fileNameExt.indexOf('.html'));\n var url = window.location.href;\n var urlFileNameMatch = url.match(fileName);\n var fileTypeMatch = fileType.match(\"text/html\");\n if (Array.isArray(fileTypeMatch) && fileTypeMatch.length === 1) {\n if (Array.isArray(urlFileNameMatch) && urlFileNameMatch.length === 1) {\n $tw.utils.httpRequest({\n url: _origin + \"/user\",\n type: \"GET\",\n callback: function(err,data,xhr){\n var reader = new FileReader();\n if(!err){\n reader.onload = function(event){\n self.dispatchEvent({\n type: \"tm-notify\",\n param: \"$:/plugins/Abe/maarfapad/create-working-notify\"\n });\n $tw.utils.httpRequest({\n url: _origin + \"/wiki/\" + fileName + \"/\" + JSON.parse(data)._rev,\n type: \"PUT\",\n headers: {\n \"Content-type\": \"text/html\"},\n data: event.target.result,\n callback: function(err,data,xhr){\n if(!err){\n self.dispatchEvent({\n type: \"tm-notify\",\n param: \"$:/plugins/Abe/maarfapad/uploaded-notify\"\n });\n }else{\n switch(err) {\n case \"XMLHttpRequest error code: 413\":\n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/upload-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"The notebook you are attempting to save is too large! Consider opening another notebook or delete some data you do not need anymore and then save again.\"\n }));\n break;\n default:\n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/upload-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Failed to upload because of error. \\n\\n Error: \" + err\n }));\n }\n }\n }\n });\n };\n reader.readAsText(event.target.files[0]);\n }else{\n switch(err) {\n case \"XMLHttpRequest error code: 401\":\n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/upload-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Your current session has expired. Back up your notebook and login again.\"\n }));\n break;\n default: \n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/upload-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Failed to upload because of error. \\n\\n Error: \" + err\n }));\n }\n }\n }\n });\n } else {\n return $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/upload-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"The filename does not match the notebook's name\"\n }));\n }\n } else {\n return $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/upload-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Please upload a HTML file only.\"\n }));\n }\n }\n },false);\n // Insert element\n parent.insertBefore(domNode,nextSibling);\n this.renderChildren(domNode,null);\n this.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nUploadWidget.prototype.execute = function() {\n this.nwsaveas = this.getAttribute(\"nwsaveas\");\n this.webkitdirectory = this.getAttribute(\"webkitdirectory\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nUploadWidget.prototype.refresh = function(changedTiddlers) {\n return false;\n};\n\nexports.upload = UploadWidget;\n\n})();",
"type": "application/javascript",
"title": "$:/plugins/Abe/maarfapad/upload.js",
"tags": "",
"module-type": "widget",
"modified": "20180828194303009"
},
"$:/plugins/Abe/maarfapad/upload": {
"created": "20170829175946851",
"modified": "20180828193046243",
"tags": "",
"title": "$:/plugins/Abe/maarfapad/upload",
"type": "text/vnd.tiddlywiki",
"text": "!!!Upload your backup copy of this notebook to Maarfapad. ''Be sure to maintain the original name of your notebook'':\n\n<$upload />\n\nRefresh the page after upload is complete to display the uploaded notebook.",
"caption": "Upload Notebook"
},
"$:/plugins/Abe/maarfapad/uploaded-notify": {
"created": "20170828200059379",
"modified": "20180828193556352",
"tags": "",
"title": "$:/plugins/Abe/maarfapad/uploaded-notify",
"type": "text/vnd.tiddlywiki",
"text": "''Notebook uploaded. Refresh the page to view''"
},
"$:/plugins/Abe/maarfapad/wikiManager.js": {
"created": "20170903163200504",
"text": "/*\\\ncreated: 20170903163200504\ntype: application/javascript\ntitle: $:/plugins/Abe/maarfapad/wikiManager.js\ntags: \nmodified: 20171009212525559\nmodule-type: widget\n\nReturns a list of all wikis hosted on Maarfapad\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar wikiManagerWidget = function(parseTreeNode,options) {\n this.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nwikiManagerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nwikiManagerWidget.prototype.render = function(parent,nextSibling) {\n var _origin = location.origin;\n var self = this;\n self.parentDomNode = parent;\n this.computeAttributes();\n this.execute();\n $tw.utils.httpRequest({\n url: _origin + \"/user\",\n type: \"GET\",\n callback: function(err,data){\n if(!err){\n self.doc = JSON.parse(data);\n self.revision = self.doc._rev\n var domNode = self.document.createElement(\"table\");\n for(var key in self.doc._attachments){\n\t\t\t\tvar type = self.doc._attachments[key].content_type;\n\t\t\t if(type === \"text/html\"){\n\t\t\t\t var del = self.document.createTextNode(\"delete\");\n var button = self.document.createElement(\"button\");\n button.appendChild(del);\n (function(key){\n button.addEventListener(\"click\",function(){\n var allow = confirm(\"Are you sure you want to delete \" + key);\n if(allow === true){\n $tw.utils.httpRequest({\n url: _origin + \"/wiki/\" + key + \"/\" + self.revision,\n type: \"DELETE\",\n headers: {\n \"Content-type\":\"text/html\",\n \"If-Match\": self.revision\n },\n callback: function(err,data,xhr){\n if(!err){\n self.dispatchEvent({\n type: \"tm-notify\",\n param: \"$:/plugins/Abe/maarfapad/delete-notify\"\n });\n self.refreshSelf();\n } else {\n return $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/failed-delete\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Failed to delete notebook. \\n\\n Error: \" + err\n }));\n }\n }\n });\n }\n });\n })(key);\n var text = self.document.createTextNode(key);\n var textForHomeWiki = self.document.createTextNode(\"You shall not delete!\");\n var link = self.document.createElement(\"a\");\n link.setAttribute(\"href\",_origin + \"/wiki/\" + key);\n link.setAttribute(\"target\",\"_self\");\n var itemLink = self.document.createElement(\"td\");\n var itemButton = self.document.createElement(\"td\");\n var tableRow = self.document.createElement(\"tr\");\n link.appendChild(text);\n itemLink.appendChild(link);\n tableRow.appendChild(itemLink);\n if(key !== \"home\"){\n itemButton.appendChild(button);\n tableRow.appendChild(itemButton);\n\t\t\t } else {\n itemButton.appendChild(textForHomeWiki);\n tableRow.appendChild(itemButton);\n }\n }\n domNode.appendChild(tableRow);\n }\n parent.insertBefore(domNode,nextSibling);\n self.domNodes.push(domNode);\n }else{\n switch(err) {\n case \"XMLHttpRequest error code: 401\":\n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/fetch-user-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Your session has expired. Please back up your notebook and log in again.\"\n }));\n break;\n default:\n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/maarfapad/fetch-user-failed\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Failed to connect to Maarfapad. \\n\\n Error: \" + err\n }));\n }\n var text = self.document.createTextNode(\"Not connected\");\n var domNode = self.document.createElement(\"div\");\n domNode.appendChild(text);\n parent.insertBefore(domNode,nextSibling);\n self.domNodes.push(domNode);\n }\n }\n });\n};\n\n/*\nCompute the internal state of the widget\n*/\nwikiManagerWidget.prototype.execute = function(){\n};\n \n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nwikiManagerWidget.prototype.refresh = function(changedTiddlers) {\n return true\n};\n\nexports.wikimanager = wikiManagerWidget;\n\n})();",
"type": "application/javascript",
"title": "$:/plugins/Abe/maarfapad/wikiManager.js",
"tags": "",
"module-type": "widget",
"modified": "20180908211128812"
},
"$:/plugins/Abe/maarfapad/start-button": {
"created": "20171117091808966",
"text": "<$button \nmessage=\"tm-modal\" param=\"$:/plugins/Abe/maarfapad/app\"\ntooltip=\"Maarfapad services\" class=<<tv-config-toolbar-class>>>\n{{$:/plugins/Abe/maarfapad/button-image}}\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text=\"Maarfapad services\"/></span>\n</$list>\n</$button>",
"title": "$:/plugins/Abe/maarfapad/start-button",
"tags": "$:/tags/PageControls",
"modified": "20180118175229804",
"description": "Open Maarfapad services",
"caption": "Maarfapad services"
},
"$:/plugins/Abe/maarfapad/navbar.css": {
"created": "20171201160256786",
"text": "/* SIDEBAR BACKGROUND */\ndiv .tc-sidebar-scrollable {\n <$set name=\"sidebarCSS\" filter=\"[title[$:/state/sidebar]field:text[yes]]\" value=\"background: linear-gradient(to right, transparent, white 5%);\" emptyValue=\"\">\n <$text text=<<sidebarCSS>>/>\n </$set>\n}\n/* VERTICAL OFFSET FOR TOP OF SIDEBAR */\ndiv .tc-sidebar-scrollable {\n margin-top: 40px;\n}\n\ndiv .tc-modal {\n margin-top: 40px;\n}\n\ndiv .tc-topbar svg {\n fill: {{$:/state/maarfapad/navbar-icons-color}};\n}\n\ndiv .tc-topbar button:hover svg {\n fill: #d3d3d3;\n}\n\ndiv .tc-story-river {\n margin-top: 10px;\n}\n\n@media screen and (max-width: 700px) {\n\n div .topbar-nav-text {\n display: none;\n }\n div .topbar-nav-tools {\n float: left;\n position: relative;\n left: 30px;\n font-size: 1.35em;\n \n }\n div .topbar-nav-tools button {\n margin-right: 10px;\n padding-top: 1px;\n }\n div .tc-story-river {\n margin-left: 8px;\n margin-right: 8px;\n margin-top: -15px;\n }\n div .tc-tiddler-frame {\n box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.3);\n }\n div .tc-sidebar-scrollable {\n <$set name=\"sidebarCSS\" filter=\"[title[$:/state/sidebar]field:text[yes]]\" value=\"background: white;\" emptyValue=\"\">\n <$text text=<<sidebarCSS>>/>\n </$set>\n}\n}\n\n<$set name=\"navbartoolsCSS\" filter=\"[title[$:/state/sidebar]field:text[yes]]\" value=\".topbar-nav-tools { display: none; }\" emptyValue=\"\"> <$text text=<<navbartoolsCSS>>/> </$set>\n\n.topbar-nav {\n display: block;\n position: fixed;\n top: 0px;\n width: 100%;\n height: 44px;\n background-color: {{$:/state/maarfapad/navbar-color}};\n box-shadow: 0px 1px 5px grey;\n z-index: 500;\n}\n\n.topbar-nav-text {\n float: left;\n color: {{$:/state/maarfapad/navbar-icons-color}};\n font-size: 25px;\n font-family: {{$:/state/maarfapad/navbar-title-font-family}};\n margin-top: 10px;\n margin-left: 42px;\n}\n\n.topbar-nav-tools {\n float: right;\n width: 290px;\n height: 100%;\n position: relative;\n right: 50px;\n padding-top: 8px;\n font-size: 1.5em;\n}\n\n.topbar-nav-tools button {\n margin-right: 20px;\n}\n\n.topbar-nav-tools img {\n width: 1em;\n}\n\n.topbar-nav-tools svg {\n fill: {{$:/state/maarfapad/navbar-icons-color}};\n}\n\n/*Shifts the sticky titles to accomodate Maarfapad's navbar*/\ndiv.tc-tiddler-title {\n top: 45px;\n}",
"title": "$:/plugins/Abe/maarfapad/navbar.css",
"tags": "$:/tags/Stylesheet",
"modified": "20180903192754440"
},
"$:/plugins/Abe/maarfapad/navbar": {
"text": "{{$:/config/maarfapad/ui}}",
"title": "$:/plugins/Abe/maarfapad/navbar",
"tags": "$:/tags/PageTemplate",
"modified": "20180816224831063",
"created": "20171201155855304"
},
"$:/plugins/Abe/maarfapad/notes-list": {
"created": "20171204204012539",
"text": "<$button to=\"$:/Tiddlers\" tooltip=\"View tiddlers\" class=<<tv-config-toolbar-class>>>\n{{$:/core/images/list}}\n</$button>",
"title": "$:/plugins/Abe/maarfapad/notes-list",
"tags": "",
"modified": "20171212203636415"
},
"$:/plugins/Abe/maarfapad/create-working-notify": {
"created": "20171210204309288",
"text": "''Working...''",
"title": "$:/plugins/Abe/maarfapad/create-working-notify",
"tags": "",
"modified": "20171210204332236"
},
"$:/plugins/Abe/maarfapad/save-working-notify": {
"created": "20171210202241479",
"text": "''Saving notebook...''",
"title": "$:/plugins/Abe/maarfapad/save-working-notify",
"tags": "",
"modified": "20180828193304164"
},
"$:/plugins/Abe/maarfapad/save-wiki-button": {
"created": "20171210201727294",
"text": "<$button message=\"tm-save-wiki\" param={{$:/config/SaveWikiButton/Template}} tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span>\n</$list>\n</span>\n</$button>",
"title": "$:/plugins/Abe/maarfapad/save-wiki-button",
"tags": "",
"modified": "20180108230541574"
},
"$:/plugins/Abe/maarfapad/startupSetters.js": {
"created": "20171227222813646",
"text": "// sets up initial configuration of the app\n\n(function () {\n\n /*jslint browser: true */\n /*global $tw: false */\n \"use strict\";\n exports.platforms = [\"browser\"];\n exports.synchronous = true;\n\n\n exports.startup = function(){\n // Opens sidebar on on max-width of 700px\n var mediaQuery = window.matchMedia(\"(max-width: 700px)\");\n if(mediaQuery.matches){\n // closes sidebar on startup\n $tw.wiki.setText(\"$:/state/sidebar\",\"text\",0,\"no\");\n }else{\n // opens sidebar on startup\n $tw.wiki.setText(\"$:/state/sidebar\",\"text\",0,\"yes\")\n }\n \n // fetch TW editions from github\n if (!fetch) return;\n fetch(location.origin + \"/edition_index.json\")\n .then(function (res){\n return res.json();\n }).then(function (json){\n for (var edition in json) {\n for (var version in json[edition]) {\n var options = {\n \"title\": \"$:/state/maarfapad/edition/\" + json[edition][version],\n \"tags\": \"$:/mpad/edition\",\n \"edition\": edition,\n \"version\": version,\n \"value\": json[edition][version]\n };\n $tw.wiki.addTiddler(new $tw.Tiddler(options));\n }\n }\n }).catch(function (){\n return;\n });\n \n if(location.origin.includes('maarfapad.') || location.port.includes('8000') || location.port.includes('3000')){\n \t// sets Maarfapad as the default saver of choice on startup\n \tvar defaultSaverJSON = $tw.wiki.extractTiddlerDataItem('$:/state/maarfapad/makeMaarfapadDefault','maarfapadDefault');\n \tvar defaultSaver = JSON.parse(defaultSaverJSON);\n \tif(defaultSaver){\n \t\tconsole.log(\"Maarfapad saver on.\");\n \t\t$tw.wiki.setTiddlerData('$:/state/maarfapad/ToggleSaverState',{'toggleSaver':'true'});\n \t}\n } else {\n \t$tw.wiki.setTiddlerData('$:/state/maarfapad/ToggleSaverState',{'toggleSaver':'false'});\n }\n return;\n }\n})();",
"title": "$:/plugins/Abe/maarfapad/startupSetters.js",
"tags": "",
"modified": "20180830180155781",
"type": "application/javascript",
"module-type": "startup"
},
"$:/plugins/Abe/maarfapad/serviceWorkerHandler.js": {
"created": "20171218181901181",
"text": "var clientWikiName = location.pathname.replace(\"/wiki/\",\"\");\nif ('serviceWorker' in navigator) {\n //receive broadcasts\n navigator.serviceWorker.addEventListener('message',function (e){\n if (e.data.type !== \"offline-message\" && e.data.type !== \"mpad-sw\") return;\n if (sessionStorage) {\n sessionStorage.setItem(clientWikiName,\"offline\");\n }\n $tw.wiki.addTiddler(new $tw.Tiddler({\n \"title\": \"$:/state/MaarfapadOffline\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": e.data.message\n }));\n });\n} else {\n console.log(\"Service workers not supported.\")\n}\n",
"title": "$:/plugins/Abe/maarfapad/serviceWorkerHandler.js",
"tags": "",
"modified": "20180831233632366",
"type": "application/javascript",
"module-type": "startup"
},
"$:/favicon.ico": {
"created": "20180304204547319",
"title": "$:/favicon.ico",
"type": "image/x-icon",
"text": "AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAAIAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/2dnZ/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/3R0dP8AAAD/AAAA/wAAAP8AAAD/AAAA/wQEBP/Q0ND/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/f39//AAAA/wAAAP8AAAD/AAAA/wAAAP8EBAT/0NDQ/wEBAf8oKCj/GBgY/wEBAf8UFBT/AAAA/wAAAP8AAAD/39/f/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAQE/+Tk5P/Nzc3/tLS0/8jIyP+2trb/qqqq/wAAAP8AAAD/AAAA/9/f3/8AAAD/AAAA/wAAAP8AAAD/AAAA/wQEBP/+/v7/PT09/wAAAP8AAAD/lJSU/6ysrP8AAAD/AAAA/wAAAP/f39//AAAA/wAAAP8AAAD/AAAA/wAAAP8EBAT/3Nzc/wAAAP8AAAD/AAAA/zMzM/+srKz/AAAA/wAAAP8AAAD/39/f/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAQE/9DQ0P8AAAD/AAAA/wAAAP8oKCj/rKys/wAAAP8AAAD/AAAA/9/f3/8AAAD/AAAA/wAAAP8AAAD/AAAA/wQEBP/Q0ND/AAAA/wAAAP8AAAD/KCgo/6ysrP8AAAD/AAAA/wAAAP/f39//AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/cnJy/wAAAP8AAAD/AAAA/xAQEP9jY2P/AAAA/wAAAP8AAAD/39/f/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/9/f3/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/f39//AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/3Nzc/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/yIiIv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xoaGv8FBQX/AAAA/wAAAP8AAAD/AAAA/wAA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AP9RUVH//////1paWv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/V1dX/6enp/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CQkJ//////+hoaH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/1FRUf//////Wlpa/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/9XV1f/p6en/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8EBAT/8vLy/5iYmP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/QUFB//////9OTk7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/1dXV/+np6f8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8vLy//EBAQ/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/PDw8/wMDA/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/V1dX/6enp/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/9XV1f/p6en/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/1dXV/+np6f8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/V1dX/6enp/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/9XV1f/p6en/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/1dXV/+np6f8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP/Nzc3/5eXl/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/z09Pf9KSkr/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/CAgI/w4ODv8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BwcH/xoaGv8ICAj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/c3Nz/5iYmP8nJyf/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/T09P/7Ozs/9sbGz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8HBwf/8PDw//39/f9oaGj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ra2t///////V1dX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ODg7///////////9ycnL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA//7+/v/e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ODg7//v7+//////9ycnL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA///////e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ODg7///////7+/v9ycnL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA///////e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ODg7///////////9ycnL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA//7+/v/e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ODg7//v7+//////9ycnL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA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AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ODg7///////7+/v99fX3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9+fn7//////9nZ2f8tLS3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA///////e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ODg7//v7+//////9ycnL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP96enr//////9nZ2f8tLS3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA///////e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ODg7///////////9ycnL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP96enr//v7+/9nZ2f8tLS3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA///////e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ODg7///////////9ycnL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP96enr//////9nZ2f8tLS3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA//7+/v/e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ODg7//v7+//////9ycnL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP96enr//////9nZ2f8tLS3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA///////e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ODg7///////////9ycnL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP96enr//v7+/9nZ2f8tLS3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA///////e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ODg7///////////9ycnL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP96enr//////9nZ2f8tLS3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA//7+/v/e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8JCQn/9fX1//7+/v9sbGz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9ubm7//////9PT0/8qKir/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA///////e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/jo6O/7S0tP80NDT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8nJyf/urq6/4ODg/8SEhL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA///////e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ERER/xoaGv8EBAT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/HR0d/xAQEP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA//7+/v/e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA///////e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA///////e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA//7+/v/e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA//7+/v/e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA///////e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA//7+/v/e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA//7+/v/e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/wMDA///////e3t7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/rq6u//7+/v/V1dX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Ozs7/6Ojo/9SUlL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAAAAAAQgAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/w0NDf9bW1v/FRUV/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wQEBP9nZ2f/aWlp/woKCv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+0tLT///////Hx8f8SEhL/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9YWFj///////////+goKD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8ODg7//v7+////////////RERE/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/pqam////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ExMT/////////////////0RERP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMTE/////////////////9ERET/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+rq6v////////////U1NT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TExP/////////////////RERE/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/q6ur////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ExMT/////////////////0RERP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMTE/////////////////9ERET/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+rq6v////////////U1NT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TExP/////////////////RERE/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/q6ur////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ExMT/////////////////0RERP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMTE/////////////////9ERET/AAAA/wAAAP8AAAD/GRkZ/2hoaP+enp7/u7u7/8XFxf+urq7/j4+P/0pKSv8HBwf/AAAA/wAAAP8AAAD/EhIS/46Ojv+YmJj/Gxsb/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+rq6v////////////U1NT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TExP/////////////////RERE/wAAAP8jIyP/qKio//7+/v//////////////////////////////////////7e3t/3R0dP8HBwf/AAAA/4CAgP///////////5qamv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/q6ur////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ExMT/////////////////0RERP9ra2v/+fn5////////////////////////////////////////////////////////////2NjY/ysrK/+jo6P///////////+0tLT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMTE//////////////////Nzc3///////////////////////39/f/b29v/sbGx/5qamv+5ubn/4ODg///////////////////////09PT/29vb////////////tLS0/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+rq6v////////////U1NT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TExP//////////////////////////////////////7Ozs/8qKir/AAAA/wAAAP8AAAD/AAAA/wAAAP9HR0f/wsLC/////////////////////////////////7S0tP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/q6ur////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ExMT////////////////////////////8fHx/01NTf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAf+UlJT///////////////////////////+0tLT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMTE///////////////////////9fX1/ywsLP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/5OTk///////////////////////tLS0/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+rq6v////////////U1NT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TExP//////////////////////3p6ev8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8JCQn/3Nzc/////////////////7S0tP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/q6ur////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ExMT//////////////////T09P8HBwf/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/0hISP////////////////+0tLT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMTE/////////////////+zs7P/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8HBwf//f39////////////tLS0/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+rq6v////////////U1NT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TExP/////////////////dnZ2/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/97e3v///////////7S0tP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/q6ur////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ExMT/////////////////2BgYP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+3t7f///////////+0tLT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMTE/////////////////9OTk7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/o6Oj////////////tLS0/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+rq6v////////////U1NT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TExP/////////////////RERE/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6Ojo////////////7S0tP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/q6ur////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ExMT/////////////////0RERP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+jo6P///////////+0tLT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMTE/////////////////9ERET/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/o6Oj////////////tLS0/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+rq6v////////////U1NT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TExP/////////////////RERE/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6Ojo////////////7S0tP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/q6ur////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ExMT/////////////////0RERP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+jo6P///////////+0tLT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xMTE/////////////////9ERET/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/o6Oj////////////tLS0/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+rq6v////////////U1NT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8TExP/////////////////RERE/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6Ojo////////////7S0tP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/q6ur////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/ExMT/////////////////0RERP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+jo6P///////////+0tLT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/xAQEP////////////////9ERET/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/o6Oj////////////tLS0/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+rq6v////////////U1NT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/y8vL///////9/f3/IiIi/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/2RkZP///////////4aGhv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/q6ur////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ysrK/+RkZH/Q0ND/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8GBgb/dnZ2/3p6ev8NDQ3/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+rq6v////////////U1NT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/q6ur////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+rq6v////////////U1NT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/q6ur////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+rq6v////////////U1NT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/q6ur////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+rq6v////////////U1NT/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/q6ur////////////1NTU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/6urq////////////9TU1P8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP+Li4v////////////Dw8P/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/IyMj/9TU1P/g4OD/SEhI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"modified": "20180304204605680"
},
"$:/plugins/Abe/maarfapad/icon": {
"created": "20170829185805899",
"modified": "20180219114026782",
"title": "$:/plugins/Abe/maarfapad/icon",
"text": "{{$:/plugins/Abe/maarfapad/button-image}}"
},
"$:/plugins/Abe/maarfapad/button-image": {
"created": "20180211103745791",
"title": "$:/plugins/Abe/maarfapad/button-image",
"text": "<svg\n xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:cc=\"http://creativecommons.org/ns#\"\n xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n xmlns:svg=\"http://www.w3.org/2000/svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n version=\"1.1\"\n id=\"svg2\"\n class=\"maarfapad-button\"\n viewBox=\"0 0 601 600.99999\"\n height=\"20pt\"\n width=\"20pt\">\n <defs\n id=\"defs4\" />\n <metadata\n id=\"metadata7\">\n <rdf:RDF>\n <cc:Work\n rdf:about=\"\">\n <dc:format>image/svg+xml</dc:format>\n <dc:type\n rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" />\n <dc:title></dc:title>\n </cc:Work>\n </rdf:RDF>\n </metadata>\n <g\n transform=\"translate(-50.928571,-237.57649)\"\n fill-rule=\"evenodd\"\n id=\"layer1\">\n <path\n id=\"path3336\"\n d=\"m 51.428571,238.07649 599.999999,0 0,600 -599.999999,0 z\"\n style=\"fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\" />\n <path\n id=\"path3338\"\n d=\"m 108.57143,300.93363 485.71428,0 0,485.71429 -485.71428,0 z\"\n style=\"fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\" />\n <text\n transform=\"scale(1.0211122,0.97932431)\"\n id=\"text3340\"\n y=\"660.97339\"\n x=\"177.1178\"\n style=\"font-style:normal;font-weight:normal;font-size:77.91242981px;line-height:150%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\"\n xml:space=\"preserve\"><tspan\n style=\"font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:417.38803101px;line-height:150%;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start\"\n y=\"660.97339\"\n x=\"177.1178\"\n id=\"tspan3342\">μ|</tspan></text>\n </g>\n</svg>\n",
"modified": "20180211111251701"
},
"$:/plugins/Abe/maarfapad/app": {
"created": "20170830152108651",
"text": "<<tabs \"$:/plugins/Abe/maarfapad/controls $:/plugins/Abe/maarfapad/my-wikis $:/plugins/Abe/maarfapad/create-wiki $:/plugins/Abe/maarfapad/my-account\" \"$:/plugins/Abe/maarfapad/controls\" \"$:/state/maarfapad/app-tab\" \"tc-vertical\">>",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/Abe/maarfapad/app",
"subtitle": "{{$:/plugins/Abe/maarfapad/icon}} Maarfapad services",
"modified": "20180807213018275"
},
"$:/plugins/Abe/maarfapad/error-form.css": {
"created": "20180426165105520",
"title": "$:/plugins/Abe/maarfapad/error-form.css",
"type": "text/css",
"modified": "20180902123027185",
"tags": "$:/tags/Stylesheet",
"text": "/* Corrections for the appearance of the Error form\n * and error prompt message in desktop and \n * mobile devices\n */\n@media screen and (max-width: 700px) {\n form.tc-error-form {\n width: 100%;\n height: 80vh;\n margin: auto;\n overflow-y: auto;\n }\n}\nform.tc-error-form {\n margin-top: -1em;\n}\nform.tc-error-form div.tc-error-prompt + div {\n height: 30vh;\n overflow-y: auto;\n}"
},
"$:/plugins/Abe/maarfapad/comfortaa_font": {
"created": "20180505100659460",
"text": "<link href=\"//fonts.googleapis.com/css?family=Comfortaa:300&subset=latin-ext\" rel=\"stylesheet\">",
"title": "$:/plugins/Abe/maarfapad/comfortaa_font",
"tags": "$:/tags/RawMarkup",
"modified": "20180505101252514"
},
"$:/state/maarfapad/makeMaarfapadDefault": {
"text": "{\n \"maarfapadDefault\": \"true\"\n}",
"type": "application/json",
"title": "$:/state/maarfapad/makeMaarfapadDefault",
"tags": "",
"modified": "20180904164649060",
"created": "20171228143520892"
},
"$:/state/maarfapad/wiki-name": {
"text": "",
"type": "text/vnd.tiddlywiki",
"title": "$:/state/maarfapad/wiki-name",
"tags": "",
"modified": "20180816210343626",
"created": "20170902110815084"
},
"$:/plugins/Abe/maarfapad-ui": {
"created": "20180707140204246",
"text": "<<tabs \"$:/plugins/Abe/maarfapad/navbar-simple-settings $:/plugins/Abe/maarfapad/navbar-code\" \"$:/plugins/Abe/maarfapad/navbar-simple-settings\" \"$:/state/maarfapad-ui-settings\" \"tc-vertical\">>",
"title": "$:/plugins/Abe/maarfapad-ui",
"tags": "$:/tags/ControlPanel/Appearance",
"modified": "20180807184823782",
"caption": "Maarfapad UI settings"
},
"$:/config/maarfapad/ui": {
"created": "20180707133743579",
"text": "<div class=\"topbar-nav\">\n<!--Modify text in navbar-->\n<div class=\"topbar-nav-text\">\n{{$:/SiteTitle}}\n</div>\n\n<!--Add or remove tools in navbar-->\n<div class=\"topbar-nav-tools\">\n{{$:/core/ui/Buttons/new-tiddler}}\n{{$:/plugins/Abe/maarfapad/notes-list}}\n{{$:/plugins/Abe/maarfapad/search-btn}}\n{{$:/core/ui/Buttons/close-all}}\n{{$:/plugins/Abe/maarfapad/save-wiki-button}}\n{{$:/plugins/Abe/maarfapad/start-button}}\n</div>\n\n</div>",
"title": "$:/config/maarfapad/ui",
"tags": "",
"modified": "20180807214918730"
},
"$:/plugins/Abe/maarfapad/dropdown.css": {
"created": "20180624201237335",
"text": "/* Prevents dropdown menu from appearing outside viewport\n * in mobile devices\n */\n\n@media screen and (max-width: 490px) {\n div[class=tc-drop-down] {\n position: relative;\n left: 60vw;\n min-width: 200px;\n }\n}",
"type": "text/css",
"title": "$:/plugins/Abe/maarfapad/dropdown.css",
"tags": "$:/tags/Stylesheet",
"modified": "20180715010343247"
},
"$:/plugins/Abe/maarfapad/search-btn": {
"created": "20180707153234896",
"text": "<$button to=\"$:/Search\" tooltip=\"Search\" class=<<tv-config-toolbar-class>>>\n{{$:/core/images/advanced-search-button}}\n</$button>",
"title": "$:/plugins/Abe/maarfapad/search-btn",
"tags": "",
"modified": "20180707153448679"
},
"$:/Tiddlers": {
"text": "<<tabs \"$:/core/ui/SideBar/Open Content $:/core/ui/MoreSideBar/Recent $:/core/ui/MoreSideBar/Drafts\" \"Content\" \"\" \"tc-horizontal\">>",
"title": "$:/Tiddlers",
"tags": "",
"icon": "$:/core/images/list",
"color": "#bbbbbb"
},
"$:/Search": {
"text": "{{$:/AdvancedSearch}}",
"title": "$:/Search",
"tags": "",
"icon": "$:/core/images/advanced-search-button",
"color": "#bbbbbb"
},
"$:/plugins/Abe/maarfapad/ToggleSaver": {
"created": "20170826162903049",
"modified": "20180828194903315",
"tags": "",
"title": "$:/plugins/Abe/maarfapad/ToggleSaver",
"type": "text/vnd.tiddlywiki",
"text": "!!!Save this notebook through:\n\n<$tiddler tiddler=\"$:/state/maarfapad/ToggleSaverState\">\n<$radio index=\"toggleSaver\" value=\"true\"> Maarfapad</$radio>\n<p/>\n<$radio index=\"toggleSaver\" value=\"false\"> Others* </$radio>\n</$tiddler>\n\n-----\n<$checkbox tiddler=\"$:/state/maarfapad/makeMaarfapadDefault\" index=\"maarfapadDefault\" checked=\"true\" unchecked=\"false\" default=\"false\"> Make Maarfapad the default saver on every startup^^†^^ </$checkbox>\n\n!!!!! <$text text=\"* this will allow the notebook to choose whatever means available to save your notebook to your local machine. This usually defaults to browser download saver.\" />\n\n!!!!! <$text text=\"† this should only work if the notebook is hosted under the domain maarfapad.com\" />"
},
"$:/plugins/Abe/maarfapad/navbar-code": {
"created": "20180807184841621",
"text": "''You can modify Maarfapad's navigation bar's HTML & wikiText code directly. Add or remove tool icons, or change CSS classes.''\n\n<$edit class=\"tc-edit-texteditor\" tiddler=\"$:/config/maarfapad/ui\" />",
"title": "$:/plugins/Abe/maarfapad/navbar-code",
"tags": "",
"modified": "20180807185936672",
"caption": "Advanced settings"
},
"$:/plugins/Abe/maarfapad/navbar-simple-settings": {
"created": "20180807185327573",
"text": "\\define rm-navbar-css()\n<$action-setfield $tiddler=\"$:/plugins/Abe/maarfapad/navbar.css\" tags=\"\" />\n\\end\n\n\\define add-navbar-css()\n<$action-setfield $tiddler=\"$:/plugins/Abe/maarfapad/navbar.css\" tags=\"$:/tags/Stylesheet\" />\n\\end\n\n<$fieldmangler tiddler=\"$:/plugins/Abe/maarfapad/navbar\">\n<$button message=\"tm-remove-tag\" param=\"$:/tags/PageTemplate\" actions=<<rm-navbar-css>>>\nRemove Navigation bar\n\n</$button>\n<p></p>\n<$button message=\"tm-add-tag\" param=\"$:/tags/PageTemplate\" actions=<<add-navbar-css>>>\nRestore Navigation bar\n\n</$button>\n</$fieldmangler>\n\n|Navigation Bar Title Font-Family: | <$edit-text tag=\"input\" type=\"text\" tiddler=\"$:/state/maarfapad/navbar-title-font-family\" default=\"'Comfortaa',cursive\" />|\n|Navigation Bar Colour: | <$edit-text tag=\"input\" type=\"color\" tiddler=\"$:/state/maarfapad/navbar-color\" default=\"#000000\" />|\n|Navigation Bar Icons Colour: | <$edit-text tag=\"input\" type=\"color\" tiddler=\"$:/state/maarfapad/navbar-icons-color\" default=\"#ffffff\" />|",
"title": "$:/plugins/Abe/maarfapad/navbar-simple-settings",
"tags": "",
"modified": "20180816224750753",
"caption": "General Settings"
},
"$:/state/maarfapad/navbar-title-font-family": {
"created": "20180807214245251",
"text": "'Comfortaa',cursive",
"title": "$:/state/maarfapad/navbar-title-font-family",
"modified": "20180816222856830"
},
"$:/state/maarfapad/navbar-color": {
"text": "#000000",
"title": "$:/state/maarfapad/navbar-color",
"modified": "20180808131623995",
"created": "20180807205220946"
},
"$:/state/maarfapad/navbar-icons-color": {
"text": "#ffffff",
"title": "$:/state/maarfapad/navbar-icons-color",
"modified": "20180808131705552",
"created": "20180807210415910"
},
"$:/state/maarfapad/wiki-type": {
"text": "empty",
"title": "$:/state/maarfapad/wiki-type",
"modified": "20180816190330322",
"created": "20180816190020747"
},
"$:/plugins/Abe/maarfapad/changeListener.js": {
"created": "20180613222607803",
"text": "(function (){\n exports.startup = function (){\n if (!sessionStorage) return;\n if (!location.origin.includes('maarfapad.') && !location.port.includes('8000') && !location.port.includes('3000')) return;\n \n var changeCounter = setInterval(function (){\n source = new EventSource(\"/changefeed\");\n },20000);\n var clientWikiName = location.pathname.replace(\"/wiki/\",\"\");\n var alertMsg = {\n \"title\": \"$:/state/MaarfapadReload\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"A new version of this notebook was just saved to Maarfapad. Refresh to see it: \\n\\n <$button message='tm-browser-refresh'>{{$:/core/images/refresh-button}} Refresh</$button>\"\n };\n var onlineMsg = {\n \"title\": \"$:/state/MaarfapadOnline\",\n \"component\": \"Maarfapad says:\",\n \"tags\": \"$:/tags/Alert\",\n \"text\": \"Connection has been restored. Would you like to refresh to see the up-to-date notebook? You can ignore this if you're sure there isn't.\\n\\n <$button message='tm-browser-refresh'>{{$:/core/images/refresh-button}} Refresh</$button>\"\n };\n // clears session for reloads\n sessionStorage.removeItem(clientWikiName);\n \n var source = new EventSource(\"/changefeed\");\n source.onerror = function () {\n return changeCounter;\n };\n\n source.onmessage = function (e) {\n clearInterval(changeCounter);\n var data = JSON.parse(e.data);\n for (var wiki in data) {\n if (wiki === clientWikiName) {\n \n var mpadRev = data[wiki];\n new Promise(function (resolve,reject){\n if (sessionStorage.getItem(clientWikiName) === null) {\n sessionStorage.setItem(clientWikiName,data[wiki]);\n }\n if (sessionStorage.getItem(clientWikiName) === 'offline') {\n sessionStorage.setItem(clientWikiName,data[wiki]);\n $tw.wiki.deleteTiddler(\"$:/state/MaarfapadOffline\");\n $tw.wiki.addTiddler(new $tw.Tiddler(onlineMsg));\n }\n resolve(sessionStorage.getItem(clientWikiName));\n }).then(function (clientRev){\n if (clientRev !== mpadRev && clientRev !== 'offline') {\n sessionStorage.setItem(clientWikiName,'outdated');\n $tw.wiki.addTiddler(new $tw.Tiddler(alertMsg));\n return $tw.wiki.addTiddler(new $tw.Tiddler(alertMsg));\n }\n });\n\n }\n }\n }; \n };\n})();",
"type": "application/javascript",
"title": "$:/plugins/Abe/maarfapad/changeListener.js",
"tags": "",
"module-type": "startup",
"modified": "20180908201916010"
},
"$:/plugins/Abe/maarfapad/save-filter": {
"created": "20180826183637957",
"text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[prefix[$:/state/maarfapad/edition/]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n",
"title": "$:/plugins/Abe/maarfapad/save-filter",
"modified": "20180901223703116"
},
"$:/config/SaveWikiButton/Template": {
"text": "$:/plugins/Abe/maarfapad/save-filter",
"title": "$:/config/SaveWikiButton/Template",
"modified": "20180826184653616",
"created": "20180826183833065"
},
"$:/plugins/Abe/maarfapad/cancelled-action-notify": {
"created": "20180828193446334",
"text": "''Action cancelled by user...''",
"title": "$:/plugins/Abe/maarfapad/cancelled-action-notify",
"tags": "",
"modified": "20180828193504491"
},
"$:/state/maarfapad/ToggleSaverState": {
"created": "20180902164059940",
"text": "{\n \"toggleSaver\": \"false\"\n}",
"type": "application/json",
"title": "$:/state/maarfapad/ToggleSaverState",
"modified": "20180908224604063"
},
"$:/MaarfapadTutorial": {
"created": "20180902223957895",
"text": "{\n \"id\": \"mpad-tutor\",\n \"steps\": [{\n \"title\": \"Notes (aka 'Tiddlers')\",\n \"content\": \"Notes are linkable and yield themselves to interesting programmatic manipulation.\",\n \"target\": \"div.tc-titlebar\",\n \"width\": \"200\",\n \"placement\": \"bottom\"\n },\n {\n \"title\": \"Tags!\",\n \"content\": \"Notes can be tagged to organise them. This tag tells your notebook to place this note under the 'Content tab' (which is just another note). You can click this tag to access notes under this tag. This works for all other notes.\",\n \"target\": \"span.tc-tag-list-item\",\n \"width\": \"200\",\n \"placement\": \"bottom\"\n },\n {\n \"title\": \"Tiddler Tools\",\n \"content\": \"Close, Edit, reveal more ways to use notes\",\n \"target\": \"span.tc-tiddler-controls\",\n \"xOffset\": \"-5\",\n \"width\": \"200\",\n \"placement\": \"left\"\n },\n {\n \"title\": \"Sidebar tools\",\n \"content\": \"Quickly access frequently used tools. You can add or remove different tools here by checking tools under the 'Tools' tab. Click the Maarfapad icon to access Save options, Maarfapad settings & Account details.\",\n \"target\": \"div.tc-page-controls\",\n \"width\": \"200\",\n \"placement\": \"left\"\n },\n {\n \"title\": \"Access tabs\",\n \"content\": \"Access Opened notes, Recently created notes, Tools & More via these tabs. Tag notes as 'Content' to add them to the 'Content' tab\",\n \"target\": \"div.tc-tab-buttons\",\n \"placement\": \"left\"\n },\n {\n \"title\": \"Customise title! 🙌\",\n \"content\": \"You can customise almost everything in this notebook because it is entirely yours. Try changing the title using the 'Control Panel' (the gear icon below)\",\n \"target\": \"h1.tc-site-title\",\n \"placement\": \"left\"\n }]\n}",
"type": "application/json",
"title": "$:/MaarfapadTutorial",
"tags": "",
"modified": "20180903220942872"
},
"$:/MaarfapadTutorialMobileView": {
"created": "20180902192140139",
"text": "{\n \"id\": \"mpad-tutor\",\n \"steps\": [{\n \"title\": \"Notes (aka 'Tiddlers')\",\n \"content\": \"Notes are linkable and yield themselves to interesting programmatic manipulation.\",\n \"target\": \"div.tc-titlebar\",\n \"width\": \"200\",\n \"placement\": \"bottom\"\n },\n {\n \"title\": \"Tags!\",\n \"content\": \"Notes can be tagged to organise them. This tag tells your notebook to place this note under the 'Content tab' (which is just another note). You can click this tag to access notes under this tag. This works for all other notes.\",\n \"target\": \"span.tc-tag-list-item\",\n \"width\": \"200\",\n \"placement\": \"bottom\"\n },\n {\n \"title\": \"Tiddler Tools\",\n \"content\": \"Close, Edit, reveal more ways to use notes\",\n \"target\": \"span.tc-tiddler-controls\",\n \"xOffset\": \"-5\",\n \"width\": \"120\",\n \"placement\": \"left\"\n },\n {\n \"title\": \"Navigation bar tools\",\n \"content\": \"Create, view, search, close all & save your notes. Click the Maarfapad icon to access Save options, Maarfapad settings & Account details.\",\n \"target\": \"div.topbar-nav-tools\",\n \"width\": \"200\",\n \"placement\": \"bottom\"\n }]\n}",
"type": "application/json",
"title": "$:/MaarfapadTutorialMobileView",
"tags": "",
"modified": "20180903221010661"
},
"$:/plugins/Abe/maarfapad/mpad-route.js": {
"created": "20180904145431019",
"text": "/* A macro than can be used to generate \n * routes to Maarfapad for procution ortesting\n */\n\n(function (){\n exports.name = 'mpad-route';\n \n exports.params = [\n { name: 'text', default: 'Maarfapad Route' },\n { name: 'route', default: '/' }\n ];\n \n exports.run = function (text, route) {\n var link = \"[[\" + text + \"|\" + location.origin + route + \"]]\";\n return link;\n };\n})();",
"title": "$:/plugins/Abe/maarfapad/mpad-route.js",
"tags": "",
"modified": "20180904150609176",
"module-type": "macro",
"type": "application/javascript"
}
}
}
{{$:/config/maarfapad/ui}}
/* SIDEBAR BACKGROUND */
div .tc-sidebar-scrollable {
<$set name="sidebarCSS" filter="[title[$:/state/sidebar]field:text[yes]]" value="background: linear-gradient(to right, transparent, white 5%);" emptyValue="">
<$text text=<<sidebarCSS>>/>
</$set>
}
/* VERTICAL OFFSET FOR TOP OF SIDEBAR */
div .tc-sidebar-scrollable {
margin-top: 40px;
}
div .tc-modal {
margin-top: 40px;
}
div .tc-topbar svg {
fill: {{$:/state/maarfapad/navbar-icons-color}};
}
div .tc-topbar button:hover svg {
fill: #d3d3d3;
}
div .tc-story-river {
margin-top: 10px;
}
@media screen and (max-width: 700px) {
div .topbar-nav-text {
display: none;
}
div .topbar-nav-tools {
float: left;
position: relative;
left: 30px;
font-size: 1.35em;
}
div .topbar-nav-tools button {
margin-right: 10px;
padding-top: 1px;
}
div .tc-story-river {
margin-left: 8px;
margin-right: 8px;
margin-top: -15px;
}
div .tc-tiddler-frame {
box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.3);
}
div .tc-sidebar-scrollable {
<$set name="sidebarCSS" filter="[title[$:/state/sidebar]field:text[yes]]" value="background: white;" emptyValue="">
<$text text=<<sidebarCSS>>/>
</$set>
}
}
<$set name="navbartoolsCSS" filter="[title[$:/state/sidebar]field:text[yes]]" value=".topbar-nav-tools { display: none; }" emptyValue=""> <$text text=<<navbartoolsCSS>>/> </$set>
.topbar-nav {
display: block;
position: fixed;
top: 0px;
width: 100%;
height: 44px;
background-color: {{$:/state/maarfapad/navbar-color}};
box-shadow: 0px 1px 5px grey;
z-index: 500;
}
.topbar-nav-text {
float: left;
color: {{$:/state/maarfapad/navbar-icons-color}};
font-size: 25px;
font-family: {{$:/state/maarfapad/navbar-title-font-family}};
margin-top: 10px;
margin-left: 42px;
}
.topbar-nav-tools {
float: right;
width: 290px;
height: 100%;
position: relative;
right: 50px;
padding-top: 8px;
font-size: 1.5em;
}
.topbar-nav-tools button {
margin-right: 20px;
}
.topbar-nav-tools img {
width: 1em;
}
.topbar-nav-tools svg {
fill: {{$:/state/maarfapad/navbar-icons-color}};
}
/*Shifts the sticky titles to accomodate Maarfapad's navbar*/
div.tc-tiddler-title {
top: 45px;
}
{
"toggleSaver": "true"
}
{
"tiddlers": {
"$:/plugins/bj/storytabs/license": {
"title": "$:/plugins/bj/storytabs/license",
"text": "The MIT License (MIT)\n\nCopyright (c) 2015 Jeffrey Wikinson aka Buggyj\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
},
"$:/plugins/bj/storytabs/readme": {
"title": "$:/plugins/bj/storytabs/readme",
"text": "Facilitates easier navigating between open tiddlers. Links to open tiddlers appear above top of the story river . If 'story mode' is set to zooming (see in appearance tab in the $:/ControlPanel tiddler) then the open tiddlers appear in tabs. The top links are controlled from the 'setting' tab in the $:/ControlPanel tiddler.\n"
},
"$:/plugin/bj/storytabs": {
"title": "$:/plugin/bj/storytabs",
"type": "text/vnd.tiddlywiki",
"text": "<div class=\"tc-tab-buttons\" >\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" variable=\"currentTab\">\n<$reveal type=\"match\" state=\"$:/HistoryList!!current-tiddler\" text=<<currentTab>>>\n<div style=\"display:inline-block;\">\n<$button to=<<currentTab>> class=\"tc-tab-selected\" style=\"margin-right: 0.0em; border-right: 0.0em\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$button>\n<$button message=\"tm-close-tiddler\" param=<<currentTab>> class=\"tc-tab-selected\" style=\"border-left: 0.0em;\">×</$button></div></$reveal>\n<$reveal type=\"nomatch\" state=\"$:/HistoryList!!current-tiddler\" text=<<currentTab>>>\n<div style=\"display:inline-block;\">\n<$button to=<<currentTab>> style=\"margin-right: 0.0em;\" >\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$button><$button message=\"tm-close-tiddler\" param=<<currentTab>>>\n×</$button></div></$reveal>\n</$list>\n</div>\n\n"
},
"$:/bj/storytabs/storytabs-caller": {
"tags": "$:/tags/AboveStory",
"title": "$:/bj/storytabs/storytabs-caller",
"type": "text/vnd.tiddlywiki",
"text": "<$transclude tiddler=\"$:/plugin/bj/storytabs\" mode=\"inline\"/>\n\n\n"
},
"$:plugins/bj/ui/ControlPanel/Settings/StoryTabs": {
"caption": "Display tabs of Open Tids",
"tags": "$:/tags/ControlPanel/Settings",
"title": "$:plugins/bj/ui/ControlPanel/Settings/StoryTabs",
"type": "text/vnd.tiddlywiki",
"text": "<$checkbox tiddler=\"$:/plugin/bj/storytabs\" tag=\"$:/tags/AboveStory\" > Enable Story Tabs </$checkbox>\n\n\n"
}
}
}
{
"tiddlers": {
"$:/bj/modules/widgets/edit.js": {
"text": "/*\\\ntitle: $:/bj/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\\*/\n\nif($tw.browser ) {\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ready = false;\n\nvar MIN_TEXT_AREA_HEIGHT = 100; // Minimum height of textareas in pixels\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditHtmlWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\nvar PLUSMODE = (typeof $tw.wiki.getTiddler(\"$:/language/Docs/Types/text/x-perimental\")!='undefined');\n\n/*\nInherit from the base widget class\n*/\nEditHtmlWidget.prototype = new Widget();\n\nEditHtmlWidget.prototype.postRender = function() {\n\tvar self = this,\n\t\tcm;\n\tvar toWiki = function(text) {\n\t\t//if($tw.browser) alert(\"in towiki \"+text)\n\n\t\t//BJ FIXME - in theory the attribs can be in any order, so this may fail as it is\n\t\tvar newtext = \"\";\n\n\t\t newtext = text.replace(/^<p><span class=\\\"verbatim\\\".*?>([^<]*)<\\/span><\\/p>/,\n\t\tfunction(m,key,offset,str){\n if (key.indexOf('<') != -1) {// we have caputure some formatting - !abort\n\t\t\t\t\treturn m;\n\t\t\t\t}\n\t\t\t\treturn $tw.utils.htmlDecode(key) + \"\\n<!-- verbatim -->\";\n\n\t\t});\n\t\tnewtext =\n\t\tnewtext.replace(/<p><span class=\\\"verbatim\\\".*?>([^<]*)<\\/span><\\/p>/g,\n\t\tfunction(m,key,offset,str){\n if (key.indexOf('<') != -1) {// we have caputure some formatting - !abort\n\t\t\t\t\treturn m;\n\t\t\t\t}\n\t\t\t\treturn \"\\n<!-- nl verb -->\"+$tw.utils.htmlDecode(key)+\"<!-- atim -->\";\n\n\t\t\t\n\t\t});\n\t\tnewtext = newtext.replace(/<span class=\\\"verbatim\\\".*?>([^<]*)<\\/span>/g,\n\t\t\tfunction(m,key,offset,str){\n\t\t\t\tif (key.indexOf('<')!=-1) {// we have caputure some formatting - !abort\n\t\t\t\t\treturn m;\n\t\t\t\t}\n\t\t\t\treturn \"<!-- verb -->\"+$tw.utils.htmlDecode(key)+\"<!-- atim -->\";\n\t\t\t});\n\t\treturn newtext;\n\t}\n\n\tif($tw.browser && window.CKEDITOR && this.editTag === \"textarea\") {\n\t\t\n\t\tvar ck =\"editor\"+ Math.random();\n\t\tthis.domNodes[0].firstChild.setAttribute(\"name\",ck);\n\t\tthis.domNodes[0].firstChild.setAttribute(\"id\",ck);\n\t\tvar config;\n\t\ttry {\n\t\t config = $tw.wiki.getTiddlerData(\"$:/plugins/bj/visualeditor/config.json\");\n\t\t} catch(e) {\n\t\t\talert(\"invalid config format\");\n\t\t\tconfig = [];\n\t\t}\n\t\tCKEDITOR.replace(ck, config);//,\n\n\t\tCKEDITOR.instances[ck].on('change', \n\t\t\tfunction() { \n\t\t\t\tif (PLUSMODE && self.edittype == 'text/x-perimental') {\n\t\t\t\t\tself.saveChanges(toWiki(CKEDITOR.instances[ck].getData()));\n\t\t\t\t} else {\n\t\t\t\t\tself.saveChanges(CKEDITOR.instances[ck].getData());\n\t\t\t\t} \n\t\t\t}\n\t\t);\n\t} \n};\n\nEditHtmlWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tvar fromWiki = function(text) {\n\t\tvar preAmble = '<span class=\"verbatim\">';\n\t\tvar index=1;\n\t\t//seperate the /define .../end section\n\t\ttext = text.split(\"<\\!-- verbatim -->\");\n\t\tif (text.length == 1) //no preamble defined\n\t\t\tindex = 0;\n\t\telse\n\t\t\ttext[0] = preAmble+$tw.utils.htmlEncode(text[0]) + '</span>'\n\t\ttext[index] = text[index].replace(/^<\\!-- nl verb -->([\\s\\S]*?)<\\!-- atim -->/mg,\n\t\tfunction(m,key,offset,str){//alert(key);\n\t\t\treturn '<p>' + preAmble+$tw.utils.htmlEncode(key)+'</span>'+'</p>';\n\t\t});//alert (\"newtext \"+text[index]);\n\t\ttext[index] = text[index].replace(/<\\!-- verb -->([\\s\\S]*?)<\\!-- atim -->/g,\n\t\tfunction(m,key,offset,str){//alert(key);\n\t\t\treturn preAmble+$tw.utils.htmlEncode(key)+'</span>';\n\t\t});\n\t\t//alert (\"newtext \"+text.join(\"\"));\n\t\treturn text.join(\"\");\n\t}\n\t// Create our element\n\tvar outerDomNode = this.document.createElement('div');\n\t\touterDomNode.className = \"tw-ckeditor-instance\";\n\tvar domNode = this.document.createElement(this.editTag);\n\n\tif(this.editPlaceholder) {\n\t\tdomNode.setAttribute(\"placeholder\",this.editPlaceholder);\n\t}\n\t// Assign classes\n\tif(this.editClass) {\n\t\tdomNode.className = this.editClass;\n\t}\n\t// Set the text\n\tvar editInfo = this.getEditInfo();\n\tif(this.editTag === \"textarea\") {\n\t\tif (PLUSMODE && this.edittype == 'text/x-perimental') {\n\t\t\tdomNode.appendChild(this.document.createTextNode(fromWiki(editInfo.value)));\n\t\t} else {\n\t\t\tdomNode.appendChild(this.document.createTextNode(editInfo.value));\n\t\t} \n\t} else {\n\t\talert(\"visual editor only works with textarea\")\n\t}\n outerDomNode.appendChild(domNode);\n\t// Insert the element into the DOM\n\tparent.insertBefore(outerDomNode,nextSibling);\n\tthis.domNodes.push(outerDomNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nGet the tiddler being edited and current value\n*/\nEditHtmlWidget.prototype.getEditInfo = function() {\n\t// Get the edit value\n\tvar self = this,\n\t\tvalue,\n\t\tupdate;\n\tif(this.editIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\tupdate = function(value) {\n\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t// Get the current tiddler and the field name\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t} else {\n\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\tswitch(this.editField) {\n\t\t\t\tcase \"text\":\n\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"title\":\n\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tvalue = \"\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (this.editDefault !== undefined) {\n\t\t\t\tvalue = this.editDefault;\n\t\t\t}\n\t\t}\n\t\tupdate = function(value) {\n\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\tupdateFields = {\n\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t};\n\t\t\tupdateFields[self.editField] = value;\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t};\n\t}\n\treturn {value: value, update: update};\n};\n\nEditHtmlWidget.prototype.getAttribute = function () {\n\t//parameters are passed to parent so get them from there\n\treturn this.parentWidget.getAttribute.apply(this.parentWidget, arguments);\n}\n \nEditHtmlWidget.prototype.execute = function() {\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editDefault = this.getAttribute(\"default\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\tthis.onkeyupdate = this.getAttribute(\"onkeyupdate\",\"yes\"); \n\t// Get the content type of the thing we're editing\n\tthis.edittype = \"\";\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\tthis.edittype = tiddler.fields.type;\n\t\t}\n\t}\n\t// only textarea can be visually edited\n\tthis.editTag = \"textarea\"\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditHtmlWidget.prototype.refresh = function(changedTiddlers) {\n// attribute changes are caught by parent widget\n\tif(changedTiddlers[this.editTitle]) {\n\t\t//this.refreshSelf(); BJ maybe we don't like to have our edits pulled - this could be an option\n\t\t//return true;\n\t}\n\treturn false;\n};\n\n/*\nUpdate the editor with new text. This method is separate from updateEditorDomNode()\nso that subclasses can override updateEditor() and still use updateEditorDomNode()\n*/\nEditHtmlWidget.prototype.updateEditor = function(text) {\n\tthis.updateEditorDomNode(text);\n};\n\n/*\nUpdate the editor dom node with new text\n*/\nEditHtmlWidget.prototype.updateEditorDomNode = function(text) {\n\t// Replace the edit value if the tiddler we're editing has changed\n\tvar domNode = this.domNodes[0].firstChild;\n\tif(!domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.document.activeElement !== domNode) {\n\t\t\tdomNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\t//this.fixHeight();\n\t}\n};\n\n/*\nHandle a dom \"input\" event\n*/\nEditHtmlWidget.prototype.handleInputEvent = function(event) {\n\tthis.saveChanges(this.domNodes[0].firstChild.value);\n\t//this.fixHeight();\n\treturn true;\n};\n\nEditHtmlWidget.prototype.handleFocusEvent = function(event) {\n\tif(this.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0].firstChild,\n\t\t\ttitle: this.editFocusPopup,\n\t\t\twiki: this.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\nEditHtmlWidget.prototype.saveChanges = function(text) {\n\tvar editInfo = this.getEditInfo();\n\tif(text !== editInfo.value) {\n\t\teditInfo.update(text);\n\t}\n};\n\n$tw.utils.registerFileType(\"text/x-perimental\",\"utf8\",\".perimental\");\nexports[\"__!ckebase__\"] = EditHtmlWidget;//choose an unparseable name to make widget 'private'\n\n//-------------- base initialisation - ----------------\n\nvar startup = function () { //do after lib is loaded\n\tif (typeof CKEDITOR != 'undefined') {\n\t\tvar PLUSMODE = (typeof $tw.wiki.getTiddler(\"$:/language/Docs/Types/text/x-perimental\")!='undefined');\n\n\t\tvar sty;\n\t\ttry {\n\t\t sty=$tw.wiki.getTiddlerData(\"$:/plugins/bj/visualeditor/styles.json\");\n\t\t} catch(e){ \n\t\t\talert(\"invalid style format\");\n\t\t\tsty=[];\n\t\t}\n\t\tif (PLUSMODE) sty.push({ \"name\": \"verbatim\",\"element\": \"span\",\"attributes\": {\"class\": \"verbatim\"}});\n\n\t\tCKEDITOR.stylesSet.add( 'default',sty);\n\t\tif (PLUSMODE) CKEDITOR.addCss($tw.wiki.getTiddlerData(\"$:/plugins/bj/visualeditor/verbatim.json\").verbatim);\n\t\tCKEDITOR.on( 'instanceReady', function( ev ) {\n\t\t\tvar blockTags = ['div','h1','h2','h3','h4','h5','h6','p','pre','li','blockquote','ul','ol',\n\t\t\t\t\t\t\t'table','thead','tbody','tfoot','td','th',];\n\t\t\tvar rules = {\n\t\t\t\tindent : false,\n\t\t\t\tbreakBeforeOpen : true,\n\t\t\t\tbreakAfterOpen : false,\n\t\t\t\tbreakBeforeClose : false,\n\t\t\t\tbreakAfterClose : false\n\t\t\t};\n\n\t\t\tfor (var i=0; i<blockTags.length; i++) {\n\t\t\t\tev.editor.dataProcessor.writer.setRules( blockTags[i], rules );\n\t\t\t}\n\t\t});\n\n\t\t//BJ hide tw5 tags and macros from ckeditor\n\t\tCKEDITOR.config.protectedSource.push(/<\\/?\\$[^<]*\\/?>/g);\n\t\tCKEDITOR.config.protectedSource.push(/<<[^<]*>>/g);\n\t\t//CKEDITOR. config.protectedSource.push(/<\\?[\\s\\S]*?\\?>/g); // PHP Code\n\t\tCKEDITOR.config.protectedSource.push(/<code>[\\s\\S]*?<\\/code>/gi); // Code tags\n\t\tCKEDITOR.config.entities = false;\n\t}\n\n\tvar atiddler = $tw.wiki.getTiddler(\"$:/config/EditorTypeMappings/text/html\");\n\tif (atiddler == undefined) {\n\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),\n\t\t\t\t{title:\"$:/config/EditorTypeMappings/text/html\", text:\"html\"}));\n\t}\n\tatiddler = $tw.wiki.getTiddler(\"$:/config/EditorTypeMappings/text/x-perimental\");\n\tif (atiddler == undefined) {\t\n\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),\n\t\t\t\t\t{title:\"$:/config/EditorTypeMappings/text/x-perimental\", text:\"x-perimental\"}));\n\t}\n}\n\n//require(\"$:/plugins/bj/visualeditor/ckeditor.js\"); BJ -option to build in the lib?\n/*\ncreate lib loader \n*/\nif($tw.browser) {\n\tvar head = document.getElementsByTagName('head')[0];\n\tvar js = document.createElement(\"script\");\n\tjs.type = \"text/javascript\";\n\tjs.onload = function() { \n\t\t//do non-tree initialisation\n\t\tstartup();\n\t\tready = true;//BJ do this in startup\n\t\t//broadcast ready message\n\t\t$tw.wiki.setTextReference(\"$:/temp/ckeready\",\"ready\");\n\t}\n\tif (window.location.hostname == \"bjtools.tiddlyspot.com\") {\n\t\tjs.src = $tw.wiki.getTiddlerText(\"$:/plugin/bj/visualeditor/bjtools/lib\")||\"\";\n\t}\n\telse {\n\t\tvar tiddler = $tw.wiki.getTiddler(\"$:/plugin/bj/visualeditor/includelib\")||{fields:{}};\n\t\tvar src = (tiddler.fields.text)||\"\";\n\t\tjs.src = src.replace(/.*?<script.*?src=[\"'](.*?)[\"'][\\s\\S]*/,\"$1\");\n\t\tif (tiddler.fields.tags) {\n\t\t\tvar pos = tiddler.fields.tags.indexOf(\"$:/core/wiki/rawmarkup\");\n\t\t\tif(pos !== -1) {\n\t\t\t\talert(\"Please remove the tag $:/core/wiki/rawmarkup from tiddler $:/plugin/bj/visualeditor/includelib\")\n\t\t\t}\n\t\t}\n\t}\n\thead.appendChild(js);\n} \n//----------------base initialisation finished-----------------------------\n\nvar LoadWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n \nLoadWidget.prototype = new Widget();\n\n\n\nLoadWidget.prototype.getLoadingMessage = function() {\n\tvar message = \"<h2>loading ckeditor\",\n\t\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",message,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n \nLoadWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n\nLoadWidget.prototype.execute = function() {\n\n\tif (ready) {\n\t\t// insert the real widget\n\t\tthis.makeChildWidgets([{type: \"__!ckebase__\"}]);\n\t}\n\telse this.makeChildWidgets(this.getLoadingMessage());\n};\n\nLoadWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the 'lib is loaded' is indicated\n\t\tif(Object.keys(changedAttributes).length || changedTiddlers[\"$:/temp/ckeready\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nLoadWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tthis.invokeActions(this,event);\n\treturn true; // Action was invoked\n};\n\nexports[\"edit-html\"] = LoadWidget;\nexports[\"edit-x-perimental\"] = LoadWidget;\n})();\n}\n",
"title": "$:/bj/modules/widgets/edit.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/bj/visualeditor/styles.json": {
"type": "application/json",
"title": "$:/plugins/bj/visualeditor/styles.json",
"module-type": "library",
"text": "[\n\t{ \"name\": \"Blue Title\", \"element\": \"h3\", \"styles\": { \"color\": \"Blue\" } },\n\t{ \"name\": \"Red Title\", \"element\": \"h3\", \"styles\": { \"color\": \"Red\" } },\n\t{ \"name\": \"Marker: Yellow\",\t\"element\": \"span\", \"styles\": { \"background-color\": \"Yellow\"} },\n\t{ \"name\": \"Marker: Red\",\t\"element\": \"span\", \"styles\": { \"background-color\": \"Red\"} },\n\t{ \"name\": \"Marker: Green\",\t\"element\": \"span\", \"styles\": { \"background-color\": \"Lime\" } }\n]\n\n"
},
"$:/plugins/bj/visualeditor/config.json": {
"type": "application/json",
"title": "$:/plugins/bj/visualeditor/config.json",
"module-type": "library",
"text": "{\n\"removePlugins\":\"smiley,wsc,scayt,forms,save,preview,print\",\n\"customConfig\":\"\",\n\"language\" : \"en\",\n\"defaultLanguage\" : \"en\",\n\"contentsCss\" : \"\",\n\"disableNativeSpellChecker\" : false,\n\"resize_enabled\" : true,\n\"toolbarGroups\":[{ \"name\": \"clipboard\", \"groups\": [ \"clipboard\", \"undo\" ] },\n\t\t{ \"name\": \"editing\", \"groups\": [ \"find\", \"selection\", \"spellchecker\", \"editing\" ] },\n\t\t{ \"name\": \"links\", \"groups\": [ \"links\" ] },\n\t\t{ \"name\": \"insert\", \"groups\": [ \"insert\" ] },\n\t\t{ \"name\": \"forms\", \"groups\": [ \"forms\" ] },\n\t\t{ \"name\": \"tools\", \"groups\": [ \"tools\" ] },\n\t\t{ \"name\": \"document\", \"groups\": [ \"mode\", \"document\", \"doctools\" ] },\n\t\t{ \"name\": \"others\", \"groups\": [ \"others\" ] },\n\t\t{ \"name\": \"about\", \"groups\": [ \"about\" ] },\n\t\t{ \"name\": \"basicstyles\", \"groups\": [ \"basicstyles\", \"cleanup\" ] },\n\t\t{ \"name\": \"paragraph\", \"groups\": [ \"list\", \"indent\", \"blocks\", \"align\", \"bidi\", \"paragraph\" ] },\n\t\t{ \"name\": \"styles\", \"groups\": [ \"styles\" ] },\n\t\t{ \"name\": \"colors\", \"groups\": [ \"colors\" ] }\n\t] \n}\n"
},
"$:/plugins/bj/visualeditor/verbatim.json": {
"type": "application/json",
"title": "$:/plugins/bj/visualeditor/verbatim.json",
"module-type": "library",
"text": "{\n\"verbatim\":\".verbatim{background-color: red;border:2px solid;}\"\n}\n"
},
"$:/plugin/bj/visualeditor/includelib": {
"title": "$:/plugin/bj/visualeditor/includelib",
"description": "load the external lib",
"text": "<script src='http://127.0.0.1/libs/ckeditor/ckeditor.js'></script>\n\n"
},
"$:/plugin/bj/visualeditor/bjtools/lib": {
"title": "$:/plugin/bj/visualeditor/bjtools/lib",
"description": "load the external lib from web",
"text": "http://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.3.2/ckeditor.js\n"
},
"$:/plugins/bj/visualeditor/readme": {
"title": "$:/plugins/bj/visualeditor/readme",
"text": "!!!Basic Configuration\nThis plugin enables ckeditor to be used in a tiddlywiki. For the Ckeditor license see http://ckeditor.com/about/license\n\nckeditor can be used directly from the web, eg http://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.3.2/ckeditor.js\nor can be obtained directly from http://ckeditor.com/download\n\nNote that this plugin is designed to work with the ckeditor standard packages (but can be configured for custom packages).\n\nThe tiddler $:/plugin/bj/visualeditor/includelib\n\nneeds to contain the location of the ckeditor library. The default is\n\n```\nhttp://127.0.0.1/libs/ckeditor/ckeditor.js\n```\nchange to your location. Note that this can be an online location eg\n\n```\nhttp://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.3.2/ckeditor.js\n\n```\n\n!!!Advanced configuration\nConfiguration options as described on the ckeditor website can be set in the tiddler \n$:/plugins/bj/visualeditor/config.json\nUser styles (also described on the ckeditor website) are included in the tiddler \n$:/plugins/bj/visualeditor/styles.json\n"
},
"$:/language/Docs/Types/text/x-htmlp": {
"title": "$:/language/Docs/Types/text/x-htmlp",
"description": "ckeditor usage",
"name": "text/x-htmlp",
"group": "Text"
},
"$:/config/EditorTypeMappings/text/x-htmlp": {
"title": "$:/config/EditorTypeMappings/text/x-htmlp",
"text": "html"
}
}
}
{
"tiddlers": {
"$:/plugins/danielo/encryptTiddler/Changelog": {
"title": "$:/plugins/danielo/encryptTiddler/Changelog",
"text": "!! V2.1\n* Added control panel.\n* Added ability to batch encrypt and decrypt tiddlers.\n* Added some documentation an language strings.\n\n"
},
"$:/plugins/danielo/encryptTiddler/control-panel/batch-encrypt": {
"title": "$:/plugins/danielo/encryptTiddler/control-panel/batch-encrypt",
"caption": "Batch Encryption",
"text": "\\define lingo-base() $:/language/Search/\n<<lingo Filter/Hint>>\n{{$:/plugins/danielo/encryptTiddler/language/batch}}\n\n<$linkcatcher to=\"$:/temp/encrypt/filter\">\n\n<div class=\"tc-search tc-advanced-search\">\n<$edit-text tiddler=\"$:/temp/encrypt/filter\" type=\"search\" tag=\"input\" default=\"\" placeholder=\"filter tiddlers\"/>\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n<$reveal state=\"$:/temp/encrypt/filter\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/encrypt/filter\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n\n\n<$edit-text tag=\"input\" tiddler=\"$:/temp/password\" placeholder=\"password\" type=\"password\" default=\"\" col=\"4\"/><$encryptTiddler passwordTiddler=\"$:/temp/password\" filter={{$:/temp/encrypt/filter}}>\n<$button message=\"tw-encrypt-tiddler\">\nEncrypt\n</$button>\n<$button message=\"tw-decrypt-tiddler\">\nDecrypt\n</$button>\n</$encryptTiddler>\n</$reveal>\n</div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]!sort[]] -[[$:/core/Filters/SystemTags]] -[[$:/core/Filters/AllTags]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/encrypt/filter\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/encrypt/filter}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/encrypt/filter}} template=\"$:/plugins/danielo/encryptTiddler/ui/listItemTemplate\"/>\n</div>\n</$set>\n</$reveal>"
},
"$:/plugins/danielo/encryptTiddler/control-panel": {
"title": "$:/plugins/danielo/encryptTiddler/control-panel",
"tags": "$:/tags/ControlPanel",
"caption": "Encrypt Tiddlers",
"text": "\\define prefix(name) $:/plugins/danielo/encryptTiddler/control-panel/$name$\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]prefix[$:/plugins/danielo/encryptTiddler/control-panel/]]\" default=<<prefix \"batch-encrypt\">> state=\"$:/state/encryptTiddler/control-panel/tabs\">>"
},
"$:/plugins/danielo/encryptTiddler/crypt-batch-button": {
"creator": "Danielo",
"title": "$:/plugins/danielo/encryptTiddler/crypt-batch-button",
"text": "<span title=\"Encrypt/Decrypt tiddler\" class=\"pc-batch-controls\">\n<$reveal state=<<qualify \"$:/state/encrypt\">> type=\"nomatch\" text={{!!title}} animate=\"no\"><$button set=<<qualify \"$:/state/encrypt\">> setTo={{!!title}} class=\"tc-btn-invisible\">{{$:/plugins/danielo/encryptTiddler/unlocked}}</$button></$reveal><$reveal state=<<qualify \"$:/state/encrypt\">> type=\"match\" text={{!!title}} animate=\"no\"><$button set=<<qualify \"$:/state/encrypt\">> setTo=\"\" class=\"tc-btn-invisible\">{{$:/plugins/danielo/encryptTiddler/unlocked}}</$button></$reveal>\n<$encryptTiddler passwordTiddler=\"$:/temp/password\" filter={{$:/temp/encrypt/filter}}><$reveal state=<<qualify \"$:/state/encrypt\">> type=\"match\" text={{!!title}} animate=\"yes\">\n<div class=\"tc-block-dropdown tw-crypt-dropdown\">\n<span class=\"tw-password-field\"><$edit-text tiddler=\"$:/temp/password\" tag=\"input\" type=\"password\" default=\"\" placeholder=\"password\" class=\"tc-edit-texteditor\"/></span>\n<span class=\"tw-crypt-button\"> <$button message=\"tw-encrypt-tiddler\" set=<<qualify \"$:/state/encrypt\">> setTo=\"\" >Encrypt</$button> <$button message=\"tw-decrypt-tiddler\" set=<<qualify \"$:/state/encrypt\">> setTo=\"\" >Decrypt</$button></span>\n</div>\n</$reveal></$encryptTiddler>\n</span>"
},
"$:/plugins/danielo/encryptTiddler/crypt-button": {
"created": "20140405233000477",
"creator": "Danielo",
"modified": "20140608121335075",
"tags": "$:/tags/ViewToolbar button encrypt export",
"title": "$:/plugins/danielo/encryptTiddler/crypt-button",
"type": "text/vnd.tiddlywiki",
"text": "<span title=\"Encrypt/Decrypt tiddler\"><$transclude tiddler=\"$:/plugins/danielo/encryptTiddler/openPopup\"/>\n</span><$encryptTiddler passwordTiddler=\"$:/temp/password\"><$reveal state=\"$:/state/encrypt\" type=\"match\" text={{!!title}} animate=\"yes\">\n<div class=\"tc-block-dropdown tw-crypt-dropdown\">\n<span class=\"tw-password-field\"><$edit-text tiddler=\"$:/temp/password\" tag=\"input\" type=\"password\" default=\"\" placeholder=\"password\" class=\"tc-edit-texteditor\"/></span>\n<span class=\"tw-crypt-button\"> <$list filter=\"[all[current]!has[encrypted]]\"> <$button message=\"tw-encrypt-tiddler\" set=\"$:/state/encrypt\" setTo=\"\" >Encrypt</$button></$list><$list filter=\"[is[current]has[encrypted]]\"> <$button message=\"tw-decrypt-tiddler\" set=\"$:/state/encrypt\" setTo=\"\" >Decrypt</$button></$list></span>\n</div>\n</$reveal></$encryptTiddler>\n"
},
"$:/plugins/danielo/encryptTiddler/Encrypt-Tiddler": {
"created": "20140406153742691",
"creator": "pepito",
"description": "add the hability to encrypt individual tiddlers",
"modified": "20141029152631265",
"modifier": "Danielo Rodriguez",
"tags": "index plugins",
"title": "$:/plugins/danielo/encryptTiddler/Encrypt-Tiddler",
"type": "text/vnd.tiddlywiki",
"caption": "readme",
"text": "This plugin adds the ability to encrypt your tiddlers individually. This have several advantages:\n\n* You can specify a different password for each tiddler if you want.\n* You don't have to encrypt your whole wiky.\n* If you forget your password, you only lose a tiddler.\n* It's possible to edit the tiddler content , tags and fields ''except the encrypt field'' after encryption. Decrypting your tiddler will restore it to its original state when you encrypted it. This way you can hide the encrypted tiddlers as a \"different\" thing.\n* You can even encrypt images.\n* You can have sensible data in a day to day wiky.\n* I didn't try this, but theoretically you can apply double encryption by encrypting your wiki too."
},
"$:/plugins/danielo/encryptTiddler/encrypttiddler.js": {
"text": "/*\\\ntitle: $:/plugins/danielo/encryptTiddler/encrypttiddler.js\ntype: application/javascript\nmodule-type: widget\n\nencrypttiddler widget\n\n```\n\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar encryptTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t\t{type: \"tw-encrypt-tiddler\", handler: \"handleEncryptevent\"},\n\t\t\t{type: \"tw-decrypt-tiddler\", handler: \"handleDecryptevent\"},\n\t\t\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nencryptTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nencryptTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tconsole.log(\"Render\");\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nencryptTiddlerWidget.prototype.execute = function() {\n\t// Get attributes\n\t this.tiddlerTitle=this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t this.filter=this.getAttribute(\"filter\",undefined);\n \t this.passwordTiddler=this.getAttribute(\"passwordTiddler\");\n\t// Construct the child widgets\n\tconsole.log(this.targetTiddler);\n\t\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nencryptTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.filter) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nencryptTiddlerWidget.prototype.getTiddlersToProcess = function(){\n\tif(this.filter){ //we have a filter to work with\n\t\treturn this.wiki.filterTiddlers(this.filter);\n\t}else{ //single tiddler case\n\t\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\t\treturn tiddler? [tiddler.fields.title] : [];\n\t}\n};\n\nencryptTiddlerWidget.prototype.handleEncryptevent = function(event){\n\tvar password = this.getPassword();\n\tvar tiddlers = this.getTiddlersToProcess();\n\n\tif(tiddlers.length > 0 && password){\n\t\tvar self = this;\n\t\t$tw.utils.each(tiddlers, function(title){\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tvar fields={text:\"!This is an encrypted Tiddler\",\n\t\t\t\t\t\t\t\t encrypted:self.encryptFields(title,password)};\n\t\t\tself.saveTiddler(tiddler,fields);\n\t\t});\n\n\t}else{\n\t\tconsole.log(\"We did not find any tiddler to encrypt or password not set!\")\n\t}\n};\n\nencryptTiddlerWidget.prototype.handleDecryptevent = function(event){\n\tvar password =this.getPassword();\n\tvar tiddlers = this.getTiddlersToProcess();\n\n\tif(tiddlers.length > 0 && password){\n\t\tvar self = this;\n\t\t$tw.utils.each(tiddlers, function(title){\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tvar fields = self.decryptFields(tiddler,password);\n\t\t\tif(fields)self.saveTiddler(tiddler,fields);\n\t\t});\n\t}\n};\n\nencryptTiddlerWidget.prototype.saveTiddler=function(tiddler,fields){\n\tthis.wiki.addTiddler( new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,this.clearNonStandardFields(tiddler), fields ) )\n}\n\nencryptTiddlerWidget.prototype.encryptFields = function (title,password){\n\tvar jsonData=this.wiki.getTiddlerAsJson(title);\n\treturn $tw.crypto.encrypt(jsonData,password);\n\n};\n\nencryptTiddlerWidget.prototype.decryptFields = function(tiddler,password){\n\t\tvar JSONfields =$tw.crypto.decrypt(tiddler.fields.encrypted,password);\n\t\tif(JSONfields!==null){\n\t\t\treturn JSON.parse(JSONfields);\n\t\t}\n\t\tconsole.log(\"Error decrypting \"+tiddler.fields.title+\". Probably bad password\")\n\t\treturn false\n};\n\nencryptTiddlerWidget.prototype.getPassword = function(){\n\tvar tiddler=this.wiki.getTiddler(this.passwordTiddler);\n\tif(tiddler){\n\t\tvar password=tiddler.fields.text;\n\t\tthis.saveTiddler(tiddler); //reset password tiddler\n\t\treturn password;\n\t}\n\n\treturn false\n};\n\n// This function erases every field of a tiddler that is not standard and also\n// the text field\nencryptTiddlerWidget.prototype.clearNonStandardFields =function(tiddler) {\n\tvar standardFieldNames = \"title tags modified modifier created creator\".split(\" \");\n\t\tvar clearFields = {};\n\t\tfor(var fieldName in tiddler.fields) {\n\t\t\tif(standardFieldNames.indexOf(fieldName) === -1) {\n\t\t\t\tclearFields[fieldName] = undefined;\n\t\t\t}\n\t\t}\n\t\tconsole.log(\"Cleared fields \"+JSON.stringify(clearFields));\n\t\treturn clearFields;\n};\n\nexports.encryptTiddler = encryptTiddlerWidget;\n\n})();",
"title": "$:/plugins/danielo/encryptTiddler/encrypttiddler.js",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/danielo/encryptTiddler/Filters/encrypted-tiddlers": {
"title": "$:/plugins/danielo/encryptTiddler/Filters/encrypted-tiddlers",
"description": "All encrypted tiddlers",
"filter": "[has[encrypted]]",
"tags": "$:/tags/Filter"
},
"$:/plugins/danielo/encryptTiddler/Filters/normal-unencrypted-tiddlers": {
"title": "$:/plugins/danielo/encryptTiddler/Filters/normal-unencrypted-tiddlers",
"filter": "[!is[system]!has[encrypted]]",
"description": "Non-encrypted normal tiddlers",
"tags": "$:/tags/Filter"
},
"$:/plugins/danielo/encryptTiddler/language/batch": {
"title": "$:/plugins/danielo/encryptTiddler/language/batch",
"text": "Use below controls to encrypt or decrypt a bunch of tiddlers. Encryption ''controls are hidden'' until you type something in the search box. All listed tiddlers will be affected. The presence of a small padlock (<span class=\"pc-listItem-lock\">{{$:/core/images/locked-padlock}}</span>) next to the tiddler title indicates that particular tiddler is already encrypted."
},
"$:/plugins/danielo/encryptTiddler/ui/listItemTemplate": {
"title": "$:/plugins/danielo/encryptTiddler/ui/listItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n<$list filter=\"[all[current]has[encrypted]]\">\n<span class=\"pc-listItem-lock\">{{$:/core/images/locked-padlock}}</span>\n</$list>\n</$link>\n</div>"
},
"$:/plugins/danielo/encryptTiddler/openPopup": {
"created": "20140406151910358",
"creator": "Danielo",
"modified": "20140608121417975",
"modifier": "pepito",
"tags": "button encrypt export",
"title": "$:/plugins/danielo/encryptTiddler/openPopup",
"type": "text/vnd.tiddlywiki",
"text": "<$reveal state=\"$:/state/encrypt\" type=\"nomatch\" text={{!!title}} animate=\"no\"><$button set=\"$:/state/encrypt\" setTo={{!!title}} class=\"tc-btn-invisible\">{{$:/plugins/danielo/encryptTiddler/unlocked}}</$button></$reveal><$reveal state=\"$:/state/encrypt\" type=\"match\" text={{!!title}} animate=\"no\"><$button set=\"$:/state/encrypt\" setTo=\"\" class=\"tc-btn-invisible\">{{$:/plugins/danielo/encryptTiddler/unlocked}}</$button></$reveal>"
},
"$:/plugins/danielo/encryptTiddler/styles": {
"created": "20140406110705085",
"creator": "pepito",
"modified": "20140608121510064",
"modifier": "pepito",
"tags": "$:/tags/Stylesheet encrypt export",
"title": "$:/plugins/danielo/encryptTiddler/styles",
"type": "text/plain",
"text": ".tw-password-field {\n\tdisplay: inline-block;\n\twidth: 55%;\n font-size:1em;\n line-height:0;\n margin:0;\n\tpadding-left:7%;\n}\n\n.pc-batch-controls .tw-crypt-dropdown{\n\tright: 0px;\n}\n\n.pc-batch-controls{\n\t\tposition:relative;\n}\n\n.pc-listItem-lock svg{\n\theight: 1em;\n\twidth: 1em;\n\tfill: #aaaaaa;\n}\n\n/*It is for use in combination with tc-block-dropdown */\n.tw-crypt-dropdown{\n line-height:0;\n\t\t\tpadding-left:5px;\n\t\t\t}\n\n.tw-password-field input{\n font-size:0.5em;\n\n}\n\n.tw-crypt-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n.tw-crypt-button button{\n\tfont-size:0.5em;\n}\n"
},
"$:/plugins/danielo/encryptTiddler/unlocked": {
"created": "20140406101339943",
"creator": "danielo515",
"modified": "20140608121532690",
"modifier": "danielo515",
"tags": "encrypt export",
"title": "$:/plugins/danielo/encryptTiddler/unlocked",
"type": "text/vnd.tiddlywiki",
"text": "<svg version=\"1.1\" id=\"Capa_1\" xmlns=\"http://www.w3.org/2000/svg\" class=\"tc-image-button\"\n\t viewBox=\"0 0 100 100\" style=\"enable-background:new 0 0 100 100;\" xml:space=\"preserve\">\n<g>\n\t<path d=\"M77.555,50H35.304V31.63c0-4.057,1.435-7.521,4.305-10.391c2.87-2.87,6.333-4.305,10.391-4.305\n\t\tc4.056,0,7.52,1.435,10.39,4.305s4.305,6.335,4.305,10.391c0,0.996,0.363,1.857,1.091,2.583c0.727,0.729,1.588,1.09,2.583,1.09\n\t\th3.674c0.995,0,1.856-0.361,2.583-1.09c0.727-0.727,1.091-1.588,1.091-2.583c0-7.079-2.517-13.136-7.549-18.17\n\t\tC63.136,8.428,57.08,5.912,50,5.912c-7.081,0-13.137,2.516-18.169,7.548c-5.033,5.034-7.549,11.091-7.549,18.17V50h-1.837\n\t\tc-1.531,0-2.833,0.536-3.904,1.608c-1.072,1.072-1.607,2.372-1.607,3.902v33.067c0,1.532,0.535,2.832,1.607,3.904\n\t\tc1.071,1.072,2.372,1.608,3.904,1.608h55.11c1.53,0,2.832-0.536,3.904-1.608c1.071-1.072,1.607-2.372,1.607-3.904V55.51\n\t\tc0-1.529-0.536-2.83-1.607-3.902C80.387,50.536,79.085,50,77.555,50z M54.315,72.937V83.72c0,2.173-1.762,3.935-3.935,3.935H49.62\n\t\tc-2.173,0-3.935-1.762-3.935-3.935V72.937c-2.31-1.443-3.852-4.001-3.852-6.925c0-4.511,3.657-8.167,8.167-8.167\n\t\ts8.167,3.657,8.167,8.167C58.167,68.937,56.625,71.495,54.315,72.937z\"/>\n</g>\n</svg>\n"
}
}
}
{
"tiddlers": {
"$:/plugins/ebalster/condition/license": {
"text": "!!The MIT License (MIT)\n\nCopyright (c) 2017 Evan Balster\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/ebalster/condition/license",
"tags": "",
"modified": "20171230044506791",
"created": "20171230044445712",
"caption": "license"
},
"$:/plugins/ebalster/condition/readme": {
"text": "The ''Condition'' plugin for TiddlyWiki, version {{$:/plugins/ebalster/condition!!version}}, by Evan Balster.\n\nThis plugin defines widgets that will either show or hide their contents depending on a condition.\n\nUnlike the closely-related reveal widget, condition widgets do //not// retain their content, and do not support animation or popups. Conditions may be based on variables, macros or filtered attributes. It can also be used with the [[Formula Plugin]].\n\n\n!!Truthiness\n\nTruthiness is a simple rule for whether a value triggers an \"if\" widget or not. Values are \"truthy\" if they do not match any of the \"falsy\" values below:\n\n* The number `0`, including any decimal point.\n* `false`\n* `undefined`\n* `null`\n* Blank (no text)\n\nThis matching is case-insensitive, and any whitespace before or after the value will be ignored.\n\n\n!!If Widget\n\nThe `$if` widget will show its content based on whether a value is \"truthy\", or matches another value.\n\n|Attribute|Meaning|h\n|value|''Required.'' Content is shown if `value` is truthy.|\n|match|Optional. If present, `value` and `match` must equal //exactly// for content to be shown. (Truthiness doesn't matter.)|\n|not|Inverts the condition, so the value will be shown if it would be hidden and vice versa.|\n\nFor example,\n\n```\n<$if not value={{$:/StoryList}}>\nNo tiddlers are open right now!\n</$if>\n```\n\n\n!!Else Widget\n\nThe `$else` widget has no attributes. It must be placed after one of the conditional widgets listed below, and will only show its contents if the preceding widget is //not// showing its content.\n\n|After...|Show contents when...|h\n|`$if`<br/>`$else-if`|None of the previous if-conditions was true.|\n|`$list`|The list is empty. `$else` can be used instead of emptyMessage.|\n|`$reveal`|The contents of the reveal widget are hidden.|\n|`$else`|An else after an else will //never// be shown.|\n\nFor example:\n\n```\n<$if value={{{[tag[Note]]}}}>\n!!My notes:\n <$list filter=\"[tag[Note]]\">\n - {{!!title}}\n </$list>\n</$if>\n<$else>\n!!I don't have any notes...\n</$else>\n```\n\nNote that the else widget can't have any blank lines between it and the preceding widget.\n\n\n!!Else-If Widget\n\nThe `$else-if` widget is a combination of the `$else` and `$if` widgets, and has the same attributes as the `$if` widget. Its content will only be displayed if the previous widget is //not// showing its content //and// the `$if`-condition is true.\n\n`$else-if` widgets can be used to perform a \"chain\" of tests, showing some text based on the first condition that passes (or fails). For example:\n\n```\nSomething approaches...\n\n<$if value={{!!animal}} match=cat> Meow! </$if>\n<$else-if value={{!!animal}} match=dog> Bark! </$else-if>\n<$else-if value={{!!animal}} match=bird> Tweet! </$else-if>\n<$else> This isn't like any animal you've seen before. </$else>\n```\n\n\n!!Help & Support\n\nThis plugin is a work in progress; seek help with it on the TiddlyWiki Google Group: https://groups.google.com/forum/#!forum/tiddlywiki\n\nOr E-mail me directly: [[evan@imitone.com|mailto://evan@imitone.com]]",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/ebalster/condition/readme",
"tags": "",
"modified": "20171230052355854",
"created": "20171230044517252",
"caption": "readme"
},
"$:/plugins/ebalster/condition/widgets/condition.js": {
"text": "/*\\\ntitle: $:/plugins/ebalster/condition/widgets/condition.js\ntype: application/javascript\nmodule-type: widget\n\nBase class for condition widgets.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ConditionWidget = function(parseTreeNode,options) {\n\tif(arguments.length > 0) {\n\t\tthis.initialise(parseTreeNode,options);\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nConditionWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nConditionWidget.prototype.render = function(parent,nextSibling) {\n this.parentDomNode = parent;\n this.computeAttributes();\n this.execute();\n this.rerender(parent,nextSibling);\n};\n\nConditionWidget.prototype.rerender = function(parent,nextSibling) {\n\tthis.removeChildDomNodes();\n\tif (this.conditionError) {\n\t\t// Show an error.\n\t\tvar parseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t}, children: [\n\t\t\t{type: \"text\", text: this.conditionError}\n\t\t]}];\n\t\tthis.makeChildWidgets(parseTreeNodes);\n\t}\n\telse if (this.isOpen) {\n\t\t// Construct and render the child widgets.\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t}\n\telse {\n\t\t// Destroy the child widgets.\n\t\tthis.children = [];\n\t}\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget (default behavior)\n*/\nConditionWidget.prototype.execute = function() {\n\tthis.executeIf(\"$condition\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nConditionWidget.prototype.refresh = function(changedTiddlers) {\n\tvar currentlyOpen = this.isOpen;\n\tvar changedAttributes = this.computeAttributes();\n\tthis.execute();\n\tif(this.isOpen !== currentlyOpen) {\n\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\tthis.rerender(this.parentDomNode,nextSibling);\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nUtility: Is a value \"truthy\"?\n*/\nConditionWidget.prototype.valueIsTruthy = function(value) {\n\t// It's truthy if it's not falsy, ie, undefined, false, blank or zero.\n\treturn !(/^\\s*(undefined|false|null|0+|0*\\.0+|0+\\.0*|)\\s*$/i.test(value));\n};\n\n/*\nUtility: Find a preceding non-text widget for an \"else\" widget.\n*/\nConditionWidget.prototype.findPrecedingConditionWidget = function() {\n\tvar siblings = (this.parentWidget ? this.parentWidget.children : null);\n\tvar sibling;\n\tif (siblings) {\n\t\tfor (var i = siblings.indexOf(this)-1; i >= 0; --i) {\n\t\t\tsibling = siblings[i];\n\t\t\tif (sibling.parseTreeNode.type == \"text\") continue;\n\t\t\tif (sibling.isOpen != null || sibling.list != null) return sibling;\n\t\t\treturn null;\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nUtility: Test if another widget triggers an \"else\"; ie, false conditions, closed reveals, empty lists.\n*/\nConditionWidget.prototype.widgetTriggersElse = function(widget) {\n\t// Condition widgets\n\tif (widget.triggerElse != null) return widget.triggerElse;\n\t// Reveal widget\n\tif (widget.isOpen != null) return !widget.isOpen;\n\t// List widget\n\tif (widget.list != null) return (widget.list instanceof Array) && widget.list.length == 0;\n};\n\n/*\nUtility: Execute as an \"else\" condition, computing isOpen and conditionError accordingly.\n*/\nConditionWidget.prototype.executeElse = function(widgetName) {\n\tthis.isOpen = false;\n\tthis.conditionError = null;\n\tthis.triggerElse = false;\n\tvar predicate = this.findPrecedingConditionWidget();\n\tif (!predicate) {\n\t\tthis.conditionError = (widgetName||\"$else\") + \" widget must follow $if, $else-if, $reveal or $list.\";\n\t\treturn;\n\t}\n\tthis.isOpen = this.widgetTriggersElse(predicate);\n};\n\n/*\nUtility: Execute as an \"if\" condition, computing isOpen and conditionError accordingly.\n*/\nConditionWidget.prototype.executeIf = function(widgetName) {\n\tthis.isOpen = false;\n\tthis.conditionError = null;\n\tthis.triggerElse = false;\n // Re-check our \"if\" condition.\n\tvar value = this.getAttribute(\"value\");\n\tvar match = this.getAttribute(\"match\");\n\tif (value == null) {\n\t\tthis.conditionError = (widgetName||\"$condition\") + \" widget requires a 'value' attribute.\";\n\t\treturn;\n\t}\n\telse if (match == null) {\n\t\t// Open if the value is truthy.\n\t\tthis.isOpen = this.valueIsTruthy(value);\n\t}\n\telse {\n\t\tthis.isOpen = (value == match);\n\t}\n\tif (this.getAttribute(\"not\")) {\n\t\tthis.isOpen = !this.isOpen;\n\t}\n\tthis.triggerElse = !this.isOpen;\n};\n\nexports.condition = ConditionWidget;\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/condition/widgets/condition.js",
"tags": "",
"module-type": "widget",
"modified": "20171230024403999",
"description": "As the $vars widget, but each attribute is interpreted as a formula.",
"created": "20171230024342810"
},
"$:/plugins/ebalster/condition/widgets/elif.js": {
"text": "/*\\\ntitle: $:/plugins/ebalster/condition/widgets/if.js\ntype: application/javascript\nmodule-type: widget\n\nIf-condition widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ConditionWidget = require(\"$:/plugins/ebalster/condition/widgets/condition.js\").condition;\n\nvar ElifWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElifWidget.prototype = new ConditionWidget();\n\n/*\nCompute the internal state of the widget\n*/\nElifWidget.prototype.execute = function() {\n\tthis.executeElse(\"$else-if\");\n\tif (this.isOpen) this.executeIf(\"$if\");\n};\n\nexports[\"else-if\"] = ElifWidget;\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/condition/widgets/elif.js",
"tags": "",
"module-type": "widget",
"modified": "20171230040911552",
"description": "As the $vars widget, but each attribute is interpreted as a formula.",
"created": "20171230040903429"
},
"$:/plugins/ebalster/condition/widgets/else.js": {
"text": "/*\\\ntitle: $:/plugins/ebalster/condition/widgets/if.js\ntype: application/javascript\nmodule-type: widget\n\nIf-condition widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ConditionWidget = require(\"$:/plugins/ebalster/condition/widgets/condition.js\").condition;\n\nvar ElseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElseWidget.prototype = new ConditionWidget();\n\n/*\nCompute the internal state of the widget\n*/\nElseWidget.prototype.execute = function() {\n\t// Execute as an else condition.\n\tthis.executeElse(\"$else\");\n};\n\nexports.else = ElseWidget;\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/condition/widgets/else.js",
"tags": "",
"module-type": "widget",
"modified": "20171230025331858",
"description": "As the $vars widget, but each attribute is interpreted as a formula.",
"created": "20171230025320439"
},
"$:/plugins/ebalster/condition/widgets/if.js": {
"text": "/*\\\ntitle: $:/plugins/ebalster/condition/widgets/if.js\ntype: application/javascript\nmodule-type: widget\n\nIf-condition widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ConditionWidget = require(\"$:/plugins/ebalster/condition/widgets/condition.js\").condition;\n\nvar IfWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nIfWidget.prototype = new ConditionWidget();\n\n/*\nCompute the internal state of the widget\n*/\nIfWidget.prototype.execute = function() {\n\tthis.executeIf(\"$if\");\n};\n\nexports.if = IfWidget;\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/condition/widgets/if.js",
"tags": "",
"module-type": "widget",
"modified": "20171230004310622",
"description": "As the $vars widget, but each attribute is interpreted as a formula.",
"created": "20171230002741585"
},
"$:/plugins/ebalster/condition/changelog": {
"created": "20171230164920491",
"text": "!!Version 0.1.1 — December 30, 2017\n\n* Fix an error when refreshing the condition widget.\n* Fix \"match\" attribute not working as expected.\n\n\n!!Version 0.1.0 — December 29, 2017\n\n* Initial implementation.\n* Includes $if, $else, $else-if\n* Common code in condition.js",
"title": "$:/plugins/ebalster/condition/changelog",
"tags": "",
"modified": "20171230165117169"
},
"$:/plugins/ebalster/condition/repack": {
"created": "20171230044112191",
"text": "Repacking command (use this in the browser console to repack the plugin)\n\n<pre><code>$tw.utils.repackPlugin(\"$:/plugins/ebalster/condition\", (= \"[\" & textjoin(\",\",\n TRUE,\n [prefix[$:/plugins/ebalster/condition/]addprefix[\"]addsuffix[\"]]) & \"]\" =));\n</code></pre>\n\nVersion: <$edit-text tiddler=\"$:/plugins/ebalster/condition\" field=\"version\" />",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/ebalster/condition/repack",
"tags": "",
"modified": "20171230165309317"
}
}
}
{
"tiddlers": {
"$:/plugins/ebalster/formula/coerce.js": {
"text": "/*\\\ntitle: $:/plugins/ebalster/formula/coerce.js\ntype: application/javascript\nmodule-type: macro\n\nType coercion logic for formulas.\nSupported types for coercion:\n\n* text\n* number\n* boolean\n* array\n* date\n\nAdditional types that may be coerced:\n\n* undefined\n* regular expression\n\n\\*/\n(function(){\n\n\"use strict\";\n\n\n// Value-to-text coercion.\nvar _ToText = {\n\t\"undefined\" : function(v,ctx) {return \"undefined\";},\n\t\"string\" : function(v,ctx) {return v;},\n\t\"number\" : function(v,ctx) {return ctx.formats.number(v);},\n\t\"symbol\" : function(v,ctx) {return String(v);},\n\t\"function\" : function(v,ctx) {return \"function\" + (v.formulaSrc || \" [built-in]\");},\n\t\"boolean\" : function(v,ctx) {return (v ? \"TRUE\" : \"FALSE\");},\n\t\"object\" : function(v,ctx) {\n\t\tif (v instanceof Date) return ctx.formats.date(v);\n\t\tif (v instanceof Array) return ctx.formats.array(v,ctx);\n\t\tif (v instanceof RegExp) return String(v);\n\t\tif (v instanceof Error) throw v;\n\t\treturn JSON.stringify(v); // Last resort\n\t},\n};\n\n// Value-to-number coercion.\nvar _ToNum = {\n\t\"undefined\" : function(v,ctx) {throw \"Cannot convert undefined value to number!\";},\n\t\"string\" : function(v,ctx) {\n\t\tvar n = Number(v);\n\t\tif (isNaN(n)) throw \"Cannot convert \\\"\"+v+\"\\\" to number!\";\n\t\treturn n;\n\t},\n\t\"number\" : function(v,ctx) {return v;},\n\t\"symbol\" : function(v,ctx) {throw \"Cannot convert symbol to number!\";},\n\t\"function\" : function(v,ctx) {throw \"Cannot convert function to number!\";},\n\t\"boolean\" : function(v,ctx) {return (v ? 1 : 0);},\n\t\"object\" : function(v,ctx) {throw \"Cannot convert \\\"\" + _ToText.object(v,ctx) + \"\\\" to number!\";},\n};\n\n// Value-to-boolean coercion.\nvar _ToBool = {\n\t\"undefined\" : function(v,ctx) {return false;},\n\t\"string\" : function(v,ctx) {return !(/^\\s*(undefined|false|null|0+|0*\\.0+|0+\\.0*|)\\s*$/i.test(v));},\n\t\"number\" : function(v,ctx) {return Boolean(v);},\n\t\"symbol\" : function(v,ctx) {return Boolean(v);},\n\t\"function\" : function(v,ctx) {return true;},\n\t\"boolean\" : function(v,ctx) {return v;},\n\t\"object\" : function(v,ctx) {return Boolean(v);},\n};\n\nexports.ToSelf = function ToSelf(v,ctx) {return v;};\nexports.ToText = function ToText(v,ctx) {return _ToText[typeof v](v,ctx);};\nexports.ToNum = function ToNum (v,ctx) {return _ToNum [typeof v](v,ctx);};\nexports.ToBool = function ToBool(v,ctx) {return _ToBool[typeof v](v,ctx);};\n\nexports.ToDate = function ToDate(v,ctx) {\n\tif (v instanceof Date) return v;\n\tthrow \"Cannot auto-convert \\\"\" + exports.ToText(v,ctx) + \"\\\" to a date!\";\n};\n\nvar rxJsRegex = /^\\/((?:[^\\\\\\/\\[]|\\[(?:[^\\]]|\\\\\\])*\\]|\\\\.)+)\\/([a-z]*)$/;\nvar rxTwRegexFlags = /^\\(\\?[a-z]*\\)|\\(\\?[a-z]*\\)$/i;\n\nexports.ToRegex = function ToRegex(v,ctx) {\n\tif (v instanceof RegExp) return v;\n\tif (typeof v === \"string\") {\n\t\tv = v.trim();\n\t\t// Try JavaScript style regex\n\t\tvar match = rxJsRegex.exec(v);\n\t\tif (match) {\n\t\t\treturn new RegExp(term[1].replace(\"\\\\/\", \"/\"), term[2]);\n\t\t}\n\t\t// Try TiddlyWiki style regex\n\t\tmatch = rxTwRegexFlags.exec(v);\n\t\tif (match) {\n\t\t\tvar flagLen = match[0].length;\n\t\t\tvar flags = match[0].substr(2, match[0].length-3);\n\t\t\tif (match.index == 0) return new RegExp(v.substr(flagLen), flags);\n\t\t\telse return new RegExp(v.substr(0, v.length-flagLen), flags);\n\t\t}\n\t\treturn new RegExp(v, \"g\");\n\t\t\n\t}\n\tthrow \"Cannot auto-convert \\\"\" + exports.ToText(v,ctx) + \"\\\" to a regular expression!\";\n};\nexports.ToArray = function ToArray(v,ctx) {\n\tif (v instanceof Array) return v;\n\tthrow \"Cannot auto-convert \\\"\" + exports.ToText(v,ctx) + \"\\\" to an array!\";\n};\nexports.ToFunc = function ToFunc(v,ctx) {\n\tif (v instanceof Function) return v;\n\tthrow \"Cannot convert \\\"\" + exports.ToText(v,ctx) + \"\\\" to a function!\";\n};\n// Maybe add ToRegex\n\n\n// Build a coerce rule from a source string.\nvar CoerceFuncs = {\n\tT: exports.ToText,\n\tN: exports.ToNum,\n\tB: exports.ToBool,\n\tA: exports.ToArray,\n\tD: exports.ToDate,\n\tR: exports.ToRegex,\n\tF: exports.ToFunc,\n\t_: exports.ToSelf,\n};\n\nfunction BuildCoerceRule(src) {\n\tvar rule = {\n\t\tmain: [],\n\t\textra: [],\n\t};\n\tvar i = 0, func;\n\t// Main part\n\twhile (i < src.length) {\n\t\tfunc = CoerceFuncs[src[i]]; ++i;\n\t\tif (func) {rule.main.push(func); continue;}\n\t\tif (src[i-1] == '+') break;\n\t\tthrow \"Unknown coerce rule: '\"+src[i-1]+\"'\";\n\t}\n\t// Extra arguments (loops)\n\twhile (i < src.length) {\n\t\tfunc = CoerceFuncs[src[i]]; ++i;\n\t\tif (func) {rule.extra.push(func); continue;}\n\t\tthrow \"Unknown coerce rule: '\"+src[i-1]+\"'\";\n\t}\n\treturn rule;\n}\n\nvar NoCoerce = {rule: {main:[], extra:[]}, gen: []};\nvar CoerceCache = {'': NoCoerce};\n\nfunction GetCoerceCache(src) {\n\tif (!CoerceCache[src]) {\n\t\ttry {\n\t\t\tCoerceCache[src] = {rule: BuildCoerceRule(src), gen: []};\n\t\t}\n\t\tcatch (err) {\n\t\t\tthrow err + \" in rule string '\" + src + \"'\";\n\t\t}\n\t}\n\treturn CoerceCache[src];\n}\n\n// Generate the coercing function array.\nfunction GenCoerceFuncs(rule,len) {\n\tvar result = [], i = 0, x = 0;\n\tresult = rule.main;\n\tif (rule.extra.length) {\n\t\twhile (result.length < len) result = result.concat(rule.extra);\n\t}\n\treturn result;\n}\n\n// Get an array of coercing (ToXXX) functions based on the function.\nexports.GetCoerceFuncs = function GetCoerceFuncs(func,args) {\n\t// Possibly set up coercion for this function.\n\tif (!func._coerce) {\n\t\tif (func.inCast) {\n\t\t\ttry {\n\t\t\t\tfunc._coerce = GetCoerceCache(func.inCast);\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tthrow err + \" for function \" + func.toString();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfunc._coerce = NoCoerce;\n\t\t}\n\t}\n\tvar gen = func._coerce.gen[args.length];\n\tif (gen) return gen;\n\tgen = GenCoerceFuncs(func._coerce.rule, args.length);\n\tfunc._coerce.gen[args.length] = gen;\n\treturn gen;\n};\n\n\n// Coerce\n\n})();\n",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/coerce.js",
"tags": "",
"module-type": "library",
"modified": "20180112071139424",
"description": "",
"created": "20180113183000431"
},
"$:/plugins/ebalster/formula/compile.js": {
"text": "(function(){\n\n\"use strict\";\n\nvar Nodes = require(\"$:/plugins/ebalster/formula/nodes.js\");\n\nvar rxDatumIsFormula = /^\\s*\\(=.*=\\)\\s*$/;\nvar rxDatumIsTrue = /^s*TRUE\\s*$/i;\nvar rxDatumIsFalse = /^s*FALSE\\s*$/i;\n\nvar rxLet = /let/gi;\n\nvar rxSkipInert = /(\\s*|\\/\\/.*?([\\r\\n]|$)|\\/\\*[\\s\\S]*?\\*\\/)*/g;\nvar rxNotWhitespace = /[^\\s]+/g;\nvar rxOperandFilter = /\\[(([^\\[\\]]|\\[[^\\[\\]]*\\])+(\\](\\s*[+-])?\\s*\\[)?)+\\]/g;\nvar rxOperandTransclusion = /\\{\\{([^\\{\\}]+)\\}\\}/g;\nvar rxDatumIsTransclusion = /^\\s*\\{\\{([^\\{\\}]+)\\}\\}\\s*$/;\nvar rxOperandVariable = /<<([^<>]+)>>/g;\nvar rxDatumIsVariable = /^\\s*<<[^<>]+>>\\s*$/;\nvar rxCellName = /\\$?([A-Z]{1,2})\\$?([0-9]+)/g;\nvar rxCellRange = /\\$?([A-Z]{1,2})\\$?([0-9]+):\\$?([A-Z]{1,2})\\$?([0-9]+)/g;\nvar rxIdentifier = /[_a-zA-Z][_a-zA-Z0-9]*/g;\nvar rxKeyword = /(function|let|for|foreach|if|then|else|while|do|this|self|currentTiddler)/gi;\n\nvar rxUnsignedDecimal = /((\\d+(\\.\\d*)?)|(\\.\\d+))/g;\nvar rxDecimal = /[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))/g;\nvar rxDatumIsDecimal = /^\\s*[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))\\s*$/;\n\nvar rxDate = /\\d{2,4}-\\d{2}-\\d{2}(\\s*\\d{1,2}:\\d{2}(:\\d{2}(.\\d+)?)?)?/g;\nvar rxDatumIsDate = /^\\s*\\d{2,4}-\\d{2}-\\d{2}(\\s*\\d{1,2}:\\d{2}(:\\d{2}(.\\d{3})?)?)?\\s*$/;\nvar rxRegex = /\\/((?:[^\\\\\\/\\[]|\\[(?:[^\\]]|\\\\\\])*\\]|\\\\.)+)\\/([a-z]*)/g;\nvar rxDatumIsRegex = /^\\s*\\/((?:[^\\\\\\/\\[]|\\[(?:[^\\]]|\\\\\\])*\\]|\\\\.)+)\\/([a-z]*)\\s*$/;\nvar rxDatumIsTwDate = /^([0-9]{4})(1[0-2]|0[1-9])(3[01]|[12][0-9]|0[1-9])(2[0-3]|[01][0-9])([0-5][0-9])([0-5][0-9])([0-9]{3})?$/;\nvar rxDateFragment = /\\d+/g;\n\nvar rxString = /(\"(\\\\.|[^\"\\\\])*\"|'(\\\\.|[^'\\\\])*')/g;\nvar rxEscapeSequence = /\\\\([a-tv-z0\"'\\\\]|u[a-fA-F0-9]{0,4}|$)/g;\n\nvar formulaFunctions = null;\nvar operatorsUnaryPre = null;\nvar operatorsUnaryPost = null;\nvar operatorsBinary = null;\nvar operatorsTernary = null;\n\nfunction Parser(src)\n{\n\tthis.src = src;\n\tthis.pos = 0;\n\tthis.end = src.length;\n\tthis.locals = {};\n\tthis.localStack = [];\n\tthis.assignStack = [];\n}\nParser.prototype.getChar = function()\n{\n\treturn this.src.charAt(this.pos);\n};\nParser.prototype.nextGlyph = function()\n{\n\tthis.skipInert();\n\tif (this.pos >= this.end) return '';\n\t++this.pos;\n\treturn this.src.charAt(this.pos-1);\n};\nParser.prototype.remaining = function()\n{\n\treturn this.src.substring(this.pos, this.end);\n};\nParser.prototype.nextToken = function()\n{\n\tthis.skipInert();\n\trxNotWhitespace.lastIndex = this.pos;\n\trxNotWhitespace.test(this.src);\n\treturn this.src.substring(this.pos, rxNotWhitespace.lastIndex);\n};\nParser.prototype.match_here = function(regex)\n{\n\t// TODO this is doing much more work than is necessary\n\tregex.lastIndex = this.pos;\n\tvar result = regex.exec(this.src);\n\tif (!result || result.index != this.pos || result.index+result[0].length > this.end) return null;\n\tthis.pos = regex.lastIndex;\n\treturn result;\n};\nParser.prototype.skipInert = function()\n{\n\trxSkipInert.lastIndex = this.pos;\n\trxSkipInert.test(this.src);\n\tthis.pos = Math.min(rxSkipInert.lastIndex, this.end);\n};\n\n// Push a new set of local variables onto the parser's stack.\nParser.prototype.pushLocals = function(assigns) {\n\tvar id;\n\tvar newLocals = {};\n\tthis.localStack.push(this.locals); for (id in this.locals) newLocals[id] = 0;\n\tthis.assignStack.push(assigns); for (id in assigns) newLocals[id] = 0;\n\tthis.locals = newLocals;\n};\n\n// Pop the last set of local variables off the parser's stack and return usage-counts.\nParser.prototype.popLocals = function() {\n\tvar id, count, usage = {captures: {}, assigns: {}},\n\t\tassigns = this.assignStack.pop(),\n\t\toldLocals = this.localStack.pop();\n\tfor (id in this.locals) {\n\t\tcount = this.locals[id];\n\t\tif (count > 0) {\n\t\t\tif (assigns[id]) {\n\t\t\t\tusage.assigns[id] = count;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tusage.captures[id] = count;\n\t\t\t\toldLocals[id] += count;\n\t\t\t}\n\t\t}\n\t}\n\tthis.locals = oldLocals;\n\treturn usage;\n};\n\nvar initialize = function() {\n\tformulaFunctions = {};\n\tvar operators = {};\n\t$tw.modules.applyMethods(\"formula-function\", formulaFunctions);\n\t$tw.modules.applyMethods(\"formula-operator\", operators);\n\n\toperatorsUnaryPre = {};\n\toperatorsUnaryPost = {};\n\toperatorsBinary = {}; //{}; //{plus: {arity: 2, precedence: 10, operator: \"+\", function: \"add\"}};\n\toperatorsTernary = {};\n\tfor (var opName in operators)\n\t{\n\t\tvar op = operators[opName];\n\n\t\t// Bind the associated function. \n\t\tvar func = formulaFunctions[op.function];\n\t\tif (!func) continue;\n\t\top.func_bind = func;\n\n\t\t// Sort the op by arity and position.\n\t\tswitch (op.arity)\n\t\t{\n\t\tcase 2: operatorsBinary [opName] = op; break;\n\t\tcase 3: operatorsTernary [opName] = op; break;\n\t\tcase 1:\n\t\t\tswitch (op.position)\n\t\t\t{\n\t\t\t\tcase \"pre\": operatorsUnaryPre [opName] = op; break;\n\t\t\t\tcase \"post\": operatorsUnaryPost[opName] = op; break;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n};\n\n\nexports.compileExpression = function(expression) {\n\n\t// Create a parser and process the formula as an expression.\n\tvar parser = new Parser(expression);\n\n\tvar operand = buildExpression(parser);\n\n\treturn operand;\n};\n\nexports.compileDatum = function(datum) {\n\t\n\tvar parser, term;\n\n\t// Short-hand formula\n\tif (datum.charAt(0) == \"=\") {\n\t\tparser = new Parser(datum);\n\t\tparser.pos = 1;\n\t\treturn buildExpression(parser);\n\t}\n\n\t// Could be a TiddlyWiki date?\n\tif (rxDatumIsTwDate.test(datum)) {\n\t\treturn new Nodes.Date($tw.utils.parseDate(datum));\n\t}\n\n\t// Could be a number?\n\tif (rxDatumIsDecimal.test(datum)) {\n\t\t// Treat as a number constant\n\t\treturn new Nodes.Number(Number(datum));\n\t}\n\n\t// Could be a formula?\n\tif (rxDatumIsFormula.test(datum)) {\n\t\t// Parse contents as a formula\n\t\tparser = new Parser(datum);\n\t\tparser.pos = datum.indexOf(\"=\")+1;\n\t\tparser.end = datum.lastIndexOf(\"=\");\n\t\treturn buildExpression(parser);\n\t}\n\n\t// Could be a transclusion or variable?\n\tif (rxDatumIsTransclusion.test(datum) ||\n\t\t\trxDatumIsVariable.test(datum)) {\n\t\t// Defer to the operand parser...\n\t\tparser = new Parser(datum);\n\t\treturn buildOperand(parser);\n\t}\n\n\t// Booleans?\n\tif (rxDatumIsFalse.test(datum)) return new Nodes.Bool(false);\n\tif (rxDatumIsTrue .test(datum)) return new Nodes.Bool(true);\n\n\t// Date?\n\tif (rxDatumIsDate.test(datum))\n\t{\n\t\trxDateFragment.lastIndex = 0;\n\t\tvar parts = [];\n\t\twhile (true)\n\t\t{\n\t\t\tvar res = rxDateFragment.exec(datum);\n\t\t\tif (!res) break;\n\t\t\tparts.push(parseInt(res[0]));\n\t\t}\n\t\tif (parts.length)\n\t\t{\n\t\t\treturn new Nodes.Date(new Date(\n\t\t\t\tparts[0], (parts[1] || 1)-1, parts[2] || 1,\n\t\t\t\tparts[3] || 0, parts[4] || 0, parts[5] || 0, parts[6] || 0));\n\t\t}\n\t}\n\n\t// Regex?\n\tif ((term = rxDatumIsRegex.exec(datum))) {\n\t\treturn new Nodes.Regex(new RegExp(term[1].replace(\"\\\\/\", \"/\"), term[2]));\n\t}\n\n\t// Otherwise, treat as a string constant\n\treturn new Nodes.Text(datum);\n};\n\nexports.compileFormula = function(formulaString)\n{\n\t// Process the formula string into a root operand\n\ttry {\n\t\treturn exports.compileExpression(formulaString);\n\t}\n\tcatch (err) {\n\t\tthrow \"CompileError: \" + err;\n\t}\n};\n\n\n// Compile an operator\nfunction parseOperator(parser, operatorGroup) {\n\n\t// Skip more whitespace\n\tparser.skipInert();\n\n\tvar result = null;\n\n\t// Find the longest operator matching the current text.\n\tfor (var opName in operatorGroup)\n\t{\n\t\tvar op = operatorGroup[opName];\n\t\tif (parser.src.substr(parser.pos, op.operator.length) == op.operator\n\t\t\t&& parser.pos+op.operator.length <= parser.end)\n\t\t{\n\t\t\tif (!result || result.operator.length < op.operator.length) result = op;\n\t\t}\n\t}\n\n\tif (result) parser.pos += result.operator.length;\n\n\treturn result;\n}\n\n// Parse a text reference. This function is pased on $tw.utils.getTextReference.\nfunction buildTextReference(textReference) {\n\tvar tr = $tw.utils.parseTextReference(textReference);\n\tvar title;\n\tif (tr.title) title = new Nodes.Text(tr.title);\n\telse title = new Nodes.Variable(new Nodes.Text(\"currentTiddler\"));\n\tif (tr.field) {\n\t\tif (tr.field == \"title\") {\n\t\t\treturn title;\n\t\t}\n\t\telse {\n\t\t\treturn new Nodes.TranscludeField(title, new Nodes.Text(tr.field));\n\t\t}\n\t}\n\telse if (tr.index) {\n\t\treturn new Nodes.TranscludeIndex(title, new Nodes.Text(tr.index));\n\t}\n\telse {\n\t\treturn new Nodes.TranscludeText(title);\n\t}\n}\n\n// Parse a formula.\nfunction buildExpression(parser, nested) {\n\t\n\t// Make sure math functions are initialized\n\tif (!formulaFunctions) initialize();\n\n\tparser.skipInert();\n\n\t// Expression compiler state\n\tvar operands = [];\n\tvar operators = [];\n\tvar precedences = [];\n\tvar operand = null, callArgs;\n\t\n\t// Unary stacking function\n\tvar applyUnary = function(unary) {\n\t\toperand = new Nodes.CallJS(unary.func_bind, [operand]);\n\t};\n\n\twhile (true)\n\t{\n\t\tvar unaries = [];\n\n\t\t// Prefix operators\n\t\twhile (true)\n\t\t{\n\t\t\tvar prefix = parseOperator(parser, operatorsUnaryPre);\n\t\t\tif (prefix) unaries.unshift(prefix);\n\t\t\telse break;\n\t\t}\n\n\t\t// Grab the operand\n\t\toperand = buildOperand(parser);\n\n\t\t// Missing operand is an error\n\t\tif (operand === null)\n\t\t{\n\t\t\tvar token = parser.nextToken();\n\t\t\tif (token && token[0] != \")\" && token[0] != \",\")\n\t\t\t\tthrow \"invalid operand \\\"\" + token + \"\\\"\";\n\t\t\telse if (operators.length)\n\t\t\t\tthrow \"missing operand after \\\"\" + operators[operators.length-1].operator + \"\\\"\";\n\t\t\telse throw \"empty expression\";\n\t\t}\n\n\t\t// Check for a function call (precedes all operators).\n\t\tcallArgs = buildArguments(parser);\n\t\tif (callArgs) operand = new Nodes.CallFunc(operand, callArgs);\n\n\t\t// Postfix operators\n\t\twhile (true)\n\t\t{\n\t\t\tvar postfix = parseOperator(parser, operatorsUnaryPost);\n\t\t\tif (postfix) unaries.push(postfix);\n\t\t\telse break;\n\t\t}\n\n\t\tunaries.forEach(applyUnary);\n\n\t\t// Operand is complete.\n\t\toperands.push(operand);\n\n\t\t// Infix operators\n\t\tvar operator = parseOperator(parser, operatorsBinary);\n\n\t\t// Missing operator ends the expression\n\t\tif (operator === null) break;\n\n\t\t// Add the operator and its precedence level.\n\t\toperators.push(operator);\n\t\tvar precedence = operator.precedence;\n\t\tif (precedences.indexOf(precedence || 0) == -1) precedences.push(precedence);\n\t}\n\n\t// Sanity check\n\tif (operands.length != operators.length+1)\n\t\tthrow \"internal error: operator/operand parsing inconsistency\";\n\n\t// Resolve operators by precedence\n\tprecedences.sort(function(a,b) {return (a>b)?-1:1;});\n\n\tfor (var j = 0; j < precedences.length; ++j)\n\t{\n\t\tvar prec = precedences[j];\n\t\tfor (var i = 0; i < operators.length; )\n\t\t{\n\t\t\t// Process only operators at the current precedence level.\n\t\t\tvar op = operators[i];\n\t\t\tif (op.precedence != prec) {++i; continue;}\n\n\t\t\t// Collapse the previous and next operands with this operator.\n\t\t\toperands[i] = new Nodes.CallJS(op.func_bind, [operands[i], operands[i+1]]);\n\t\t\toperators.splice(i, 1);\n\t\t\toperands.splice(i+1, 1);\n\t\t}\n\t}\n\n\t// Sanity check\n\tif (operators.length !== 0 || operands.length != 1)\n\t\tthrow \"internal error: resoving failed; \" + operands.length + \" operands and \" + operators.length + \" operators remain\";\n\n\t// For non-nested expressions, throw if any tokens remain.\n\tif (!nested)\n\t{\n\t\tparser.skipInert();\n\n\t\tif (parser.pos < parser.end)\n\t\t{\n\t\t\tthrow \"expected operator, got \\\"\" + parser.nextToken() + \"\\\"\";\n\t\t}\n\t}\n\t\n\t// Otherwise return the operand directly\n\treturn operands[0];\n}\n\n// Compile a list expression, which could be function arguments or an array...\nfunction buildCommaList(parser, braces, afterHint) {\n\n\t// Is an open-brace present?\n\tparser.skipInert();\n\tif (parser.getChar() !== braces[0]) return null;\n\t++parser.pos;\n\n\t// Zero arguments?\n\tparser.skipInert();\n\tif (parser.getChar() === braces[1]) {++parser.pos; return [];}\n\t\n\tvar nodeList = [];\n\n\twhile (true)\n\t{\n\t\t// Compile an expression.\n\t\tnodeList.push(buildExpression(parser, true));\n\n\t\t// Expect close-brace or , after argument.\n\t\tvar char = parser.nextGlyph();\n\t\tif (char === braces[1]) break;\n\t\tif (char !== \",\") throw \"Expect ',' or '\" + braces[1] + \"' after \" + afterHint;\n\t}\n\n\treturn nodeList;\n}\n\n// Build an argument list.\nfunction buildArguments(parser) {\n\treturn buildCommaList(parser, \"()\", \"function argument.\");\n}\n\n// Build an array literal.\nfunction buildArrayLiteral(parser) {\n\tvar array = buildCommaList(parser, \"{}\", \"array element (use {{double braces}} for transclusions).\");\n\tif (!array) throw \"Expect '{' to begin array literal.\";\n\treturn array;\n}\n\n// Build a let or foreach expression (parser starts after the keyword)\nfunction buildLetExpression(parser) {\n\n\tif (parser.nextGlyph() !== \"(\") throw \"Expect '(' after LET.\";\n\n\t// Gradually push locals.\n\tvar assigns = {}, id, c;\n\tparser.pushLocals(assigns);\n\twhile (true) {\n\t\t// Look for a name (identifier)\n\t\tparser.skipInert();\n\t\tid = parser.match_here(rxIdentifier);\n\t\tif (!id) throw \"Expected name in LET assignment, got '\" + parser.nextToken() + \"'.\";\n\t\tid = id[0];\n\t\tif (rxKeyword.test(id)) throw \"Illegal name for LET: \" + id;\n\t\t\n\t\t// Look for an equals, then an expression.\n\t\tif (parser.nextGlyph() !== '=') throw \"Expect '=' after LET value.\";\n\n\t\t// Build the expression... Each let can use the ones before it.\n\t\ttry {\n\t\t\tassigns[id] = buildExpression(parser, true);\n\t\t}\n\t\tcatch (err) {\n\t\t\tthrow \"compiling LET '\" + id + \"': \" + err;\n\t\t}\n\t\tparser.locals[id] = 0;\n\n\t\t// Expect ) or , after argument.\n\t\tvar char = parser.nextGlyph();\n\t\tif (char == \")\") break;\n\t\tif (char != \",\") throw \"Expect ',' or ')' after LET assignment.\";\n\t}\n\n\tif (parser.nextGlyph() !== \":\") throw \"Expect ':' after LET assignment list.\";\n\tif (parser.nextGlyph() !== \"(\") throw \"Expect LET expression in parentheses after ':'.\";\n\n\t// Compile the body expression, with additional locals.\n\tvar body = buildExpression(parser, true);\n\tvar usage = parser.popLocals();\n\n\t// TODO could examine usage.assigns and letLocals to see if any values were unused.\n\n\tif (parser.nextGlyph() !== \")\") throw \"Expect ')' after LET expression.\";\n\n\treturn new Nodes.LetVars(assigns,body);\n}\n\n// Build a function (parser starts after the keyword \"function\")\nfunction buildFunction(parser) {\n\t\n\tvar srcBegin = parser.pos;\n\n\tif (parser.nextGlyph() !== \"(\") throw \"Expect '(' after 'function'.\";\n\n\tparser.skipInert();\n\n\t// Build the parameter list, if any.\n\tvar params = [], assigns = {};\n\tif (parser.getChar() === \")\") {++parser.pos;}\n\telse while (true)\n\t{\n\t\t// Get a parameter name (identifier).\n\t\tvar param = parser.match_here(rxIdentifier);\n\t\tif (!param) throw \"Expect list of parameter names after 'function'.\";\n\t\tparam = param[0];\n\t\tif (rxKeyword.test(param)) throw \"Illegal parameter name: \" + param;\n\t\tparams.push(param);\n\t\tif (assigns[param]) throw \"Parameter name used twice: \" + param;\n\t\tassigns[param] = true;\n\n\t\t// Expect ) or , after argument.\n\t\tvar char = parser.nextGlyph();\n\t\tif (char == \")\") break;\n\t\tif (char != \",\") throw \"Expect ',' or ')' after function parameter name.\";\n\n\t\t// Skip inert stuff\n\t\tparser.skipInert();\n\t}\n\n\tif (parser.nextGlyph() !== \":\") throw \"Expect ':' after function parameter list.\";\n\tif (parser.nextGlyph() !== \"(\") throw \"Expect function body beginning with '(' after ':'.\";\n\n\t// Compile the body expression, with parameters as locals. Closures are NOT currently supported.\n\tparser.pushLocals(assigns);\n\tvar body = buildExpression(parser, true);\n\tvar usage = parser.popLocals();\n\tvar captures = usage.captures;\n\n\tif (parser.nextGlyph() !== \")\") throw \"Expect ')' after function body.\";\n\n\t// Create the function object (must be called with this = context)\n\tvar func = function() {\n\t\tvar locals = Object.assign({}, func.captured || {});\n\t\tfor (var i = 0; i < arguments.length; ++i) locals[params[i]] = arguments[i];\n\t\treturn body.compute(this.let(locals));\n\t};\n\t//func.params = params;\n\tfunc.min_args = params.length;\n\tfunc.max_args = params.length;\n\tfunc.formulaSrc = parser.src.substring(srcBegin, parser.pos);\n\treturn new Nodes.Function(func, captures);\n}\n\n// Compile an operand into a function returning the operand value.\nfunction buildOperand(parser) {\n\n\tvar term;\n\t\n\t// Skip whitespace & comments\n\tparser.skipInert();\n\n\tif (parser.pos == parser.end) return null;\n\n\tvar char = parser.getChar();\n\n\tif (char.match(/[0-9\\.+]/i))\n\t{\n\t\t// Number constant\n\t\tterm = parser.match_here(rxDecimal);\n\t\tif (term) return new Nodes.Number(Number(term[0]));\n\t\tthrow \"Invalid number: \" + parser.nextToken();\n\t}\n\telse if (char.match(/[$a-z_]/i))\n\t{\n\t\t// Cell range?\n\t\tterm = parser.match_here(rxCellRange);\n\t\tif (term) throw \"Cell ranges are currently unsupported!\";\n\n\t\t// Cell name?\n\t\tterm = parser.match_here(rxCellName);\n\t\tif (term) return new Nodes.Datum(\n\t\t\tnew Nodes.TranscludeIndex(\n\t\t\t\tnew Nodes.Variable(new Nodes.Text(\"currentTiddler\")),\n\t\t\t\tnew Nodes.Text(term[1]+term[2])));\n\n\t\t// Identifier?\n\t\tterm = parser.match_here(rxIdentifier);\n\t\tif (!term) return null;\n\n\t\tif (parser.locals[term] != undefined)\n\t\t{\n\t\t\t// Scoped variable. We count up references to each.\n\t\t\t++parser.locals[term];\n\t\t\treturn new Nodes.ScopeVar(term[0]);\n\t\t}\n\n\t\tvar termLower = term[0].toLowerCase();\n\t\tswitch (termLower)\n\t\t{\n\t\tcase \"let\":\n\t\t\t// LET expression.\n\t\t\treturn buildLetExpression(parser);\n\n\t\tcase \"function\":\n\t\t\t// Function declaration.\n\t\t\treturn buildFunction(parser);\n\n\t\tdefault:\n\t\t\t// Function call.\n\t\t\tvar func = formulaFunctions[termLower];\n\n\t\t\tif (!func) throw \"unknown function: \" + term[0];\n\n\t\t\tvar args = buildArguments(parser);\n\n\t\t\t// Omitting arguments is only OK for constant functions\n\t\t\tif (args === null)\n\t\t\t{\n\t\t\t\tif (!func.isConstant) throw \"Expected '(' after \" + term[0];\n\t\t\t\targs = [];\n\t\t\t}\n\n\t\t\tif (func instanceof Function) {\n\t\t\t\t// Check parameter count\n\t\t\t\tif (args.length > func.length && !func.variadic)\n\t\t\t\t\tthrow \"too many arguments for \" + term[0] + \" (requires \" + func.length + \")\";\n\t\t\t\tif (args.length < func.length)\n\t\t\t\t\tthrow \"too few arguments for \" + term[0] + (func.variadic?\" (min \":\" (requires \") + func.length + \")\";\n\t\t\t}\n\t\t\telse if (func.select || func.construct) {\n\t\t\t\t// Check argument range\n\t\t\t\tif (func.max_args && args.length > func.max_args)\n\t\t\t\t\tthrow \"too many arguments for \" + term[0] + \" (max \" + func.max_args + \")\";\n\t\t\t\tif (func.min_args && args.length < func.min_args)\n\t\t\t\t\tthrow \"too few arguments for \" + term[0] + \" (min \" + func.min_args + \")\";\n\t\t\t\t\n\t\t\t\t// If a construct function is present, use it to generate an operand.\n\t\t\t\tif (func.construct) return func.construct(args);\n\n\t\t\t\t// If a select function is present, prepare to bind it with a CallJS.\n\t\t\t\tfunc = func.select(args);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow \"Function \" + term[0] + \" seems to be unusable.\";\n\t\t\t}\n\n\t\t\treturn new Nodes.CallJS(func, args);\n\t\t}\n\t}\n\telse switch (char)\n\t{\n\tcase \"(\": // Parenthesized expression\n\t\t++parser.pos;\n\t\tvar parentheses = buildExpression(parser, true);\n\t\tparser.skipInert();\n\t\tif (parser.getChar() !== \")\")\n\t\t{\n\t\t\tif (parser.pos == parser.end) throw \"missing ')' at end of formula\";\n\t\t\telse throw \"expected ')', got \\\"\" + parser.nextToken() + \"\\\"\";\n\t\t}\n\t\t++parser.pos;\n\t\treturn parentheses;\n\n\tcase \"'\":\n\tcase \"\\\"\": // String constant\n\t\tterm = parser.match_here(rxString);\n\t\tif (!term) throw \"Invalid string: \" + parser.nextToken();\n\t\tterm = term[0].substr(1, term[0].length-2);\n\t\tterm = term.replace(rxEscapeSequence, function(esc) {\n\t\t\tswitch (esc.charAt(1)) {\n\t\t\t\tcase '\"': return '\"';\n\t\t\t\tcase '\\'': return '\\'';\n\t\t\t\tcase '\\\\': return '\\\\';\n\t\t\t\tcase 'n': return '\\n';\n\t\t\t\tcase 'r': return '\\r';\n\t\t\t\tcase 'b': return '\\b';\n\t\t\t\tcase 'f': return '\\f';\n\t\t\t\tcase 't': return '\\t';\n\t\t\t\tcase 'v': return '\\v';\n\t\t\t\tcase '0': return '\\0';\n\t\t\t\tcase 'u':\n\t\t\t\t\tif (esc.length < 6) throw \"Invalid escape sequence: \" + esc;\n\t\t\t\t\treturn String.fromCharCode(parseInt(esc.substr(2), 16));\n\t\t\t\tdefault: throw \"Invalid escape sequence: \" + esc;\n\t\t\t}\n\t\t});\n\t\treturn new Nodes.Text(term);\n\n\tcase \"[\": // Filter operand\n\t\tterm = parser.match_here(rxOperandFilter);\n\t\tif (term) return new Nodes.Filter(term[0]);\n\t\tbreak;\n\n\tcase \"{\": // Transclusion or array\n\t\t++parser.pos;\n\t\tchar = parser.getChar();\n\t\t--parser.pos;\n\t\tif (char == '{') {\n\t\t\t// Possible transclusion operand\n\t\t\tterm = parser.match_here(rxOperandTransclusion);\n\t\t\tif (term) return new Nodes.Datum(buildTextReference(term[1]));\n\t\t}\n\t\t// Array operand\n\t\treturn new Nodes.ArrayDef(buildArrayLiteral(parser));\n\n\tcase \"<\": // Variable operand\n\t\tterm = parser.match_here(rxOperandVariable);\n\t\tif (term) return new Nodes.Datum(\n\t\t\tnew Nodes.Variable(new Nodes.Text(term[1])));\n\t\tbreak;\n\n\tcase \"/\": // Regular expression?\n\t\tterm = parser.match_here(rxRegex);\n\t\tif (term) return new Nodes.Regex(new RegExp(term[1].replace(\"\\\\/\", \"/\"), term[2]));\n\t\t\tbreak;\n\t}\n\n\t// Didn't recognize the operand\n\treturn null;\n}\n\n})();\n",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/compile.js",
"tags": "",
"module-type": "library",
"modified": "20171211181652443",
"description": "",
"created": "20171210195223539"
},
"$:/plugins/ebalster/formula/compute.js": {
"text": "(function(){\n\n\"use strict\";\n\nvar Nodes = require(\"$:/plugins/ebalster/formula/nodes.js\");\nvar Compiler = require(\"$:/plugins/ebalster/formula/compile.js\");\nvar Coerce = require(\"$:/plugins/ebalster/formula/coerce.js\");\n\nvar Numeral = require(\"$:/plugins/ebalster/formula/lib/numeral.js\");\n\n// TiddlyWiki array format\nfunction arrayFormatTW(arr,ctx) {\n\tvar result = \"\";\n\tfor (var i = 0; i < arr.length; ++i) {\n\t\tvar part = Coerce.ToText(arr[i],ctx);\n\t\tif (i && part.length) result += \" \";\n\t\tif (part.indexOf(/\\s/g) >= 0) result += \"[[\" + part + \"]]\";\n\t\telse result += part;\n\t}\n\treturn result;\n}\n\n// Number format functions...\n\n// SANE number formatting: if we find five consecutive 9s or 0s after the decimal point, round them off.\nfunction NumberStringSane(n) {\n\tvar s = String(n);\n\tvar parse = /^(0\\.0*[1-9]\\d*?|\\d*\\.\\d*?)(0{5}\\d*|9{5}\\d*)(|e[+-]\\d*)$/.exec(s);\n\tif (!parse) return s;\n\tvar kept = parse[1], exp = parse[3];\n\tvar end = kept.slice(-1);\n\tif (parse[2][0] === '0') return ((end === '.') ? kept.substr(0,kept.length-1) : kept) + exp;\n\tif (end === '.') return (Number(kept.substr(0,kept.length-1))+1) + exp;\n\treturn kept.substr(0,kept.length-1) + (Number(end)+1) + exp;\n}\nvar numeralFormat = function(fmt) {return function(num) {return Numeral(num).format(fmt);};};\nvar numeralFormatPrec = function(fmt,digs) {return function(num) {return Numeral(num.toPrecision(digs)).format(fmt);};};\nvar numberFormatFixed = function(prec) {return function(num) {return num.toFixed (prec);};};\nvar numberFormatPrec = function(digs) {return function(num) {return num.toPrecision(digs);};};\nvar numberFormatSelect = function(settings)\n{\n\tif (settings.precision == \"true\" || settings.precision > 100) return String;\n\tif (typeof settings.numberFormat == \"string\") {\n\t\t// Use numeral\n\t\treturn isNaN(settings.precision) ?\n\t\t\tnumeralFormat (settings.numberFormat) :\n\t\t\tnumeralFormatPrec(settings.numberFormat, settings.precision);\n\t}\n\tif (!isNaN(settings.fixed)) return numberFormatFixed(settings.fixed);\n\tif (!isNaN(settings.precision)) return numberFormatPrec (settings.precision);\n\treturn NumberStringSane;\n\t// return String;\n};\n\nexports.computeFormula = function(compiledFormula, widget, formatOptions, debug) {\n\t\n\tvar value, context;\n\t\n\tformatOptions = formatOptions || {};\n\n\tvar dateFormat = formatOptions.dateFormat || \"0hh:0mm, DDth MMM YYYY\";\n\n\t// Specify format. These are all required!\n\tvar formats = {\n\t\tnumber: numberFormatSelect(formatOptions),\n\t\tdate: function(date) {return $tw.utils.formatDateString(date, dateFormat);},\n\t\tarray: arrayFormatTW,\n\t};\n\n\tcontext = new Nodes.Context(widget, formats);\n\n\t// Compute a value from the root node of the compiled formula.\n\ttry {\n\t\tvalue = compiledFormula.computeText(context);\n\t}\n\tcatch (err) {\n\t\tthrow \"ComputeError: \" + String(err) + (err.fileName || \"\") + (err.lineNumber || \"\")\n\t\t\t+ (debug ? \"\\nNodes: \" + JSON.stringify(compiledFormula) : \"\");\n\t}\n\n\t// Format the root node as a string.\n\tif (debug) return value + \"\\n - Val:\" + String(value) + \", Op:\" + compiledFormula.name;\n\telse return value;\n};\n\nexports.evalFormula = function(formulaString, widget, formatOptions, debug) {\n\t\n\tvar compiledFormula;\n\n\t// Compile the formula\n\ttry {\n\t\tcompiledFormula = Compiler.compileExpression(formulaString);\n\t}\n\tcatch (err) {\n\t\tthrow \"CompileError: \" + String(err);\n\t}\n\n\t// Compute the formula\n\treturn exports.computeFormula(compiledFormula, widget, formatOptions, debug);\n};\n\n})();\n",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/compute.js",
"tags": "",
"module-type": "library",
"modified": "20180114170348576",
"description": "",
"created": "20180114170308058"
},
"$:/plugins/ebalster/formula/filters/range.js": {
"text": "/*\\\ntitle: $:/plugins/ebalster/formula/filters/range.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for generating a numeric range.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.range = function(source,operator,options) {\n\tvar results = [];\n\n\t// Split the operand into numbers delimited by these symbols\n\tvar parts = operator.operand.split(/[,:;]/g), beg, end, inc, i, fixed = 0;\n\n\tfor (i = 0; i < parts.length; ++i) {\n\t\t// Validate real number\n\t\tif (!/^\\s*[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))\\s*$/.test(parts[i]))\n\t\t\treturn [\"range: bad number \\\"\"+parts[i]+\"\\\"\"];\n\n\t\t// Count digits; the most precise number determines decimal places in output.\n\t\tvar frac = /\\.\\d+/.exec(parts[i]);\n\t\tif (frac) fixed = Math.max(fixed, frac[0].length-1);\n\t\t\n\t\tparts[i] = parseFloat(parts[i]);\n\t}\n\n\tswitch (parts.length) {\n\t\tcase 1:\n\t\t\tbeg = 0;\n\t\t\tend = parts[0];\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = Math.abs(parts[2]);\n\t\t\tbreak;\n\t}\n\n\tif (inc === 0) return [\"range: increment 0 causes infinite loop\"];\n\n\t// May need to count backwards\n\tvar direction = ((end<beg) ? -1 : 1);\n\tinc *= direction;\n\n\t// Estimate number of resulting elements\n\tif ((end-beg)/inc > 10000) return [\"range: too many steps (over 10K)\"];\n\n\t// Avoid rounding error on last step\n\tend += direction * 0.5 * Math.pow(0.1, fixed);\n\n\tvar safety = 10010;\n\n\t// Enumerate the range\n\tif (end<beg) {for (i = beg; i > end; i += inc) {results.push(i.toFixed(fixed)); if (--safety<0) break;}}\n\telse {for (i = beg; i < end; i += inc) {results.push(i.toFixed(fixed)); if (--safety<0) break;}}\n\n\tif (safety<0) return [\"range: unexpectedly large output\"];\n\n\t// Reverse?\n\tif (operator.prefix === \"!\") results.reverse();\n\n\treturn results;\n};\n\n})();\n",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/filters/range.js",
"tags": "",
"module-type": "filteroperator",
"modified": "20171221181907646",
"created": "20171221181646560"
},
"$:/plugins/ebalster/formula/functions/arithmetic.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\n// Unary sign operators\nexports.uplus = function(a) {return a;};\nexports.uminus = function(a) {return -a;};\nexports.uminus.inCast = 'N';\n\n// Add\nexports.add = function(a, b) {return a + b;};\nexports.add.inCast = 'NN';\nexports.sub = function(a, b) {return a - b;};\nexports.sub.inCast = 'NN';\n\n// Multiply\nexports.mul = function(a, b) {return a * b;};\nexports.mul.inCast = 'NN';\nexports.div = function(a, b) {return a / b;};\nexports.div.inCast = 'NN';\n\n// Percent -- TODO make this a different value-type\nexports.percent = function(a) {return a / 100;};\nexports.percent.inCast = 'N';\n\n\n// Aliases\nexports.subtract = exports.sub;\nexports.minus = exports.sub;\nexports.multiply = exports.mul;\nexports.divide = exports.div;\nexports.quotient = exports.div;\nexports.power = exports.pow;\n\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/functions/arithmetic.js",
"tags": "",
"module-type": "formula-function",
"modified": "20171212223526867",
"created": "20171211192843088"
},
"$:/plugins/ebalster/formula/functions/arrays.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\n// Array constructor function\nexports.array = function() {\n\treturn Array.prototype.slice.call(arguments);\n};\nexports.array.variadic = true;\n\n\nexports.nth = function(a, i) {\n\ti = Math.floor(i);\n\tif (i < 1 || i > a.length) return undefined;\n\treturn a[i-1];\n};\nexports.nth.inCast = 'AN';\n\nexports.first = function(a) {\n\tif (a.length) return a[0];\n\treturn undefined;\n};\nexports.first.inCast = 'A';\n\nexports.last = function(a) {\n\tif (a.length) return a[a.length-1];\n\treturn undefined;\n};\nexports.last.inCast = 'A';\n\n// MAP function\nexports.map = function(f, a) {\n\tif (f.min_args > 1 || f.max_args < 1) throw \"MAP requires single-argument function.\";\n\tvar result = [];\n\tvar func = f.bind(this);\n\tfor (var i = 0; i < a.length; ++i) result.push(func(a[i]));\n\treturn result;\n};\nexports.map.inCast = 'FA';\n\n\n/*\n\tCounting subroutines...\n\t\tcountA counts every non-array value\n\t\tcountS counts every non-array value but null, undefined and empty strings.\n*/\nfunction countS(a) {\n\tif (!(a instanceof Array)) return (a == null || a.length === 0) ? 0 : 1;\n\tvar n = 0;\n\tfor (var i = 0; i < a.length; ++i) n += countS(a[i]);\n\treturn n;\n}\nfunction countA(a) {\n\tif (!(a instanceof Array)) return 1;\n\tvar n = 0;\n\tfor (var i = 0; i < a.length; ++i) n += countA(a[i]);\n\treturn n;\n}\nfunction countS_multi() {\n\tvar n = 0;\n\tfor (var i = 0; i < arguments.length; ++i) n += countS(arguments[i]);\n\treturn n;\n}\nfunction countA_multi() {\n\tvar n = 0;\n\tfor (var i = 0; i < arguments.length; ++i) n += countA(arguments[i]);\n\treturn n;\n}\nexports.count =\n{\n\tmin_args : 1,\n\tselect : function(operands)\n\t{\n\t\tswitch (operands)\n\t\t{\n\t\tcase 1: return countS;\n\t\tdefault: return countS_multi;\n\t\t}\n\t}\n};\nexports.counta =\n{\n\tmin_args : 1,\n\tselect : function(operands)\n\t{\n\t\tswitch (operands)\n\t\t{\n\t\tcase 1: return countA;\n\t\tdefault: return countA_multi;\n\t\t}\n\t}\n};\n\n// COUNTA function, currently counts everything\nexports.counta = exports.count;\n\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/functions/arrays.js",
"tags": "",
"module-type": "formula-function",
"modified": "20171219014910148",
"created": "20171219014903147"
},
"$:/plugins/ebalster/formula/functions/compare.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\n// Equality\nexports.eq = function(a, b) {return a == b;};\nexports.ne = function(a, b) {return a != b;};\n\n// Inequality\nexports.gt = function(a, b) {return a > b;};\nexports.gte = function(a, b) {return a >= b;};\nexports.lt = function(a, b) {return a < b;};\nexports.lte = function(a, b) {return a <= b;};\n\n\n// Aliases\nexports.equal = exports.eq;\nexports.not_equal = exports.ne;\nexports.greater = exports.gt;\nexports.greater_or_equal = exports.gte;\nexports.less = exports.lt;\nexports.less_or_equal = exports.lte;\n\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/functions/compare.js",
"tags": "",
"module-type": "formula-function",
"modified": "20171214050803365",
"created": "20171214050022626"
},
"$:/plugins/ebalster/formula/functions/datetime.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nvar MS_PER_DAY = 86400000;\nvar MS_PER_HOUR = 3600000;\nvar MS_PER_MINUTE = 60000;\nvar MS_PER_SECOND = 1000;\n\nvar UNIX_EPOCH_JULIAN_DAY = 2440587;\n\n\n/*!\n * isoWeekNum from pikaday <https://github.com/actano/Pikaday>\n */\nfunction isoWeekOfYear(date, dayInFirstWeek) {\n\tdayInFirstWeek = dayInFirstWeek || 4;\n\tdate = date instanceof Date ? date : new Date();\n\tdate.setHours(0, 0, 0, 0);\n\tvar yearDay = date.getDate(),\n\t\tweekDay = date.getDay(),\n\t\tdayShift = dayInFirstWeek - 1, // counting starts at 0\n\t\tprevWeekDay = function(day) { return (day + 7 - 1) % 7; };\n\tdate.setDate(yearDay + dayShift - prevWeekDay(weekDay));\n\tvar jan4th = new Date(date.getFullYear(), 0, dayInFirstWeek),\n\t\tdaysBetween = (date.getTime() - jan4th.getTime()) / MS_PER_DAY,\n\t\tweekNum = 1 + Math.round((daysBetween - dayShift + prevWeekDay(jan4th.getDay())) / 7);\n\treturn weekNum;\n}\nfunction isLeapYear(year) {\n\treturn year % 400 === 0 || (year % 100 !== 0 && year % 4 === 0);\n}\nfunction daysInYear(year) {\n\treturn isLeapYear(year) ? 366 : 365;\n}\nfunction daysInMonth(year, monthIndex) {\n\tswitch (monthIndex) {\n\tcase 0: case 2: case 4: case 6: case 7: case 9: case 11:return 31;\n\tcase 3: case 5: case 8: case 10: return 30;\n\tcase 1: return (isLeapYear(year) ? 29 : 28);\n\tdefault: throw \"days_in_month: invalid monthIndex: \" + monthIndex;\n\t}\n}\n\n// Utility: Add some months or years to a date\nfunction dateAddMonths(date, monthDiff, yearDiff) {\n\tyearDiff = yearDiff || 0;\n\tvar newMonth = date.getMonth() + Math.round(monthDiff);\n\tvar newYear = date.getFullYear() + Math.round(yearDiff);\n\n\tvar yearShift = ((newMonth < 0) ? -Math.floor(-(newMonth-11)/12) : Math.floor(newMonth/12));\n\tnewYear += yearShift;\n\tnewMonth -= 12*yearShift;\n\n\treturn new Date(newYear, newMonth,\n\t\tMath.min(date.getDate(), daysInMonth(newYear, newMonth)),\n\t\tdate.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n}\n\n// Utility: Get date difference in whole years and months\nfunction dateDelta(date1, date2) {\n\tif (date2.getTime() < date1.getTime())\n\t{\n\t\tvar d = dateDelta(date2, date1);\n\t\treturn {years: -d.years, months: -d.months};\n\t}\n\tvar dMonths = 12*(date2.getYear()-date1.getYear()) + (date2.getMonth()-date1.getMonth());\n\tif (date2.getDate() < date1.getDate()) dMonths -= 1;\n\tvar dYears = Math.floor(dMonths/12);\n\t//dMonths -= dYears*12;\n\t/*var dDays = (new Date(\n\t\tdate1.getFullYear()+dYears, date1.getMonth()+dMonths, date2.getDate(),\n\t\tdate2.getHours(), date2.getMinutes(), date2.getSeconds(), date2.getMilliseconds()\n\t\t).getTime() - date1.getTime()) / MS_PER_DAY;*/\n\treturn {years: dYears, months: dMonths};\n}\n\n\n// Get the current time\nexports.now = function() {return new Date(Date.now());};\n\n// Decompose dates\nexports.year = function(d) {return (d.getFullYear());};\nexports.year.inCast = 'D';\nexports.month = function(d) {return (d.getMonth()+1);};\nexports.month.inCast = 'D';\nexports.day = function(d) {return (d.getDate());};\nexports.day.inCast = 'D';\nexports.hour = function(d) {return (d.getHours());};\nexports.hour.inCast = 'D';\nexports.minute = function(d) {return (d.getMinutes());};\nexports.minute.inCast = 'D';\nexports.second = function(d) {return (d.getSeconds());};\nexports.second.inCast = 'D';\nexports.millisecond = function(d) {return (d.getMilliseconds());};\nexports.millisecond.inCast = 'D';\n\n// Week functions\nexports.weekday = function(d) {return (d.getDay()+1);};\nexports.weekday.inCast = 'D';\nexports.weeknum = function(d) {return (isoWeekOfYear(d, 1));};\nexports.weeknum.inCast = 'D';\nexports.isoweekday = function(d) {return ((d.getDay()+6) % 7 + 1);};\nexports.isoweekday.inCast = 'D';\nexports.isoweeknum = function(d) {return (isoWeekOfYear(d));};\nexports.isoweeknum.inCast = 'D';\n\n\n/*\n\tDate math\n*/\nfunction makeTimeDiffFunction(milliseconds) {\n\tvar f = function(a, b) {return (b.getTime() - a.getTime()) / milliseconds;};\n\tf.inCast = 'DD';\n\treturn f;\n}\nfunction makeTimeAddFunction(milliseconds) {\n\tvar f = function(a, b) {return new Date(a.getTime() + b * milliseconds);};\n\tf.inCast = 'DN';\n\treturn f;\n}\n\nexports.years = function(a, b) {return dateDelta(a, b).years;};\nexports.years.inCast = 'DD';\nexports.months = function(a, b) {return dateDelta(a, b).months;};\nexports.months.inCast = 'DD';\nexports.days = makeTimeDiffFunction(MS_PER_DAY);\nexports.hours = makeTimeDiffFunction(MS_PER_HOUR);\nexports.minutes = makeTimeDiffFunction(MS_PER_MINUTE);\nexports.seconds = makeTimeDiffFunction(MS_PER_SECOND);\nexports.milliseconds = makeTimeDiffFunction(1);\n\nexports.add_years = function(a, b) {return dateAddMonths(a, 0, b);};\nexports.add_years.inCast = 'DN';\nexports.add_months = function(a, b) {return dateAddMonths(a, b);};\nexports.add_months.inCast = 'DN';\nexports.add_days = makeTimeAddFunction(MS_PER_DAY);\nexports.add_hours = makeTimeAddFunction(MS_PER_HOUR);\nexports.add_minutes = makeTimeAddFunction(MS_PER_MINUTE);\nexports.add_seconds = makeTimeAddFunction(MS_PER_SECOND);\nexports.add_milliseconds = makeTimeAddFunction(1);\n\nexports.is_leap_year = function(year) {return (isLeapYear(year));};\nexports.is_leap_year.inCast = 'N';\nexports.days_in_year = function(year) {return (daysInYear(year));};\nexports.days_in_year.inCast = 'N';\nexports.days_in_month = function(yr, mon) {return (daysInMonth(yr, mon-1));};\nexports.days_in_month.inCast = 'NN';\n\n/*exports.datedif = function(a, b, c) {\n\tswitch (c.toUpperCase())\n\t{\n\tcase \"D\": return ((b.getTime() - a.getTime()) / MS_PER_DAY);\n\tcase \"M\": {var d=dateDelta(a, b); return d.months+12*d.years;}\n\tcase \"Y\": return dateDelta(a, b).years;\n\tcase \"YM\": return dateDelta(a, b).months;\n\tcase \"MD\": return dateDelta(a, b).days;\n\t}\n};\nexports.datedif.inCast = 'DDT';*/\n\n\n// Parse TiddlyWiki date\nexports.tw_date = function(timestamp) {\n\tvar date = $tw.utils.parseDate(timestamp);\n\tif (!date) throw \"Bad timestamp: \\\"\" + date + \"\\\"\";\n\treturn (date);\n};\nexports.tw_date.inCast = 'T';\n\n// Stringify as TiddlyWiki date\nexports.to_tw_date = function(date) {\n\treturn $tw.utils.stringifyDate(date);\n};\nexports.to_tw_date.inCast = 'D';\n\n// Create ISO date\nexports.make_date = function(year, month, day) {\n\treturn (new Date(year, month-1, day));\n};\nexports.make_date.inCast = 'NNN';\n\n// Create ISO time\nexports.make_time = function(hour, minute, second) {\n\treturn (new Date(0, 0, 0, hour, minute, second));\n};\nexports.make_time.inCast = 'NNN';\n\n// Create from julian\nexports.julian = function(julian) {\n\treturn (new Date((julian - UNIX_EPOCH_JULIAN_DAY) * MS_PER_DAY));\n};\nexports.julian.inCast = 'N';\n\n// Convert to julian\nexports.to_julian = function(date) {\n\treturn (UNIX_EPOCH_JULIAN_DAY + (date.getTime() / MS_PER_DAY));\n};\nexports.to_julian.inCast = 'D';\n\nexports.time = exports.make_time;\n\n\n// Cast the incoming value into a date.\nfunction interpret_date(a) {\n\tif (a instanceof Date) return a;\n\treturn exports.tw_date(a);\n}\ninterpret_date.inCast = 'D';\n\n\n// Consruct a date from a TiddlyWiki timestamp or a set of parts\nexports.date = {\n\tmin_args: 1, max_args: 3,\n\tselect: function(operands) {\n\t\tswitch (operands.length) {\n\t\tcase 1: return interpret_date;\n\t\tcase 3: return exports.make_date;\n\t\tdefault: throw \"Bad arguments to DATE. Should be (timestamp) or (year, month, day).\";\n\t\t}\n\t}\n};\n\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/functions/datetime.js",
"tags": "",
"module-type": "formula-function",
"modified": "20171217192149101",
"created": "20171217192129179"
},
"$:/plugins/ebalster/formula/functions/logic.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Node = require(\"$:/plugins/ebalster/formula/nodes.js\").Node;\n\n\n// Constants\nexports.true = function() {return true;};\nexports.false = function() {return false;};\n\nexports.true.isConstant = true;\nexports.false.isConstant = true;\n\n// Logical operators\nexports.not = function(a) {return !a;};\nexports.not.inCast = 'B';\nexports.and = function(a, b) {return a && b;};\nexports.and.inCast = 'BB';\nexports.or = function(a, b) {return a || b;};\nexports.or .inCast = 'BB';\nexports.xor = function(a, b) {return a ? !b : b;};\nexports.xor.inCast = 'BB';\n\n// Ternary\nfunction IfNode(pred, tval, fval) {\n\tthis.pred = pred;\n\tthis.tval = tval;\n\tthis.fval = fval;\n}\nIfNode.prototype = new Node();\nIfNode.prototype.name = \"if\";\nIfNode.prototype.compute = (function(ctx) {\n\treturn (this.pred.computeBool(ctx) ? this.tval.compute(ctx) : this.fval.compute(ctx));\n});\nexports.if = {\n\tmin_args: 3, max_args: 3,\n\tconstruct: function(operands) {\n\t\treturn new IfNode(operands[0], operands[1], operands[2]);\n\t}\n};\n\n\n// IFERROR\n/*exports.iferror = {\n\tmin_args = 2, max_args = 2,\n\tfunc = function(a, b) {\n\tselect: function(operands) {\n\t\ttry {return a.compute();}\n\t\tcatch (err) {return b.compute();}\n\t}\n\t};*/\n\n\n// SWITCH (variadic)\nexports.switch =\n{\n\tmin_args: 3,\n\tselect: function(operands)\n\t{\n\t\tswitch (operands.length % 2)\n\t\t{\n\t\tdefault:\n\t\tcase 0: return function(a) // Switch with default\n\t\t\t{\n\t\t\t\tvar value = a;\n\t\t\t\tfor (var i = 1; i+1 < arguments.length; i += 2)\n\t\t\t\t\t{if (arguments[i] == value) return arguments[i+1];}\n\t\t\t\treturn arguments[arguments.length-1];\n\t\t\t};\n\t\tcase 1: return function(a) // Switch, no default\n\t\t\t{\n\t\t\t\tvar value = a;\n\t\t\t\tfor (var i = 1; i+1 < arguments.length; i += 2)\n\t\t\t\t\t{if (arguments[i] == value) return arguments[i+1];}\n\t\t\t\treturn undefined;\n\t\t\t};\n\t\t}\n\t}\n};\n\n// CHOOSE (variadic)\nexports.choose = function(a, b)\n{\n\tvar index = Math.floor(a);\n\tvar result = arguments[index];\n\tif (index < 1 || !result) return undefined;\n\treturn result;\n};\nexports.choose.inCast = 'N';\nexports.choose.variadic = true;\n\n// IFS function (variadic)\nfunction ifsFunc() {\n\tfor (var i = 0; i < arguments.length; i += 2)\n\t\t{if (arguments[i]) return arguments[i+1];}\n\treturn undefined;\n};\nifsFunc.inCast = '+B_';\n\nexports.ifs =\n{\n\tmin_args : 2,\n\tinput: '+B_',\n\tselect : function(operands) {\n\t\tif (operands.length % 2 !== 0) throw \"Odd number of arguments to IFS\";\n\t\treturn ifsFunc;\n\t}\n};\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/functions/logic.js",
"tags": "",
"module-type": "formula-function",
"modified": "20171214060456114",
"created": "20171214054240274"
},
"$:/plugins/ebalster/formula/functions/math.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Coerce = require(\"$:/plugins/ebalster/formula/coerce.js\");\n\n\n// Constants\nexports.pi = function() {return (Math.PI);};\nexports._e = function() {return (Math.E);};\n\nexports.pi.isConstant = true;\nexports._e.isConstant = true;\n\n\n// Random\nexports.rand = function() {return Math.random();};\nexports.randbetween = function(a, b) {return (a+(b-a)*Math.random());};\nexports.randbetween.inCast = 'NN';\nexports.random = exports.rand;\n\n\n// Sign and absolute value\nexports.abs = function(a) {return Math.abs(a);};\nexports.abs.inCast = 'N';\nexports.sign = function(x) {return (((x > 0) - (x < 0)) || +x);};\nexports.sign.inCast = 'N';\n\n// Min/max\nexports.min = function(a)\n{\n\tvar min = a;\n\tfor (var i = 1; i < arguments.length; ++i) min = Math.min(min, arguments[i]);\n\treturn min;\n};\nexports.min.variadic = true;\nexports.min.inCast = '+N';\n\nexports.max = function(a)\n{\n\tvar max = a;\n\tfor (var i = 1; i < arguments.length; ++i) max = Math.max(max, arguments[i]);\n\treturn max;\n};\nexports.max.variadic = true;\nexports.max.inCast = '+N';\n\nexports.clamp = function(a, min, max) {\n\treturn (Math.min(Math.max(a, min), max));\n};\nexports.clamp.inCast = 'NNN';\n\n\n/*\n\tSeries arithmetic\n*/\nfunction Count(a) {\n\tif (a instanceof Array) {\n\t\tvar n = 0;\n\t\tfor (var i = 0; i < a.length; ++i) n += Count(a[i]);\n\t\treturn n;\n\t}\n\treturn 1;\n}\nfunction Sum(a) {\n\tif (a instanceof Array) {\n\t\tvar n = 0;\n\t\tfor (var i = 0; i < a.length; ++i) n += Sum(a[i]);\n\t\treturn n;\n\t}\n\treturn Coerce.ToNum(a,this);\n}\nfunction Product(a) {\n\tif (a instanceof Array) {\n\t\tvar n = 1;\n\t\tfor (var i = 0; i < a.length; ++i) n *= Product(a[i]);\n\t\treturn n;\n\t}\n\treturn Coerce.ToNum(a,this);\n}\nfunction Average(a) {\n\treturn Sum(a) / Count(a);\n}\n\nfunction GenSeriesFunc(func) {\n\treturn {\n\t\tmin_args : 1,\n\t\tselect : function(operands) {\n\t\t\tswitch (operands.length) {\n\t\t\tcase 1: return func;\n\t\t\tdefault: return function() {return func(Array.prototype.slice.call(arguments));};\n\t\t\t}\n\t\t}\n\t};\n}\n\nexports.sum = GenSeriesFunc(Sum);\nexports.average = GenSeriesFunc(Average);\nexports.product = GenSeriesFunc(Product);\n\n\n/*\n\tExponential\n*/\n\n// Exponentiation and logarithm\nexports.pow = function(a, b) {return (Math.pow(a, b));};\nexports.pow.inCast = 'NN';\nexports.log = function(a, b) {return (Math.log(a) / Math.log(b));};\nexports.log.inCast = 'NN';\nexports.exp = function(a) {return (Math.exp(a));};\nexports.exp.inCast = 'N';\nexports.ln = function(a) {return (Math.log(a));};\nexports.ln.inCast = 'N';\nexports.log2 = function(a) {return (Math.log2(a));};\nexports.log2.inCast = 'N';\nexports.log10 = function(a) {return (Math.log10(a));};\nexports.log10.inCast = 'N';\n\nexports.power = exports.pow;\n\n// Precise exponentiation and logarithm\nexports.expm1 = function(a) {return (Math.expm1(a));};\nexports.expm1.inCast = 'N';\nexports.log1p = function(a) {return (Math.log1p(a));};\nexports.log1p.inCast = 'N';\n\n// Roots\nexports.sqrt = function(a) {return (Math.sqrt(a));};\nexports.sqrt.inCast = 'N';\nexports.cbrt = function(a) {return (Math.cbrt(a));};\nexports.cbrt.inCast = 'N';\n\n\n/*\n\tTrigonometry\n*/\n\n// Conversion\nexports.radians = function(a) {return (Math.PI*a/180);};\nexports.radians.inCast = 'N';\nexports.degrees = function(a) {return (180*a/Math.PI);};\nexports.degrees.inCast = 'N';\n\n// Trigonometry\nexports.sin = function(a) {return ( Math.sin(a));};\nexports.sin.inCast = 'N';\nexports.cos = function(a) {return ( Math.cos(a));};\nexports.cos.inCast = 'N';\nexports.tan = function(a) {return ( Math.tan(a));};\nexports.tan.inCast = 'N';\nexports.csc = function(a) {return (1/Math.sin(a));};\nexports.csc.inCast = 'N';\nexports.sec = function(a) {return (1/Math.cos(a));};\nexports.sec.inCast = 'N';\nexports.cot = function(a) {return (1/Math.tan(a));};\nexports.cot.inCast = 'N';\n\n// Inverse Trigonometry\nexports.asin = function(a) {return (Math.asin( a));};\nexports.asin.inCast = 'N';\nexports.acos = function(a) {return (Math.acos( a));};\nexports.acos.inCast = 'N';\nexports.atan = function(a) {return (Math.atan( a));};\nexports.atan.inCast = 'N';\nexports.acsc = function(a) {return (Math.asin(1/a));};\nexports.acsc.inCast = 'N';\nexports.asec = function(a) {return (Math.acos(1/a));};\nexports.asec.inCast = 'N';\nexports.acot = function(a) {return (Math.atan(1/a));};\nexports.acot.inCast = 'N';\nexports.atan2 = function(y,x) {return (Math.atan2(y, x));};\nexports.atan2.inCast = 'NN';\n\n// Hyperbolic Trigonometry\nexports.sinh = function(a) {return ( Math.sinh(a));};\nexports.sinh.inCast = 'N';\nexports.cosh = function(a) {return ( Math.cosh(a));};\nexports.cosh.inCast = 'N';\nexports.tanh = function(a) {return ( Math.tanh(a));};\nexports.tanh.inCast = 'N';\nexports.csch = function(a) {return (1/Math.sinh(a));};\nexports.csch.inCast = 'N';\nexports.sech = function(a) {return (1/Math.cosh(a));};\nexports.sech.inCast = 'N';\nexports.coth = function(a) {return (1/Math.tanh(a));};\nexports.coth.inCast = 'N';\n\n// Inverse Hyperbolic Trigonometry\nexports.asinh = function(a) {return (Math.asinh( a));};\nexports.asinh.inCast = 'N';\nexports.acosh = function(a) {return (Math.acosh( a));};\nexports.acosh.inCast = 'N';\nexports.atanh = function(a) {return (Math.atanh( a));};\nexports.atanh.inCast = 'N';\nexports.acsch = function(a) {return (Math.asinh(1/a));};\nexports.acsch.inCast = 'N';\nexports.asech = function(a) {return (Math.acosh(1/a));};\nexports.asech.inCast = 'N';\nexports.acoth = function(a) {return (Math.atanh(1/a));};\nexports.acoth.inCast = 'N';\n\n/*\n\tRounding, ceiling and floor functions.\n\t\tSpecial measures were taken to reproduce the conventions.\n*/\n\nvar signedFloor = Math.trunc || function(n) {return (n<0) ? Math.ceil (n) : Math.floor(n);};\nvar signedCeil = function(n) {return (n<0) ? Math.floor(n) : Math.ceil (n);};\n\nfunction genCeilFloor(func) {\n\tvar by1 = function(a) {return func(a);},\n\t\tbyN = function(a, b) {var prec = b; return (func(a/prec) * prec);};\n\tby1.inCast = 'NN';\n\tbyN.inCast = 'NN';\n\treturn {\n\t\tmin_args : 1, max_args : 2,\n\t\tinput: 'NN',\n\t\tselect: function(operands) {\n\t\t\tswitch (operands.length)\n\t\t\t{\n\t\t\tcase 1: return by1;\n\t\t\tcase 2: return byN;\n\t\t\t}\n\t\t}\n\t};\n}\n\nfunction genRound(func) {\n\tvar lndigit = Math.log(0.1);\n\tvar by1 = function(a) {return func(a);},\n\t\tbyN = function(a, b) {var prec = Math.exp(lndigit*b); return (func(a/prec) * prec);};\n\tby1.inCast = 'NN';\n\tbyN.inCast = 'NN';\n\treturn {\n\t\tmin_args : 1, max_args : 2,\n\t\tinput: 'NN',\n\t\tselect: function(operands) {\n\t\t\tswitch (operands.length)\n\t\t\t{\n\t\t\tcase 1: return by1;\n\t\t\tcase 2: return byN;\n\t\t\t}\n\t\t}\n\t};\n}\n\nexports.floor = genCeilFloor(Math.floor);\nexports.ceil = genCeilFloor(Math.ceil);\n//exports.floor_precise = genCeilFloor(Math.floor);\n//exports.ceil_precise = genCeilFloor(Math.ceil);\nexports.round = genRound(Math.round);\nexports.roundup = genRound(signedCeil);\nexports.rounddown = genRound(signedFloor);\nexports.trunc = exports.rounddown;\n\n// Related functions\nexports.fract = function(a) {return (a-signedFloor(a));};\nexports.fract.inCast = 'NN';\nexports.modulo = function(a,b) {return (a-b*Math.floor(a/b));};\nexports.modulo.inCast = 'NN';\n\nexports.mod = exports.modulo;\n\n\n/*\n\tInterpolation\n*/\nexports.mix = function(a,b,m) {return (a + (b-a) * m);};\nexports.mix.inCast = 'NNN';\n\nexports.step = function(e,x) {return ((x<e) ? 0.0 : 1.0);};\nexports.step.inCast = 'NN';\n\nexports.smoothstep = function(e0,e1,x) {\n\tif (x < e0) return (0.0);\n\tif (x > e1) return (1.0);\n\tx = (x-e0) / (e1-e0);\n\treturn (3*x*x - 2*x*x*x);\n};\nexports.smoothstep.inCast = 'NNN';\n\n\n/*\n\tAlgorithms\n*/\nexports.gcd = function(a,b) {\n\ta = Math.abs(Math.round(a));\n\tb = Math.abs(Math.round(b));\n\tif (b > a) {var temp = a; a = b; b = temp;}\n\tvar limit = 1000;\n\twhile (true) {\n\t\tif (b == 0) return a;\n\t\ta %= b;\n\t\tif (a == 0) return b;\n\t\tb %= a;\n\t\tif (--limit < 0) throw \"GCD function is nonterminal!\";\n\t}\n};\nexports.gcd.inCast = 'NN';\n\nexports.lcm = function(a,b) {\n\ta = Math.abs(Math.round(a));\n\tb = Math.abs(Math.round(b));\n\treturn (!a || !b) ? 0 : Math.abs((a * b) / exports.gcd(a, b));\n};\nexports.lcm.inCast = 'NN';\n\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/functions/math.js",
"tags": "",
"module-type": "formula-function",
"modified": "20171214171708994",
"created": "20171214171454666"
},
"$:/plugins/ebalster/formula/functions/regexp.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\n// Compile regex. TODO: Precompile these where possible\n/*var TW_RX_FLAGS = /^\\(\\?[a-z]*\\)|\\(\\?[a-z]*\\)$/i;\n\nfunction tw_regex(rx_str, defaultFlags) {\n\tif (!rx_str) throw \"Empty regular expression\";\n\tvar flagPart = TW_RX_FLAGS.exec(rx_str);\n\tif (flagPart) {\n\t\tvar flagLen = flagPart[0].length;\n\t\tvar flags = flagPart[0].substr(2, flagPart[0].length-3);\n\t\tif (flagPart.index == 0) return new RegExp(rx_str.substr(flagLen), flags);\n\t\telse return new RegExp(rx_str.substr(0, rx_str.length-flagLen), flags);\n\t}\n\treturn new RegExp(rx_str, defaultFlags);\n}*/\n\n\n// Regex replace\nexports.regexreplace = function(s, rx, b) {\n\t//rx = tw_regex(rx, \"g\");\n\trx.lastIndex = 0;\n\treturn s.replace(rx, b);\n};\nexports.regexreplace.inCast = 'TRT';\n\n// Regex match\nexports.regexmatch = function(s, rx) {\n\t//rx = tw_regex(rx, \"\");\n\trx.lastIndex = 0;\n\treturn rx.test(s);\n};\nexports.regexmatch.inCast = 'TR';\n\n// Regex extract\nfunction regexextract(s, rx) {\n\t//rx = tw_regex(rx, \"g\");\n\trx.lastIndex = 0;\n\ts = s;\n\tvar captureIndex = arguments[2] || 0;\n\tvar matches = [];\n\tvar match;\n\twhile ((match = rx.exec(s)) != null) {\n\t\tif (match[0].length == 0) ++rx.lastIndex;\n\t\tmatches.push(match[captureIndex] || \"\");\n\t\tif (!rx.global) break;\n\t}\n\treturn matches;\n}\nregexextract.inCast = 'TRN';\n\nexports.regexextract = {\n\tmin_args: 2, max_args: 3,\n\tselect: function(operands) {return regexextract;}\n};\n\n// Regex extract, single argument\nfunction regexextract1(s, rx, dfl) {\n\t//rx = tw_regex(rx, \"\");\n\trx.lastIndex = 0;\n\ts = s;\n\tvar captureIndex = arguments[3] || 0;\n\tvar match = rx.exec(s);\n\treturn (match && match[captureIndex]) ? match[captureIndex] : dfl;\n}\nregexextract1.inCast = 'TRTN';\n\nexports.regexextract1 = {\n\tmin_args: 3, max_args: 4,\n\tselect: function(operands) {return regexextract1;}\n};\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/functions/regexp.js",
"tags": "",
"module-type": "formula-function",
"modified": "20171220230855457",
"created": "20171220230845098"
},
"$:/plugins/ebalster/formula/functions/strings.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Coerce = require(\"$:/plugins/ebalster/formula/coerce.js\");\n\n\n// Cast to text. Second argument not yet supported.\nexports.t = function(a) {return a;};\nexports.t.inCast = 'T';\n\nfunction t_format(a, format) {return a;}\nt_format.inCast = 'TT';\n\nexports.text = {\n\tmin_args: 1, max_args: 1,\n\tinput: 'TT',\n\tselect: function(operands) {\n\t\tif (operands.length == 1) return exports.t;\n\t\treturn t_format;\n\t}\n};\n\n// Cast string to number.\nexports.value = function(a) {return a;};\nexports.inCast = 'N';\n\n// Array to string\nvar JoinFunc = function(delimiter, ignore_empty, array, startIndex) {\n\tvar join = \"\", part;\n\tfor (var i = startIndex; i < array.length; ++i)\n\t{\n\t\tvar arg = array[i];\n\t\tif (arg instanceof Array) {\n\t\t\tpart = JoinFunc(delimiter, ignore_empty, arg, 0);\n\t\t}\n\t\telse {\n\t\t\tpart = Coerce.ToText(arg,this);\n\t\t}\n\t\tif (part.length || !ignore_empty) {\n\t\t\tif (join.length) join += delimiter;\n\t\t\tjoin += part;\n\t\t}\n\t}\n\treturn join;\n};\n\n// Join\nexports.join = function(delimiter) {\n\treturn JoinFunc.call(this, delimiter, false, arguments, 1);\n};\nexports.join.variadic = true;\nexports.join.inCast = 'T';\n\n// Textjoin\nexports.textjoin = function(delimiter, ignore_empty) {\n\treturn JoinFunc.call(this, delimiter, ignore_empty, arguments, 2);\n};\nexports.textjoin.variadic = true;\nexports.textjoin.inCast = 'T';\n\n// Split string to array\nexports.split = function(str, delimiter) {\n\treturn str.split(delimiter);\n};\nexports.split.inCast = 'T';\n\n// String length\nexports.len = function(str) {return str.length;};\nexports.len.inCast = 'T';\n\n// String exact match\nexports.exact = function(a, b) {return a === b;};\nexports.exact.inCast = 'TT';\n\n\n// Substrings\nexports.mid = function(str, i, n) {return str.substr(i-1, n);};\nexports.exact.inCast = 'TNN';\n\nexports.substr = exports.mid;\n\n\n// Substitute\nexports.substitute = function(s, f, r) {return s.split(f).join(r);};\nexports.substitute.inCast = 'TTT';\n\n// Replace (N/I)\n//exports.replace = function(s, p, l, r) {return (s.splice(a, b));};\n\n\n// Concatenate\nexports.cat = function(a, b) {return a + b;};\nexports.cat.inCast = 'TT';\n\n// Trim space\nexports.trim = function(a) {return a.split(/^\\s+|\\s+$/g).join(\"\");};\nexports.trim.inCast = 'T';\n\n\n// Aliases\nexports.concatenate = exports.cat;\n\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/functions/strings.js",
"tags": "",
"module-type": "formula-function",
"modified": "20171213003237206",
"created": "20171213003135495"
},
"$:/plugins/ebalster/formula/functions/wiki.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Nodes = require(\"$:/plugins/ebalster/formula/nodes.js\");\n\n\n// Get variable string by name.\nexports.transclude = {\n\tmin_args: 1, max_args: 2,\n\tconstruct: function(operands) {\n\t\tswitch (operands.length) {\n\t\t\tcase 1: return new Nodes.TranscludeText(operands[0]);\n\t\t\tcase 2: return new Nodes.TranscludeField(operands[0], operands[1]);\n\t\t}\n\t}\n};\n\n// Transclude tiddler text string by name.\nexports.transclude_index = {\n\tmin_args: 2, max_args: 2,\n\tconstruct: function(operands) {return new Nodes.TranscludeIndex(operands[0], operands[1]);}\n};\n\n// Transclude field string by name.\nexports.variable = {\n\tmin_args: 1, max_args: 1,\n\tconstruct: function(operands) {return new Nodes.Variable(operands[0]);}\n};\n\n// Interpret value as a datum.\nexports.datum = {\n\tmin_args: 1, max_args: 1,\n\tconstruct: function(operands) {return new Nodes.Datum(operands[0]);}\n};\n\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/functions/wiki.js",
"tags": "",
"module-type": "formula-function",
"modified": "20180108012007186",
"created": "20180108011928370"
},
"$:/plugins/ebalster/formula/lib/numeral.js": {
"text": "/*! @preserve\n * numeral.js\n * version : 2.0.6\n * author : Adam Draper\n * license : MIT\n * http://adamwdraper.github.com/Numeral-js/\n */\n!function(a,b){\"function\"==typeof define&&define.amd?define(b):\"object\"==typeof module&&module.exports?module.exports=b():a.numeral=b()}(this,function(){function a(a,b){this._input=a,this._value=b}var b,c,d=\"2.0.6\",e={},f={},g={currentLocale:\"en\",zeroFormat:null,nullFormat:null,defaultFormat:\"0,0\",scalePercentBy100:!0},h={currentLocale:g.currentLocale,zeroFormat:g.zeroFormat,nullFormat:g.nullFormat,defaultFormat:g.defaultFormat,scalePercentBy100:g.scalePercentBy100};return b=function(d){var f,g,i,j;if(b.isNumeral(d))f=d.value();else if(0===d||\"undefined\"==typeof d)f=0;else if(null===d||c.isNaN(d))f=null;else if(\"string\"==typeof d)if(h.zeroFormat&&d===h.zeroFormat)f=0;else if(h.nullFormat&&d===h.nullFormat||!d.replace(/[^0-9]+/g,\"\").length)f=null;else{for(g in e)if(j=\"function\"==typeof e[g].regexps.unformat?e[g].regexps.unformat():e[g].regexps.unformat,j&&d.match(j)){i=e[g].unformat;break}i=i||b._.stringToNumber,f=i(d)}else f=Number(d)||null;return new a(d,f)},b.version=d,b.isNumeral=function(b){return b instanceof a},b._=c={numberToFormat:function(a,c,d){var e,g,h,i,j,k,l,m=f[b.options.currentLocale],n=!1,o=!1,p=0,q=\"\",r=1e12,s=1e9,t=1e6,u=1e3,v=\"\",w=!1;if(a=a||0,g=Math.abs(a),b._.includes(c,\"(\")?(n=!0,c=c.replace(/[\\(|\\)]/g,\"\")):(b._.includes(c,\"+\")||b._.includes(c,\"-\"))&&(j=b._.includes(c,\"+\")?c.indexOf(\"+\"):0>a?c.indexOf(\"-\"):-1,c=c.replace(/[\\+|\\-]/g,\"\")),b._.includes(c,\"a\")&&(e=c.match(/a(k|m|b|t)?/),e=e?e[1]:!1,b._.includes(c,\" a\")&&(q=\" \"),c=c.replace(new RegExp(q+\"a[kmbt]?\"),\"\"),g>=r&&!e||\"t\"===e?(q+=m.abbreviations.trillion,a/=r):r>g&&g>=s&&!e||\"b\"===e?(q+=m.abbreviations.billion,a/=s):s>g&&g>=t&&!e||\"m\"===e?(q+=m.abbreviations.million,a/=t):(t>g&&g>=u&&!e||\"k\"===e)&&(q+=m.abbreviations.thousand,a/=u)),b._.includes(c,\"[.]\")&&(o=!0,c=c.replace(\"[.]\",\".\")),h=a.toString().split(\".\")[0],i=c.split(\".\")[1],k=c.indexOf(\",\"),p=(c.split(\".\")[0].split(\",\")[0].match(/0/g)||[]).length,i?(b._.includes(i,\"[\")?(i=i.replace(\"]\",\"\"),i=i.split(\"[\"),v=b._.toFixed(a,i[0].length+i[1].length,d,i[1].length)):v=b._.toFixed(a,i.length,d),h=v.split(\".\")[0],v=b._.includes(v,\".\")?m.delimiters.decimal+v.split(\".\")[1]:\"\",o&&0===Number(v.slice(1))&&(v=\"\")):h=b._.toFixed(a,0,d),q&&!e&&Number(h)>=1e3&&q!==m.abbreviations.trillion)switch(h=String(Number(h)/1e3),q){case m.abbreviations.thousand:q=m.abbreviations.million;break;case m.abbreviations.million:q=m.abbreviations.billion;break;case m.abbreviations.billion:q=m.abbreviations.trillion}if(b._.includes(h,\"-\")&&(h=h.slice(1),w=!0),h.length<p)for(var x=p-h.length;x>0;x--)h=\"0\"+h;return k>-1&&(h=h.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g,\"$1\"+m.delimiters.thousands)),0===c.indexOf(\".\")&&(h=\"\"),l=h+v+(q?q:\"\"),n?l=(n&&w?\"(\":\"\")+l+(n&&w?\")\":\"\"):j>=0?l=0===j?(w?\"-\":\"+\")+l:l+(w?\"-\":\"+\"):w&&(l=\"-\"+l),l},stringToNumber:function(a){var b,c,d,e=f[h.currentLocale],g=a,i={thousand:3,million:6,billion:9,trillion:12};if(h.zeroFormat&&a===h.zeroFormat)c=0;else if(h.nullFormat&&a===h.nullFormat||!a.replace(/[^0-9]+/g,\"\").length)c=null;else{c=1,\".\"!==e.delimiters.decimal&&(a=a.replace(/\\./g,\"\").replace(e.delimiters.decimal,\".\"));for(b in i)if(d=new RegExp(\"[^a-zA-Z]\"+e.abbreviations[b]+\"(?:\\\\)|(\\\\\"+e.currency.symbol+\")?(?:\\\\))?)?$\"),g.match(d)){c*=Math.pow(10,i[b]);break}c*=(a.split(\"-\").length+Math.min(a.split(\"(\").length-1,a.split(\")\").length-1))%2?1:-1,a=a.replace(/[^0-9\\.]+/g,\"\"),c*=Number(a)}return c},isNaN:function(a){return\"number\"==typeof a&&isNaN(a)},includes:function(a,b){return-1!==a.indexOf(b)},insert:function(a,b,c){return a.slice(0,c)+b+a.slice(c)},reduce:function(a,b){if(null===this)throw new TypeError(\"Array.prototype.reduce called on null or undefined\");if(\"function\"!=typeof b)throw new TypeError(b+\" is not a function\");var c,d=Object(a),e=d.length>>>0,f=0;if(3===arguments.length)c=arguments[2];else{for(;e>f&&!(f in d);)f++;if(f>=e)throw new TypeError(\"Reduce of empty array with no initial value\");c=d[f++]}for(;e>f;f++)f in d&&(c=b(c,d[f],f,d));return c},multiplier:function(a){var b=a.toString().split(\".\");return b.length<2?1:Math.pow(10,b[1].length)},correctionFactor:function(){var a=Array.prototype.slice.call(arguments);return a.reduce(function(a,b){var d=c.multiplier(b);return a>d?a:d},1)},toFixed:function(a,b,c,d){var e,f,g,h,i=a.toString().split(\".\"),j=b-(d||0);return e=2===i.length?Math.min(Math.max(i[1].length,j),b):j,g=Math.pow(10,e),h=(c(a+\"e+\"+e)/g).toFixed(e),d>b-e&&(f=new RegExp(\"\\\\.?0{1,\"+(d-(b-e))+\"}$\"),h=h.replace(f,\"\")),h}},b.options=h,b.formats=e,b.locales=f,b.locale=function(a){return a&&(h.currentLocale=a.toLowerCase()),h.currentLocale},b.localeData=function(a){if(!a)return f[h.currentLocale];if(a=a.toLowerCase(),!f[a])throw new Error(\"Unknown locale : \"+a);return f[a]},b.reset=function(){for(var a in g)h[a]=g[a]},b.zeroFormat=function(a){h.zeroFormat=\"string\"==typeof a?a:null},b.nullFormat=function(a){h.nullFormat=\"string\"==typeof a?a:null},b.defaultFormat=function(a){h.defaultFormat=\"string\"==typeof a?a:\"0.0\"},b.register=function(a,b,c){if(b=b.toLowerCase(),this[a+\"s\"][b])throw new TypeError(b+\" \"+a+\" already registered.\");return this[a+\"s\"][b]=c,c},b.validate=function(a,c){var d,e,f,g,h,i,j,k;if(\"string\"!=typeof a&&(a+=\"\",console.warn&&console.warn(\"Numeral.js: Value is not string. It has been co-erced to: \",a)),a=a.trim(),a.match(/^\\d+$/))return!0;if(\"\"===a)return!1;try{j=b.localeData(c)}catch(l){j=b.localeData(b.locale())}return f=j.currency.symbol,h=j.abbreviations,d=j.delimiters.decimal,e=\".\"===j.delimiters.thousands?\"\\\\.\":j.delimiters.thousands,k=a.match(/^[^\\d]+/),null!==k&&(a=a.substr(1),k[0]!==f)?!1:(k=a.match(/[^\\d]+$/),null!==k&&(a=a.slice(0,-1),k[0]!==h.thousand&&k[0]!==h.million&&k[0]!==h.billion&&k[0]!==h.trillion)?!1:(i=new RegExp(e+\"{2}\"),a.match(/[^\\d.,]/g)?!1:(g=a.split(d),g.length>2?!1:g.length<2?!!g[0].match(/^\\d+.*\\d$/)&&!g[0].match(i):1===g[0].length?!!g[0].match(/^\\d+$/)&&!g[0].match(i)&&!!g[1].match(/^\\d+$/):!!g[0].match(/^\\d+.*\\d$/)&&!g[0].match(i)&&!!g[1].match(/^\\d+$/))))},b.fn=a.prototype={clone:function(){return b(this)},format:function(a,c){var d,f,g,i=this._value,j=a||h.defaultFormat;if(c=c||Math.round,0===i&&null!==h.zeroFormat)f=h.zeroFormat;else if(null===i&&null!==h.nullFormat)f=h.nullFormat;else{for(d in e)if(j.match(e[d].regexps.format)){g=e[d].format;break}g=g||b._.numberToFormat,f=g(i,j,c)}return f},value:function(){return this._value},input:function(){return this._input},set:function(a){return this._value=Number(a),this},add:function(a){function b(a,b,c,e){return a+Math.round(d*b)}var d=c.correctionFactor.call(null,this._value,a);return this._value=c.reduce([this._value,a],b,0)/d,this},subtract:function(a){function b(a,b,c,e){return a-Math.round(d*b)}var d=c.correctionFactor.call(null,this._value,a);return this._value=c.reduce([a],b,Math.round(this._value*d))/d,this},multiply:function(a){function b(a,b,d,e){var f=c.correctionFactor(a,b);return Math.round(a*f)*Math.round(b*f)/Math.round(f*f)}return this._value=c.reduce([this._value,a],b,1),this},divide:function(a){function b(a,b,d,e){var f=c.correctionFactor(a,b);return Math.round(a*f)/Math.round(b*f)}return this._value=c.reduce([this._value,a],b),this},difference:function(a){return Math.abs(b(this._value).subtract(a).value())}},b.register(\"locale\",\"en\",{delimiters:{thousands:\",\",decimal:\".\"},abbreviations:{thousand:\"k\",million:\"m\",billion:\"b\",trillion:\"t\"},ordinal:function(a){var b=a%10;return 1===~~(a%100/10)?\"th\":1===b?\"st\":2===b?\"nd\":3===b?\"rd\":\"th\"},currency:{symbol:\"$\"}}),function(){b.register(\"format\",\"bps\",{regexps:{format:/(BPS)/,unformat:/(BPS)/},format:function(a,c,d){var e,f=b._.includes(c,\" BPS\")?\" \":\"\";return a=1e4*a,c=c.replace(/\\s?BPS/,\"\"),e=b._.numberToFormat(a,c,d),b._.includes(e,\")\")?(e=e.split(\"\"),e.splice(-1,0,f+\"BPS\"),e=e.join(\"\")):e=e+f+\"BPS\",e},unformat:function(a){return+(1e-4*b._.stringToNumber(a)).toFixed(15)}})}(),function(){var a={base:1e3,suffixes:[\"B\",\"KB\",\"MB\",\"GB\",\"TB\",\"PB\",\"EB\",\"ZB\",\"YB\"]},c={base:1024,suffixes:[\"B\",\"KiB\",\"MiB\",\"GiB\",\"TiB\",\"PiB\",\"EiB\",\"ZiB\",\"YiB\"]},d=a.suffixes.concat(c.suffixes.filter(function(b){return a.suffixes.indexOf(b)<0})),e=d.join(\"|\");e=\"(\"+e.replace(\"B\",\"B(?!PS)\")+\")\",b.register(\"format\",\"bytes\",{regexps:{format:/([0\\s]i?b)/,unformat:new RegExp(e)},format:function(d,e,f){var g,h,i,j,k=b._.includes(e,\"ib\")?c:a,l=b._.includes(e,\" b\")||b._.includes(e,\" ib\")?\" \":\"\";for(e=e.replace(/\\s?i?b/,\"\"),h=0;h<=k.suffixes.length;h++)if(i=Math.pow(k.base,h),j=Math.pow(k.base,h+1),null===d||0===d||d>=i&&j>d){l+=k.suffixes[h],i>0&&(d/=i);break}return g=b._.numberToFormat(d,e,f),g+l},unformat:function(d){var e,f,g=b._.stringToNumber(d);if(g){for(e=a.suffixes.length-1;e>=0;e--){if(b._.includes(d,a.suffixes[e])){f=Math.pow(a.base,e);break}if(b._.includes(d,c.suffixes[e])){f=Math.pow(c.base,e);break}}g*=f||1}return g}})}(),function(){b.register(\"format\",\"currency\",{regexps:{format:/(\\$)/},format:function(a,c,d){var e,f,g,h=b.locales[b.options.currentLocale],i={before:c.match(/^([\\+|\\-|\\(|\\s|\\$]*)/)[0],after:c.match(/([\\+|\\-|\\)|\\s|\\$]*)$/)[0]};for(c=c.replace(/\\s?\\$\\s?/,\"\"),e=b._.numberToFormat(a,c,d),a>=0?(i.before=i.before.replace(/[\\-\\(]/,\"\"),i.after=i.after.replace(/[\\-\\)]/,\"\")):0>a&&!b._.includes(i.before,\"-\")&&!b._.includes(i.before,\"(\")&&(i.before=\"-\"+i.before),g=0;g<i.before.length;g++)switch(f=i.before[g]){case\"$\":e=b._.insert(e,h.currency.symbol,g);break;case\" \":e=b._.insert(e,\" \",g+h.currency.symbol.length-1)}for(g=i.after.length-1;g>=0;g--)switch(f=i.after[g]){case\"$\":e=g===i.after.length-1?e+h.currency.symbol:b._.insert(e,h.currency.symbol,-(i.after.length-(1+g)));break;case\" \":e=g===i.after.length-1?e+\" \":b._.insert(e,\" \",-(i.after.length-(1+g)+h.currency.symbol.length-1))}return e}})}(),function(){b.register(\"format\",\"exponential\",{regexps:{format:/(e\\+|e-)/,unformat:/(e\\+|e-)/},format:function(a,c,d){var e,f=\"number\"!=typeof a||b._.isNaN(a)?\"0e+0\":a.toExponential(),g=f.split(\"e\");return c=c.replace(/e[\\+|\\-]{1}0/,\"\"),e=b._.numberToFormat(Number(g[0]),c,d),e+\"e\"+g[1]},unformat:function(a){function c(a,c,d,e){var f=b._.correctionFactor(a,c),g=a*f*(c*f)/(f*f);return g}var d=b._.includes(a,\"e+\")?a.split(\"e+\"):a.split(\"e-\"),e=Number(d[0]),f=Number(d[1]);return f=b._.includes(a,\"e-\")?f*=-1:f,b._.reduce([e,Math.pow(10,f)],c,1)}})}(),function(){b.register(\"format\",\"ordinal\",{regexps:{format:/(o)/},format:function(a,c,d){var e,f=b.locales[b.options.currentLocale],g=b._.includes(c,\" o\")?\" \":\"\";return c=c.replace(/\\s?o/,\"\"),g+=f.ordinal(a),e=b._.numberToFormat(a,c,d),e+g}})}(),function(){b.register(\"format\",\"percentage\",{regexps:{format:/(%)/,unformat:/(%)/},format:function(a,c,d){var e,f=b._.includes(c,\" %\")?\" \":\"\";return b.options.scalePercentBy100&&(a=100*a),c=c.replace(/\\s?\\%/,\"\"),e=b._.numberToFormat(a,c,d),b._.includes(e,\")\")?(e=e.split(\"\"),e.splice(-1,0,f+\"%\"),e=e.join(\"\")):e=e+f+\"%\",e},unformat:function(a){var c=b._.stringToNumber(a);return b.options.scalePercentBy100?.01*c:c}})}(),function(){b.register(\"format\",\"time\",{regexps:{format:/(:)/,unformat:/(:)/},format:function(a,b,c){var d=Math.floor(a/60/60),e=Math.floor((a-60*d*60)/60),f=Math.round(a-60*d*60-60*e);return d+\":\"+(10>e?\"0\"+e:e)+\":\"+(10>f?\"0\"+f:f)},unformat:function(a){var b=a.split(\":\"),c=0;return 3===b.length?(c+=60*Number(b[0])*60,c+=60*Number(b[1]),c+=Number(b[2])):2===b.length&&(c+=60*Number(b[0]),c+=Number(b[1])),Number(c)}})}(),b});",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/lib/numeral.js",
"module-type": "library",
"modified": "20180114171115244",
"created": "20180114171007227"
},
"$:/plugins/ebalster/formula/license": {
"text": "!!The MIT License (MIT)\n\nCopyright (c) 2017 Evan Balster\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/ebalster/formula/license",
"tags": "",
"modified": "20171220211838536",
"created": "20171220071005710",
"caption": "license"
},
"$:/plugins/ebalster/formula/macros/formula.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Compute = require(\"$:/plugins/ebalster/formula/compute.js\");\n\n/*\n\tInformation about this macro\n*/\n\nexports.name = \"formula\";\nexports.params = [{\"name\": \"formula\"}];\n\n/*\nRun the macro\n*/\nexports.run = function(formula) {\n\n\ttry {\n\t\treturn Compute.evalFormula(formula, this);\n\t}\n\tcatch (err) {\n\t\treturn \"`\" + String(err) + \"`\";\n\t}\n};\n\n})();\n",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/macros/formula.js",
"tags": "",
"module-type": "macro",
"modified": "20171212194124031",
"created": "20171210215758530"
},
"$:/plugins/ebalster/formula/nodes.js": {
"text": "/*\\\ntitle: $:/plugins/ebalster/formula/nodes.js\ntype: application/javascript\nmodule-type: macro\n\nLibrary defining computation \"nodes\" used to build compiled formulas.\nOperands represent some value within the formula: an expression, datum, operator, constant or query...\nOperands may be constant, allowing the formula compiler to optimize them away.\n\n\\*/\n(function(){\n\n\"use strict\";\n\nvar Coerce = require(\"$:/plugins/ebalster/formula/coerce.js\");\n\n\n// A Context has all the information necessary for computations.\nexports.Context = function(widget, formats, locals, depth, maxDepth) {\n\tthis.widget = widget;\n\tthis.formats = formats || {};\n\tthis.locals = locals || {};\n\tthis.depth = depth || 1;\n\tthis.maxDepth = maxDepth || 256;\n\tif (this.maxDepth < this.depth) throw \"Formula recursion exceeds limit of \" + this.maxDepth + \". Infinite regress?\";\n};\nexports.Context.prototype.sub = function() {return new exports.Context(this.widget,this.formats,null,this.depth+1,this.maxDepth);};\nexports.Context.prototype.let = function(locals) {return new exports.Context(this.widget,this.formats,locals,this.depth,this.maxDepth);};\nexports.Context.prototype.wiki = function() {return this.widget.wiki;};\nexports.Context.prototype.wikiVariable = function(name) {return this.widget.getVariable(name);};\n\n\nexports.Node = function() {\n};\nexports.Node.prototype.is_constant = false;\nexports.Node.prototype.name = \"unknown-operand\";\nexports.Node.prototype.toString = function() {return \"[Node \" + this.name + \"]\";};\n\n// Compute the Node's value.\nexports.Node.prototype.compute = function(ctx) {return undefined;};\n\n// Compute a specific type of value, with coercion if necessary.\nexports.Node.prototype.computeNum = function(ctx) {return Coerce.ToNum (this.compute(ctx), ctx);};\nexports.Node.prototype.computeText = function(ctx) {return Coerce.ToText (this.compute(ctx), ctx);};\nexports.Node.prototype.computeBool = function(ctx) {return Coerce.ToBool (this.compute(ctx), ctx);};\nexports.Node.prototype.computeDate = function(ctx) {return Coerce.ToDate (this.compute(ctx), ctx);};\nexports.Node.prototype.computeArray = function(ctx) {return Coerce.ToArray(this.compute(ctx), ctx);};\nexports.Node.prototype.computeFunc = function(ctx) {return Coerce.ToFunc (this.compute(ctx), ctx);};\n\n\n// An operand that just throws an error.\nexports.ThrowError = function(exception) {\n\tthis.exception = exception;\n};\nexports.ThrowError.prototype = new exports.Node();\nexports.ThrowError.prototype.name = \"error\";\nexports.ThrowError.prototype.compute = function(ctx)\n{\n\t// Throw up\n\tthrow this.exception;\n};\n\n// Scoped variable node.\nexports.ScopeVar = function(name) {\n\tthis.name = name;\n};\nexports.ScopeVar.prototype = new exports.Node();\n//exports.ScopeVar.prototype.name = \"scope-var\";\nexports.ScopeVar.prototype.compute = function(ctx) {return ctx.locals[this.name];};\n\n// Scoped variable assignment node.\nexports.LetVars = function(assigns, expr) {\n\tthis.assigns = assigns;\n\tthis.expr = expr;\n};\nexports.LetVars.prototype = new exports.Node();\nexports.LetVars.prototype.name = \"let\";\nexports.LetVars.prototype.compute = function(ctx) {\n\t// Each let-expression can access the ones before it.\n\tvar locals = Object.assign({}, ctx.locals);\n\tctx = ctx.let(locals);\n\tfor (var id in this.assigns) {\n\t\ttry {\n\t\t\tlocals[id] = this.assigns[id].compute(ctx);\n\t\t}\n\t\tcatch (err) {\n\t\t\tthrow \"computing LET '\" + id + \"': \" + err;\n\t\t}\n\t}\n\treturn this.expr.compute(ctx);\n};\n\n// Call a function by reference.\nexports.CallFunc = function CallFunc(func, args) {\n\tthis.func = func;\n\tthis.args = args;\n};\nexports.CallFunc.prototype = new exports.Node();\nexports.CallFunc.prototype.name = \"function-builtin\";\nexports.CallFunc.prototype.compute = (function(ctx) {\n\t// Check the function parameters.\n\tvar func = this.func.computeFunc(ctx);\n\tif (this.args.length < func.min_args) throw \"Too few parameters for function\";\n\tif (this.args.length > func.max_args) throw \"Too many parameters for function\";\n\t// Compute arguments.\n\tvar vals = [];\n\tfor (var i = 0; i < this.args.length; ++i) vals.push(this.args[i].compute(ctx));\n\t// Call the function!\n\treturn func.apply(ctx, vals);\n});\n\n// JavaScript function call with possible coercion.\nexports.CallJS = function CallJS(func, args) {\n\tthis.func = func;\n\tthis.args = args;\n\tthis.coerce = Coerce.GetCoerceFuncs(func, args);\n\tthis.n_coerce = Math.min(this.args.length, this.coerce.length);\n};\nexports.CallJS.prototype = new exports.Node();\nexports.CallJS.prototype.name = \"function-builtin\";\nexports.CallJS.prototype.compute = function(ctx) {\n\tvar vals = [];\n\tvar i = 0;\n\tfor (; i < this.n_coerce; ++i) vals.push(this.coerce[i](this.args[i].compute(ctx), ctx));\n\tfor (; i < this.args.length; ++i) vals.push(this.args[i].compute(ctx));\n\treturn this.func.apply(ctx, vals);\n};\n\n// Call a function by reference.\nexports.ArrayDef = function ArrayDef(elems) {\n\tthis.elems = elems;\n};\nexports.ArrayDef.prototype = new exports.Node();\nexports.ArrayDef.prototype.name = \"function-builtin\";\nexports.ArrayDef.prototype.compute = (function(ctx) {\n\t// Compute elements.\n\tvar elems = [];\n\tfor (var i = 0; i < this.elems.length; ++i) elems.push(this.elems[i].compute(ctx));\n\treturn elems;\n});\n\n\n// Function declaration operand.\nexports.Function = function(func, captures) {\n\tthis.func = func;\n\tthis.captures = captures;\n};\nexports.Function.prototype = new exports.Node();\nexports.Function.prototype.name = \"function\";\nexports.Function.prototype.is_constant = true;\nexports.Function.prototype.compute = function(ctx) {\n\tthis.func.captured = {};\n\tif (this.captures) {\n\t\tfor (var name in this.captures) {\n\t\t\tthis.func.captured[name] = ctx.locals[name];\n\t\t}\n\t}\n\treturn this.func;\n};\n\n// String constant operand.\nexports.Text = function(value) {this.value = value;};\nexports.Text.prototype = new exports.Node();\nexports.Text.prototype.name = \"string\";\nexports.Text.prototype.is_constant = true;\nexports.Text.prototype.compute = function(ctx) {return this.value;};\n\n// Date constant operand.\nexports.Date = function(value) {this.value = value;};\nexports.Date.prototype = new exports.Node();\nexports.Date.prototype.name = \"date\";\nexports.Date.prototype.is_constant = true;\nexports.Date.prototype.compute = function(ctx) {return this.value;};\n\n// Boolean constant operand.\nexports.Bool = function(value) {this.value = value;};\nexports.Bool.prototype = new exports.Node();\nexports.Bool.prototype.name = \"boolean\";\nexports.Bool.prototype.is_constant = true;\nexports.Bool.prototype.compute = function(ctx) {return this.value;};\n\n// Number constant operand.\nexports.Number = function(value) {this.value = value;};\nexports.Number.prototype = new exports.Node();\nexports.Number.prototype.name = \"number\";\nexports.Number.prototype.is_constant = true;\nexports.Number.prototype.compute = function(ctx) {return this.value;};\n\n// Regex constant operand.\nexports.Regex = function(value) {this.value = value;};\nexports.Regex.prototype = new exports.Node();\nexports.Regex.prototype.name = \"regex\";\nexports.Regex.prototype.is_constant = true;\nexports.Regex.prototype.compute = function(ctx) {return this.value;};\n\n\nvar Compile = require(\"$:/plugins/ebalster/formula/compile.js\");\n\n\n// \"Automatic\" operand; a compiled string value\nexports.Datum = function(origin) {\n\tthis.origin = origin;\n\tthis.text = null;\n\tthis.op = null;\n};\nexports.Datum.prototype = new exports.Node();\nexports.Datum.prototype.name = \"automatic\";\n\nexports.Datum.prototype.compute = function(ctx) {\n\n\tvar newText = this.origin.computeText(ctx);\n\n\tif (newText != this.text)\n\t{\n\t\tthis.text = newText;\n\t\ttry {\n\t\t\tthis.op = Compile.compileDatum(newText);\n\t\t}\n\t\tcatch (err) {\n\t\t\t// Save the error\n\t\t\tthis.op = new exports.ThrowError(\n\t\t\t\terr + \"\\n source: \\\"\" + this.datum + \"\\\"\\n from \" + origin.name);\n\t\t}\n\t}\n\n\treturn this.op.compute(ctx.sub());\n};\n\n\n// Transcluded text operand.\nexports.TranscludeText = function(title) {\n\tthis.title = title;\n};\nexports.TranscludeText.prototype = new exports.Node();\nexports.TranscludeText.prototype.name = \"transclude\";\n\nexports.TranscludeText.prototype.compute = function(ctx) {\n\treturn ctx.wiki().getTiddlerText(this.title.computeText(ctx),\"\");\n};\n\n// Transcluded field operand.\nexports.TranscludeField = function(title, field) {\n\tthis.title = title;\n\tthis.field = field;\n};\nexports.TranscludeField.prototype = new exports.Node();\nexports.TranscludeField.prototype.name = \"transclude-field\";\n\nexports.TranscludeField.prototype.compute = function(ctx) {\n\tvar tiddler = ctx.wiki().getTiddler(this.title.computeText(ctx)),\n\t\tfield = this.field.computeText(ctx);\n\treturn (tiddler && $tw.utils.hop(tiddler.fields,field)) ? tiddler.getFieldString(field) : \"\";\n};\n\n// Transcluded index operand.\nexports.TranscludeIndex = function(title, index) {\n\tthis.title = title;\n\tthis.index = index;\n};\nexports.TranscludeIndex.prototype = new exports.Node();\nexports.TranscludeIndex.prototype.name = \"transclude-index\";\n\nexports.TranscludeIndex.prototype.compute = function(ctx) {\n\treturn ctx.wiki().extractTiddlerDataItem(\n\t\tthis.title.computeText(ctx),\n\t\tthis.index.computeText(ctx),\"\");\n};\n\n\n// Variable operand.\nexports.Variable = function(variable) {\n\tthis.variable = variable;\n};\nexports.Variable.prototype = new exports.Node();\nexports.Variable.prototype.name = \"variable\";\n\nexports.Variable.prototype.compute = function(ctx) {\n\treturn ctx.wikiVariable(this.variable.computeText(ctx)) || \"\";\n};\n\n\n// Filter operand, with some lazy-compile optimizations.\nexports.Filter = function(filter) {\n\tthis.filter = filter;\n\tthis.elements = {}; // Each has count, op, value\n\t//this.array = [];\n\tthis.compileError = null;\n};\nexports.Filter.prototype = new exports.Node();\nexports.Filter.prototype.name = \"filter\";\n\nexports.Filter.prototype.compute = function(ctx) {\n\t// Apply the filter and compile each result\n\tvar i, expr, elem, exprs = ctx.wiki().filterTiddlers(this.filter, ctx.widget);\n\n\t// Clear the array and mark all existing elements for removal\n\tfor (expr in this.elements) this.elements[expr].count = 0;\n\t//this.array = [];\n\n\t// Selectively re-compile any filter results that have changed\n\tfor (i = 0; i < exprs.length; ++i)\n\t{\n\t\texpr = exprs[i];\n\t\telem = this.elements[expr];\n\t\t//this.array.push(expr);\n\t\t\n\t\tif (elem) ++elem.count;\n\t\telse try {\n\t\t\tthis.elements[expr] = {count: 1, op: Compile.compileDatum(expr), value: null};\n\t\t}\n\t\tcatch (err) {\n\t\t\t// Save the error\n\t\t\tthis.elements[expr] = new exports.ThrowError(\n\t\t\t\terr + \"\\n source: \\\"\" + expr + \"\\\"\\n from \\\"\" + this.filter + \"\\\"\");\n\t\t}\n\t}\n\n\t// Compute (unique) values. Delete any elements with no copies left.\n\tfor (expr in this.elements) {\n\t\telem = this.elements[expr];\n\t\tif (elem.count === 0) delete this.elements[expr];\n\t\telse elem.val = elem.op.compute(ctx.sub());\n\t}\n\n\t// Return value computes an array of datum values.\n\tvar results = [];\n\tfor (i = 0; i < exprs.length; ++i) {\n\t\texpr = exprs[i];\n\t\tresults.push(this.elements[expr].val);\n\t}\n\treturn results;\n};\n\n})();\n",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/nodes.js",
"tags": "",
"module-type": "library",
"modified": "20180112071139424",
"description": "",
"created": "20171211183000431"
},
"$:/plugins/ebalster/formula/operators/arithmetic.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Unary sign operators\nexports.uplus = {arity: 1, position: \"pre\", operator: \"+\", function: \"uplus\"};\nexports.uminus = {arity: 1, position: \"pre\", operator: \"-\", function: \"uminus\"};\n\n// Add\nexports.plus = {arity: 2, precedence: 10, operator: \"+\", function: \"add\"};\nexports.minus = {arity: 2, precedence: 10, operator: \"-\", function: \"sub\"};\n\n// Multiply\nexports.multiply = {arity: 2, precedence: 20, operator: \"*\", function: \"mul\"};\nexports.divide = {arity: 2, precedence: 20, operator: \"/\", function: \"div\"};\n\n// Exponential\nexports.pow = {arity: 2, precedence: 30, operator: \"^\", function: \"pow\", associativity: \"right\"};\n\n// Percentage\nexports.percent = {arity: 1, position: \"post\", operator: \"%\", function: \"percent\"};\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/operators/arithmetic.js",
"tags": "",
"module-type": "formula-operator",
"modified": "20171212223539769",
"created": "20171212223503019"
},
"$:/plugins/ebalster/formula/operators/compare.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Equality\nexports.eq = {arity: 2, precedence: 0, operator: \"=\", function: \"eq\"};\nexports.ne = {arity: 2, precedence: 0, operator: \"<>\", function: \"ne\"};\n\n// Inequality\nexports.gt = {arity: 2, precedence: 0, operator: \">\", function: \"gt\"};\nexports.gte = {arity: 2, precedence: 0, operator: \">=\", function: \"gte\"};\nexports.lt = {arity: 2, precedence: 0, operator: \"<\", function: \"lt\"};\nexports.lte = {arity: 2, precedence: 0, operator: \"<=\", function: \"lte\"};\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/operators/compare.js",
"tags": "",
"module-type": "formula-operator",
"modified": "20171214050739104",
"created": "20171214050556123"
},
"$:/plugins/ebalster/formula/operators/strings.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\n// Concatenate\nexports.concatenate = {arity: 2, precedence: 4, operator: \"&\", function: \"cat\"};\n\n})();",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/operators/strings.js",
"tags": "",
"module-type": "formula-operator",
"modified": "20171213003346943",
"created": "20171213003246267"
},
"$:/plugins/ebalster/formula/readme": {
"text": "''Formula'' for TiddlyWiki, version {{$:/plugins/ebalster/formula!!version}}, by Evan Balster.\n\nFormulas are written between `(=` mushroom brackets `=)`. Where possible, their functions and syntax are designed to emulate popular spreadsheet software (Microsoft Excel and Google Sheets). They //also// support WikiText-like syntax for `{{`transclusion`}}`, `[`filters`]`, `<<`variables`>>`, and a large number of functions.\n\nFormulas can also be evaluated by the `$formula` widget, the `$formula-vars` widget and the `<<formula>>` macro.\n\nFurther documentation is available here: [[https://evanbalster.com/tiddlywiki/formulas.html]].\n\nThis plugin is a work in progress; please report any issues on GitHub: [[https://github.com/EvanBalster/TiddlyWikiFormula/issues]].",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/ebalster/formula/readme",
"tags": "",
"modified": "20171220212520970",
"created": "20171220042006170",
"caption": "readme"
},
"$:/plugins/ebalster/formula/settings": {
"text": "Currently no global settings are implemented, but formulas can be controlled by setting some global macros. For example:\n\n|Macro|Meaning|h\n|`\\define formulaFixed() 2`|makes numbers display with 2 decimal points.|\n|`\\define formulaPrecision() 4`|makes numbers display with 4 significant digits (but `formulafixed` takes priority.|\n|`\\define formulaDateFormat() YYYY-MM-0DD`|Sets a date display format using the same rules as TiddlyWiki.|\n\nPlace these at the top of the tiddler where they should take effect, or create a tiddler tagged with <<tag $:/tags/Macro>> to make them apply to all tiddlers.\n\nIn the future, we'll probably add some global settings here...",
"bag": "default",
"revision": "0",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/ebalster/formula/settings",
"tags": "",
"modified": "20171221002035357",
"created": "20171221001634811",
"caption": "readme"
},
"$:/plugins/ebalster/formula/value.js": {
"text": "(function(){\n\n\"use strict\";\n\n\nexports.NumberFormatFunc = null;\n\nexports.DateFormat = \"0hh:0mm, DDth MMM YYYY\";\n\n\n// Base type for formula values\nexports.Value = function() {\n this.name = \"unknown-value\";\n};\n\n// Get the value payload\nexports.Value.prototype.get = function() {return undefined;};\n\n// Describe the value\nexports.Value.prototype.describe = function() {return this.name + \" (\" + String(this.get()) + \")\";};\n\nexports.Value.prototype.toString = function() {return \"[Value \" + this.describe() + \"]\";};\n\n// Get the value as a number (generic implementation)\nexports.Value.prototype.asNum = function() {\n var v = this.get();\n var n = Number(v);\n if (isNaN(n)) throw \"Cannot convert \" + this.describe() + \" to a number!\";\n return n;\n};\n\n// Get the value as a number, summing arrays (generic implementation)\nexports.Value.prototype.asSum = function() {\n var v = this.get();\n var n;\n if (Array.isArray(v)) {n = 0; for (var i = 0; i < v.length; ++i) n += Number(v[i]);}\n else n = Number(v);\n if (isNaN(n)) throw \"Cannot sum \" + this.describe() + \" to a number!\";\n return n;\n};\n\n// More convertsions\nexports.Value.prototype.asString = function() {\n return String(this.get());\n};\nexports.Value.prototype.asArray = function() {\n var v = this.get();\n if (Array.isArray(v)) return v;\n else return [v];\n};\nexports.Value.prototype.asDate = function() {\n throw \"Cannot convert \" + this.describe() + \" to a date!\";\n};\n\n\n// Undefined value.\nexports.V_Undefined = function() {\n this.name = \"undefined\";\n};\nexports.V_Undefined.prototype = new exports.Value();\nexports.V_Undefined.prototype.get = function() {return undefined;};\n\n\n// Array value.\nexports.V_Array = function(value) {\n this.name = \"array\";\n\n this.value = value;\n};\nexports.V_Array.prototype = new exports.Value();\nexports.V_Array.prototype.get = function() {return this.value;};\nexports.V_Array.prototype.asNum = function() {throw \"Cannot convert \" + this.describe() + \" to number!\";};\nexports.V_Array.prototype.asSum = function() {\n var n = 0;\n for (var i = 0; i < this.value.length; ++i) n += this.value[i].asNum();\n if (isNaN(n)) throw \"Cannot sum \" + this.describe() + \" to a number!\";\n return n;\n};\nexports.V_Array.prototype.asString = function() {\n var result = \"\";\n for (var i = 0; i < this.value.length; ++i) {\n var part = this.value[i].asString();\n if (i && part.length) result += \" \";\n if (part.indexOf(/\\s/g) >= 0) result += \"[[\" + part + \"]]\";\n else result += part;\n }\n return result;\n};\n\n\n// String value.\nexports.V_Text = function(value) {\n this.name = \"string\";\n\n this.value = value;\n};\nexports.V_Text.prototype = new exports.Value();\nexports.V_Text.prototype.get = function() {return this.value;};\n//exports.V_Text.prototype.asDate = function() {return $tw.utils.parseDate();}\n\n\n// Date value.\nexports.V_Date = function(value) {\n this.name = \"date\";\n\n this.value = value;\n};\nexports.V_Date.prototype = new exports.Value();\nexports.V_Date.prototype.get = function() {return this.value;};\nexports.V_Date.prototype.asString = function() {return $tw.utils.formatDateString(this.value, exports.DateFormat);};\nexports.V_Date.prototype.asNum = function() {throw \"Date-to-Number conversion usupported\";};\nexports.V_Date.prototype.asSum = function() {throw \"Date-to-Number conversion usupported\";};\nexports.V_Date.prototype.asDate = function() {return this.value;};\n\n\n// Boolean value.\nexports.V_Bool = function(value) {\n this.name = \"boolean\";\n\n this.value = value;\n};\nexports.V_Bool.prototype = new exports.Value();\nexports.V_Bool.prototype.get = function() {return this.value;};\nexports.V_Bool.prototype.asString = function() {return this.value ? \"TRUE\" : \"FALSE\";};\nexports.V_Bool.prototype.asNum = function() {return this.value ? 1 : 0;};\nexports.V_Bool.prototype.asSum = function() {return this.value ? 1 : 0;};\n\n\n// Number value.\nexports.V_Num = function(value) {\n this.name = \"number\";\n\n this.value = value;\n};\nexports.V_Num.prototype = new exports.Value();\nexports.V_Num.prototype.get = function() {return this.value;};\nexports.V_Num.prototype.asString = function() {return (exports.NumberFormatFunc || String)(this.value);};\nexports.V_Num.prototype.asNum = function() {return this.value;};\nexports.V_Num.prototype.asSum = function() {return this.value;};\n\n\n// Percentage value.\nexports.V_Percent = function(value) {\n this.name = \"percentage\";\n\n this.value = value;\n};\nexports.V_Percent.prototype = new exports.V_Num();\nexports.V_Percent.prototype.asString = function()\n{\n return (exports.NumberFormatFunc || String)(100*this.value) + \"%\";\n};\n\n})();\n",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/value.js",
"tags": "",
"module-type": "library",
"modified": "20171211195014088",
"description": "",
"created": "20171211195003728"
},
"$:/plugins/ebalster/formula/widgets/attributes/formula.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Compile = require(\"$:/plugins/ebalster/formula/compile.js\");\nvar Compute = require(\"$:/plugins/ebalster/formula/compute.js\");\nvar Nodes = require(\"$:/plugins/ebalster/formula/nodes.js\");\n\nvar FormulaAttribute = function(widget, node) {\n\tthis.widget = widget;\n\tthis.formula = node.formula;\n\ttry {\n\t\tthis.compiledFormula = Compile.compileFormula(this.formula);\n\t}\n\tcatch (err) {\n\t\tthis.compiledFormula = new Nodes.ThrowError(err);\n\t}\n\tthis.value = this.compute();\n};\n\n/*\nInherit from the base ??? class\n*/\n//FormulaAttribute.prototype = new Attribute();\n\nFormulaAttribute.prototype.compute = function() {\n\t// Compute options\n\tthis.formatOptions =\n\t{\n\t\tfixed: (this.widget.getVariable(\"formulaFixed\")),\n\t\tprecision: (this.widget.getVariable(\"formulaPrecision\")),\n\t\tnumberFormat: (this.widget.getVariable(\"formulaNumberFormat\")),\n\t\tdateFormat: (this.widget.getVariable(\"formulaDateFormat\")),\n\t};\n\t// Execute the formula.\n\ttry {\n\t\treturn Compute.computeFormula(this.compiledFormula, this.widget, this.formatOptions);\n\t}\n\tcatch (err) {\n\t\treturn \"\";\n\t}\n};\n\nFormulaAttribute.prototype.refresh = function(changedTiddlers) {\n\tthis.value = this.compute();\n\treturn this.value;\n};\n\n\nexports.formula = FormulaAttribute;\n\n})();\n\t",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/widgets/attributes/formula.js",
"tags": "",
"module-type": "attributevalue",
"modified": "20171225035808674",
"description": "Evaluates a formula as an attribute value string.",
"created": "20171225035721011"
},
"$:/plugins/ebalster/formula/widgets/formula-vars.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar Compile = require(\"$:/plugins/ebalster/formula/compile.js\");\nvar Compute = require(\"$:/plugins/ebalster/formula/compute.js\");\n\nvar FormulaVarsWidget = function(parseTreeNode,options) {\n\t// Call the constructor\n\tWidget.call(this);\n\t// Initialise\t\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFormulaVarsWidget.prototype = Object.create(Widget.prototype);\n\n/*\nRender this widget into the DOM\n*/\nFormulaVarsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\n\tif (this.formulaError) {\n\t\t// Show an error.\n\t\tvar parseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t}, children: [\n\t\t\t{type: \"text\", text: this.formulaError}\n\t\t]}];\n\t\tthis.makeChildWidgets(parseTreeNodes);\n\t}\n\telse {\n\t\t// Construct and render the child widgets.\n\t\tthis.makeChildWidgets();\n\t}\n\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nRecompute formulas\n*/\nFormulaVarsWidget.prototype.formula_recompute = function() {\n\t// Parse variables\n\tvar self = this;\n\n\tthis.formatOptions =\n\t{\n\t\tfixed: (this.getAttribute(\"$fixed\") || this.parentWidget.getVariable(\"formulaFixed\")),\n\t\tprecision: (this.getAttribute(\"$precision\") || this.parentWidget.getVariable(\"formulaPrecision\")),\n\t\tnumberFormat: (this.getAttribute(\"$numberFormat\") || this.parentWidget.getVariable(\"formulaNumberFormat\")),\n\t\tdateFormat: (this.getAttribute(\"$dateFormat\") || this.parentWidget.getVariable(\"formulaDateFormat\")),\n\t};\n\n\t// Deprecation\n\tif (this.getAttribute(\"$toFixed\")) {this.formulaError = \"Change '$toFixed' to '$fixed'.\"; return;}\n\tif (this.getAttribute(\"$toPrecision\")) {this.formulaError = \"Change '$toPrecision' to '$precision'.\"; return;}\n\n\tif (!this.currentValues)\n\t{\n\t\t// Initial values\n\t\tthis.currentValues = {};\n\t\tthis.formulaSrc = {};\n\t\tthis.formulaComp = {};\n\t}\n\n\tthis.formulaError = null;\n\n\ttry {\n\t\tif (this.getAttribute(\"$noRefresh\")) throw \"Illegal $noRefresh attribute; use $noRebuild instead.\";\n\n\t\t$tw.utils.each(this.attributes,function(val,key) {\n\t\t\tif(key.charAt(0) !== \"$\") {\n\t\t\t\t// Recompile if necessary\n\t\t\t\tif (self.formulaSrc[key] != val) {\n\t\t\t\t\tself.formulaSrc[key] = val;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tself.formulaComp[key] = Compile.compileFormula(self.formulaSrc[key]);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\tself.formulaSrc[key] = null;\n\t\t\t\t\t\tthrow \"Variable \" + key + \": \" + String(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Recompute the formula\n\t\t\t\tif (self.formulaComp[key]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tself.currentValues[key] = Compute.computeFormula(\n\t\t\t\t\t\t\tself.formulaComp[key], self, self.formatOptions);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (err) {\n\t\t\t\t\t\tthrow \"Variable \" + key + \": \" + String(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow \"Variable \" + key + \": Formula not assigned\";\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tcatch (err) {\n\t\tthis.formulaError = String(err);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nFormulaVarsWidget.prototype.execute = function() {\n\t// Recompute formulas\n\tthis.formula_recompute();\n\n\tif (!this.formulaError) {\n\t\tfor (var key in this.currentValues) {\n\t\t\tthis.setVariable(key, this.currentValues[key]);\n\t\t}\n\t}\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nFormulaVarsWidget.prototype.refresh = function formulaVarsRefresh(changedTiddlers) {\n\tthis.computeAttributes();\n\tvar oldValues = Object.assign({}, this.currentValues || {}), oldError = this.formulaError;\n\tthis.formula_recompute();\n\n\t// Did any computed values change?\n\tvar changedValues = false;\n\tfor (var key in this.currentValues) {\n\t\tif (this.currentValues[key] !== oldValues[key]) {\n\t\t\tthis.setVariable(key, this.currentValues[key]);\n\t\t\tchangedValues = true;\n\t\t}\n\t}\n\n\t// Option to suppress full refreshing\n\tif (this.getAttribute(\"$noRebuild\") === \"true\") changedValues = false;\n\tif (this.formulaError !== oldError) changedValues = true;\n\n\tif(changedValues) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports[\"formula-vars\"] = FormulaVarsWidget;\n\n})();\n",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/widgets/formula-vars.js",
"tags": "",
"module-type": "widget",
"modified": "20171222071557661",
"description": "As the $vars widget, but each attribute is interpreted as a formula.",
"created": "20171216003055342"
},
"$:/plugins/ebalster/formula/widgets/formula.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar Compile = require(\"$:/plugins/ebalster/formula/compile.js\");\nvar Compute = require(\"$:/plugins/ebalster/formula/compute.js\");\n\nvar FormulaWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFormulaWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFormulaWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.rerender(parent,nextSibling);\n};\n\nFormulaWidget.prototype.rerender = function(parent, nextSibling) {\n\n\tthis.removeChildDomNodes();\n\n\tvar parseTreeNodes;\n\n\tif (this.formulaError) {\n\t\t// Show an error as a tc-error span.\n\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t}, children: [\n\t\t\t{type: \"text\", text: this.formulaError}\n\t\t]}];\n\t}\n\telse {\n\t\t// Parse the value, or, failing this, produce a text node.\n\t\tvar parser = this.wiki.parseText(\n\t\t\tthis.wikifyType, this.currentValue,\n\t\t\t{parseAsInline: this.wikifyMode === \"inline\"});\n\t\tparseTreeNodes = (parser ? parser.tree : [{type: \"text\", text: this.currentValue}]);\n\t}\n\n\t// Construct and render the child widgets.\n\tthis.makeChildWidgets(parseTreeNodes);\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFormulaWidget.prototype.execute = function() {\n\n\tvar oldFormula = this.formula;\n\n\t// Get parameters from our attributes\n\tthis.formula = this.getAttribute(\"formula\");\n\tthis.debug = this.getAttribute(\"debug\");\n\n\tthis.wikifyType = this.getAttribute(\"outputType\");\n\tthis.wikifyMode = this.getAttribute(\"outputMode\",\"inline\");\n\n\tthis.formatOptions =\n\t{\n\t\tfixed: (this.getAttribute(\"fixed\") || this.getVariable(\"formulaFixed\")),\n\t\tprecision: (this.getAttribute(\"precision\") || this.getVariable(\"formulaPrecision\")),\n\t\tnumberFormat: (this.getAttribute(\"numberFormat\") || this.getVariable(\"formulaNumberFormat\")),\n\t\tdateFormat: (this.getAttribute(\"dateFormat\") || this.getVariable(\"formulaDateFormat\")),\n\t};\n\n\t// Deprecation\n\tif (this.getAttribute(\"toFixed\")) {this.formulaError = \"Change 'toFixed' to 'fixed'.\"; return;}\n\tif (this.getAttribute(\"toPrecision\")) {this.formulaError = \"Change 'toPrecision' to 'precision'.\"; return;}\n\n\t// Compile the formula, if it has changed, yielding compiledFormula\n\tif(this.formula !== oldFormula) {\n\t\t// Clear the error flag\n\t\tthis.formulaError = null;\n\t\tthis.compiledFormula = null;\n\t\tif (this.formula) {\n\t\t\ttry {\n\t\t\t\tthis.compiledFormula = Compile.compileFormula(this.formula);\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tthis.formulaError = String(err);\n\t\t\t\tthis.formula = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compute the formula, yielding currentValue\n\tif(this.compiledFormula) {\n\t\ttry {\n\t\t\tthis.currentValue = Compute.computeFormula(this.compiledFormula, this, this.formatOptions, Boolean(this.debug));\n\t\t}\n\t\tcatch (err) {\n\t\t\tthis.formulaError = String(err);\n\t\t}\n\t}\n\telse {\n\t\tthis.formulaError = \"Error: formula not assigned\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFormulaWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldValue = this.currentValue, oldError = this.formulaError;\n\tthis.execute();\n\tif(this.oldError !== this.formulaError || this.currentValue !== oldValue) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\t// We DON'T call refreshSelf() because it call execute() again\n\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\tthis.rerender(this.parentDomNode,nextSibling);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.formula = FormulaWidget;\n\n})();\n",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/widgets/formula.js",
"tags": "",
"module-type": "widget",
"modified": "20171212194059701",
"description": "Evaluates a formula.",
"created": "20171210232543292"
},
"$:/plugins/ebalster/formula/wikiparser/attributes/formula.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nexports.formula = function(source, pos, node) {\n\t// Is it a formula?\n\tvar reFormulaValue = /\\(=(([^=]+|=[^\\)])*)=\\)/g;\n\n\tvar value = $tw.utils.parseTokenRegExp(source,pos,reFormulaValue);\n\tif (!value) return null;\n\n\tnode.type = \"formula\";\n\tnode.formula = value.match[1];\n\tnode.end = value.end;\n\treturn node;\n};\n\n})();\n",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/wikiparser/attributes/formula.js",
"tags": "",
"module-type": "attributerule",
"modified": "20171225042523039",
"description": "Tag attribute rule for formulas. Ex. `(= 2+2 =)`",
"created": "20171224060415431"
},
"$:/plugins/ebalster/formula/wikiparser/formula.js": {
"text": "(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"formula\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\(=/mg;\n\tthis.endMatchRegExp = /=\\)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Look for the end marker\n\tthis.endMatchRegExp.lastIndex = this.parser.pos;\n\tvar match = this.endMatchRegExp.exec(this.parser.source),\n\t\ttext;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"formula\",\n\t\tattributes: {\n\t\t\tformula: {type: \"string\", value: text},\n\t\t}\n\t}];\n};\n\n})();\n",
"bag": "default",
"revision": "0",
"type": "application/javascript",
"title": "$:/plugins/ebalster/formula/wikiparser/formula.js",
"tags": "",
"module-type": "wikirule",
"modified": "20171211181716654",
"description": "Wiki text inline rule for formulas. Ex. `((=2+2))`",
"created": "20171211033327565"
}
}
}
{
"tiddlers": {
"$:/plugins/felixhayashi/hotzone/config.js": {
"title": "$:/plugins/felixhayashi/hotzone/config.js",
"text": "/*\\\n\ntitle: $:/plugins/felixhayashi/hotzone/config.js\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n(function(){\"use strict\";exports.config={classNames:{storyRiver:\"tc-story-river\",tiddlerFrame:\"tc-tiddler-frame\",tiddlerTitle:\"tc-title\"},references:{userConfig:\"$:/config/hotzone/focusOffset\",focussedTiddlerStore:\"$:/temp/focussedTiddler\"},checkbackTime:$tw.utils.getAnimationDuration()}})();",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/hotzone/hotzone.js": {
"title": "$:/plugins/felixhayashi/hotzone/hotzone.js",
"text": "/*\\\n\ntitle: $:/plugins/felixhayashi/hotzone/hotzone.js\ntype: application/javascript\nmodule-type: startup\n\n@preserve\n\n\\*/\n(function(){\"use strict\";exports.name=\"hotzone\";exports.platforms=[\"browser\"];exports.after=[\"story\"];exports.synchronous=true;exports.startup=function(){var t=require(\"$:/plugins/felixhayashi/hotzone/config.js\").config;var e=null;var i=false;var r=document.getElementsByClassName(t.classNames.storyRiver)[0];var s=$tw.wiki.getTiddlerData(t.references.userConfig,{});var a=isNaN(parseInt(s.focusOffset))?150:parseInt(s.focusOffset);var n=function(e,i,r){if(!(e instanceof Element))return;if(!$tw.utils.hasClass(e,t.classNames.tiddlerFrame))return;var s=e.getElementsByClassName(t.classNames.tiddlerTitle)[0];if(s){var a=s.innerText||s.textContent;return a.trim()}};var o=function(t){if(!i){i=true;window.setTimeout(f,t||0)}};var l=function(e,i){$tw.wiki.addTiddler(new $tw.Tiddler({title:t.references.focussedTiddlerStore,text:e},$tw.wiki.getModificationFields()));if(i){var r=document.getElementsByClassName(\"hzone-focus\")[0];if(r){$tw.utils.removeClass(r,\"hzone-focus\")}$tw.utils.addClass(i,\"hzone-focus\")}};var f=function(){i=false;var s=$tw.wiki.getTiddler(\"$:/StoryList\");if(s&&s.fields.list.length){var o=null;var f=Number.MAX_VALUE;var d=r.children;var u=t.classNames.tiddlerFrame;for(var c=d.length;c--;){if($tw.utils.hasClass(d[c],u)){var v=d[c].getBoundingClientRect();var w=Math.min(Math.abs(a-v.top),Math.abs(a-v.bottom));if(w<f){o=d[c];f=w}}}var m=n(o);if(m!==e&&$tw.wiki.getTiddler(m)){e=m;l(e,o);return}}else if(e){e=\"\";l(e)}};var d=function(t){if(t[\"$:/HistoryList\"]){if(!$tw.wiki.tiddlerExists(\"$:/HistoryList\"))return;var e=$tw.wiki.getTiddler(\"$:/HistoryList\").fields[\"current-tiddler\"];var i=$tw.wiki.getTiddlerList(\"$:/StoryList\");var r=i.indexOf(e)>=0;if(!r)return;o($tw.utils.getAnimationDuration()+100)}else if(t[\"$:/StoryList\"]){o($tw.utils.getAnimationDuration()+100)}};var u=function(t){o(250)};$tw.wiki.addEventListener(\"change\",d);window.addEventListener(\"scroll\",u,false);u()}})();",
"type": "application/javascript",
"module-type": "startup"
},
"$:/plugins/felixhayashi/hotzone/Configuration": {
"title": "$:/plugins/felixhayashi/hotzone/Configuration",
"text": "Please see the [[GitHub page|https://github.com/felixhayashi/TW5-HotZone]] for more information on the options.\n\nSave and reload the wiki to activate changes.\n\n<table>\n <tr>\n <th align=\"left\">Focus offset:</th>\n <td><$edit-text tiddler=\"$:/config/hotzone/focusOffset\" tag=\"input\" default=\"71px\" /></td>\n </tr>\n</table>"
},
"$:/temp/focussedTiddler": {
"title": "$:/temp/focussedTiddler"
},
"$:/plugins/felixhayashi/hotzone/License": {
"title": "$:/plugins/felixhayashi/hotzone/License",
"text": "This code is released under the BSD license. For the exact terms visit:\n\nhttps://github.com/felixhayashi/TW5-HotZone/blob/master/LICENSE"
},
"$:/plugins/felixhayashi/hotzone/Readme": {
"title": "$:/plugins/felixhayashi/hotzone/Readme",
"text": "Please visit the [[GitHub page|https://github.com/felixhayashi/TW5-HotZone]] for more information."
}
}
}
{
"tiddlers": {
"$:/plugins/felixhayashi/tiddlymap/layout": {
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline \n\n@charset \"UTF-8\";\n/********************************************************************\n * README \n ********************************************************************\n * \n * If you add some non-valid css string that won't compile and \n * unquote also doesn't help, do the following: in this stylesheet,\n * add a placeholder of the form __yourVariable__ at the point where\n * you need the string to be inserted. Then visit the gulpfile.js\n * file and add a replace instruction for your variable so it will\n * be replaced after the sass compiler has finished.\n * \n * Careful of the variable scope. Variables defined in partials\n * are visible everywhere https://gist.github.com/matyus/4339721.\n * \n *******************************************************************/\n/**\n * Returns a makedatauri macro\n */\n/**\n * Do not allow blurred background for dialogs\n * see: https://github.com/Jermolene/TiddlyWiki5/issues/1893\n */\nbody .tc-page-container-wrapper.tc-modal-displayed {\n -webkit-filter: inherit;\n -moz-filter: inherit;\n filter: inherit; }\n\nbody .tc-modal-wrapper {\n z-index: 1010; }\n body .tc-modal-wrapper .tc-modal-header svg {\n vertical-align: sub; }\n body .tc-modal-wrapper .tc-modal-header h3 {\n line-height: 10px; }\n body .tc-modal-wrapper .tc-modal-body {\n min-height: 250px;\n max-height: 70vh;\n padding-top: 0px;\n padding-bottom: 0px;\n overflow: auto; }\n body .tc-modal-wrapper .tc-modal-footer {\n padding: 8px; }\n body .tc-modal-wrapper .tc-modal-footer .tmap-dialog-button {\n font-weight: bold; }\n body .tc-modal-wrapper .tc-modal-footer .tmap-hidden-close-button {\n display: none; }\n\ntable.tmap-table tr, .tc-modal-body table.tmap-config-table tr {\n /*\n &:hover {\n background-color: #FFFFF3;\n }\n*/ }\n table.tmap-table tr:nth-child(odd), .tc-modal-body table.tmap-config-table tr:nth-child(odd) {\n background-color: #F0F0F0; }\n table.tmap-table tr:nth-child(even), .tc-modal-body table.tmap-config-table tr:nth-child(even) {\n background-color: #FFFFFF; }\n\n.tmap-save-canvas-preview {\n text-align: center; }\n .tmap-save-canvas-preview img {\n background-color: white;\n border: 1px solid lightgray;\n max-width: 100%;\n max-height: 100px; }\n\n.tmap-list-separator {\n display: block;\n background-color: #efefef;\n margin: 10px 0 5px 0;\n cursor: default;\n border-bottom: 1px dotted gray;\n font-weight: bold;\n font-size: 0.8em; }\n\n.tmap-unicode-icon {\n width: 1em;\n display: inline-block;\n text-align: center;\n color: black; }\n\nhtml .tmap-link {\n color: #5778D8; }\n html .tmap-link:hover {\n color: white;\n background: #5778D8; }\n\nhtml .tmap-small-list, html .tmap-smaller-list, html .tmap-very-small-list {\n overflow: auto;\n min-height: 2em;\n max-height: 9em;\n display: block; }\n\nhtml .tmap-smaller-list {\n max-height: 7em; }\n\nhtml .tmap-very-small-list {\n max-height: 5empx; }\n\nhtml .tc-tiddler-controls button.tmap-active-button svg {\n fill: #888888; }\n\nhtml #tmap-node-filter-dialog #tmap-filter-tips {\n font-size: 0.8em; }\n\nhtml #tmap-node-filter-dialog textarea {\n height: 100px;\n max-height: 300px;\n overflow: auto;\n width: 100%;\n font-size: 11px;\n font-family: \"Courier New\", Courier, monospace; }\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n .tc-sidebar-scrollable .tmap-desktop-editor .tmap-widget:not(.tmap-fullscreen) {\n display: none; } }\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n .tc-sidebar-scrollable .tmap-mobile-editor {\n display: none; }\n .tc-modal-wrapper {\n z-index: 1010; }\n .tc-modal-wrapper .tc-modal {\n boder: 1px solid #999999;\n left: calc(50% - 400px);\n width: 802px; }\n .tc-modal-wrapper .tc-modal-body {\n left: calc(50% - 400px);\n width: 800px; } }\n\n/**\n * see https://developer.mozilla.org/en/docs/Web/CSS/animation\n */\n/*** Keyframes for animations *************************************/\n@-o-keyframes fadein-keyframes {\n 0% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n@-moz-keyframes fadein-keyframes {\n 0% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n@-webkit-keyframes fadein-keyframes {\n 0% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n@keyframes flash fadein-keyframes {\n 0% {\n opacity: 0; }\n 100% {\n opacity: 1; } }\n\n@-o-keyframes fadeout-keyframes {\n 0% {\n opacity: 1; }\n 100% {\n opacity: 0; } }\n\n@-moz-keyframes fadeout-keyframes {\n 0% {\n opacity: 1; }\n 100% {\n opacity: 0; } }\n\n@-webkit-keyframes fadeout-keyframes {\n 0% {\n opacity: 1; }\n 100% {\n opacity: 0; } }\n\n@keyframes flash fadeout-keyframes {\n 0% {\n opacity: 1; }\n 100% {\n opacity: 0; } }\n\n.tmap-config-widget {\n background: #F0F0F0;\n padding: 5px;\n margin: 5px 0;\n box-sizing: border-box;\n display: block; }\n .tmap-config-widget .vis-network {\n display: none; }\n .tmap-config-widget .vis-configuration-wrapper {\n width: 100%; }\n .tmap-config-widget .vis-configuration-wrapper .vis-config-rangeinput {\n height: inherit;\n margin-left: 4px; }\n .tmap-config-widget .vis-configuration-wrapper .vis-configuration.vis-config-item {\n width: 100%;\n height: inherit;\n background: none;\n padding-left: 0px;\n left: 0; }\n .tmap-config-widget .vis-configuration-wrapper .vis-configuration.vis-config-item.tmap-vis-config-item-active .vis-config-label::after {\n content: \"(inherited)\";\n position: absolute;\n display: inline-block;\n margin-left: 10px;\n -o-animation: fadein-keyframes 1s;\n -moz-animation: fadein-keyframes 1s;\n -webkit-animation: fadein-keyframes 1s;\n animation: fadein-keyframes 1s;\n content: \"✔\";\n color: green;\n font-weight: bold;\n font-size: 15px; }\n .tmap-config-widget .vis-configuration-wrapper .vis-configuration.vis-config-item.tmap-vis-config-item-inactive .vis-config-label::after {\n /*\n @include marker;\n content: \"✔\";\n color: lightgray;\n position: absolute;\n*/ }\n .tmap-config-widget .vis-configuration-wrapper .vis-configuration.vis-config-item button.tmap-config-item-reset {\n vertical-align: top;\n margin-left: 5px; }\n .tmap-config-widget .vis-configuration-wrapper .vis-configuration.vis-config-item .vis-config-range {\n width: 150px; }\n .tmap-config-widget .vis-configuration-wrapper .vis-configuration.vis-config-item .vis-config-range::-moz-range-track {\n width: 150px !important; }\n .tmap-config-widget .vis-configuration-wrapper .vis-configuration.vis-config-item .vis-config-label {\n width: 150px; }\n .tmap-config-widget::after {\n clear: both;\n content: \"\";\n display: block; }\n\n/*\n$color-picker-height: 200;\ndiv div.vis-color-picker {\n div.vis-color {\n width: $color-picker-height + px;\n height: $color-picker-height + px;\n }\n \n div.vis-brightness {\n top: ($color-picker-height + 30) + px;\n }\n \n div.vis-label.vis-brightness {\n top: ($color-picker-height + 43) + px;\n }\n \n div.vis-label.vis-opacity {\n top: 338px\n }\n \n div.vis-opacity {\n top: 351px;\n }\n div.vis-initial-color, vis-new-color {\n top: 381px;\n }\n \n div.vis-button {\n top: 411px;\n }\n\n}\n*/\n.tmap-flash-message {\n border: 1px solid lightgray;\n padding: 5px;\n margin: 6px 0;\n display: block;\n color: #333333; }\n .tmap-flash-message.tmap-info, .tmap-flash-message.tmap-plain, .tmap-flash-message.tmap-neutral {\n background: #F0F0F0; }\n .tmap-flash-message.tmap-info::before, .tmap-flash-message.tmap-plain::before, .tmap-flash-message.tmap-neutral::before {\n content: \"i\";\n display: inline-block;\n border-radius: 50%;\n width: 0.8em;\n border: 2px solid;\n font-family: serif;\n text-align: center;\n height: 0.8em;\n font-weight: bold;\n line-height: 0.8em;\n vertical-align: text-top;\n margin-right: 2px; }\n .tmap-flash-message.tmap-valid, .tmap-flash-message.tmap-success {\n background: #D1EED4; }\n .tmap-flash-message.tmap-valid::before, .tmap-flash-message.tmap-success::before {\n content: \"i\";\n display: inline-block;\n border-radius: 50%;\n width: 0.8em;\n border: 2px solid;\n font-family: serif;\n text-align: center;\n height: 0.8em;\n font-weight: bold;\n line-height: 0.8em;\n vertical-align: text-top;\n margin-right: 2px; }\n .tmap-flash-message.tmap-warning {\n background: #FFF6D1; }\n .tmap-flash-message.tmap-warning::before {\n content: \"\";\n display: inline-block;\n background: url(<<tmap \"datauri\" \"$:/core/images/warning\" \"\">>);\n display: inline-block;\n width: 1em;\n height: 1em;\n background-size: 100% 100%;\n vertical-align: text-top;\n margin-right: 2px; }\n .tmap-flash-message.tmap-malformed, .tmap-flash-message.tmap-invalid, .tmap-flash-message.tmap-danger {\n background: #EED5D1; }\n .tmap-flash-message.tmap-malformed::before, .tmap-flash-message.tmap-invalid::before, .tmap-flash-message.tmap-danger::before {\n content: \"\";\n display: inline-block;\n background: url(<<tmap \"datauri\" \"$:/core/images/warning\" \"\">>);\n display: inline-block;\n width: 1em;\n height: 1em;\n background-size: 100% 100%;\n vertical-align: text-top;\n margin-right: 2px; }\n\n.tmap-widget {\n background: #FFFFFF;\n width: auto;\n position: relative;\n border: 1px dotted lightgray;\n padding: 2px;\n color: #666666;\n display: block; }\n .tmap-widget.tmap-click-to-use:not(.tmap-fullscreen) .vis-network:not(.vis-active) {\n cursor: pointer; }\n .tmap-widget.tmap-click-to-use:not(.tmap-fullscreen) .vis-network:not(.vis-active) .vis-navigation {\n display: none; }\n .tmap-widget.tmap-click-to-use:not(.tmap-fullscreen) .vis-network:not(.vis-active):hover:before {\n color: gray;\n background: white;\n content: \"Click to use\";\n font-size: 14px;\n font-weight: bold;\n right: calc(50% - 65px - 5px);\n position: absolute;\n text-align: center;\n top: calc(50% - 14px - 5px);\n width: 130px;\n z-index: 2000;\n padding: 5px;\n pointer-events: none;\n background-color: rgba(255, 255, 255, 0.3); }\n .tmap-widget .tmap-loading-bar {\n display: none;\n position: absolute;\n text-align: center;\n font-size: 2em;\n padding: 10px;\n top: 50%;\n background: rgba(245, 245, 245, 0.5);\n z-index: 1;\n width: 250px;\n margin: auto;\n left: 0px;\n right: 0px; }\n .tmap-widget .tmap-vis-graph {\n height: calc(100% - 35px); }\n .tmap-widget.tmap-no-buttons .vis-navigation {\n display: none; }\n .tmap-widget.tmap-advanced-editor .tmap-topbar {\n background: #d6d9d8; }\n .tmap-widget.tmap-advanced-editor .tmap-topbar .tmap-active-button {\n color: #488DCD; }\n .tmap-widget.tmap-advanced-editor .tmap-topbar .tmap-active-button svg {\n fill: #488DCD; }\n .tmap-widget.tmap-advanced-editor .tmap-topbar .tmap-unicode-button {\n font-size: 1.5em;\n vertical-align: bottom; }\n .tmap-widget .tmap-menu-bar {\n width: 100%; }\n .tmap-widget .tmap-topbar {\n background: #F5F5F5;\n border-bottom: 1px solid lightgray;\n padding: 3px 5px;\n height: 35px;\n position: relative; }\n .tmap-widget .tmap-topbar .tmap-view-label {\n width: 100%;\n text-align: center;\n font-weight: bold;\n padding-top: 3px; }\n .tmap-widget .tmap-topbar .tmap-focus-button {\n position: absolute;\n right: 10px;\n top: 6px; }\n .tmap-widget .tmap-topbar .tmap-focus-button input {\n width: 140px; }\n .tmap-widget .tmap-topbar .tmap-search-dropdown {\n position: relative; }\n .tmap-widget .tmap-topbar .tmap-search-dropdown .tc-drop-down {\n position: absolute;\n z-index: 999;\n right: 0px; }\n .tmap-widget .tmap-topbar [hidden] {\n display: none; }\n .tmap-widget .tmap-topbar select {\n width: 30%;\n max-width: 200px;\n word-wrap: initial;\n padding: 0px; }\n .tmap-widget .tmap-topbar button {\n line-height: inherit;\n color: #666666; }\n .tmap-widget .tmap-topbar > * {\n display: inline-block; }\n .tmap-widget .tmap-topbar .tmap-separator:after {\n color: #bdbdbd;\n margin: 3px;\n content: \" | \"; }\n .tmap-widget .tmap-topbar .tc-edit-add-tag .tc-add-tag-name input {\n width: 70%; }\n .tmap-widget .tmap-topbar .tc-sidebar-header {\n text-shadow: none; }\n .tmap-widget .tmap-topbar .tc-edit-tags {\n border: none;\n padding: inherit;\n box-shadow: none; }\n\n.tmap-widget.tmap-static-mode .tmap-topbar {\n height: initial; }\n\n.tmap-widget.tmap-static-mode .tmap-vis-graph {\n text-align: center;\n cursor: not-allowed; }\n .tmap-widget.tmap-static-mode .tmap-vis-graph:not(.tmap-graph-placeholder):hover::before {\n box-shadow: 10px 10px 5px lightgray;\n color: gray;\n background: white;\n content: \"Static\";\n font-size: 18px;\n font-weight: bold;\n left: 50%;\n margin-left: -100px;\n position: absolute;\n text-align: center;\n top: 50px;\n width: 200px;\n z-index: 2000;\n padding: 5px;\n pointer-events: none; }\n .tmap-widget.tmap-static-mode .tmap-vis-graph.tmap-graph-placeholder::before {\n content: \"No Preview\";\n display: block;\n text-align: center;\n padding: 20px; }\n\n.tmap-widget .tc-drop-down {\n min-width: 170px;\n max-width: 210px;\n padding: 5px;\n margin: 5px 0; }\n .tmap-widget .tc-drop-down button, .tmap-widget .tc-drop-down a {\n padding: 0 2px;\n text-decoration: none; }\n .tmap-widget .tc-drop-down button:hover, .tmap-widget .tc-drop-down a:hover {\n color: #ffffff; }\n .tmap-widget .tc-drop-down button svg, .tmap-widget .tc-drop-down a svg {\n vertical-align: middle; }\n\n.tmap-widget .tc-block-dropdown {\n width: 370px;\n min-width: 370px;\n padding: 5px;\n margin: 15px 0 0 -370px; }\n .tmap-widget .tc-block-dropdown a {\n display: inline;\n padding: 0px; }\n\n.tmap-widget.tmap-plain-design {\n border: none;\n padding: 0px; }\n .tmap-widget.tmap-plain-design .tmap-topbar {\n display: none; }\n\n.tc-sidebar-scrollable .tmap-widget {\n position: absolute;\n min-height: 350px; }\n\n/*** vis ***********************************************************/\n.tmap-widget div.vis-network .vis-edit-mode {\n height: 26px; }\n\n.tmap-widget div.vis-network .vis-manipulation {\n height: 34px;\n border-top: 1px solid #d6d9d8;\n background: rgba(245, 245, 245, 0.7); }\n\n.tmap-widget div.vis-network .vis-navigation .vis-button.tmap-button-enabled {\n right: 15px; }\n .tmap-widget div.vis-network .vis-navigation .vis-button.tmap-button-enabled.tmap-fullscreen-button {\n bottom: 90px;\n background-image: url(<<tmap \"datauri\" \"$:/plugins/felixhayashi/tiddlymap/media/fullscreen.png\" \"\">>); }\n .tmap-widget div.vis-network .vis-navigation .vis-button.tmap-button-enabled.tmap-halfscreen-button {\n bottom: 130px;\n background-image: url(<<tmap \"datauri\" \"$:/plugins/felixhayashi/tiddlymap/media/halfscreen.png\" \"\">>); }\n\n.tmap-widget div.vis-network .vis-navigation .vis-button:hover {\n box-shadow: 0 0 3px 3px rgba(75, 75, 75, 0.3); }\n .tmap-widget div.vis-network .vis-navigation .vis-button:hover:before {\n background: beige;\n display: block;\n color: black;\n padding: 3px;\n position: relative;\n border: 1px solid lightgray;\n width: 80px;\n left: -100px;\n top: -50px;\n z-index: 1000;\n text-align: center; }\n .tmap-widget div.vis-network .vis-navigation .vis-button:hover.vis-up:before {\n left: 30px;\n content: \"Scroll up\"; }\n .tmap-widget div.vis-network .vis-navigation .vis-button:hover.vis-down:before {\n left: 30px;\n content: \"Scroll down\"; }\n .tmap-widget div.vis-network .vis-navigation .vis-button:hover.vis-right:before {\n left: 30px;\n content: \"Scroll right\"; }\n .tmap-widget div.vis-network .vis-navigation .vis-button:hover.vis-left:before {\n left: 30px;\n content: \"Scroll left\"; }\n .tmap-widget div.vis-network .vis-navigation .vis-button:hover.vis-zoomOut:before {\n content: \"Zoom out\"; }\n .tmap-widget div.vis-network .vis-navigation .vis-button:hover.vis-zoomIn:before {\n content: \"Zoom in\"; }\n .tmap-widget div.vis-network .vis-navigation .vis-button:hover.vis-zoomExtends:before {\n content: \"Fit whole graph\"; }\n .tmap-widget div.vis-network .vis-navigation .vis-button:hover.tmap-fullscreen-button:before {\n content: \"Toggle Fullscreen\"; }\n .tmap-widget div.vis-network .vis-navigation .vis-button:hover.tmap-halfscreen-button:before {\n content: \"Toggle Halfscreen\"; }\n\n.tc-dropzone > .tc-story-river .tmap-widget .vis-navigation .tmap-halfscreen-button {\n display: none; }\n\n.tc-dropzone > .tc-story-river .tmap-widget:not(.tmap-fullscreen) .vis-navigation .vis-button {\n display: none; }\n\n.tc-dropzone > .tc-story-river .tmap-widget:hover .vis-navigation .vis-button.tmap-fullscreen-button {\n display: block; }\n\n.tc-dropzone > .tc-story-river .tmap-widget:hover .vis-navigation .vis-button.vis-zoomExtends {\n display: block; }\n\n/*** Fullscreen ****************************************************/\nbody.tmap-has-fullscreen-widget {\n overflow: hidden; }\n body.tmap-has-fullscreen-widget .tmap-widget.tmap-fullscreen {\n background: white !important;\n height: 100% !important;\n width: 100% !important;\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n z-index: 999 !important;\n border: none !important;\n margin: 0 !important; }\n body.tmap-has-fullscreen-widget .tc-dropzone > *.tmap-has-fullscreen-widget {\n background: white !important;\n height: 100% !important;\n width: 100% !important;\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n z-index: 999 !important;\n border: none !important;\n margin: 0 !important; }\n body.tmap-has-fullscreen-widget .tc-dropzone > *:not(.tmap-has-fullscreen-widget) {\n display: none; }\n\nbody.tmap-has-halfscreen-widget .tmap-widget.tmap-halfscreen {\n background: white !important;\n height: 100% !important;\n width: 100% !important;\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: 0 !important;\n z-index: 999 !important;\n border: none !important;\n margin: 0 !important;\n position: absolute !important;\n border-left: 1px solid lightgray !important; }\n\n.tc-modal-footer .tmap-hidden-close-button {\n display: none; }\n\n.tmap-modal-content {\n position: relative;\n padding: 1em 0;\n padding-top: 0; }\n .tmap-modal-content table tr td {\n vertical-align: top; }\n .tmap-modal-content :not(pre) > code {\n padding: 1px;\n font-size: 0.9em;\n position: relative;\n top: -1px; }\n .tmap-modal-content :not(pre) > code {\n color: #666666; }\n .tmap-modal-content .tc-tab-set .tc-tab-content {\n margin-top: 0.5em; }\n .tmap-modal-content .tc-image-button {\n font-size: 14px; }\n .tmap-modal-content fieldset {\n margin: 0px; }\n .tmap-modal-content fieldset legend {\n font-weight: bold; }\n\n.tc-modal-body .tmap-modal-editor > p {\n margin: 0px; }\n\n.tc-modal-body .tmap-modal-editor .tmap-template-select select {\n width: 50%; }\n\n.tc-modal-body .tmap-modal-editor .tc-tiddler-frame {\n margin: auto;\n width: auto; }\n .tc-modal-body .tmap-modal-editor .tc-tiddler-frame .tc-tiddler-controls {\n display: none; }\n .tc-modal-body .tmap-modal-editor .tc-tiddler-frame .tc-tiddler-title {\n display: none; }\n\n.tc-modal-body table {\n margin: 6px 0;\n border: none;\n width: 100%; }\n .tc-modal-body table td, .tc-modal-body table th {\n border: 1px solid lightgray; }\n .tc-modal-body table.tmap-key-value-table th {\n width: 30%;\n background-color: #F0F0F0; }\n .tc-modal-body table.tmap-config-table.tmap-large-input tr td:last-child {\n width: 20%; }\n .tc-modal-body table.tmap-config-table.tmap-small-input tr td:last-child {\n width: 60%; }\n .tc-modal-body table.tmap-config-table tr td {\n border: none;\n vertical-align: top;\n padding: 5px; }\n .tc-modal-body table.tmap-config-table tr td:first-child {\n width: 15%; }\n .tc-modal-body table.tmap-config-table tr td:last-child {\n width: 40%; }\n .tc-modal-body table.tmap-config-table tr td input:not([type=radio]), .tc-modal-body table.tmap-config-table tr td textarea, .tc-modal-body table.tmap-config-table tr td select {\n width: 100%;\n /* prevents bad looking select boxes and wrapping in textareas */\n word-wrap: normal; }\n .tc-modal-body table.tmap-config-table tr td textarea {\n height: 100%; }\n .tc-modal-body table.tmap-config-table tr td .tmap-no-stretch input, .tc-modal-body table.tmap-config-table tr td .tmap-no-stretch textarea, .tc-modal-body table.tmap-config-table tr td .tmap-no-stretch select {\n width: auto; }\n .tc-modal-body table.tmap-config-table tr td div.tmap-button-wrapper {\n text-align: center; }\n .tc-modal-body table.tmap-config-table tr td .tmap-note {\n margin-top: 0.5em; }\n .tc-modal-body table.tmap-config-table tr td .tmap-description {\n font-style: italic; }\n\n#tmap-element-type-manager > div:first-child {\n height: 50vh;\n float: left;\n width: 21%;\n background: linear-gradient(90deg, whitesmoke 0%, white 50%); }\n #tmap-element-type-manager > div:first-child .tmap-searchbar {\n padding: 1em 0 0 0; }\n #tmap-element-type-manager > div:first-child .tmap-searchbar input {\n width: calc(100% - 36px); }\n #tmap-element-type-manager > div:first-child .tmap-searchbar button {\n width: 30px;\n float: right; }\n #tmap-element-type-manager > div:first-child ul {\n height: calc(100% - 65px);\n overflow: auto;\n margin-top: 1em;\n padding: 0; }\n #tmap-element-type-manager > div:first-child ul.no-bullets li {\n list-style: none; }\n #tmap-element-type-manager > div:first-child ul li {\n white-space: nowrap; }\n #tmap-element-type-manager > div:first-child ul li .tmap-ranking {\n width: 30px;\n display: inline-block; }\n\n#tmap-element-type-manager > div:last-child {\n height: 100%;\n width: calc(79% - 15px);\n float: right; }\n #tmap-element-type-manager > div:last-child .tc-tab-set .tc-tab-content {\n overflow: auto;\n height: 50vh; }\n\n.tmap-manage-node-types .tmap-edge-type-specific {\n display: none !important; }\n\n.tmap-manage-edge-types .tmap-node-type-specific {\n display: none !important; }\n\n.tmap-modal-fullscreen-editor .tc-tab-content p {\n margin: 1em 0; }\n\n.tmap-has-pending-template {\n background-color: #C1EDC4; }\n\n#tmap-search-table td {\n border: none;\n padding-left: 0px; }\n #tmap-search-table td:first-child {\n width: 30px; }\n\n#tmap-search-table b {\n display: inline-block;\n width: 40px;\n text-align: right; }\n\n#tmap-search-table ul {\n padding-left: 20px;\n margin: 1em 0 0 0; }\n #tmap-search-table ul li {\n list-style: inherit; }\n #tmap-search-table ul button {\n text-align: left; }\n\nbutton.tmap-go-back {\n margin-bottom: 1em;\n font-weight: bold; }\n\n.tmap-badges > span, .tmap-badge {\n background: gray;\n font-size: 11px;\n color: white;\n padding: 3px 4px;\n display: inline-block;\n font-weight: bold;\n border-radius: 2px;\n line-height: 1em;\n cursor: help; }\n .tmap-badges > span.tmap-red-flag, .tmap-badge.tmap-red-flag {\n background: red; }\n\n/**\n * See http://stackoverflow.com/questions/3331353/transitions-on-the-display-property\n */\n.tmap-popup {\n display: none;\n position: absolute;\n opacity: 0;\n transition: opacity 0.3s ease; }\n .tmap-popup.tmap-popup-active {\n opacity: 1; }\n\n.tmap-tooltip {\n box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2);\n min-width: 100px;\n min-height: 50px;\n max-width: <<tmap option config.sys.popups.width>>;\n max-height: <<tmap option config.sys.popups.height>>;\n padding: 5px;\n resize: both;\n overflow: auto;\n cursor: auto;\n font-family: verdana;\n font-size: 14px;\n background-color: #f5f4ed;\n border: 1px solid #808074;\n -moz-border-radius: 3px;\n -webkit-border-radius: 3px;\n border-radius: 3px; }\n .tmap-tooltip[style*=\"height\"] {\n max-height: none !important; }\n .tmap-tooltip[style*=\"width\"] {\n max-width: none !important; }\n\n.tmap-quick-connect {\n font-size: 0.7em; }\n .tmap-quick-connect p {\n padding-left: 0;\n padding-right: 0; }\n .tmap-quick-connect .tc-drop-down {\n padding: 5px;\n width: 250px;\n white-space: normal;\n line-height: 1em;\n position: absolute;\n z-index: 1000;\n right: 50px;\n background: linear-gradient(45deg, whitesmoke 0%, white 50%, whitesmoke 100%); }\n .tmap-quick-connect .tc-drop-down:first-child {\n padding-top: 0;\n margin-top: 0; }\n .tmap-quick-connect .tc-drop-down .title {\n margin: 1.5em 0 0.5em 0;\n font-weight: bold;\n color: gray; }\n .tmap-quick-connect .tc-drop-down select {\n width: 80px;\n word-wrap: initial; }\n .tmap-quick-connect .tc-drop-down table {\n width: 100%;\n border: none;\n margin: 0.5em 0; }\n .tmap-quick-connect .tc-drop-down table td, .tmap-quick-connect .tc-drop-down table th {\n padding: 3px 3px 3px 0;\n vertical-align: middle;\n font-weight: normal;\n border: none; }\n .tmap-quick-connect .tc-drop-down table td table, .tmap-quick-connect .tc-drop-down table th table {\n margin: 0; }\n .tmap-quick-connect .tc-drop-down .tmap-quick-connect-search-bar, .tmap-quick-connect .tc-drop-down .tmap-quick-connect-existing-bar {\n background: #F1F1F1;\n margin-top: 0;\n border-bottom: 1px solid #D5D5D5;\n border-top: 1px solid #D5D5D5; }\n .tmap-quick-connect .tc-drop-down table.tmap-quick-connect-search-bar td, .tmap-quick-connect .tc-drop-down th {\n padding: 5px; }\n .tmap-quick-connect .tc-drop-down .tmap-quick-connect-existing-bar {\n padding: 5px; }\n .tmap-quick-connect .tc-drop-down .tmap-connection-table th, .tmap-quick-connect .tc-drop-down .tmap-connection-table td {\n text-align: left;\n padding: 1px 1px 1px 0; }\n .tmap-quick-connect .tc-drop-down .tmap-connection-table button {\n width: 20px;\n padding: 0px; }\n .tmap-quick-connect .tc-drop-down .tmap-scroll-table {\n height: 120px;\n overflow: auto;\n display: block; }\n .tmap-quick-connect .tc-drop-down hr {\n border: 0;\n height: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n border-bottom: 1px solid rgba(255, 255, 255, 0.3); }\n .tmap-quick-connect .tc-drop-down a {\n display: inline;\n padding: 0;\n color: #5778d8;\n background: transparent; }\n .tmap-quick-connect .tc-drop-down a:hover {\n background: transparent;\n color: #5778d8;\n text-decoration: underline; }\n .tmap-quick-connect .tc-drop-down button {\n display: inline-block;\n padding: 0px 3px;\n text-align: center;\n color: #333333;\n line-height: 1.0; }\n .tmap-quick-connect .tc-drop-down button:hover {\n color: #ffffff; }\n .tmap-quick-connect .tc-drop-down button svg {\n fill: inherit; }\n .tmap-quick-connect .tc-drop-down button svg:hover {\n fill: #ffffff; }\n",
"title": "$:/plugins/felixhayashi/tiddlymap/layout",
"type": "text/vnd.tiddlywiki",
"tags": [
"$:/tags/Stylesheet"
]
},
"$:/plugins/felixhayashi/tiddlymap/js/AbstractEdgeTypeSubscriber": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/AbstractEdgeTypeSubscriber",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/AbstractEdgeTypeSubscriber\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\nvar _EdgeType = require('$:/plugins/felixhayashi/tiddlymap/js/EdgeType');\n\nvar _EdgeType2 = _interopRequireDefault(_EdgeType);\n\nvar _exception = require('$:/plugins/felixhayashi/tiddlymap/js/exception');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Super class for all edge type subscribers.\n */\nvar AbstractEdgeTypeSubscriber = function () {\n\n /**\n * @param {Object.<id, EdgeType>} allEdgeTypes - A list of all EdgeType instances that\n * are currently in the system. Each subscriber may use this list to build up an\n * index or perform mappings etc. Note that this list does not include types that are\n * just about to be inserted. Therefore, this list should only be used, if needed,\n * in the context of edge retrieval via loadEdges.\n * @param {number} [priority} - Subscribers with a higher priority get executed earlier\n * @param {boolean} [skipOthers] - In case of insert and delete operations: Whether or\n * not to skip any subsequent subscribers that also can handle the edge type\n * but have a lower priority assigned.\n * @param {boolean} [ignore] - Whether or not to completely ignore this subscriber.\n * This flag is useful if you want to dynamically at runtime whether or not to\n * include the subscriber.\n */\n function AbstractEdgeTypeSubscriber(allEdgeTypes) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref$priority = _ref.priority,\n priority = _ref$priority === undefined ? 0 : _ref$priority,\n _ref$skipOthers = _ref.skipOthers,\n skipOthers = _ref$skipOthers === undefined ? true : _ref$skipOthers,\n _ref$ignore = _ref.ignore,\n ignore = _ref$ignore === undefined ? false : _ref$ignore;\n\n _classCallCheck(this, AbstractEdgeTypeSubscriber);\n\n this.allEdgeTypes = allEdgeTypes;\n this.priority = priority;\n this.skipOthers = skipOthers;\n this.ignore = ignore;\n }\n\n /**\n * DI\n * @param {Tracker} tracker\n */\n\n\n _createClass(AbstractEdgeTypeSubscriber, [{\n key: 'setTracker',\n value: function setTracker(tracker) {\n this.tracker = tracker;\n }\n\n /**\n * Returns all edges stored in the specified tiddler.\n *\n * @interface\n * @param {Tiddler} tObj - the tiddler that holds the references.\n * @param {Object<TiddlerReference, boolean>} toWL - a whitelist of tiddlers that are allowed to\n * be included in the result.\n * @param {Object<id, EdgeType>} [typeWL] - a whitelist that defines that only Tiddlers that are linked\n * via a type specified in the list may be included in the result. If typeWL is not passed it means\n * all types are included.\n * @return {Object<Id, Edge>|null}\n */\n\n }, {\n key: 'loadEdges',\n value: function loadEdges(tObj, toWL, typeWL) {\n\n throw new _exception.MissingOverrideError(this, 'loadEdges');\n }\n\n /**\n * Whether or not this subscriber instance can handle an edge of the given type.\n *\n * @interface\n * @param {EdgeType} edgeType\n * @return boolean\n */\n\n }, {\n key: 'canHandle',\n value: function canHandle(edgeType) {\n\n throw new _exception.MissingOverrideError(this, 'canHandle');\n }\n\n /**\n * Called by the Adapter whenever a type is inserted\n *\n * @param {Tiddler} tObj - the tiddler that holds the references.\n * @param {Edge} edge - the edge to be deleted\n * @param {EdgeType} type\n */\n\n }, {\n key: 'insertEdge',\n value: function insertEdge(tObj, edge, type) {}\n\n // optional\n\n /**\n * Called by the Adapter whenever a type is deleted\n *\n * @param {Tiddler} tObj - the tiddler that holds the references.\n * @param {Edge} edge - the edge to be deleted\n * @param {EdgeType} type\n */\n\n }, {\n key: 'deleteEdge',\n value: function deleteEdge(tObj, edge, type) {\n\n // optional\n\n }\n }]);\n\n return AbstractEdgeTypeSubscriber;\n}();\n\n/*** Exports *******************************************************/\n\nexports.default = AbstractEdgeTypeSubscriber;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/edgeTypeSubscriber/AbstractEdgeTypeSubscriber.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/AbstractMagicEdgeTypeSubscriber": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/AbstractMagicEdgeTypeSubscriber",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _Edge = require('$:/plugins/felixhayashi/tiddlymap/js/Edge');\n\nvar _Edge2 = _interopRequireDefault(_Edge);\n\nvar _exception = require('$:/plugins/felixhayashi/tiddlymap/js/exception');\n\nvar _AbstractRefEdgeTypeSubscriber = require('$:/plugins/felixhayashi/tiddlymap/js/AbstractRefEdgeTypeSubscriber');\n\nvar _AbstractRefEdgeTypeSubscriber2 = _interopRequireDefault(_AbstractRefEdgeTypeSubscriber);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/AbstractMagicEdgeTypeSubscriber\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/**\n * @constructor\n */\nvar AbstractMagicEdgeTypeSubscriber = function (_AbstractRefEdgeTypeS) {\n _inherits(AbstractMagicEdgeTypeSubscriber, _AbstractRefEdgeTypeS);\n\n /**\n * @inheritDoc\n */\n function AbstractMagicEdgeTypeSubscriber(allEdgeTypes, options) {\n _classCallCheck(this, AbstractMagicEdgeTypeSubscriber);\n\n // later used for edge retrieval to identify those fields that hold connections\n var _this = _possibleConstructorReturn(this, (AbstractMagicEdgeTypeSubscriber.__proto__ || Object.getPrototypeOf(AbstractMagicEdgeTypeSubscriber)).call(this, allEdgeTypes, options));\n\n _this.edgeTypesByFieldName = _utils2.default.makeHashMap();\n\n for (var id in allEdgeTypes) {\n\n var edgeType = allEdgeTypes[id];\n if (_this.canHandle(edgeType)) {\n _this.edgeTypesByFieldName[edgeType.name] = edgeType;\n }\n }\n\n return _this;\n }\n\n /**\n * Returns all references to other tiddlers stored in the specified tiddler.\n *\n * @interface\n * @param {Tiddler} tObj - the tiddler that holds the references.\n * @param {String} fieldName - the name of the field to get the reference from.\n * @param {Object<TiddlerReference, boolean>} toWL - a whitelist of tiddlers that are allowed to\n * be included in the result.\n * @return {Object<Id, Edge>|null}\n */\n\n\n _createClass(AbstractMagicEdgeTypeSubscriber, [{\n key: 'getReferencesFromField',\n value: function getReferencesFromField(tObj, fieldName, toWL) {\n\n throw new _exception.MissingOverrideError(this, 'getReferencesFromField');\n }\n }, {\n key: 'getReferences',\n\n\n /**\n * @inheritDoc\n */\n value: function getReferences(tObj, toWL, typeWL) {\n\n var refsGroupedByType = _utils2.default.makeHashMap();\n var fieldNames = tObj.fields;\n\n for (var fieldName in fieldNames) {\n\n var type = this.edgeTypesByFieldName[fieldName];\n\n if (!type || typeWL && !typeWL[type.id]) continue;\n\n var toRefs = this.getReferencesFromField(tObj, fieldName, toWL);\n\n if (toRefs && toRefs.length) {\n refsGroupedByType[type.id] = toRefs;\n }\n }\n\n return refsGroupedByType;\n }\n }]);\n\n return AbstractMagicEdgeTypeSubscriber;\n}(_AbstractRefEdgeTypeSubscriber2.default);\n\n/*** Exports *******************************************************/\n\nexports.default = AbstractMagicEdgeTypeSubscriber;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/edgeTypeSubscriber/AbstractMagicEdgeTypeSubscriber.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/AbstractRefEdgeTypeSubscriber": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/AbstractRefEdgeTypeSubscriber",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _Edge = require('$:/plugins/felixhayashi/tiddlymap/js/Edge');\n\nvar _Edge2 = _interopRequireDefault(_Edge);\n\nvar _exception = require('$:/plugins/felixhayashi/tiddlymap/js/exception');\n\nvar _AbstractEdgeTypeSubscriber = require('$:/plugins/felixhayashi/tiddlymap/js/AbstractEdgeTypeSubscriber');\n\nvar _AbstractEdgeTypeSubscriber2 = _interopRequireDefault(_AbstractEdgeTypeSubscriber);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/AbstractRefEdgeTypeSubscriber\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\n/*** Code **********************************************************/\n\n/**\n * Parent class for all subscribers that retrieve or store\n * non-TiddlyMap edges ({@see TmapEdgeTypeSubscriber) from a tiddler,\n * for example tag or list references.\n */\nvar AbstractRefEdgeTypeSubscriber = function (_AbstractEdgeTypeSubs) {\n _inherits(AbstractRefEdgeTypeSubscriber, _AbstractEdgeTypeSubs);\n\n function AbstractRefEdgeTypeSubscriber() {\n _classCallCheck(this, AbstractRefEdgeTypeSubscriber);\n\n return _possibleConstructorReturn(this, (AbstractRefEdgeTypeSubscriber.__proto__ || Object.getPrototypeOf(AbstractRefEdgeTypeSubscriber)).apply(this, arguments));\n }\n\n _createClass(AbstractRefEdgeTypeSubscriber, [{\n key: 'loadEdges',\n\n\n /**\n * @inheritDoc\n */\n value: function loadEdges(tObj, toWL, typeWL) {\n\n // references to other tiddlers grouped by their edge type\n var refsByType = this.getReferences(tObj, toWL, typeWL);\n\n if (!refsByType || !_utils2.default.hasElements(refsByType)) return;\n\n var fromId = tObj.fields['tmap.id'];\n var idByT = $tm.tracker.getIdsByTiddlers();\n var allETy = this.allEdgeTypes;\n var fromTRef = _utils2.default.getTiddlerRef(tObj);\n\n var edges = _utils2.default.makeHashMap();\n\n for (var typeId in refsByType) {\n\n var toRefs = refsByType[typeId];\n\n if (!toRefs) {\n continue;\n }\n\n var type = allETy[typeId];\n for (var i = toRefs.length; i--;) {\n var toTRef = toRefs[i];\n\n if (!toTRef || !$tw.wiki.tiddlerExists(toTRef) || _utils2.default.isSystemOrDraft(toTRef) || toWL && !toWL[toTRef]) {\n continue;\n }\n\n var id = type.id + $tw.utils.hashString(fromTRef + toTRef);\n edges[id] = new _Edge2.default(fromId, idByT[toTRef], type.id, id);\n }\n }\n\n return edges;\n }\n\n /**\n * Returns a list of tiddlers (= tiddler names) that are targeted by the specified tiddler.\n * Note: All referenced tiddlers have to be grouped by their edge type.\n *\n * @interface\n * @param {Tiddler} tObj - the tiddler that holds the references.\n * @param {Object<TiddlerReference, boolean>} toWL - a whitelist of tiddlers that are allowed to\n * be included in the result.\n * @param {Object<id, EdgeType>} typeWL - a whitelist that defines that only Tiddlers that are linked\n * via a type specified in the list may be included in the result.\n * @return {Object<string, TiddlerReference[]>|null} a list of referenced tiddlers grouped by their edge type.\n */\n\n }, {\n key: 'getReferences',\n value: function getReferences(tObj, toWL, typeWL) {\n\n throw new _exception.MissingOverrideError(this, 'getReferences');\n }\n }]);\n\n return AbstractRefEdgeTypeSubscriber;\n}(_AbstractEdgeTypeSubscriber2.default);\n\n/*** Exports *******************************************************/\n\nexports.default = AbstractRefEdgeTypeSubscriber;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/edgeTypeSubscriber/AbstractRefEdgeTypeSubscriber.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/EdgeTypeSubscriberRegistry": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/EdgeTypeSubscriberRegistry",
"text": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/EdgeTypeSubscriberRegistry\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/**\n * Registry to store and retrieve EdgeTypeSubcriber modules that are responsible\n * for handling the retrieval, insertion and deletion of EdgeType objects.\n */\nvar EdgeTypeSubscriberRegistry = function () {\n\n /**\n * @param {AbstractEdgeTypeSubscriber[]} subscribers\n * @param {EdgeType[]} allEdgeTypes\n * @param {Tracker} tracker\n */\n function EdgeTypeSubscriberRegistry(subscribers, allEdgeTypes, tracker) {\n _classCallCheck(this, EdgeTypeSubscriberRegistry);\n\n this.subscriberClasses = subscribers;\n this.tracker = tracker;\n\n this.updateIndex(allEdgeTypes);\n }\n\n /**\n * Gets all matching subscribers for a type.\n *\n * @param {EdgeType} edgeType\n * @returns AbstractEdgeTypeSubscriber[]\n */\n\n\n _createClass(EdgeTypeSubscriberRegistry, [{\n key: \"getAllForType\",\n value: function getAllForType(edgeType) {\n\n var allSubscribers = this.allSubscribers;\n var subscribersForType = [];\n\n for (var i = 0, l = allSubscribers.length; i < l; i++) {\n\n if (allSubscribers[i].canHandle(edgeType)) {\n\n subscribersForType.push(allSubscribers[i]);\n\n if (allSubscribers[i].skipOthers) {\n break;\n }\n }\n }\n\n return subscribersForType;\n }\n\n /**\n * Gets all subscribers.\n *\n * @returns AbstractEdgeTypeSubscriber[]\n */\n\n }, {\n key: \"getAll\",\n value: function getAll() {\n\n return this.allSubscribers;\n }\n\n /**\n * Indexes all subscribers. Moreover, subscribers get linked to the edge\n * types that currently exist in the wiki.\n *\n * This method should be called everytime after an edge type is added or\n * removed in the system.\n *\n * @param {EdgeType[]} allEdgeTypes\n */\n\n }, {\n key: \"updateIndex\",\n value: function updateIndex(allEdgeTypes) {\n\n var allSubscribers = [];\n\n // instantiate and register all active subscriber modules\n var subscriberClass = this.subscriberClasses;\n for (var moduleName in subscriberClass) {\n\n var subscriber = new subscriberClass[moduleName](allEdgeTypes);\n subscriber.setTracker(this.tracker);\n\n // ignore all subscribers that have their ignore flag set to false\n if (subscriber.ignore === true) {\n continue;\n }\n\n allSubscribers.push(subscriber);\n }\n\n // sort subscribers by priority\n allSubscribers.sort(function (s1, s2) {\n return s2.priority - s1.priority;\n });\n\n this.allSubscribers = allSubscribers;\n }\n }]);\n\n return EdgeTypeSubscriberRegistry;\n}();\n\n/*** Exports *******************************************************/\n\nexports.default = EdgeTypeSubscriberRegistry;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/edgeTypeSubscriber/EdgeTypeSubscriberRegistry.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/tmap": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/tmap",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.TmapEdgeTypeSubscriber = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _Edge = require('$:/plugins/felixhayashi/tiddlymap/js/Edge');\n\nvar _Edge2 = _interopRequireDefault(_Edge);\n\nvar _AbstractEdgeTypeSubscriber = require('$:/plugins/felixhayashi/tiddlymap/js/AbstractEdgeTypeSubscriber');\n\nvar _AbstractEdgeTypeSubscriber2 = _interopRequireDefault(_AbstractEdgeTypeSubscriber);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/tmap\ntype: application/javascript\nmodule-type: tmap.edgetypehandler\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\n/*** Code **********************************************************/\n\n/**\n * TiddlyMap's original EdgeTypeSubscriber. It will store and retrieve edges by relying on\n * json stored in a tiddler field.\n *\n * @constructor\n */\nvar TmapEdgeTypeSubscriber = function (_AbstractEdgeTypeSubs) {\n _inherits(TmapEdgeTypeSubscriber, _AbstractEdgeTypeSubs);\n\n function TmapEdgeTypeSubscriber(allEdgeTypes) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, TmapEdgeTypeSubscriber);\n\n return _possibleConstructorReturn(this, (TmapEdgeTypeSubscriber.__proto__ || Object.getPrototypeOf(TmapEdgeTypeSubscriber)).call(this, allEdgeTypes, _extends({ priority: 0 }, options)));\n }\n\n /**\n * @inheritDoc\n */\n\n\n _createClass(TmapEdgeTypeSubscriber, [{\n key: 'loadEdges',\n value: function loadEdges(tObj, toWL, typeWL) {\n\n var connections = _utils2.default.parseFieldData(tObj, 'tmap.edges');\n if (!connections) {\n return;\n }\n\n var tById = this.tracker.getTiddlersByIds();\n var fromId = tObj.fields['tmap.id'];\n\n var edges = _utils2.default.makeHashMap();\n\n for (var conId in connections) {\n\n var con = connections[conId];\n var toTRef = tById[con.to];\n if (toTRef && (!toWL || toWL[toTRef]) && (!typeWL || typeWL[con.type])) {\n\n edges[conId] = new _Edge2.default(fromId, con.to, con.type, conId);\n }\n }\n\n return edges;\n }\n\n /**\n * @inheritDoc\n */\n\n }, {\n key: 'insertEdge',\n value: function insertEdge(tObj, edge, type) {\n\n // load existing connections\n var connections = _utils2.default.parseFieldData(tObj, 'tmap.edges', {});\n\n // assign new id if not present yet\n edge.id = edge.id || _utils2.default.genUUID();\n // add to connections object\n connections[edge.id] = { to: edge.to, type: type.id };\n\n // save\n _utils2.default.writeFieldData(tObj, 'tmap.edges', connections, $tm.config.sys.jsonIndentation);\n\n return edge;\n }\n\n /**\n * @inheritDoc\n */\n\n }, {\n key: 'deleteEdge',\n value: function deleteEdge(tObj, edge, type) {\n\n if (!edge.id) return;\n\n // load\n var connections = _utils2.default.parseFieldData(tObj, 'tmap.edges', {});\n\n // delete\n delete connections[edge.id];\n\n // save\n _utils2.default.writeFieldData(tObj, 'tmap.edges', connections, $tm.config.sys.jsonIndentation);\n\n return edge;\n }\n\n /**\n * @inheritDoc\n */\n\n }, {\n key: 'canHandle',\n value: function canHandle(edgeType) {\n\n return true;\n }\n }]);\n\n return TmapEdgeTypeSubscriber;\n}(_AbstractEdgeTypeSubscriber2.default);\n\n/*** Exports *******************************************************/\n\nexports.TmapEdgeTypeSubscriber = TmapEdgeTypeSubscriber;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/edgeTypeSubscriber/TmapEdgeTypeSubscriber.js.map\n",
"type": "application/javascript",
"module-type": "tmap.edgetypehandler"
},
"$:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/field": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/field",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.FieldEdgeTypeSubscriber = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _AbstractMagicEdgeTypeSubscriber = require('$:/plugins/felixhayashi/tiddlymap/js/AbstractMagicEdgeTypeSubscriber');\n\nvar _AbstractMagicEdgeTypeSubscriber2 = _interopRequireDefault(_AbstractMagicEdgeTypeSubscriber);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/field\ntype: application/javascript\nmodule-type: tmap.edgetypehandler\n\n@preserve\n\n\\*/\n\n/**\n * The FieldEdgeTypeSubscriber deals with connections that are stored in form of tiddler fields.\n * In this case one field can only hold one connection.\n *\n * If an EdgeType with a \"tw-field\" namespace is inserted or deleted, the type's name\n * is interpreted as field name and the connection is stored or removed in a tiddler\n * field with of that name.\n *\n * E.g. creating an edge between the tiddlers \"Betsy\" and \"Dave\" with the type\n * tw-field:husband will create a field \"husband\" inside the \"Betsy\" tiddler and set\n * \"Dave\" as value.\n\n * Note: A single field can only hold one connection.\n *\n * @see http://tiddlymap.org/#tw-field\n *\n * @inheritDoc\n * @constructor\n */\nvar FieldEdgeTypeSubscriber = function (_AbstractMagicEdgeTyp) {\n _inherits(FieldEdgeTypeSubscriber, _AbstractMagicEdgeTyp);\n\n /**\n * @inheritDoc\n */\n function FieldEdgeTypeSubscriber(allEdgeTypes) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, FieldEdgeTypeSubscriber);\n\n return _possibleConstructorReturn(this, (FieldEdgeTypeSubscriber.__proto__ || Object.getPrototypeOf(FieldEdgeTypeSubscriber)).call(this, allEdgeTypes, _extends({ priority: 10 }, options)));\n }\n\n /**\n * @inheritDoc\n */\n\n\n _createClass(FieldEdgeTypeSubscriber, [{\n key: 'canHandle',\n value: function canHandle(edgeType) {\n\n return edgeType.namespace === 'tw-field';\n }\n\n /**\n * @override\n */\n\n }, {\n key: 'getReferencesFromField',\n value: function getReferencesFromField(tObj, fieldName, toWL) {\n\n // wrap in array\n return [tObj.fields[fieldName]];\n }\n\n /**\n * Stores and maybe overrides an edge in this tiddler\n */\n\n }, {\n key: 'insertEdge',\n value: function insertEdge(tObj, edge, type) {\n\n var toTRef = this.tracker.getTiddlerById(edge.to);\n if (toTRef == null) {\n // null or undefined\n return;\n }\n\n // only use the name without the private marker or the namespace\n _utils2.default.setField(tObj, type.name, toTRef);\n\n return edge;\n }\n }, {\n key: 'deleteEdge',\n\n\n /**\n * Deletes an edge in this tiddler\n */\n value: function deleteEdge(tObj, edge, type) {\n\n var toTRef = this.tracker.getTiddlerById(edge.to);\n\n if (toTRef == null) {\n // null or undefined\n return;\n }\n\n // only use the name without the private marker or the namespace\n _utils2.default.setField(tObj, type.name, undefined);\n\n return edge;\n }\n }]);\n\n return FieldEdgeTypeSubscriber;\n}(_AbstractMagicEdgeTypeSubscriber2.default);\n\n/*** Exports *******************************************************/\n\nexports.FieldEdgeTypeSubscriber = FieldEdgeTypeSubscriber;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/edgeTypeSubscriber/magicEdgeTypeSubscriber/FieldEdgeTypeSubscriber.js.map\n",
"type": "application/javascript",
"module-type": "tmap.edgetypehandler"
},
"$:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/filter": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/filter",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.FilterEdgeTypeSubstriber = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _AbstractMagicEdgeTypeSubscriber = require('$:/plugins/felixhayashi/tiddlymap/js/AbstractMagicEdgeTypeSubscriber');\n\nvar _AbstractMagicEdgeTypeSubscriber2 = _interopRequireDefault(_AbstractMagicEdgeTypeSubscriber);\n\nvar _widget = require('$:/core/modules/widgets/widget.js');\n\nvar _widget2 = _interopRequireDefault(_widget);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/filter\ntype: application/javascript\nmodule-type: tmap.edgetypehandler\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\n/*** Code **********************************************************/\n\n/**\n * The FilterEdgeTypeSubstriber deals with connections that are stored inside\n * tiddler fields via a dynamic filter.\n *\n * @see http://tiddlymap.org/#tw-filter\n * @see https://github.com/felixhayashi/TW5-TiddlyMap/issues/206\n */\nvar FilterEdgeTypeSubstriber = function (_AbstractMagicEdgeTyp) {\n _inherits(FilterEdgeTypeSubstriber, _AbstractMagicEdgeTyp);\n\n /**\n * @inheritDoc\n */\n function FilterEdgeTypeSubstriber(allEdgeTypes) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, FilterEdgeTypeSubstriber);\n\n return _possibleConstructorReturn(this, (FilterEdgeTypeSubstriber.__proto__ || Object.getPrototypeOf(FilterEdgeTypeSubstriber)).call(this, allEdgeTypes, _extends({ priority: 10 }, options)));\n }\n\n /**\n * @inheritDoc\n */\n\n\n _createClass(FilterEdgeTypeSubstriber, [{\n key: 'canHandle',\n value: function canHandle(edgeType) {\n\n return edgeType.namespace === 'tw-filter';\n }\n\n /**\n * @override\n */\n\n }, {\n key: 'getReferencesFromField',\n value: function getReferencesFromField(tObj, fieldName, toWL) {\n\n var filter = tObj.fields[fieldName];\n\n // Solves https://github.com/felixhayashi/TW5-TiddlyMap/issues/278\n var parentWidget = new _widget2.default.widget({});\n parentWidget.setVariable(\"currentTiddler\", tObj.fields.title);\n var widget = new _widget2.default.widget({}, { \"parentWidget\": parentWidget });\n //noinspection UnnecessaryLocalVariableJS\n var toRefs = _utils2.default.getMatches(filter, toWL, widget);\n\n return toRefs;\n }\n\n /**\n * Stores and maybe overrides an edge in this tiddler\n */\n\n }, {\n key: 'insertEdge',\n value: function insertEdge(tObj, edge, type) {\n\n if (!edge.to) {\n return;\n }\n\n // get the name without the private marker or the namespace\n var name = type.name;\n var currentFilter = tObj.fields[name] || \"\";\n var toTRef = this.tracker.getTiddlerById(edge.to);\n // by treating the toTRef as a list of one, we can make\n // it safe to append to any filter.\n // \"tiddler\" -> \"tiddler\"\n // \"tiddler with spaces\" -> \"[[tiddler with spaces]]\"\n var safe_toTRef = $tw.utils.stringifyList([toTRef]);\n\n if (currentFilter.length > 0) {\n safe_toTRef = \" \" + safe_toTRef;\n }\n\n // save\n _utils2.default.setField(tObj, name, currentFilter + safe_toTRef);\n\n return edge;\n }\n }]);\n\n return FilterEdgeTypeSubstriber;\n}(_AbstractMagicEdgeTypeSubscriber2.default);\n\n/*** Exports *******************************************************/\n\nexports.FilterEdgeTypeSubstriber = FilterEdgeTypeSubstriber;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/edgeTypeSubscriber/magicEdgeTypeSubscriber/FilterEdgeTypeSubscriber.js.map\n",
"type": "application/javascript",
"module-type": "tmap.edgetypehandler"
},
"$:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/list": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/list",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.ListEdgeTypeSubscriber = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _AbstractMagicEdgeTypeSubscriber = require('$:/plugins/felixhayashi/tiddlymap/js/AbstractMagicEdgeTypeSubscriber');\n\nvar _AbstractMagicEdgeTypeSubscriber2 = _interopRequireDefault(_AbstractMagicEdgeTypeSubscriber);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/list\ntype: application/javascript\nmodule-type: tmap.edgetypehandler\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\n/*** Code **********************************************************/\n\n/**\n * The ListEdgeTypeSubstriber deals with connections that are stored inside\n * tiddler fields in a tiddler-list format.\n *\n * If an EdgeType with a 'tw-list\" namespace is inserted or deleted, the type's name\n * is interpreted as field name and the list of connections is stored or removed in a tiddler\n * field with of that name. Each outgoing connection to a tiddler is stored by\n * inserting the title the edge is pointing to into a list.\n *\n * Say you the user creates a connection between tiddler \"Dawna Dozal\" and\n * tiddler \"Toney Thacker\" and names the connection \"tw-list:friends\". Then a field\n * named \"friends\" will be created in tiddler \"Dawna Dozal\" and \"Toney Thacker\" will be\n * added to this field.\n *\n * @see http://tiddlymap.org/#tw-list\n */\nvar ListEdgeTypeSubscriber = function (_AbstractMagicEdgeTyp) {\n _inherits(ListEdgeTypeSubscriber, _AbstractMagicEdgeTyp);\n\n /**\n * @inheritDoc\n */\n function ListEdgeTypeSubscriber(allEdgeTypes) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, ListEdgeTypeSubscriber);\n\n return _possibleConstructorReturn(this, (ListEdgeTypeSubscriber.__proto__ || Object.getPrototypeOf(ListEdgeTypeSubscriber)).call(this, allEdgeTypes, _extends({ priority: 10 }, options)));\n }\n\n /**\n * @inheritDoc\n */\n\n\n _createClass(ListEdgeTypeSubscriber, [{\n key: 'canHandle',\n value: function canHandle(edgeType) {\n\n return edgeType.namespace === 'tw-list';\n }\n\n /**\n * @override\n */\n\n }, {\n key: 'getReferencesFromField',\n value: function getReferencesFromField(tObj, fieldName, toWL) {\n\n return $tw.utils.parseStringArray(tObj.fields[fieldName]);\n }\n\n /**\n * Stores and maybe overrides an edge in this tiddler\n */\n\n }, {\n key: 'insertEdge',\n value: function insertEdge(tObj, edge, type) {\n\n if (!edge.to) {\n return;\n }\n\n // get the name without the private marker or the namespace\n var name = type.name;\n\n var list = $tw.utils.parseStringArray(tObj.fields[name]);\n // we need to clone the array since tiddlywiki might directly\n // returned the auto-parsed field value (as in case of tags, or list)\n // and this array would be read only!\n list = (list || []).slice();\n\n // transform\n var toTRef = this.tracker.getTiddlerById(edge.to);\n\n list.push(toTRef);\n\n // save\n _utils2.default.setField(tObj, name, $tw.utils.stringifyList(list));\n\n return edge;\n }\n }, {\n key: 'deleteEdge',\n\n\n /**\n * Deletes an edge in this tiddler\n */\n value: function deleteEdge(tObj, edge, type) {\n\n var list = $tw.utils.parseStringArray(tObj.fields[type.name]);\n // we need to clone the array since tiddlywiki might directly\n // returned the auto-parsed field value (as in case of tags, or list)\n // and this array would be read only!\n list = (list || []).slice();\n\n // transform\n var toTRef = this.tracker.getTiddlerById(edge.to);\n\n var index = list.indexOf(toTRef);\n if (index > -1) {\n list.splice(index, 1);\n }\n\n // @see https://github.com/felixhayashi/TW5-TiddlyMap/issues/288\n var stringList = void 0;\n if (list.length > 0) {\n stringList = $tw.utils.stringifyList(list);\n }\n // save\n _utils2.default.setField(tObj, type.name, stringList);\n\n return edge;\n }\n }]);\n\n return ListEdgeTypeSubscriber;\n}(_AbstractMagicEdgeTypeSubscriber2.default);\n\n/*** Exports *******************************************************/\n\nexports.ListEdgeTypeSubscriber = ListEdgeTypeSubscriber;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/edgeTypeSubscriber/magicEdgeTypeSubscriber/ListEdgeTypeSubscriber.js.map\n",
"type": "application/javascript",
"module-type": "tmap.edgetypehandler"
},
"$:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/body/link": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/body/link",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.LinkEdgeTypeSubscriber = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _AbstractRefEdgeTypeSubscriber = require('$:/plugins/felixhayashi/tiddlymap/js/AbstractRefEdgeTypeSubscriber');\n\nvar _AbstractRefEdgeTypeSubscriber2 = _interopRequireDefault(_AbstractRefEdgeTypeSubscriber);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/body/link\ntype: application/javascript\nmodule-type: tmap.edgetypehandler\n\n@preserve\n\n\\*/\n\n/**\n * The LinkEdgeTypeSubscriber deals with connections that are stored inside\n * a tiddler' text field.\n *\n * Note: This subscriber only retrieves edges, however doesn't store or delete them.\n *\n * @see http://tiddlymap.org/#tw-body\n */\nvar LinkEdgeTypeSubscriber = function (_AbstractRefEdgeTypeS) {\n _inherits(LinkEdgeTypeSubscriber, _AbstractRefEdgeTypeS);\n\n /**\n * @inheritDoc\n */\n function LinkEdgeTypeSubscriber(allEdgeTypes) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, LinkEdgeTypeSubscriber);\n\n return _possibleConstructorReturn(this, (LinkEdgeTypeSubscriber.__proto__ || Object.getPrototypeOf(LinkEdgeTypeSubscriber)).call(this, allEdgeTypes, _extends({ priority: 20 }, options)));\n }\n\n /**\n * @inheritDoc\n */\n\n\n _createClass(LinkEdgeTypeSubscriber, [{\n key: 'canHandle',\n value: function canHandle(edgeType) {\n\n return edgeType.id === 'tw-body:link';\n }\n\n /**\n * @inheritDoc\n */\n\n }, {\n key: 'getReferences',\n value: function getReferences(tObj, toWL, typeWL) {\n\n if (typeWL && !typeWL['tw-body:link']) {\n return;\n }\n\n var toRefs = $tw.wiki.getTiddlerLinks(tObj.fields.title);\n\n if (!toRefs || !toRefs.length) {\n return;\n }\n\n return { 'tw-body:link': toRefs };\n }\n }]);\n\n return LinkEdgeTypeSubscriber;\n}(_AbstractRefEdgeTypeSubscriber2.default);\n\n/*** Exports *******************************************************/\n\nexports.LinkEdgeTypeSubscriber = LinkEdgeTypeSubscriber;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/edgeTypeSubscriber/refEdgeTypeSubscriber/LinkEdgeTypeSubscriber.js.map\n",
"type": "application/javascript",
"module-type": "tmap.edgetypehandler"
},
"$:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/body/transclude": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/body/transclude",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.TranscludeEdgeTypeSubscriber = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _AbstractRefEdgeTypeSubscriber = require('$:/plugins/felixhayashi/tiddlymap/js/AbstractRefEdgeTypeSubscriber');\n\nvar _AbstractRefEdgeTypeSubscriber2 = _interopRequireDefault(_AbstractRefEdgeTypeSubscriber);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/modules/edge-type-handler/body/transclude\ntype: application/javascript\nmodule-type: tmap.edgetypehandler\n\n@preserve\n\n\\*/\n\n/**\n * The TranscludeEdgeTypeSubscriber retrieves connections that result tiddler transclusions.\n *\n * Note: This subscriber only retrieves edges, however doesn't store or delete them. It only\n * works if the `$tw.wiki.getTiddlerTranscludes` method is present in the wiki.\n */\nvar TranscludeEdgeTypeSubscriber = function (_AbstractRefEdgeTypeS) {\n _inherits(TranscludeEdgeTypeSubscriber, _AbstractRefEdgeTypeS);\n\n /**\n * @inheritDoc\n */\n function TranscludeEdgeTypeSubscriber(allEdgeTypes) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, TranscludeEdgeTypeSubscriber);\n\n return _possibleConstructorReturn(this, (TranscludeEdgeTypeSubscriber.__proto__ || Object.getPrototypeOf(TranscludeEdgeTypeSubscriber)).call(this, allEdgeTypes, _extends({\n priority: 20,\n ignore: typeof $tw.wiki.getTiddlerTranscludes !== 'function'\n }, options)));\n }\n\n /**\n * @inheritDoc\n */\n\n\n _createClass(TranscludeEdgeTypeSubscriber, [{\n key: 'canHandle',\n value: function canHandle(edgeType) {\n\n return edgeType.id === 'tw-body:transclude';\n }\n\n /**\n * @inheritDoc\n */\n\n }, {\n key: 'getReferences',\n value: function getReferences(tObj, toWL, typeWL) {\n\n if (typeWL && !typeWL['tw-body:transclude']) {\n return;\n }\n\n var toRefs = $tw.wiki.getTiddlerTranscludes(tObj.fields.title);\n\n if (!toRefs || !toRefs.length) {\n return;\n }\n\n return { 'tw-body:transclude': toRefs };\n }\n }]);\n\n return TranscludeEdgeTypeSubscriber;\n}(_AbstractRefEdgeTypeSubscriber2.default);\n\n/*** Exports *******************************************************/\n\nexports.TranscludeEdgeTypeSubscriber = TranscludeEdgeTypeSubscriber;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/edgeTypeSubscriber/refEdgeTypeSubscriber/TranscludeEdgeTypeSubscriber.js.map\n",
"type": "application/javascript",
"module-type": "tmap.edgetypehandler"
},
"$:/plugins/felixhayashi/tiddlymap/js/Edge": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/Edge",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/Edge\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\n/*** Code **********************************************************/\n\n/**\n * @constructor\n */\nvar Edge = function Edge(from, to, type, id) {\n _classCallCheck(this, Edge);\n\n this.from = from;\n this.to = to;\n this.type = type;\n this.id = id || _utils2.default.genUUID();\n};\n\n/*** Exports *******************************************************/\n\nexports.default = Edge;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/graph/Edge.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/EdgeType": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/EdgeType",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _MapElementType2 = require('$:/plugins/felixhayashi/tiddlymap/js/MapElementType');\n\nvar _MapElementType3 = _interopRequireDefault(_MapElementType2);\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _environment = require('$:/plugins/felixhayashi/tiddlymap/js/lib/environment');\n\nvar env = _interopRequireWildcard(_environment);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/EdgeType\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\n/*** Code **********************************************************/\n\n/**\n * This class is used to abstract edge types. It facilitates the parsing\n * of style information, the translation of type names into actual type data\n * or the persistance of edge type data.\n *\n * Note: EdgeType instances are immutable (frozen).\n */\nvar EdgeType = function (_MapElementType) {\n _inherits(EdgeType, _MapElementType);\n\n /**\n * @param {EdgeTypeId} id\n * @param {Object} [data] @see http://visjs.org/docs/network/edges.html\n */\n function EdgeType(id, data) {\n _classCallCheck(this, EdgeType);\n\n // we do not simply use the provided id but disassemble and\n // reassemble it again to ensure the id is well formatted.\n var _EdgeType$getIdParts = EdgeType.getIdParts(id),\n marker = _EdgeType$getIdParts.marker,\n namespace = _EdgeType$getIdParts.namespace,\n name = _EdgeType$getIdParts.name;\n\n id = EdgeType.getId(marker, namespace, name);\n\n // call the parent constructor\n\n var _this = _possibleConstructorReturn(this, (EdgeType.__proto__ || Object.getPrototypeOf(EdgeType)).call(this, id, env.path.edgeTypes, EdgeType.fieldMeta, data));\n\n _this.id = id;\n _this.marker = marker;\n _this.name = name;\n _this.namespace = namespace;\n\n var arrows = (_this.style || {}).arrows;\n\n if (arrows) {\n\n _this.invertedArrow = isArrowEnabled(arrows, 'from');\n _this.toArrow = isArrowEnabled(arrows, 'to') || isArrowEnabled(arrows, 'middle');\n // determine if bi arrows (either from+to or no arrows)\n _this.biArrow = _this.invertedArrow === _this.toArrow;\n\n if (_this.biArrow) {\n _this.toArrow = true;\n _this.invertedArrow = true;\n }\n } else {\n\n _this.toArrow = true;\n }\n\n Object.freeze(_this);\n\n return _this;\n }\n\n /**\n * Returns an object holding the parts that make up the edge type id.\n *\n * @param {EdgeTypeId} id\n * @return {{marker: (*|string), namespace: (*|string), name: (*|string)}}\n */\n\n\n _createClass(EdgeType, [{\n key: 'getLabel',\n value: function getLabel() {\n\n return this.label || this.name;\n }\n }], [{\n key: 'getIdParts',\n value: function getIdParts() {\n var id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n\n id = _utils2.default.getWithoutPrefix(id, env.path.edgeTypes + '/');\n var match = id.match(edgeTypeRegex) || [];\n\n return {\n marker: match[1] || '',\n namespace: match[3] && match[2] || '',\n name: match[3] || match[2] || ''\n };\n }\n }, {\n key: 'getId',\n\n\n /**\n * Creates an {@link EdgeTypeId} from a set of parts that make up the id.\n * If it is not possible to create the id from the parts, the default\n * edge type 'tmap:unknown' is returned.\n *\n * @param {string} marker\n * @param {string} namespace\n * @param {string} name\n * @return {EdgeTypeId}\n */\n value: function getId() {\n var marker = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var namespace = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var name = arguments[2];\n\n\n return name ? marker + (namespace && namespace + ':') + name : 'tmap:unknown';\n }\n }]);\n\n return EdgeType;\n}(_MapElementType3.default);\n\n/**\n * @see https://github.com/babel/babel/issues/4854\n * @param {string} id - Either the edge type id (name)\n * or a tiddler reference denoting the type or an\n * `EdgeType` object (that is directly bounced back). If the\n * id can be translated into a tiddler object that resides in\n * the edge type path, then its data is retrieved automatically.\n */\n\n\nEdgeType.getInstance = function (id) {\n return id instanceof EdgeType ? id : new EdgeType(id);\n};\n\nEdgeType.fieldMeta = _extends({}, _MapElementType3.default.fieldMeta, {\n 'label': {},\n 'show-label': {}\n});\n\n/**\n *\n * @param {Object} arrows\n * @param {('from'|'to'|'middle')} direction\n * @return {boolean}\n */\nvar isArrowEnabled = function isArrowEnabled(arrows, direction) {\n\n var arrow = arrows[direction];\n\n if (arrow == null && direction === 'to') {\n // if the arrow is not further specified and its direction is to\n // we regard it as enabled.\n return true;\n }\n\n return (typeof arrow === 'undefined' ? 'undefined' : _typeof(arrow)) === 'object' ? arrow.enabled !== false : arrow === true;\n};\n\n/**\n * An edge-type id consists of the following parts of which the\n * first two are optional: `[marker][namespace:]name`\n *\n * The colon is not considered to be part of the namespace.\n */\nvar edgeTypeRegex = new RegExp('^(_?)([^:_][^:]*):?([^:]*)');\n\n/*** Exports *******************************************************/\n\nexports.default = EdgeType;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/graph/EdgeType.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/MapElementType": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/MapElementType",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/MapElementType\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/*** Code **********************************************************/\n\n/**\n * @abstract\n */\nvar MapElementType = function () {\n function MapElementType(id, root, fieldMeta, data) {\n _classCallCheck(this, MapElementType);\n\n this.id = id;\n this.root = root;\n this._fieldMeta = fieldMeta;\n this.fullPath = this.root + '/' + this.id;\n this.isShipped = $tw.wiki.getSubTiddler($tm.path.pluginRoot, this.fullPath);\n\n // finally get the data\n this._load(data || this.fullPath);\n }\n\n /**\n * Load the type's data. Depending on the constructor arguments,\n * the data source can be a tiddler, a type store\n *\n * @private\n */\n\n\n _createClass(MapElementType, [{\n key: '_load',\n value: function _load(data) {\n\n if (!data) {\n\n return;\n }\n\n if (typeof data === 'string') {\n // assume id or full path\n\n var isFullPath = _utils2.default.startsWith(data, this.root);\n var tRef = isFullPath ? data : this.root + '/' + data;\n this._loadFromTiddler(tRef);\n } else if (data instanceof $tw.Tiddler) {\n\n this._loadFromTiddler(data);\n } else if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object') {\n // = type or a data object\n\n for (var field in this._fieldMeta) {\n this[field] = data[field];\n }\n }\n }\n\n /**\n * Retrieve all data from the tiddler provided. If a shadow tiddler\n * with the same id exists, its data is merged during the load\n * process.\n *\n * @private\n */\n\n }, {\n key: '_loadFromTiddler',\n value: function _loadFromTiddler(tiddler) {\n\n var tObj = _utils2.default.getTiddler(tiddler);\n\n if (!tObj) {\n\n return;\n }\n\n var shadowTObj = $tw.wiki.getSubTiddler($tm.path.pluginRoot, this.fullPath) || {};\n\n // copy object to allow manipulation of the data\n var rawData = $tw.utils.extend({}, shadowTObj.fields, tObj.fields);\n // allow parsers to transform the raw field data\n for (var field in this._fieldMeta) {\n\n var parser = this._fieldMeta[field].parse;\n var rawVal = rawData[field];\n\n this[field] = parser ? parser.call(this, rawVal) : rawVal;\n }\n }\n\n /**\n * Method to determine whether or not this type exists. A type\n * exists if a tiddler with the type's id can be found below\n * the type's root path.\n *\n * @return {boolean} True if the type exists, false otherwise.\n */\n\n }, {\n key: 'exists',\n value: function exists() {\n\n return _utils2.default.tiddlerExists(this.fullPath);\n }\n }, {\n key: 'setStyle',\n value: function setStyle(style, isMerge) {\n\n // preprocessing: try to turn string into json\n if (typeof style === 'string') {\n\n style = _utils2.default.parseJSON(style);\n }\n\n // merge or override\n if ((typeof style === 'undefined' ? 'undefined' : _typeof(style)) === 'object') {\n\n if (isMerge) {\n\n _utils2.default.merge(this.style, style);\n } else {\n\n this.style = style;\n }\n }\n }\n\n /**\n * Store the type object as tiddler in the wiki. If the `tRef`\n * property is not provided, the default type path prefix\n * will be used with the type id appended. Stringifiers provided in\n * the field meta object (that was passed to the constructor) are\n * called.\n *\n * @param {string} [tRef] - If `tRef` is provided, the type\n * data will be written into this tiddler and the id property\n * is added as extra field value. Only do this is only for\n * dumping purposes!\n * @param {boolean} [silently=false] do not update the modification date\n */\n\n }, {\n key: 'save',\n value: function save(tRef, silently) {\n\n if (!tRef) {\n\n tRef = this.fullPath;\n } else if (typeof tRef !== 'string') {\n\n return;\n }\n\n // also add an empty text field to guard against\n // https://github.com/Jermolene/TiddlyWiki5/issues/2025\n var fields = {\n title: tRef,\n text: ''\n };\n\n if (!_utils2.default.startsWith(tRef, this.root)) {\n\n // = not the standard path for storing this type!\n // in this case we add the id to the output.\n fields.id = this.id;\n }\n\n // allow parsers to transform the raw field data\n for (var field in this._fieldMeta) {\n\n var stringify = this._fieldMeta[field].stringify;\n\n fields[field] = stringify ? stringify.call(this, this[field]) : this[field];\n }\n\n if (!this.exists()) {\n // newly created\n Object.assign(fields, $tw.wiki.getCreationFields());\n }\n\n if (silently !== true) {\n // add modification date to the output;\n Object.assign(fields, $tw.wiki.getModificationFields());\n }\n\n $tw.wiki.addTiddler(new $tw.Tiddler(fields));\n }\n }]);\n\n return MapElementType;\n}();\n\n/**\n * A list of fields that are used as data identifiers. Only these\n * listed keys are acknowledged by the load and save functions in\n * this class.\n *\n * This object resembles tw's field modules that are used by\n * `boot.js` to decide how fields are parsed and stringified again.\n */\n\n\nMapElementType.fieldMeta = {\n 'description': {},\n 'style': {\n parse: _utils2.default.parseJSON,\n stringify: JSON.stringify\n },\n 'modified': {}, // translation handled by TW's core\n 'created': {} // translation handled by TW's core\n};\n\n/*** Exports *******************************************************/\n\nexports.default = MapElementType;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/graph/MapElementType.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/NodeType": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/NodeType",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _MapElementType2 = require('$:/plugins/felixhayashi/tiddlymap/js/MapElementType');\n\nvar _MapElementType3 = _interopRequireDefault(_MapElementType2);\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/NodeType\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\n/*** Code **********************************************************/\n\n/**\n * Used to define the type of a node.\n *\n * Note: NodeType instances are immutable (frozen).\n */\nvar NodeType = function (_MapElementType) {\n _inherits(NodeType, _MapElementType);\n\n function NodeType(id, data) {\n _classCallCheck(this, NodeType);\n\n id = typeof id === 'string' ? _utils2.default.getWithoutPrefix(id, $tm.path.nodeTypes + '/') : 'tmap:unknown';\n\n // call the parent constructor\n\n var _this = _possibleConstructorReturn(this, (NodeType.__proto__ || Object.getPrototypeOf(NodeType)).call(this, id, $tm.path.nodeTypes, NodeType.fieldMeta, data));\n\n Object.freeze(_this);\n\n return _this;\n }\n\n /**\n * Get all tiddlers that inherit this type.\n *\n * @param {Array<TiddlerReference>} [src=$tw.wiki.allTitles()] - A list\n * of tiddlers that is searched for inheritors.\n * @return {Array<TiddlerReference>} The inheritors.\n */\n\n\n _createClass(NodeType, [{\n key: 'getInheritors',\n value: function getInheritors(src) {\n\n return this.scope ? _utils2.default.getMatches(this.scope, src || $tw.wiki.allTitles()) : [];\n }\n }]);\n\n return NodeType;\n}(_MapElementType3.default);\n\n/**\n * @see https://github.com/babel/babel/issues/4854\n * @param {string} id - Either the edge type id (name)\n * or a tiddler reference denoting the type or an\n * `EdgeType` object (that is directly bounced back). If the\n * id can be translated into a tiddler object that resides in\n * the edge type path, then its data is retrieved automatically.\n */\n\n\nNodeType.getInstance = function (id) {\n return id instanceof NodeType ? id : new NodeType(id);\n};\n\nNodeType.fieldMeta = _extends({}, _MapElementType3.default.fieldMeta, {\n 'view': {},\n 'priority': {\n parse: function parse(raw) {\n return isNaN(raw) ? 1 : parseInt(raw);\n },\n stringify: function stringify(num) {\n return _utils2.default.isInteger(num) ? num.toString() : '1';\n }\n },\n 'scope': {\n stringify: _utils2.default.getWithoutNewLines\n },\n 'fa-icon': {},\n 'tw-icon': {}\n});\n\n/*** Exports *******************************************************/\n\nexports.default = NodeType;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/graph/NodeType.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/ViewAbstraction": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/ViewAbstraction",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/ViewAbstraction\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\nvar _EdgeType = require('$:/plugins/felixhayashi/tiddlymap/js/EdgeType');\n\nvar _EdgeType2 = _interopRequireDefault(_EdgeType);\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _environment = require('$:/plugins/felixhayashi/tiddlymap/js/lib/environment');\n\nvar env = _interopRequireWildcard(_environment);\n\nvar _exception = require('$:/plugins/felixhayashi/tiddlymap/js/exception');\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/*** Code **********************************************************/\n\n/**\n * This class abstracts the various pieces that together make up the\n * view such as map, edge filter, node filter, config etc.\n * If {@code isCreate} is not specified, the viewAbstraction will only\n * represent the view and not create it or any missing part of it.\n */\nvar ViewAbstraction = function () {\n\n /**\n *\n * @param {string|ViewAbstraction|Tiddler} view - The view\n * @param {Object} options\n * @param {boolean} [options.isCreate] - True if the view should be created and override\n * any existing view, false otherwise.\n */\n function ViewAbstraction(view) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, ViewAbstraction);\n\n if (view instanceof ViewAbstraction) {\n\n // bounce back the object we received\n return view;\n }\n\n this._registerPaths(view);\n\n if (options.isCreate) {\n\n if (!this.configTRef) {\n\n var name = _utils2.default.getRandomLabel({ plural: true });\n this.configTRef = $tw.wiki.generateNewTitle($tm.path.views + '/' + name);\n }\n\n this._createView(options);\n } else if (!ViewAbstraction.exists(this.getRoot())) {\n // no valid config path\n\n throw new ResourceNotFoundException('ViewAbstraction', view);\n }\n }\n\n /**\n * Returns true if this view cannot be edited.\n * As a general rule, all views that come as plugins are locked.\n *\n * @return {boolean}\n */\n\n\n _createClass(ViewAbstraction, [{\n key: 'isLocked',\n value: function isLocked() {\n\n return $tw.wiki.isShadowTiddler(this.configTRef);\n }\n\n /**\n * Gives the view a chance to rebuild its properties cache.\n *\n * @param {Updates} updates\n * @return {boolean} True if changes affect parts of the view.\n */\n\n }, {\n key: 'update',\n value: function update(updates) {\n var changedTiddlers = updates.changedTiddlers;\n\n\n if (updates[env.path.edgeTypes] || _utils2.default.hasKeyWithPrefix(changedTiddlers, this.getRoot())) {\n this._clearCaches();\n\n return true;\n }\n\n return false;\n }\n\n /**\n * clones the tiddler denoted via tRef and uses it as placeholder\n * for this view when a widget using this view is displayed in\n * static mode\n *\n * @param {Tiddler} tiddler\n */\n\n }, {\n key: 'addPlaceholder',\n value: function addPlaceholder(tiddler) {\n\n _utils2.default.cp(_utils2.default.getTiddlerRef(tiddler), this.snapshotTRef, true);\n }\n\n /**\n * A view exists if the the view's root exists as tiddler in the store.\n *\n * @deprecated\n *\n * @return {boolean}\n */\n\n }, {\n key: 'exists',\n value: function exists() {\n\n return ViewAbstraction.exists(this);\n }\n\n /**\n * The path to the config tiddler that represents the view.\n *\n * @return {TiddlerReference}\n */\n\n }, {\n key: 'getRoot',\n value: function getRoot() {\n\n return this.configTRef;\n }\n\n /**\n * Returns this view's creation date.\n *\n * @param {boolean} [asString] True if the returned value should be a string in any case.\n * @return {string|object|undefined} The creation date in the specified output format.\n */\n\n }, {\n key: 'getCreationDate',\n value: function getCreationDate(asString) {\n\n var date = $tw.wiki.getTiddler(this.configTRef).fields['created'];\n\n if (asString) {\n // note: th will be translated as well!\n return date instanceof Date ? $tw.utils.formatDateString(date, 'DDth MMM YYYY') : '';\n }\n\n return date;\n }\n\n /**\n * The label of the view (which is basically the root-path's basename).\n *\n * @return {string} The label (name) of the view.\n */\n\n }, {\n key: 'getLabel',\n value: function getLabel() {\n\n return _utils2.default.getBasename(this.configTRef);\n }\n\n /**\n * Method to remove the view and its configuration.\n * It will make the view non-existent.\n *\n * Note: Do not use the object anymore after you called this function!\n */\n\n }, {\n key: 'destroy',\n value: function destroy() {\n\n // delete the view and all tiddlers stored in its path (map, edge-filter etc.)\n _utils2.default.deleteTiddlers(_utils2.default.getMatches('[prefix[' + this.configTRef + ']]'));\n }\n\n /**\n * Returns all tiddlers include tiddlymap widgets that reference this view.\n */\n\n }, {\n key: 'getOccurrences',\n value: function getOccurrences() {\n\n var filter = '[regexp:text[<\\\\$(tiddlymap|tmap).*?view=.' + this.getLabel() + '..*?>]]';\n return _utils2.default.getMatches(filter);\n }\n\n /**\n * Renames the view.\n *\n * @param {string} newLabel\n * @return {boolean}\n */\n\n }, {\n key: 'rename',\n value: function rename(newLabel) {\n\n if (typeof newLabel !== 'string') {\n\n return false;\n }\n\n if (_utils2.default.inArray('/', newLabel)) {\n\n $tm.notify('A view name must not contain any \"/\"');\n\n return false;\n }\n\n // keep a reference to the old label before we change it\n var oldLabel = this.getLabel();\n\n // start the renaming\n var newRoot = env.path.views + '/' + newLabel;\n var oldRoot = this.getRoot();\n\n _utils2.default.mv(oldRoot, newRoot, true);\n\n // update references\n\n if ($tm.config.sys.defaultView === oldLabel) {\n _utils2.default.setEntry($tm.ref.sysUserConf, 'defaultView', newLabel);\n }\n\n if ($tm.config.sys.liveTab.fallbackView === oldLabel) {\n _utils2.default.setEntry($tm.ref.sysUserConf, 'liveTab.fallbackView', newLabel);\n }\n\n $tw.wiki.each(function (tObj, tRef) {\n\n if (tObj.fields['tmap.open-view'] === oldLabel) {\n\n // update global node data fields referencing this view\n _utils2.default.setField(tRef, 'tmap.open-view', newLabel);\n\n return;\n }\n\n if (ViewAbstraction.exists(tRef)) {\n\n // update all local node data referencing this view\n var view = new ViewAbstraction(tRef);\n var nodes = view.getNodeData();\n\n for (var id in nodes) {\n if (nodes[id]['open-view'] === oldLabel) {\n nodes[id]['open-view'] = newLabel;\n }\n }\n\n view.saveNodeData(nodes);\n }\n });\n\n // clear caches registered to previous root before registering new paths\n this._clearCaches();\n this._registerPaths(newLabel);\n }\n\n /**\n * All configurations that are toggled via checkboxes to have a value\n * either `true` or `false` can be accessed via this method.\n *\n * @param {string} name - The configs name without the `_config` prefix.\n * @return {boolean} True if the configuration is enabled, false otherwise.\n */\n\n }, {\n key: 'isEnabled',\n value: function isEnabled(name) {\n\n return _utils2.default.isTrue(this.getConfig(name), false);\n }\n\n /**\n * Returns a configuration value relating to the given name. If no name\n * is given, an object with all configurations is returned.\n *\n * @param {string} [name] - Instead of all configurations being returned,\n * only the configuration named name is returned. The initial \"config.\"\n * may be omitted.\n * @result {string|Object} If `type` is not specified an object containing\n * all configurations is returned, otherwise a single value will be returned.\n */\n\n }, {\n key: 'getConfig',\n value: function getConfig(name) {\n var _this = this;\n\n var config = $tw.wiki.getCacheForTiddler(this.configTRef, \"tmap-config\", function () {\n\n var fields = _utils2.default.getTiddler(_this.configTRef).fields;\n return _utils2.default.getPropertiesByPrefix(fields, 'config.');\n });\n\n var prefixlessName = name && _utils2.default.startsWith(name, 'config.') ? name : 'config.' + name;\n\n return name ? config[prefixlessName] : config;\n }\n\n /**\n * Enables the api user to modify the view's configuration.\n *\n * In case two arguments are provided, the first is assumed to be the property\n * name and the second the value to be set.\n *\n * In case a single object is provided as argument, it is treated as a key-value\n * collection and each property in this object is saved as config.\n *\n * @param {*} args\n */\n\n }, {\n key: 'setConfig',\n value: function setConfig() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (args[0] == null) {\n // null or undefined\n\n return;\n }\n\n if (args.length === 1 && _typeof(args[0]) === 'object') {\n\n for (var prop in args[0]) {\n this.setConfig(prop, args[0][prop]);\n }\n } else if (args.length === 2 && typeof args[0] === 'string') {\n\n var _prop = _utils2.default.getWithoutPrefix(args[0], 'config.');\n var val = args[1];\n\n if (val === undefined) {\n\n return;\n }\n\n var config = this.getConfig();\n\n if (val === null) {\n\n $tm.logger('debug', 'Removing config', _prop);\n delete config['config.' + _prop];\n } else {\n\n if (_prop === 'edge_type_namespace') {\n var match = val.match(/[^:]+/);\n val = match ? match[0] : '';\n }\n }\n\n $tm.logger('log', 'Setting config', _prop, val);\n config['config.' + _prop] = val;\n\n // save\n $tw.wiki.addTiddler(new $tw.Tiddler(_utils2.default.getTiddler(this.configTRef), config));\n } else {\n // not allowed\n\n throw new (Function.prototype.bind.apply(_exception.InvalidArgumentException, [null].concat(args)))();\n }\n }\n\n /**\n * Whether this view represents the 'live view'\n *\n * @return {boolean}\n */\n\n }, {\n key: 'isLiveView',\n value: function isLiveView() {\n\n return this.getLabel() === $tm.misc.liveViewLabel;\n }\n\n /**\n * Whether the node is already explicitly contained in the view's node filter,\n * i.e. whether it is explicitly referenced by its title.\n *\n * @private\n *\n * @param {Node} node\n * @return {string}\n */\n\n }, {\n key: '_isNodeIncludedById',\n value: function _isNodeIncludedById(node) {\n\n var regex = $tw.utils.escapeRegExp(ViewAbstraction._getNodeIdFilterPart(node));\n\n return this.getNodeFilter('raw').match(regex);\n }\n\n /**\n * Sets and rebuilds the node filter according to the expression provided.\n *\n * @param {string} expr - A tiddlywiki filter expression.\n * @param {boolean} force\n */\n\n }, {\n key: 'setNodeFilter',\n value: function setNodeFilter(expr, force) {\n\n expr = expr.replace(/[\\n\\r]/g, ' ');\n\n if (this.getNodeFilter('raw') === expr) {\n // already up to date;\n // This check is critical to prevent recursion!\n return;\n }\n\n _utils2.default.setField(this.nodeFilterTRef, 'filter', expr);\n\n $tm.logger('debug', 'Node filter set to', expr);\n }\n\n /**\n * Sets and rebuilds the edge type filter according to the expression provided.\n *\n * @param {string} expr - A tiddlywiki filter expression.\n */\n\n }, {\n key: 'setEdgeTypeFilter',\n value: function setEdgeTypeFilter(expr) {\n\n expr = expr.replace(/[\\n\\r]/g, ' ');\n\n if (this.getEdgeTypeFilter('raw') === expr) {\n // already up to date\n // This check is critical to prevent recursion!\n return;\n }\n\n _utils2.default.setField(this.edgeTypeFilterTRef, 'filter', expr);\n\n $tm.logger('debug', 'Edge filter set to', expr);\n }\n\n /**\n * Method to append a filter part to the current filter (*or*-style).\n * The node's tmap.id will be used in the filter to reference the corresponding tiddler.\n *\n * @param {Node} node\n */\n\n }, {\n key: 'addNode',\n value: function addNode(node) {\n\n if (!this._isNodeIncludedById(node)) {\n\n // @see https://github.com/felixhayashi/TW5-TiddlyMap/issues/285\n if (_utils2.default.isTrue($tm.config.sys.alwaysAddNodeIdToViewFilter) || !_utils2.default.isMatch(node.tRef, this.getNodeFilter('compiled'))) {\n\n var part = ViewAbstraction._getNodeIdFilterPart(node);\n var separator = ' ';\n this.setNodeFilter(this.getNodeFilter('raw') + separator + part);\n }\n\n this.saveNodePosition(node);\n }\n }\n\n /**\n * Removes a node from the the view filter that has been\n * explicitly added before.\n *\n * ATTENTION: Never remove the node data (i.e. style and positions)\n * from the node-data store. This will be done by a garbage\n * collector. See Adapter.prototype._removeObsoleteViewData\n *\n * @return {boolean} True if node was removed, false otherwise.\n * Note: false is also returned if the node did not exist before.\n */\n\n }, {\n key: 'removeNode',\n value: function removeNode(nodeId) {\n\n if (!this._isNodeIncludedById(nodeId)) {\n\n return false;\n }\n\n var part = ViewAbstraction._getNodeIdFilterPart(nodeId);\n var f = this.getNodeFilter('raw').replace(part, '');\n\n this.setNodeFilter(f);\n\n if (this.getNodeData(nodeId)) {\n this.saveNodeData(nodeId, null);\n }\n\n return true;\n }\n\n /**\n * Method will return a tiddlywiki edge-type filter that is used to\n * decide which edge types are displayed by the graph.\n *\n * Note: needs to be recalculated if the collection of edge types changed\n * in the wiki.\n *\n * @param {(\"raw\"|\"pretty\"|\"matches\"|\"whitelist\")} [type]\n * Use this param to control the output type.\n * @result {*}\n * Depends on the type param:\n * - raw: the original filter string\n * - pretty: the prettyfied filter string for usage in textareas\n * - matches: {Array<string>} all matches\n * - whitelist: A lookup table where all matches are true\n */\n\n }, {\n key: 'getEdgeTypeFilter',\n value: function getEdgeTypeFilter(type) {\n var _this2 = this;\n\n var filter = $tw.wiki.getCacheForTiddler(this.edgeTypeFilterTRef, \"tmap-edgeTypeFilter\", function () {\n\n var allETy = $tm.indeces.allETy;\n var src = Object.keys(allETy);\n var tObj = $tw.wiki.getTiddler(_this2.edgeTypeFilterTRef);\n\n var filter = {};\n filter.raw = tObj && tObj.fields.filter || '';\n filter.pretty = _utils2.default.getPrettyFilter(filter.raw);\n filter.matches = _utils2.default.getEdgeTypeMatches(filter.raw, allETy);\n filter.whitelist = _utils2.default.getLookupTable(filter.matches);\n\n return filter;\n });\n\n return type ? filter[type] : filter;\n }\n\n /**\n * Whether or not this EdgeType is visible in this view.\n *\n * @param {EdgeType|string} id\n * @return {*}\n */\n\n }, {\n key: 'isEdgeTypeVisible',\n value: function isEdgeTypeVisible(id) {\n\n return _utils2.default.isEdgeTypeMatch(_EdgeType2.default.getInstance(id).id, this.getEdgeTypeFilter(\"raw\"));\n }\n\n /**\n * Method will return a tiddlywiki node filter that is used to\n * decide which nodes are displayed by the graph.\n *\n * @param {(\"raw\"|\"pretty\"|\"compiled\")} [type] - Use this param to control the output type.\n * @result {*}\n * Depends on the type param:\n * - raw: the original filter string\n * - pretty: the prettyfied filter string for usage in textareas\n * - compiled: {Array<string>} all matches\n */\n\n }, {\n key: 'getNodeFilter',\n value: function getNodeFilter(type) {\n var _this3 = this;\n\n var filter = $tw.wiki.getCacheForTiddler(this.nodeFilterTRef, \"tmap-nodeFilter\", function () {\n\n var filter = _utils2.default.makeHashMap();\n var tObj = $tw.wiki.getTiddler(_this3.nodeFilterTRef);\n\n filter.raw = tObj && tObj.fields.filter || '';\n filter.pretty = _utils2.default.getPrettyFilter(filter.raw);\n filter.compiled = $tw.wiki.compileFilter(filter.raw);\n\n return filter;\n });\n\n return type ? filter[type] : filter;\n }\n\n /**\n * This method will return the node data stored in the view.\n *\n * @todo When to delete obsolete data?\n *\n * @param {string} nodeId\n * @result {Hashmap<Id, Object>} A Hashmap with node data.\n */\n\n }, {\n key: 'getNodeData',\n value: function getNodeData(nodeId) {\n var _this4 = this;\n\n var data = $tw.wiki.getCacheForTiddler(this.mapTRef, \"tmap-map\", function () {\n return _utils2.default.parseFieldData(_this4.mapTRef, 'text', {});\n });\n\n return nodeId ? data[nodeId] : data;\n }\n\n /**\n * A view equals another view either\n *\n * 1) if the js objects reference the same objects in the js runtime\n * 2) or if the views have the same root and both views exist\n *\n * @param view\n * @return {boolean}\n */\n\n }, {\n key: 'equals',\n value: function equals(view) {\n\n return view === this || ViewAbstraction.exists(view) && new ViewAbstraction(view).getRoot() === this.getRoot();\n }\n\n /**\n * This function will merge the given data in the view's node store.\n *\n * If a property is set to null, it will be removed.\n *\n * If two arguments are provided, the first parameter is assumed\n * to be a node id and the second to be the data object. The data\n * will extend the existing data. If data is not an object, it is\n * assumed to be a delete directive and consequently the node data\n * in the store will be deleted.\n *\n * Otherwise, if a single object parameter is provided, it is regarded\n * as a node collection and the whole object is used to extend the store.\n *\n * Note: The Adapter will routinely delete node content of nodes that are\n * not contained in the view anymore.\n */\n\n }, {\n key: 'saveNodeData',\n value: function saveNodeData() {\n\n var data = this.getNodeData();\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n if (args.length === 2) {\n\n if (_typeof(args[1]) === 'object') {\n\n if (args[1] === null) {\n\n delete data[args[0]];\n } else {\n\n data[args[0]] = Object.assign(data[args[0]] || {}, args[1]);\n }\n }\n } else if (args.length === 1 && _typeof(args[0]) === 'object') {\n\n $tm.logger('log', 'Storing data in', this.mapTRef);\n\n Object.assign(data, args[0]);\n } else {\n // not allowed\n\n throw new (Function.prototype.bind.apply(_exception.InvalidArgumentException, [null].concat(args)))();\n }\n\n _utils2.default.writeFieldData(this.mapTRef, 'text', data, $tm.config.sys.jsonIndentation);\n }\n\n /**\n * Saves a node's position to the store\n *\n * @param {Node} node\n */\n\n }, {\n key: 'saveNodePosition',\n value: function saveNodePosition(node) {\n\n if (node.id && node.x != null && node.y != null) {\n // only pass coordinates to prevent other data from being stored!\n this.saveNodeData(node.id, { x: node.x, y: node.y });\n }\n }\n\n /**\n * Saves a node's position to the store\n *\n * @param {Object} positions\n */\n\n }, {\n key: 'saveNodePositions',\n value: function saveNodePositions(positions) {\n\n var nodeData = this.getNodeData();\n\n for (var id in positions) {\n\n nodeData[id] = nodeData[id] || {};\n nodeData[id].x = positions[id].x;\n nodeData[id].y = positions[id].y;\n }\n\n this.saveNodeData(nodeData);\n }\n\n /**\n * Marks the node with the given id as central topic.\n *\n * @param nodeId\n */\n\n }, {\n key: 'setCentralTopic',\n value: function setCentralTopic(nodeId) {\n\n this.setConfig('central-topic', nodeId);\n }\n\n /**\n * Saves the provided style for the node with the specified id in the view's store.\n *\n * Note: The coordinates of the node on the map are not stored via this function.\n * For this task, use saveNodePosition() instead.\n *\n * @param {string} nodeId\n * @param {Object} style\n */\n\n }, {\n key: 'saveNodeStyle',\n value: function saveNodeStyle(nodeId, style) {\n\n // remove any previos style from store;\n // @TODO: optimize this only null in style var needs to be removed\n var data = this.getNodeData(nodeId) || {};\n\n var pos = { x: data.x, y: data.y };\n\n // tabula rasa! delete all previous properties\n for (var p in data) {\n delete data[p];\n }\n\n // save new style\n this.saveNodeData(nodeId, _extends({}, style, pos));\n }\n\n /**\n * The view's configTiddlerRef is stored in different tiddlers (paths).\n * This function registers these paths to this the view instance.\n *\n * @private\n * @params {ViewAbstraction|string} view\n */\n\n }, {\n key: '_registerPaths',\n value: function _registerPaths(view, isCreate) {\n\n // main config is stored here\n this.configTRef = ViewAbstraction._getRootPath(view);\n\n // store for node properties (positions and local node styles)\n this.mapTRef = this.configTRef + '/map';\n\n // filter stores\n this.nodeFilterTRef = this.configTRef + '/filter/nodes';\n this.edgeTypeFilterTRef = this.configTRef + '/filter/edges';\n\n this.snapshotTRef = this.getRoot() + '/snapshot';\n }\n\n /**\n * This will clear all cached tiddlers related to this view.\n *\n * @private\n * @return {boolean} true if the cache was dirty, false if cache was up-to-date and did\n */\n\n }, {\n key: '_clearCaches',\n value: function _clearCaches() {\n // clear all tiddler-caches below this path\n _utils2.default.getMatches('[prefix[' + this.getRoot() + ']]').forEach(function (tRef) {\n $tw.wiki.clearCache(tRef);\n });\n }\n\n /**\n * Will create the config tiddler which means that the view will\n * start to exist.\n *\n * @private\n */\n\n }, {\n key: '_createView',\n value: function _createView() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n isForce = _ref.isForce,\n protoView = _ref.protoView,\n isHidden = _ref.isHidden;\n\n // destroy any former view that existed in this path\n if (ViewAbstraction.exists(this)) {\n\n if (!isForce) {\n\n return;\n }\n\n this.destroy();\n }\n\n if (ViewAbstraction.exists(protoView)) {\n _utils2.default.cp(new ViewAbstraction(protoView).getRoot(), this.configTRef, true);\n }\n\n // create new view\n var fields = {\n title: this.configTRef,\n id: _utils2.default.genUUID() // maybe useful for future purposes…\n };\n\n if (!isHidden) {\n fields[$tm.field.viewMarker] = true;\n }\n\n $tw.wiki.addTiddler(new $tw.Tiddler(_utils2.default.getTiddler(this.configTRef), // in case we cloned the view\n fields));\n\n this.setEdgeTypeFilter(env.filter.defaultEdgeTypeFilter);\n }\n\n /**\n * Will return a filter part that matches the node's id.\n *\n * E.g. [field:tmap.id[1748576e-74bb-4165-85bb-0d312e3e4f1f]]\n *\n * @private\n *\n * @param node\n * @return {string}\n */\n\n }], [{\n key: '_getNodeIdFilterPart',\n value: function _getNodeIdFilterPart(node) {\n\n var id = (typeof node === 'undefined' ? 'undefined' : _typeof(node)) === 'object' ? node.id : node;\n\n return '[field:tmap.id[' + id + ']]';\n }\n\n /**\n * Will return the path to the config tiddler of this view, aka the view's root.\n *\n * @private\n *\n * @param {*} view - The constructor param to abstract or create the view.\n * @result {string|undefined} The view config path.\n */\n\n }, {\n key: '_getRootPath',\n value: function _getRootPath(view) {\n\n if (view instanceof ViewAbstraction) {\n\n return view.configTRef;\n }\n\n if (view instanceof $tw.Tiddler) {\n // is a tiddler object\n\n view = view.fields.title;\n }\n\n if (typeof view === 'string') {\n\n // remove prefix and slash\n var label = _utils2.default.getWithoutPrefix(view, $tm.path.views + '/');\n\n // a valid label must not contain any slashes\n if (label && !_utils2.default.hasSubString(label, '/')) {\n\n return $tm.path.views + '/' + label;\n }\n }\n }\n\n /**\n * A view exists if the the view's root exists as tiddler in the store.\n *\n * @return {ViewAbstraction|string}\n */\n\n }, {\n key: 'exists',\n value: function exists(view) {\n\n if (!view) {\n\n return false;\n }\n\n if (view instanceof ViewAbstraction) {\n\n view = view.configTRef;\n } else {\n\n view = ViewAbstraction._getRootPath(view);\n }\n\n return _utils2.default.tiddlerExists(view);\n }\n }]);\n\n return ViewAbstraction;\n}();\n\n/*** Exports *******************************************************/\n\nexports.default = ViewAbstraction;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/graph/ViewAbstraction.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/Popup": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/Popup",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**** Code *********************************************************/\n\n/**\n * Installs a hidden popup below `parentDomNode` that may be shown\n * and or hidden.\n *\n * @constructor\n *\n * @param {Element} [parentDomNode] - The popup container. The\n * popup will create itself in this container.\n * @param {Hashmap} [options] - An options object.\n * @param {string} [options.className] - A classname to be added to\n * the popup div.\n * @param {int} [options.delay] - The default delay for the popup\n * show and hide.\n */\nfunction Popup(parentDomNode, options) {\n\n options = options || {};\n\n this._parentDomNode = parentDomNode;\n this._domNode = document.createElement('div');\n this._domNode.style.display = 'none';\n this._domNode.className = 'tmap-popup';\n\n this._parentDomNode.appendChild(this._domNode);\n $tw.utils.addClass(this._domNode, options.className);\n\n this._isEnabled = true;\n this._isPreventShowOrHide = false;\n this._isHideOnClick = !!options.hideOnClick;\n this._timeoutShow = null;\n this._timeoutHide = null;\n this._isDisplayNoneAfterAnimation = true;\n\n // delays\n var val = parseInt(options.leavingDelay);\n this._hideDelayLeavingPopup = _utils2.default.isInteger(val) ? val : 200;\n\n val = parseInt(options.hideDelay);\n this._hideDelay = _utils2.default.isInteger(val) ? val : 200;\n\n val = parseInt(options.showDelay);\n this._showDelay = _utils2.default.isInteger(val) ? val : 200;\n\n // force early binding of functions to this context\n _utils2.default.bindTo(this, ['_show', '_hide', '_handleEnter', '_handleLeave', '_handleAnimationEnd', '_handleClick']);\n\n // specify handlers\n this._listeners = {\n 'mouseenter': this._handleEnter,\n 'mouseleave': this._handleLeave,\n 'click': [this._handleClick, true]\n };\n\n var fn = this._handleAnimationEnd;\n this._listeners[$tw.utils.convertEventName('animationEnd')] = fn;\n this._listeners[$tw.utils.convertEventName('transitionEnd')] = fn;\n\n // add handlers\n _utils2.default.setDomListeners('add', this._domNode, this._listeners, false);\n}\n\n/**\n * When the mouse is inside the popup, the popup will manage closing\n * itself and ignore all closing attempts from outside.\n */\n// @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/Popup\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\nPopup.prototype._handleEnter = function (ev) {\n\n //~ console.log(\"_handleEnter\");\n\n this._isPreventShowOrHide = true;\n};\n\n/**\n * Handler triggered when leaving the popup div.\n */\nPopup.prototype._handleLeave = function (ev) {\n\n //~ console.log(\"_handleLeave\");\n\n this._isPreventShowOrHide = false;\n\n // we need some delay because resizing may cause the mouse to\n // exit the popup for some miliseconds\n\n this.hide(this._hideDelayLeavingPopup);\n};\n\nPopup.prototype._handleClick = function (ev) {\n\n //~ console.log(\"_handleLeave\");\n\n if (this._isHideOnClick) {\n this._hide(true);\n }\n};\n\n/**\n * Handler triggered when leaving the popup div.\n */\nPopup.prototype._handleAnimationEnd = function () {\n\n if (this._isDisplayNoneAfterAnimation) {\n //~ console.log(\"display: none\");\n this._domNode.style.display = 'none';\n }\n};\n\n/**\n * Immediately hides the popup.\n */\nPopup.prototype._hide = function (isForce) {\n\n //~ console.log(\"_hide\");\n\n if (!isForce && this._isPreventShowOrHide) return;\n\n //~ console.log(\"_hide SUCCESS\");\n\n this._isDisplayNoneAfterAnimation = true;\n this._isPreventShowOrHide = false;\n\n $tw.utils.removeClass(this._domNode, 'tmap-popup-active');\n};\n\n/**\n * Makes the text visible as popup and registers it with the\n * given signature.\n *\n * The popup is spawned on the side that has the most space.\n *\n * @param {*} signature - The signature that has been\n * passed to {@link show}.\n */\nPopup.prototype._show = function (signature, text) {\n\n //~ console.log(\"_show\");\n\n if (this._isPreventShowOrHide || $tm.mouse.ctrlKey || !this._isEnabled) {\n return;\n }\n\n this._domNode.style.display = 'none';\n $tw.utils.removeClass(this._domNode, 'tmap-popup-active');\n\n // remove any positioning or modification done before\n this._domNode.removeAttribute('style');\n\n // remove any previous content\n _utils2.default.removeDOMChildNodes(this._domNode);\n var div = this._domNode.appendChild(document.createElement('div'));\n\n if (typeof text === 'function') {\n text(signature, div);\n } else {\n div.innerHTML = text;\n }\n\n if (!div.childNodes.length) return;\n\n var parRect = this._parentDomNode.getBoundingClientRect();\n var x = $tm.mouse.clientX;\n var y = $tm.mouse.clientY;\n\n //~ console.log(\"_show SUCCESS\");\n\n // ATTENTION: display needs to be true before we can get the bounds!\n\n // make sure that display is block so the animation is executed\n // and we can retrieve the size of the div.\n this._domNode.style.display = 'block';\n\n var popRect = this._domNode.getBoundingClientRect();\n\n var availSpaceRight = parRect.right - (x + popRect.width);\n var availSpaceLeft = x - popRect.width - parRect.left;\n var spawnRight = availSpaceRight > availSpaceLeft;\n\n var availSpaceBottom = parRect.bottom - (y + popRect.height);\n var availSpaceTop = y - popRect.height - parRect.top;\n var spawnBottom = availSpaceBottom > availSpaceTop;\n\n var shiftLeft = spawnRight ? -15 : popRect.width + 15;\n var shiftTop = spawnBottom ? -15 : popRect.height + 15;\n\n this._domNode.style.left = x - parRect.left - shiftLeft + 'px';\n this._domNode.style.top = y - parRect.top - shiftTop + 'px';\n\n // …and make sure that it stays block after the animation is done…\n this._isDisplayNoneAfterAnimation = false;\n // …and add the class that triggers the animation…\n $tw.utils.addClass(this._domNode, 'tmap-popup-active');\n};\n\n/**\n * Makes the text visible as popup after a given delay and\n * registers the popup under the specified signature.\n *\n * @param {*} signature - If {@param text} is provided as param and\n * is a function, then this will be passed later as argument to\n * text. It therefore acts as means to identify the popup later\n * on or pass data that survives the delay.\n * @param {string|Function} text - If text\n * is a string, it will be shown in the popup, otherwise,\n * if text is a function, it will be executed and it is\n * expected to populate the popup div passed as second parameter;\n * the first parameter will be the signature object.\n * @param{delay} delay - Delays the hide operation.\n */\nPopup.prototype.show = function (signature, text, delay) {\n\n //~ console.log(\"show\", delay);\n\n this._clearTimeouts();\n\n delay = _utils2.default.isInteger(delay) ? delay : this._showDelay;\n\n // start a new timeout\n this._timeoutShow = setTimeout(this._show, delay, signature, text);\n};\n\n/**\n * Hide the popup.\n *\n * @param {int} delay - Delays the hide operation.\n */\nPopup.prototype.hide = function (delay, isForce) {\n\n //~ console.log(\"hide\", delay);\n\n this._clearTimeouts();\n\n delay = _utils2.default.isInteger(delay) ? delay : this._hideDelay;\n\n if (isForce || delay === 0) {\n // @TODO is this really correct?\n this._hide(isForce);\n } else {\n this._timeoutHide = setTimeout(this._hide, delay, isForce);\n }\n};\n\n/**\n * Completely enable or disable the popup\n */\nPopup.prototype.setEnabled = function (isEnabled) {\n this._isEnabled = isEnabled;\n};\n\nPopup.prototype.isShown = function () {\n return this._domNode.style.display === 'block';\n};\n\nPopup.prototype._clearTimeouts = function () {\n\n clearTimeout(this._timeoutShow);\n clearTimeout(this._timeoutHide);\n\n this._timeoutShow = undefined;\n this._timeoutHide = undefined;\n};\n\n/*** Exports *******************************************************/\n\nexports.default = Popup;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/lib/Popup.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/lib/SelectionRectangle": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/lib/SelectionRectangle",
"text": "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/lib/SelectionRectangle\ntype: application/SelectionRectangle\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/**** Code *********************************************************/\n\n/**\n * Represents a rectangle spanned by mouse selection\n *\n * @constructor\n *\n * @param {Element} [parentDomNode] - The popup container. The\n * popup will create itself in this container.\n * @param {Hashmap} [options] - An options object.\n * @param {string} [options.className] - A classname to be added to\n * the popup div.\n * @param {int} [options.delay] - The default delay for the popup\n * show and hide.\n */\nvar SelectionRectangle = function () {\n\n /**\n * Sets up the selection with the specified initial offset.\n *\n * @param {number} x - offset x\n * @param {number} y - offset y\n */\n function SelectionRectangle(x, y) {\n _classCallCheck(this, SelectionRectangle);\n\n this.x1 = x;\n this.x2 = x;\n\n this.y1 = y;\n this.y2 = y;\n }\n\n /**\n * Spans the selection.\n *\n * @param {number} x - x coordinate\n * @param {number} y - y coordinate\n */\n\n\n _createClass(SelectionRectangle, [{\n key: \"span\",\n value: function span(x, y) {\n\n this.x2 = x;\n this.y2 = y;\n }\n\n /**\n * @return {number} width\n */\n\n }, {\n key: \"getWidth\",\n value: function getWidth() {\n\n return this.x2 - this.x1;\n }\n\n /**\n * @return {number} height\n */\n\n }, {\n key: \"getHeight\",\n value: function getHeight() {\n\n return this.y2 - this.y1;\n }\n\n /**\n * @return {array} an array holding the following data in sequence: x, y, width, height\n */\n\n }, {\n key: \"getRect\",\n value: function getRect() {\n\n return [this.x1, this.y1, this.getWidth(), this.getHeight()];\n }\n\n /**\n * @param {number} x - x coordinate\n * @param {number} y - y coordinate\n * @return {boolean}\n */\n\n }, {\n key: \"isPointWithin\",\n value: function isPointWithin(_ref) {\n var x = _ref.x,\n y = _ref.y;\n var x1 = this.x1,\n x2 = this.x2,\n y1 = this.y1,\n y2 = this.y2;\n\n\n var mostLeft = Math.min(x1, x2);\n var mostRight = Math.max(x1, x2);\n var mostBottom = Math.min(y1, y2);\n var mostTop = Math.max(y1, y2);\n\n return mostLeft < x && x < mostRight && mostBottom < y && y < mostTop;\n }\n }]);\n\n return SelectionRectangle;\n}();\n\n/*** Exports *******************************************************/\n\nexports.default = SelectionRectangle;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/lib/SelectionRectangle.js.map\n",
"type": "application/SelectionRectangle",
"module-type": "library"
},
"/home/felo/projects/Tiddlywiki/TiddlyWiki5/plugins/felixhayashi/tiddlymap/js/lib/TypeDefs.js": {
"title": "/home/felo/projects/Tiddlywiki/TiddlyWiki5/plugins/felixhayashi/tiddlymap/js/lib/TypeDefs.js",
"text": "/**\n * @typedef {string} TiddlerReference\n *\n * A reference (title) that identifies a tiddler.\n */\n\n/**\n * @typedef {$tw.Tiddler|TiddlerReference} Tiddler\n *\n * Either a reference (title) that identifies the tiddler or an object\n * representation.\n */\n\n/**\n * @typedef {string|number} Id\n *\n * An id used to identify a node or tiddler. Ids may only contain characters\n * that are valid when used as tiddlywiki field values.\n */\n\n/**\n * @typedef {Object} Edge\n *\n * @property {Id} id - The id of the edge.\n * @property {Id} from - An id that refers to a {@link Node} and denotes the\n * from part of an edge.\n * @property {Id} to - An id that refers to a {@link Node} and denotes the\n * to part of an edge.\n * @property {string} label - The label of the edge that will be displayed\n * in the rendered graph.\n * @property {string} [view] - An optional viewname to which the edge is\n * bound to.\n *\n * An edge connects nodes in a vis.Network.\n */\n\n/**\n * @typedef {Object} EdgeTypeSubscriberInfo\n *\n * @property {(\"_\"|undefined)} [marker] - The marker of the edge type.\n * @property {string} [namespace] - The namespace of the edge type.\n * @property {string} [name] - The name of the edge type.\n * @property {boolean} [include=true] - Whether or not this subscriber should be registered.\n */\n\n/**\n * @typedef {Object} Node\n *\n * This object is used by the vis.Network.\n *\n * @property {Id} id - The id of the node.\n * @property {string} label - The label of the node that will be displayed\n * in the rendered graph.\n */\n\n/**\n * @typedef {Object} Hashmap\n *\n * Sometimes it makes semantically more sense to call an object a hashmap.\n * Then it becomes clear that we are talking about a simple key-value store.\n */\n\n/**\n * @typedef {Array.<*>|Hashmap.<Id, *>|vis.DataSet} Collection\n *\n * A collection contains a group of elements, usually nodes\n * (see {@link NodeCollection}) or edges (see {@link EdgeCollection}).\n *\n * A collection object corresponds to a {@link CollectionTypeString}.\n */\n\n/**\n * @typedef {Array.<Edge>|Hashmap.<Id, Edge>|vis.DataSet} EdgeCollection\n *\n * A collection of edges.\n */\n\n/**\n * @typedef {Array.<Node>|Hashmap.<Id, Node>|vis.DataSet} NodeCollection\n *\n * A collection of nodes.\n */\n\n/**\n * @typedef {Array.<Tiddler>|Hashmap.<Id, Tiddler>} TiddlerCollection\n *\n * A collection of tiddlers.\n */\n\n/**\n * @typedef {string|function} TiddlyWikiFilter\n *\n * A tiddlywiki filter expression or a compiled filter.\n */\n\n/**\n * @typedef {Tiddler|string|ViewAbstraction} View\n *\n * A view is identified either by a tiddler reference (title),\n * a Tiddler instance or a label. Moreover, a ViewAbstraction\n * may be used as view representation.\n */\n\n/**\n * @typedef {array|hashmap|dataset} CollectionTypeString\n *\n * Most of tiddlymap's select statements allow the user to choose one\n * of the specified output types, depending on what is most suitable.\n *\n * The output types relate to the different types of\n * {@link EdgeCollection} and {@link NodeCollection}.\n */\n\n/**\n * @typedef {Object} Position\n *\n * An object containing x, y properties.\n *\n * @property {number} x - The x coordinate.\n * @property {number} y - The y coordinate.\n */\n\n/**\n * @typedef {Object} Updates\n *\n * An object that carries information about wiki changes after a refresh cycle occurred.\n * This is a more advanced form of the changedTiddlers object.\n *\n * @property {Object<TiddlerReference, string>} changedTiddlers\n * a TiddlyWiki changedTiddlers list that has all draft tiddler changes removed\n * @property {Object<string, boolean>} paths\n * a list of root paths in which tiddler changes occured.\n */\n\n/**\n * @typedef {string} EdgeTypeId\n *\n * An edge-type id string consists of the following parts of which the\n * first two are optional: `[marker][namespace:]name`\n *\n * Note: The colon is not considered to be part of the namespace but is required\n * if a namespace exists.\n */\n\"use strict\";\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/lib/TypeDefs.js.map\n"
},
"$:/plugins/felixhayashi/tiddlymap/js/config/vis": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/config/vis",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/config/vis\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\nvar visConfig = {\n\n locale: 'en_EN',\n clickToUse: false,\n autoResize: false,\n height: '100%',\n width: '100%',\n configure: {\n enabled: false\n },\n interaction: {\n dragNodes: true,\n dragView: true,\n hideEdgesOnDrag: false,\n hideNodesOnDrag: false,\n hover: true,\n navigationButtons: true,\n multiselect: true,\n selectable: true,\n selectConnectedEdges: true,\n tooltipDelay: 600,\n zoomView: false,\n keyboard: {\n enabled: false,\n speed: {\n x: 10,\n y: 10,\n zoom: 0.02\n },\n bindToWindow: false\n }\n },\n manipulation: {\n initiallyActive: true\n },\n nodes: {\n shape: 'box',\n shadow: {\n enabled: false\n },\n color: {\n border: '#2B7CE9',\n background: '#97C2FC'\n }\n },\n edges: {\n smooth: {\n enabled: true\n },\n color: {\n color: '#848484',\n inherit: false\n },\n arrows: {\n to: {\n enabled: true\n }\n }\n },\n physics: {\n forceAtlas2Based: {\n // <- more repulsion between nodes - 0 - more attraction between nodes ->\n gravitationalConstant: -300, // default: -50\n // edge length\n springLength: 0, // default: 100\n // <- less stiff edges - 0 - stiffer edges ->\n springConstant: 0.2, // default: 0.08\n // pulls the entire network back to the center.\n centralGravity: 0.015, // default: 0.01\n // kinetic energy reduction\n damping: 0.4\n },\n solver: 'forceAtlas2Based',\n stabilization: {\n enabled: true,\n iterations: 1000,\n updateInterval: 10,\n onlyDynamicEdges: false,\n fit: false\n }\n }\n};\n\nexports.default = visConfig;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/lib/VisConfig.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/lib/environment": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/lib/environment",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n// @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/lib/environment\ntype: application/javascript\n module-type: library\n\n@preserve\n\n\\*/\n\n/*** Code **********************************************************/\n\n/**\n * This module is responsible for registering a global namespace\n * under $tw and registering fundamental path variables.\n *\n * Everything that doesn't change when the global config object is\n * updated. This includes prefixes (paths) and tiddler titles.\n *\n * ATTENTION: The paths are deliberately written in full so they\n * are discovered when a search is performed over the TiddlyMap code.\n */\n\n// **ATTENTION: NO TRAILING SLASHES IN PATHS EVER**\nvar path = exports.path = {\n pluginRoot: '$:/plugins/felixhayashi/tiddlymap',\n edgeTypes: '$:/plugins/felixhayashi/tiddlymap/graph/edgeTypes',\n nodeTypes: '$:/plugins/felixhayashi/tiddlymap/graph/nodeTypes',\n views: '$:/plugins/felixhayashi/tiddlymap/graph/views',\n options: '$:/plugins/felixhayashi/tiddlymap/config',\n dialogs: '$:/plugins/felixhayashi/tiddlymap/dialog',\n footers: '$:/plugins/felixhayashi/tiddlymap/dialogFooter',\n tempRoot: '$:/temp/tmap',\n tempStates: '$:/temp/tmap/state',\n tempPopups: '$:/temp/tmap/state/popup',\n localHolders: '$:/temp/tmap/holders'\n};\n\n// static references to important tiddlers\nvar ref = exports.ref = {\n defaultViewHolder: '$:/plugins/felixhayashi/tiddlymap/misc/defaultViewHolder',\n graphBar: '$:/plugins/felixhayashi/tiddlymap/misc/advancedEditorBar',\n sysUserConf: '$:/plugins/felixhayashi/tiddlymap/config/sys/user',\n visUserConf: '$:/plugins/felixhayashi/tiddlymap/config/vis/user',\n welcomeFlag: '$:/plugins/felixhayashi/tiddlymap/flag/welcome',\n focusButton: '$:/plugins/felixhayashi/tiddlymap/misc/focusButton',\n sysMeta: '$:/plugins/felixhayashi/tiddlymap/misc/meta',\n liveTab: '$:/plugins/felixhayashi/tiddlymap/hook/liveTab',\n mainEditor: '$:/plugins/felixhayashi/tiddlymap/hook/editor',\n sidebarBreakpoint: '$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint'\n};\n\n// some other options\nvar misc = exports.misc = {\n // if no edge label is specified, this is used as label\n unknownEdgeLabel: 'tmap:undefined',\n liveViewLabel: 'Live View',\n defaultViewLabel: 'Default',\n mainEditorId: 'main_editor',\n arrows: { 'in': '⇦', 'out': '➡', 'bi': '⇄' }\n};\n\nvar config = exports.config = {\n sys: {\n field: {\n nodeLabel: 'caption',\n nodeIcon: 'icon',\n nodeInfo: 'description',\n viewMarker: 'isview'\n },\n liveTab: {\n fallbackView: misc.liveViewLabel\n },\n suppressedDialogs: {},\n edgeClickBehaviour: 'manager',\n debug: 'false',\n notifications: 'true',\n popups: {\n enabled: 'true',\n delay: '600',\n width: '240px',\n height: '140px'\n },\n jsonIndentation: '1',\n alwaysAddNodeIdToViewFilter: 'true',\n editNodeOnCreate: 'false',\n singleClickMode: 'false',\n nodeFilterNeighbours: 'false',\n editorMenuBar: {\n showNeighScopeButton: 'true',\n showRasterMenuButton: 'true',\n showScreenshotButton: 'true'\n }\n }\n};\n\n// some popular filters\nvar filter = exports.filter = {\n nodeTypes: '[prefix[' + path.nodeTypes + ']]',\n edgeTypes: '[prefix[' + path.edgeTypes + ']]',\n views: '[' + config.sys.field.viewMarker + '[true]]',\n defaultEdgeTypeFilter: '-[prefix[_]] -[[tw-body:link]] -[[tw-list:tags]] -[[tw-list:list]]'\n};\n\nvar allSelector = '[all[tiddlers+shadows]!has[draft.of]]';\n\n// some popular selectors\n// usually used from within tiddlers via the tmap macro\n\nvar s = {\n allEdgeTypes: allSelector + ' +' + filter.edgeTypes,\n allNodeTypes: allSelector + ' +' + filter.nodeTypes,\n allViews: allSelector + ' +' + filter.views,\n allPotentialNodes: '[all[tiddlers]!is[system]!has[draft.of]]'\n};\n\nvar selector = exports.selector = _extends({}, s, {\n allEdgeTypesById: s.allEdgeTypes + ' +[removeprefix[' + path.edgeTypes + '/]]',\n allNodeTypesById: s.allNodeTypes + ' +[removeprefix[' + path.nodeTypes + '/]]',\n allViewsByLabel: s.allViews + ' +[removeprefix[' + path.views + '/]]'\n});\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/lib/environment.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/exception": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/exception",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/exception\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/**\n * Base class for all Exceptions in TiddlyMap\n */\nvar TiddlyMapError = function (_Error) {\n _inherits(TiddlyMapError, _Error);\n\n /**\n *\n * @param {string} message\n * @param {array} payload\n */\n function TiddlyMapError(message, payload) {\n _classCallCheck(this, TiddlyMapError);\n\n var _this = _possibleConstructorReturn(this, (TiddlyMapError.__proto__ || Object.getPrototypeOf(TiddlyMapError)).call(this, message));\n\n _this.payload = payload;\n return _this;\n }\n\n _createClass(TiddlyMapError, [{\n key: 'getPayload',\n value: function getPayload() {\n return this.payload;\n }\n }]);\n\n return TiddlyMapError;\n}(Error);\n\n/**\n * Thrown if a css or dom structure is not present but was expected by TiddlyMap.\n */\n\n\nvar EnvironmentError = exports.EnvironmentError = function (_TiddlyMapError) {\n _inherits(EnvironmentError, _TiddlyMapError);\n\n function EnvironmentError(aspect) {\n _classCallCheck(this, EnvironmentError);\n\n return _possibleConstructorReturn(this, (EnvironmentError.__proto__ || Object.getPrototypeOf(EnvironmentError)).call(this, 'Critical parts of the underlying system changed: ' + aspect));\n }\n\n return EnvironmentError;\n}(TiddlyMapError);\n\n/**\n * Thrown if a plugin or any other kind of required dependency is missing.\n */\n\n\nvar DependencyError = exports.DependencyError = function (_TiddlyMapError2) {\n _inherits(DependencyError, _TiddlyMapError2);\n\n function DependencyError(dep) {\n _classCallCheck(this, DependencyError);\n\n return _possibleConstructorReturn(this, (DependencyError.__proto__ || Object.getPrototypeOf(DependencyError)).call(this, 'TiddlyMap cannot run without: : ' + dep));\n }\n\n return DependencyError;\n}(TiddlyMapError);\n\n/**\n * Thrown if an interface method is not fully implemented.\n */\n\n\nvar MissingOverrideError = exports.MissingOverrideError = function (_TiddlyMapError3) {\n _inherits(MissingOverrideError, _TiddlyMapError3);\n\n function MissingOverrideError(context, methodName) {\n _classCallCheck(this, MissingOverrideError);\n\n return _possibleConstructorReturn(this, (MissingOverrideError.__proto__ || Object.getPrototypeOf(MissingOverrideError)).call(this, context.constructor.name + ' does not override method \"' + methodName + '\"'));\n }\n\n return MissingOverrideError;\n}(TiddlyMapError);\n\n/**\n * Thrown if a resource such as a node, edge, view, tiddler etc. cannot be located\n * in the system.\n */\n\n\nvar ResourceNotFoundException = exports.ResourceNotFoundException = function (_TiddlyMapError4) {\n _inherits(ResourceNotFoundException, _TiddlyMapError4);\n\n /**\n * @param {string} resourceType\n * @param {*} payload\n */\n function ResourceNotFoundException(resourceType) {\n _classCallCheck(this, ResourceNotFoundException);\n\n for (var _len = arguments.length, payload = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n payload[_key - 1] = arguments[_key];\n }\n\n return _possibleConstructorReturn(this, (ResourceNotFoundException.__proto__ || Object.getPrototypeOf(ResourceNotFoundException)).call(this, 'Cannot resolve ' + resourceType, payload));\n }\n\n return ResourceNotFoundException;\n}(TiddlyMapError);\n\n/**\n * Thrown if a resource such as a node, edge, view, tiddler etc. cannot be located\n * in the system.\n */\n\n\nvar InvalidArgumentException = exports.InvalidArgumentException = function (_TiddlyMapError5) {\n _inherits(InvalidArgumentException, _TiddlyMapError5);\n\n function InvalidArgumentException() {\n _classCallCheck(this, InvalidArgumentException);\n\n for (var _len2 = arguments.length, payload = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n payload[_key2] = arguments[_key2];\n }\n\n return _possibleConstructorReturn(this, (InvalidArgumentException.__proto__ || Object.getPrototypeOf(InvalidArgumentException)).call(this, 'Invalid or missing argument provided', payload));\n }\n\n return InvalidArgumentException;\n}(TiddlyMapError);\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/lib/exceptions.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/URL": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/URL",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/URL\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/*** Code **********************************************************/\n\n/**\n * <<<\n * Lightweight URL manipulation with JavaScript. This library is\n * independent of any other libraries and has pretty simple interface\n * and lightweight code-base. Some ideas of query string parsing\n * had been taken from Jan Wolter.\"\n *\n * @see http://unixpapa.com/js/querystring.html\n * @license MIT\n * @author Mykhailo Stadnyk <mikhus@gmail.com>\n * <<< https://github.com/Mikhus/jsurl\n *\n * @class\n * @param {string} url\n */\nfunction Url(url) {\n this.paths = function (paths) {\n var prefix = '',\n i = 0,\n s;\n\n if (paths && paths.length && paths + '' !== paths) {\n if (this.isAbsolute()) {\n prefix = '/';\n }\n\n for (s = paths.length; i < s; i++) {\n paths[i] = encode(paths[i]);\n }\n\n this.path = prefix + paths.join('/');\n }\n\n paths = (this.path.charAt(0) === '/' ? this.path.slice(1) : this.path).split('/');\n\n for (i = 0, s = paths.length; i < s; i++) {\n paths[i] = decode(paths[i]);\n }\n\n return paths;\n };\n\n this.encode = encode;\n this.decode = decode;\n\n this.isAbsolute = function () {\n return this.protocol || this.path.charAt(0) === '/';\n };\n\n this.toString = function () {\n return (this.protocol && this.protocol + '://') + (this.user && encode(this.user) + (this.pass && ':' + encode(this.pass)) + '@') + (this.host && this.host) + (this.port && ':' + this.port) + (this.path && this.path) + (this.query.toString() && '?' + this.query) + (this.hash && '#' + encode(this.hash));\n };\n\n parse(this, url);\n}\n\nvar\n// mapping between what we want and <a> element properties\nmap = {\n protocol: 'protocol',\n host: 'hostname',\n port: 'port',\n path: 'pathname',\n query: 'search',\n hash: 'hash'\n},\n defaultPorts = {\n 'ftp': 21,\n 'gopher': 70,\n 'http': 80,\n 'https': 443,\n 'ws': 80,\n 'wss': 443\n},\n parse = function parse(self, url) {\n var d = document,\n link = d.createElement('a'),\n url = url || d.location.href,\n auth = url.match(/\\/\\/(.*?)(?::(.*?))?@/) || [],\n i;\n\n link.href = url;\n\n for (i in map) {\n self[i] = link[map[i]] || '';\n }\n\n // fix-up some parts\n self.protocol = self.protocol.replace(/:$/, '');\n self.query = self.query.replace(/^\\?/, '');\n self.hash = decode(self.hash.replace(/^#/, ''));\n self.user = decode(auth[1] || '');\n self.pass = decode(auth[2] || '');\n self.port = defaultPorts[self.protocol] == self.port || self.port == 0 ? '' : self.port; // IE fix, Android browser fix\n\n if (!self.protocol && !/^([a-z]+:)?\\/\\//.test(url)) {\n // is IE and path is relative\n var base = new Url(d.location.href.match(/(.*\\/)/)[0]),\n basePath = base.path.split('/'),\n selfPath = self.path.split('/'),\n props = ['protocol', 'user', 'pass', 'host', 'port'],\n s = props.length;\n\n basePath.pop();\n\n for (i = 0; i < s; i++) {\n self[props[i]] = base[props[i]];\n }\n\n while (selfPath[0] == '..') {\n // skip all \"../\n basePath.pop();\n selfPath.shift();\n }\n\n self.path = (url.charAt(0) != '/' ? basePath.join('/') : '') + '/' + selfPath.join('/');\n } else {\n // fix absolute URL's path in IE\n self.path = self.path.replace(/^\\/?/, '/');\n }\n\n self.paths((self.path.charAt(0) == '/' ? self.path.slice(1) : self.path).split('/'));\n\n parseQs(self);\n},\n encode = function encode(s) {\n return encodeURIComponent(s).replace(/'/g, '%27');\n},\n decode = function decode(s) {\n s = s.replace(/\\+/g, ' ');\n\n s = s.replace(/%([ef][0-9a-f])%([89ab][0-9a-f])%([89ab][0-9a-f])/gi, function (code, hex1, hex2, hex3) {\n var n1 = parseInt(hex1, 16) - 0xE0,\n n2 = parseInt(hex2, 16) - 0x80;\n\n if (n1 == 0 && n2 < 32) {\n return code;\n }\n\n var n3 = parseInt(hex3, 16) - 0x80,\n n = (n1 << 12) + (n2 << 6) + n3;\n\n if (n > 0xFFFF) {\n return code;\n }\n\n return String.fromCharCode(n);\n });\n\n s = s.replace(/%([cd][0-9a-f])%([89ab][0-9a-f])/gi, function (code, hex1, hex2) {\n var n1 = parseInt(hex1, 16) - 0xC0;\n\n if (n1 < 2) {\n return code;\n }\n\n var n2 = parseInt(hex2, 16) - 0x80;\n\n return String.fromCharCode((n1 << 6) + n2);\n });\n\n s = s.replace(/%([0-7][0-9a-f])/gi, function (code, hex) {\n return String.fromCharCode(parseInt(hex, 16));\n });\n\n return s;\n},\n parseQs = function parseQs(self) {\n var qs = self.query;\n\n self.query = new function (qs) {\n var re = /([^=&]+)(=([^&]*))?/g,\n match;\n\n while (match = re.exec(qs)) {\n var key = decodeURIComponent(match[1].replace(/\\+/g, ' ')),\n value = match[3] ? decode(match[3]) : '';\n\n if (this[key] != null) {\n if (!(this[key] instanceof Array)) {\n this[key] = [this[key]];\n }\n\n this[key].push(value);\n } else {\n this[key] = value;\n }\n }\n\n this.clear = function () {\n for (var key in this) {\n\n if (!(this[key] instanceof Function)) {\n\n delete this[key];\n }\n }\n };\n\n this.count = function () {\n var count = 0,\n key;\n for (key in this) {\n\n if (!(this[key] instanceof Function)) {\n count++;\n }\n }\n return count;\n };\n\n this.isEmpty = function () {\n return this.count() === 0;\n };\n\n this.toString = function () {\n var s = '',\n e = encode,\n i,\n ii;\n\n for (i in this) {\n\n if (this[i] instanceof Function) {\n continue;\n }\n\n if (this[i] instanceof Array) {\n\n var len = this[i].length;\n\n if (len) {\n for (ii = 0; ii < len; ii++) {\n s += s ? '&' : '';\n\n s += e(i) + '=' + e(this[i][ii]);\n }\n } else {\n // parameter is an empty array, so treat as\n // an empty argument\n\n s += (s ? '&' : '') + e(i) + '=';\n }\n } else {\n s += s ? '&' : '';\n\n s += e(i) + '=' + e(this[i]);\n }\n }\n\n return s;\n };\n }(qs);\n};\n\n/*** Exports *******************************************************/\n\nexports.default = Url;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/lib/url.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/lib/utils/basic": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/lib/utils/basic",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.bindTo = exports.getNearestRasterPosition = exports.mod = exports.removeDOMChildNodes = exports.setDomListeners = exports.merge = exports.getRandomLabel = exports.getFirstElementByClassName = exports.getImgFromWeb = exports.pickRandom = exports.hasKeyWithPrefix = exports.getWithoutPrefix = exports.getPropertiesByPrefix = exports.removeArrayElement = exports.isTrue = exports.replaceAll = exports.isInteger = exports.findAndRemoveClassNames = exports.getAncestorWithClass = exports.makeHashMap = exports.getWithoutNewLines = exports.joinAndWrap = exports.parseJSON = exports.hasSubString = exports.inArray = exports.getRandomInt = exports.isEqual = exports.identity = exports.base64 = exports.startsWith = exports.getBasename = exports.escapeRegex = exports.hasElements = exports.ucFirst = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/lib/utils/basic\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\nvar _exception = require('$:/plugins/felixhayashi/tiddlymap/js/exception');\n\n/**\n * Uppercase the first letter of a string.\n */\nvar ucFirst = exports.ucFirst = function ucFirst(string) {\n return string && string[0].toUpperCase() + string.slice(1);\n};\n\n/**\n * Function to find out whether an object has any enumerable properties\n * or, in case of an array, elements.\n *\n * @param {Object} obj\n * @return {boolean} True if at least one enumerable property exists,\n * false otherwise.\n */\nvar hasElements = exports.hasElements = function hasElements(obj) {\n return Object.keys(obj).length > 0;\n};\n\n/**\n * When we do not know the string, we need to escape it.\n * @deprecated use tw's escapeRegExp instead\n */\nvar escapeRegex = exports.escapeRegex = function escapeRegex(str) {\n return str.replace(/[-$^?.+*[\\]\\\\(){}|]/g, '\\\\$&');\n};\n\n/**\n * Returns the basename of a path.\n * A path is a string with slashes (or another separator).\n *\n * @param {string} path - The path\n * @param {string} [separator='/']\n * @return {string} The basename\n */\nvar getBasename = exports.getBasename = function getBasename(path) {\n var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '/';\n return path.substring(path.lastIndexOf(separator) + 1);\n};\n\n/**\n * Helper to increase the code semantics.\n *\n * @param {string} str - The string to work with.\n * @param {string} prefix - The sequence to test.\n * @result {boolean} True if `str` starts with `prefix`, false otherwise.\n */\nvar startsWith = exports.startsWith = function startsWith(str, prefix) {\n return str.substring(0, prefix.length) === prefix;\n};\n\n/**\n * Converts a string to base64 encoding.\n *\n * To do so, we either choose the native btoa browser function or the Buffer class\n * received via scope.\n *\n * @param {string} str\n */\nvar base64 = exports.base64 = typeof window === 'undefined' ? function (str) {\n return new Buffer(str).toString('base64');\n} : window.btoa.bind(window);\n\n/**\n * If two objects have the same properties, with the same values\n * then identity identity(obj) === identity(obj2) will return true.\n *\n * @param obj\n * @return string\n */\nvar identity = exports.identity = function identity(obj) {\n return (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj !== null ? JSON.stringify(Object.keys(obj).sort().map(function (key) {\n return [key, obj[key]];\n })) : null;\n};\n\n/**\n * Returns true if both objects have the same properties\n * @param obj1\n * @param obj2\n */\nvar isEqual = exports.isEqual = function isEqual(obj1, obj2) {\n return identity(obj1) === identity(obj2);\n};\n\n/**\n *\n * @param min\n * @param max\n */\nvar getRandomInt = exports.getRandomInt = function getRandomInt(min, max) {\n return Math.floor(Math.random() * (max - min) + min);\n};\n\n/**\n * Checks if a value exists in an array. A strict search is used\n * which means that also the type of the needle in the haystack\n * is checked.\n *\n * @param {*} needle - The searched value.\n * @param {Array} haystack - The array.\n * @return Returns true if needle is found in the array, false otherwise.\n */\nvar inArray = exports.inArray = function inArray(needle, haystack) {\n return haystack.indexOf(needle) !== -1;\n};\n\n/**\n * Checks if a string exists in a string.\n */\nvar hasSubString = exports.hasSubString = function hasSubString(str, sub) {\n return str.indexOf(sub) !== -1;\n};\n\n/**\n * Try to turn the string into a javascript object. If the\n * transformation fails, return the optionally provided `data` object.\n *\n * @param {string} str - The string to parse.\n * @param {*} data - The default value if the operation fails.\n * @return {*} Either the object resulting from the parsing operation\n * or `undefined` or `data` if the operation failed.\n */\nvar parseJSON = exports.parseJSON = function parseJSON(str, data) {\n\n try {\n\n return JSON.parse(str);\n } catch (Error) {\n\n return data;\n }\n};\n\n/**\n * Joins all elements of an array into a string where all elements\n * are wrapped between `left` and `right`.\n *\n * @param {Array} arr - The array to perform the join on.\n * @param {string} left - The wrapping string for the left side.\n * @param {string} right - The wrapping string for the right side.\n * @param {string} [separator] - The separator between a wrapped element\n * and the next one. Defaults to space.\n * @return {string} The wrapped string, e.g. `[[hello]] [[world]]`.\n */\nvar joinAndWrap = exports.joinAndWrap = function joinAndWrap(arr, left, right) {\n var separator = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ' ';\n return left + arr.join(right + separator + left) + right;\n};\n\n/**\n * Remove any newline from a string\n */\nvar getWithoutNewLines = exports.getWithoutNewLines = function getWithoutNewLines(str) {\n return typeof str === 'string' ? str.replace(/[\\n\\r]/g, ' ') : str;\n};\n\n/**\n * Factory function to return a prototypeless object that is used as\n * map. It only has the property hasOwnProperty in order to to be\n * exchangeble with other framworks that depend on this method like\n * e.g. visjs.\n *\n * @param {Object} [initialValues] - an object whose own properties will be\n * used to initialize the map.\n */\nvar makeHashMap = exports.makeHashMap = function makeHashMap(initialValues) {\n\n var map = Object.create(null);\n Object.defineProperty(map, 'hasOwnProperty', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: Object.prototype.hasOwnProperty.bind(map)\n });\n\n if (initialValues) {\n for (var key in initialValues) {\n if (initialValues.hasOwnProperty(key)) {\n map[key] = initialValues[key];\n }\n }\n }\n\n return map;\n};\n\n/**\n * If an ancestor that possesses a specified class exists the the\n * element will be returned, otherwise undefined is returned.\n *\n * @param {Element} el\n * @param {string} className\n */\nvar getAncestorWithClass = exports.getAncestorWithClass = function getAncestorWithClass(el, className) {\n\n if ((typeof el === 'undefined' ? 'undefined' : _typeof(el)) !== 'object' || typeof className !== 'string') {\n return;\n }\n\n while (el.parentNode && el.parentNode !== document) {\n el = el.parentNode;\n if (el.classList.contains(className)) {\n return el;\n }\n }\n};\n\n/**\n * Searches the dom for elements that possess a certain class\n * and removes this class from each element.\n *\n * @param {Array<string>} classNames - The class names to remove.\n */\nvar findAndRemoveClassNames = exports.findAndRemoveClassNames = function findAndRemoveClassNames(classNames) {\n\n for (var i = classNames.length; i--;) {\n var elements = document.getElementsByClassName(classNames[i]);\n for (var j = elements.length; j--;) {\n elements[j].classList.remove(classNames[i]);\n }\n }\n};\n\n/**\n * Polyfill until `isInteger` has become official. If the target\n * value is an integer, return true, otherwise return false.\n * If the value is NaN or infinite, return false.\n *\n * @param {*} value - The value to be tested for being an integer.\n * @return {boolean} True if the value is an integer, false otherwise.\n */\nvar isInteger = exports.isInteger = Number.isInteger || function (value) {\n return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;\n};\n\n/**\n *\n * @param {string} str\n * @param defaultReplacement\n * @param subStrings\n * @return {*}\n */\nvar replaceAll = exports.replaceAll = function replaceAll(str) {\n var defaultReplacement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var subStrings = arguments[2];\n\n\n for (var i = subStrings.length; i--;) {\n\n var subString = subStrings[i];\n var replacement = defaultReplacement;\n\n if (Array.isArray(subString)) {\n replacement = subString[1];\n subString = subString[0];\n }\n\n str = str.replace(subString, replacement);\n }\n\n return str;\n};\n\n/**\n * Sadly, setting fields with tw means that we lose the type information\n * since field values are persisted as strings and the type is not\n * included.\n *\n * To ensure that flags are always interpreted correctly, the following\n * function exists.\n *\n * We regard the following values as `true` (order matters):\n *\n * # Any string that can be translated into a number unequal `0`\n * # `\"true\"`\n * # Any number unequal `0`\n * # Boolean `true`\n *\n * The following as false (order matters):\n *\n * # Any string that can be translated into number `0`\n * # Every string unequal `\"true\"`\n * # The number `0`\n * # Boolean `false`\n *\n */\nvar isTrue = exports.isTrue = function isTrue(confVal, defVal) {\n\n if (confVal == null) {\n return !!defVal;\n } else if (typeof confVal === 'string') {\n var n = parseInt(confVal);\n return isNaN(n) ? confVal === 'true' : n !== 0;\n } else if (typeof confVal === 'boolean') {\n return confVal;\n } else if (typeof confVal === 'number') {\n return n !== 0;\n }\n\n return false;\n};\n\n/**\n * If the array contains the element, the element is removed from\n * the array in-place and the removed element.\n */\nvar removeArrayElement = exports.removeArrayElement = function removeArrayElement(arr, el) {\n\n var index = arr.indexOf(el);\n if (index > -1) {\n return arr.splice(index, 1)[0];\n }\n};\n\n/**\n * Returns a new object that contains only properties that start with\n * a certain prefix. The prefix is optionally removed from the result.\n *\n * @param {Object} obj\n * @param {string} prefix - The start sequence\n * @param {boolean} [removePrefix=false] - True if the prefix shall be removed\n * from the resulting property name, false otherwise.\n * @result {object}\n */\nvar getPropertiesByPrefix = exports.getPropertiesByPrefix = function getPropertiesByPrefix(obj, prefix, removePrefix) {\n\n var r = makeHashMap();\n for (var p in obj) {\n if (startsWith(p, prefix)) {\n r[removePrefix ? p.substr(prefix.length) : p] = obj[p];\n }\n }\n\n return r;\n};\n\n/**\n * Function to remove the prefix of a string\n */\nvar getWithoutPrefix = exports.getWithoutPrefix = function getWithoutPrefix(str, prefix) {\n return startsWith(str, prefix) ? str.substr(prefix.length) : str;\n};\n\n/**\n *\n */\nvar hasKeyWithPrefix = exports.hasKeyWithPrefix = function hasKeyWithPrefix(obj, prefix) {\n\n for (var p in obj) {\n if (startsWith(p, prefix)) {\n return true;\n }\n }\n\n return false;\n};\n\n/**\n *\n * @param arr\n */\nvar pickRandom = exports.pickRandom = function pickRandom(arr) {\n return arr[getRandomInt(0, arr.length - 1)];\n};\n\n/**\n * Loads the image from web and passes it to the callback as\n * object url.\n */\nvar getImgFromWeb = exports.getImgFromWeb = function getImgFromWeb(imgUri, callback) {\n\n if (!imgUri || typeof callback !== 'function') return;\n\n var xhr = new XMLHttpRequest();\n xhr.open('GET', imgUri, true);\n xhr.responseType = 'blob';\n xhr.onerror = function (e) {\n console.log(e);\n };\n xhr.onload = function (e) {\n if (this.readyState === 4 && (this.status === 200 || this.status === 0 && this.response.size > 0)) {\n var blob = this.response;\n callback(window.URL.createObjectURL(blob));\n }\n };\n\n try {\n xhr.send();\n } catch (e) {\n console.log(e);\n }\n};\n\n//~ utils.getNestedProperty = function(obj, propPath) {\n//~\n//~ propPath = propPath.split(\".\");\n//~ for (var i = propPath.length; i--;) {\n//~ if (obj !== null && typeof obj === \"object\") {\n//~ obj = obj[propPath[i]];\n//~ }\n//~\n//~ };\n\n/**\n * Works like get `getElementById()` but is based on a class name.\n * It will return the first element inside an optional parent (root)\n * that has a class of this name.\n *\n * @param {string} cls - The class name to search for.\n * @param {Element} [root=document] - The context to search in.\n * @param {boolean} [isRequired=true] - If true, an exception will be\n * thrown if no element can be retrieved. This is important\n * when depending on third party modules and class names change!\n * @throws {EnvironmentError} - May be thrown if\n * `isRequired` is set to true.\n * @return {Element} Either a dom element or null is returned.\n */\nvar getFirstElementByClassName = exports.getFirstElementByClassName = function getFirstElementByClassName(cls, root, isRequired) {\n\n var el = (root || document).getElementsByClassName(cls)[0];\n if (!el && (typeof isRequired === 'boolean' ? isRequired : true)) {\n var text = 'Missing element with class \"' + cls + '\" inside ' + root;\n throw new _exception.EnvironmentError(text);\n }\n\n return el;\n};\n\nvar getRandomLabel = exports.getRandomLabel = function getRandomLabel() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\n var adjective = pickRandom(['exciting', 'notable', 'epic', 'new', 'fancy', 'great', 'cool', 'fresh', 'funky', 'clever']);\n\n var noun = (options.object || pickRandom(['concept', 'idea', 'thought', 'topic', 'subject'])) + (options.plural ? 's' : '');\n\n return 'My ' + adjective + ' ' + noun;\n};\n\nvar _merge = function _merge(dest, src) {\n\n if ((typeof dest === 'undefined' ? 'undefined' : _typeof(dest)) !== 'object') {\n dest = {};\n }\n\n for (var p in src) {\n if (src.hasOwnProperty(p)) {\n if (src[p] != null) {\n // skip null or undefined\n dest[p] = _typeof(src[p]) === 'object' ? _merge(dest[p], src[p]) : src[p]; // primitive type, stop recursion\n }\n }\n }\n\n return dest;\n};\n\n/**\n * Merges `src` into `dest` which means that the merge transforms\n * the `dest` object itself. If src and dest both have the same\n * property path, src does only replace the primitive data type\n * at the end of the path.\n *\n * @todo Should null really be skipped or treated as value?\n *\n * @param {Object} dest - The destination object.\n * @param {...Object} sources - At least one object to merge into `dest`.\n * @return {Object} The original `dest` object.\n */\nvar merge = exports.merge = function merge(dest) {\n for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n // start the merging; i = 1 since first argument is the destination\n for (var i = 0, l = sources.length; i < l; i++) {\n var src = sources[i];\n if (src != null && (typeof src === 'undefined' ? 'undefined' : _typeof(src)) === 'object') {\n dest = _merge(dest, src);\n }\n }\n\n return dest;\n};\n\n/**\n * Adds or removes listeners from the target in capture or\n * non-capture (bubbling) mode.\n *\n * @param {string} task - Either \"add\" or \"remove\". Make sure to\n * always call add and remove with *excatly* the same listeners\n * Note: if you use bind, you change the function object.\n * @param {Element} target - The element to attach or remove the\n * listener to or from.\n * @param {Object<string, (Function|Array)>} listeners - The key is\n * the event name and the value is either a handler function\n * or an array where the first index is the handler function and\n * the second is a boolean that specifies whether to use capture\n * or not.\n * @param {boolean} [isCapt=false] - Whether to run the handler in\n * bubbling or capturing phase.\n */\nvar setDomListeners = exports.setDomListeners = function setDomListeners(task, target, listeners, isCapt) {\n\n isCapt = typeof isCapt === 'boolean' ? isCapt : false;\n task = task + 'EventListener';\n\n for (var event in listeners) {\n\n var l = listeners[event];\n\n if (typeof l === 'function') {\n\n target[task](event, l, isCapt);\n } else {\n // expect Array\n\n target[task](event, l[0], typeof l[1] === 'boolean' ? l[1] : isCapt);\n }\n }\n};\n\n/**\n * Removes all child nodes of a DOM element. This includes element\n * and non-element objects.\n */\nvar removeDOMChildNodes = exports.removeDOMChildNodes = function removeDOMChildNodes(el) {\n\n for (var i = el.childNodes.length; i--;) {\n el.removeChild(el.childNodes[i]);\n }\n};\n\n/**\n * Implementation of the algebraic modulus operation.\n *\n * In javascript '%' is really a remainder operator, not a modulus.\n * Algebraically speaking, a modulus operation always yields\n * positive results, while '%' in js can yield negative results.\n *\n * Note: divident mod divisor\n *\n * @param {number} divident\n * @param {number} divisor\n * @return {number}\n */\nvar mod = exports.mod = function mod(divident, divisor) {\n\n var remainder = divident % divisor;\n\n return Math.floor(remainder >= 0 ? remainder : remainder + divisor);\n};\n\n/**\n * Maps a coordinate to the nearest raster coordinate.\n *\n * @param {number} x\n * @param {number} y\n * @param {number} raster\n * @return {{x: number, y: number}}\n */\nvar getNearestRasterPosition = exports.getNearestRasterPosition = function getNearestRasterPosition(_ref, raster) {\n var x = _ref.x,\n y = _ref.y;\n\n\n var rasterHalf = raster / 2;\n\n // calculate distances to previous raster lines\n var distPrevX = mod(x, raster);\n var distPrevY = mod(y, raster);\n\n return {\n x: distPrevX < rasterHalf ? x - distPrevX : x - distPrevX + raster,\n y: distPrevY < rasterHalf ? y - distPrevY : y - distPrevY + raster\n };\n};\n\n/**\n * Force early binding of functions to this context.\n *\n * @param context the context to bind this function to (typically `this`)\n * @param {Array<string>} fnNames - The prototype function names\n * to bind to this context.\n */\nvar bindTo = exports.bindTo = function bindTo(context, fnNames) {\n\n for (var i = fnNames.length; i--;) {\n var fn = context[fnNames[i]];\n context[fnNames[i]] = fn.bind(context);\n }\n};\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/lib/utils/basic.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/lib/utils/thirdParty": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/lib/utils/thirdParty",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/lib/utils/thirdParty\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/**\n * Modified TW-Code from Navigator widget\n * https://github.com/Jermolene/TiddlyWiki5/blob/master/core/modules/widgets/navigator.js\n */\nvar generateDraftTitle = exports.generateDraftTitle = function generateDraftTitle(title) {\n\n var c = 0,\n draftTitle = void 0;\n do {\n draftTitle = 'Draft ' + (c ? c + 1 + ' ' : '') + 'of \\'' + title + '\\'';\n c++;\n } while ($tw.wiki.tiddlerExists(draftTitle));\n return draftTitle;\n};\n\n/**\n * Modified TW-Code from Navigator widget\n * https://github.com/Jermolene/TiddlyWiki5/blob/master/core/modules/widgets/navigator.js\n */\nvar makeDraftTiddler = exports.makeDraftTiddler = function makeDraftTiddler(targetTitle) {\n\n // See if there is already a draft tiddler for this tiddler\n var draftTitle = $tw.wiki.findDraft(targetTitle);\n if (draftTitle) {\n return $tw.wiki.getTiddler(draftTitle);\n }\n // Get the current value of the tiddler we're editing\n var tiddler = $tw.wiki.getTiddler(targetTitle);\n // Save the initial value of the draft tiddler\n draftTitle = generateDraftTitle(targetTitle);\n var draftTiddler = new $tw.Tiddler(tiddler, {\n title: draftTitle,\n 'draft.title': targetTitle,\n 'draft.of': targetTitle\n }, $tw.wiki.getModificationFields());\n $tw.wiki.addTiddler(draftTiddler);\n return draftTiddler;\n};\n\n/**\n * TW-Code\n * @deprecated delete this in 2016 and use $tw.utils.getFullScreenApis instead\n */\nvar getFullScreenApis = exports.getFullScreenApis = function getFullScreenApis() {\n\n var d = document,\n db = d.body,\n result = {\n '_requestFullscreen': db.webkitRequestFullscreen !== undefined ? 'webkitRequestFullscreen' : db.mozRequestFullScreen !== undefined ? 'mozRequestFullScreen' : db.msRequestFullscreen !== undefined ? 'msRequestFullscreen' : db.requestFullscreen !== undefined ? 'requestFullscreen' : '',\n '_exitFullscreen': d.webkitExitFullscreen !== undefined ? 'webkitExitFullscreen' : d.mozCancelFullScreen !== undefined ? 'mozCancelFullScreen' : d.msExitFullscreen !== undefined ? 'msExitFullscreen' : d.exitFullscreen !== undefined ? 'exitFullscreen' : '',\n '_fullscreenElement': d.webkitFullscreenElement !== undefined ? 'webkitFullscreenElement' : d.mozFullScreenElement !== undefined ? 'mozFullScreenElement' : d.msFullscreenElement !== undefined ? 'msFullscreenElement' : d.fullscreenElement !== undefined ? 'fullscreenElement' : '',\n '_fullscreenChange': d.webkitFullscreenElement !== undefined ? 'webkitfullscreenchange' : d.mozFullScreenElement !== undefined ? 'mozfullscreenchange' : d.msFullscreenElement !== undefined ? 'MSFullscreenChange' : d.fullscreenElement !== undefined ? 'fullscreenchange' : ''\n };\n if (!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement) {\n return null;\n } else {\n return result;\n }\n};\n\n/**\n *\n * Slightly modified by me to allow an optional prefix.\n *\n * For the original code:\n *\n * Copyright (c) 2014, Hugh Kennedy, All rights reserved.\n * Code published under the BSD 3-Clause License\n *\n * @see oringal repo https://github.com/hughsk/flat\n * @see snapshot https://github.com/felixhayashi/flat\n * @see http://opensource.org/licenses/BSD-3-Clause\n */\nvar flatten = exports.flatten = function flatten(target) {\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n var delimiter = opts.delimiter || '.';\n var prefix = opts.prefix || '';\n var output = {};\n\n function step(object, prev) {\n Object.keys(object).forEach(function (key) {\n var value = object[key];\n var isarray = opts.safe && Array.isArray(value);\n var type = Object.prototype.toString.call(value);\n var isobject = type === '[object Object]' || type === '[object Array]';\n\n var newKey = prev ? prev + delimiter + key : prefix + key;\n\n if (!isarray && isobject) {\n return step(value, newKey);\n }\n\n output[newKey] = value;\n });\n }\n\n step(target);\n\n return output;\n};\n\n/**\n * Copyright (c) 2014, Hugh Kennedy, All rights reserved.\n * Code published under the BSD 3-Clause License\n *\n * @see oringal repo https://github.com/hughsk/flat\n * @see snapshot https://github.com/felixhayashi/flat\n * @see http://opensource.org/licenses/BSD-3-Clause\n */\nvar unflatten = exports.unflatten = function unflatten(target) {\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n var delimiter = opts.delimiter || '.';\n var result = {};\n\n if (Object.prototype.toString.call(target) !== '[object Object]') {\n return target;\n }\n\n // safely ensure that the key is\n // an integer.\n function getkey(key) {\n var parsedKey = Number(key);\n\n return isNaN(parsedKey) || key.indexOf('.') !== -1 ? key : parsedKey;\n }\n\n Object.keys(target).forEach(function (key) {\n var split = key.split(delimiter);\n var key1 = getkey(split.shift());\n var key2 = getkey(split[0]);\n var recipient = result;\n\n while (key2 !== undefined) {\n if (recipient[key1] === undefined) {\n recipient[key1] = typeof key2 === 'number' && !opts.object ? [] : {};\n }\n\n recipient = recipient[key1];\n if (split.length > 0) {\n key1 = getkey(split.shift());\n key2 = getkey(split[0]);\n }\n }\n\n // unflatten again for 'messy objects'\n recipient[key1] = unflatten(target[key], opts);\n });\n\n return result;\n};\n\n/**\n * An adopted version of pmario's version to create\n * uuids of type RFC4122, version 4 ID.\n *\n * Shortened version:\n * pmario (1.0 - 2011.05.22):\n * http://chat-plugins.tiddlyspace.com/#UUIDPlugin\n *\n * Original version:\n * Math.uuid.js (v1.4)\n * http://www.broofa.com\n * mailto:robert@broofa.com\n *\n * Copyright (c) 2010 Robert Kieffer\n * Dual licensed under the MIT and GPL licenses.\n *\n * ---\n * @see https://github.com/almende/vis/issues/432\n*/\nvar genUUID = exports.genUUID = function () {\n\n // Private array of chars to use\n var CHARS = '0123456789abcdefghijklmnopqrstuvwxyz'.split('');\n\n return function () {\n var chars = CHARS,\n uuid = new Array(36);\n\n var rnd = 0,\n r;\n for (var i = 0; i < 36; i++) {\n if (i == 8 || i == 13 || i == 18 || i == 23) {\n uuid[i] = '-';\n } else if (i == 14) {\n uuid[i] = '4';\n } else {\n if (rnd <= 0x02) rnd = 0x2000000 + Math.random() * 0x1000000 | 0;\n r = rnd & 0xf;\n rnd = rnd >> 4;\n uuid[i] = chars[i == 19 ? r & 0x3 | 0x8 : r];\n }\n }\n\n return uuid.join('');\n };\n}();\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/lib/utils/thirdParty.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/lib/utils/tmap": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/lib/utils/tmap",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getSnapshotTitle = exports.getArrayValuesAsHashmapKeys = exports.getLookupTable = exports.keyOfItemWithProperty = exports.keysOfItemsWithProperty = exports.getDublicates = exports.getId = exports.refreshDataSet = exports.drawRaster = exports.getPrettyFilter = exports.groupByProperty = exports.isEdgeTypeMatch = exports.getEdgeTypeMatches = exports.getDataUri = exports.convert = exports.getValues = exports.getIterableCollection = exports.getLabel = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/lib/utils/tmap\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\nvar _vis = require('$:/plugins/felixhayashi/vis/vis.js');\n\nvar _vis2 = _interopRequireDefault(_vis);\n\nvar _exception = require('$:/plugins/felixhayashi/tiddlymap/js/exception');\n\nvar _basic = require('$:/plugins/felixhayashi/tiddlymap/js/lib/utils/basic');\n\nvar basicUtils = _interopRequireWildcard(_basic);\n\nvar _wiki = require('$:/plugins/felixhayashi/tiddlymap/js/lib/utils/wiki');\n\nvar wikiUtils = _interopRequireWildcard(_wiki);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * TODO: this method does not seem to be used!\n * @param {Tiddler} tiddler\n * @param {string} aliasField - A tiddler field that contains an\n * alternative title (e.g. \"caption\").\n * @return {string|undefined} If the `aliasField` exists and is not\n * empty, the value of the `aliasField` otherwise the tiddler's\n * title or undefined if the tiddler doesn't exist.\n */\nvar getLabel = exports.getLabel = function getLabel(tiddler, aliasField) {\n var tObj = wikiUtils.getTiddler(tiddler);\n return (tObj && tObj.fields[aliasField] ? tObj.fields[aliasField] : tObj.fields.title).replace('\\\\n', '\\n');\n};\n\n/**\n * This function will return a collection object whose data can be\n * via `Object.keys(col)` in a loop.\n *\n * @param {Collection} col - A collection\n * @return {Hashmap} The iterable object.\n */\nvar getIterableCollection = exports.getIterableCollection = function getIterableCollection(col) {\n return col instanceof _vis2.default.DataSet ? col.get() : col;\n};\n\n/**\n * Extract all the values from a collection. If `col` is an object,\n * only properties are considered that are its own and iterable.\n *\n * @param {Collection} col\n * @return {Array} An array\n */\nvar getValues = exports.getValues = function getValues(col) {\n\n if (Array.isArray(col)) {\n\n return col; // bounce back.\n } else if (col instanceof _vis2.default.DataSet) {\n // a dataset\n\n return col.get({ returnType: 'Array' });\n }\n\n var result = [];\n var keys = Object.keys(col);\n for (var i = keys.length; i--;) {\n result.push(col[keys[i]]);\n }\n\n return result;\n};\n\n/**\n * Transforms a collection of a certain type into a collection of\n * another type.\n *\n * **Attention**: When trying to convert an array into a object, the\n * array will be simply bounced back. Let's hope no one added enumerable\n * properties to Array.prototype :)\n *\n * @param {Collection} col - The collection to convert.\n * @param {CollectionTypeString} [outputType=\"dataset\"] - The output type.\n * @return {Collection} A **new** collection of type `outputType`.\n */\nvar convert = exports.convert = function convert(col, outputType) {\n\n if ((typeof col === 'undefined' ? 'undefined' : _typeof(col)) !== 'object') {\n throw new _exception.InvalidArgumentException(col, outputType);\n }\n\n if (outputType === 'object') {\n outputType = 'hashmap';\n }\n\n var mapper = {\n array: function array(col) {\n return getValues(col);\n },\n hashmap: function hashmap(col) {\n return col instanceof _vis2.default.DataSet ? col.get({ returnType: 'Object' }) : col;\n },\n dataset: function dataset(col) {\n return col instanceof _vis2.default.DataSet ? col : !Array.isArray(col) ? getValues(col) : new _vis2.default.DataSet(col);\n }\n };\n\n return mapper[outputType](col);\n};\n\n/**\n * @param {Tiddler} tiddler\n * @param {string} [type]\n * @param {boolean} [isForceBase64]\n * @return {string}\n */\nvar getDataUri = exports.getDataUri = function getDataUri(tiddler, type, isForceBase64) {\n\n var imgTObj = wikiUtils.getTiddler(tiddler);\n type = type || imgTObj.fields.type || 'image/svg+xml';\n var body = imgTObj.fields.text;\n var encoding = $tw.config.contentTypeInfo[type].encoding;\n\n if (type === 'image/svg+xml') {\n\n // see http://stackoverflow.com/questions/10768451/inline-svg-in-css\n body = body.replace(/\\r?\\n|\\r/g, ' ');\n\n if (!basicUtils.hasSubString('xmlns', body)) {\n // @tiddlywiki it is bad to remove the xmlns attribute!\n\n body = body.replace(/<svg/, '<svg xmlns=\"http://www.w3.org/2000/svg\"');\n }\n }\n\n if (isForceBase64 && encoding !== 'base64') {\n encoding = 'base64';\n body = basicUtils.base64(body);\n }\n\n return 'data:' + type + ';' + encoding + ',' + body;\n};\n\n// @todo move this to environment\nvar eTyFiltAutoPrefix = '[all[]] ';\n\n/**\n *\n * @param filter\n * @param titles\n * @return {*}\n */\nvar getEdgeTypeMatches = exports.getEdgeTypeMatches = function getEdgeTypeMatches() {\n var filter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var titles = arguments[1];\n\n\n if (!titles) {\n titles = wikiUtils.getTiddlersByPrefix($tm.path.edgeTypes + '/', {\n iterator: 'eachTiddlerPlusShadows',\n removePrefix: true\n });\n }\n\n if (titles != null && !Array.isArray(titles)) {\n titles = Object.keys(titles);\n }\n\n return wikiUtils.getMatches(eTyFiltAutoPrefix + filter, titles);\n};\n\nvar isEdgeTypeMatch = exports.isEdgeTypeMatch = function isEdgeTypeMatch(title) {\n var filter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n return wikiUtils.isMatch(title, eTyFiltAutoPrefix + filter);\n};\n\n/**\n *\n */\nvar groupByProperty = exports.groupByProperty = function groupByProperty(col, prop) {\n\n col = getIterableCollection(col);\n\n var result = basicUtils.makeHashMap();\n var keys = Object.keys(col);\n\n for (var i in keys) {\n\n var item = col[keys[i]];\n var val = item[prop];\n\n if (val == null) {\n // null or undefined\n\n // @todo use exception class\n throw 'Cannot group by property ' + prop;\n } else {\n\n if (!Array.isArray(result[val])) {\n result[val] = [];\n }\n result[val].push(item);\n }\n }\n\n return result;\n};\n\n/**\n * Turns the filter expression in a nicely formatted (but unusable)\n * text, making it easier to edit long filter expressions.\n *\n * @param {string} expr - A valid filter expression.\n * @result {string} A formatted (unusable) filter expression.\n */\nvar getPrettyFilter = exports.getPrettyFilter = function getPrettyFilter(expr) {\n\n // remove outer spaces and separate operands\n expr = expr.trim().replace('][', '] [');\n\n // regex to identify operands\n var re = /[+-]?\\[.+?[\\]\\}\\>]\\]/g;\n\n // get operands\n var operands = expr.match(re);\n\n // replace operands with dummies and trim again to avoid trailing spaces\n expr = expr.replace(re, ' [] ').trim();\n\n // turn it into an array\n var stringsPlusDummies = expr.split(/\\s+/);\n\n var operandIndex = 0;\n var parts = [];\n for (var i = 0, l = stringsPlusDummies.length; i < l; i++) {\n parts[i] = stringsPlusDummies[i] === '[]' ? operands[operandIndex++] : stringsPlusDummies[i];\n }\n\n return parts.join('\\n');\n};\n\n/**\n * This function will draw a raster on the network canvas that will\n * adjust to the network's current scaling factor and viewport offset.\n *\n * @param {CanvasRenderingContext2D} ctx - The canvas's context passed by vis.\n * @param {number} scaleFactor - The current scale factor of the network.\n * @param {Object} viewCenter - Virtual center point of the view.\n * @param {number} rasterSize - The size of the squares that are drawn.\n * @param {string} color - A string parsed as CSS color value.\n */\nvar drawRaster = exports.drawRaster = function drawRaster(ctx, scaleFactor, viewCenter, rasterSize) {\n var color = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '#D9D9D9';\n\n // from now on the most central raster point\n var _basicUtils$getNeares = basicUtils.getNearestRasterPosition(viewCenter, rasterSize),\n centerX = _basicUtils$getNeares.x,\n centerY = _basicUtils$getNeares.y;\n\n var scaledWidth = ctx.canvas.width / scaleFactor;\n var scaledHeight = ctx.canvas.height / scaleFactor;\n\n // some extra lines to ensure the canvas is completely filled with lines\n var extraLines = rasterSize * 2;\n\n // calculate the space that is required to draw the rasters\n var hSpace = Math.ceil(scaledWidth / rasterSize / 2) * rasterSize + extraLines;\n var vSpace = Math.ceil(scaledHeight / rasterSize / 2) * rasterSize + extraLines;\n\n // align the space to the center points and calculate the offsets\n var left = centerX - hSpace;\n var right = centerX + hSpace;\n var top = centerY - vSpace;\n var bottom = centerY + vSpace;\n\n ctx.beginPath();\n\n // draw vertical lines\n for (var x = left; x < right; x += rasterSize) {\n ctx.moveTo(x, top);\n ctx.lineTo(x, bottom);\n }\n\n // draw horizontal lines\n for (var y = top; y <= bottom; y += rasterSize) {\n ctx.moveTo(left, y);\n ctx.lineTo(right, y);\n }\n\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.stroke();\n};\n\n/**\n * Updates a dataset.\n *\n * Note: never use the dataset's update() method, it does not properly remove\n * obsolete properties! – use remove and add instead.\n *\n * @param {vis.DataSet} [ds] - The dataset to be updated\n * @param {Hashmap<id, Node>} ltNew - Lookup table that contains the *new* set of nodes.\n */\nvar refreshDataSet = exports.refreshDataSet = function refreshDataSet(ds, ltNew) {\n\n var ltOld = ds.get({ returnType: 'Object' });\n\n var inserted = [];\n var updated = [];\n var withoutPosition = [];\n var removed = [];\n\n for (var id in ltNew) {\n\n if (ltOld[id]) {\n // element already exists in graph\n\n if (basicUtils.isEqual(ltOld[id], ltNew[id])) {\n // simply keep element\n continue;\n }\n\n updated.push(id);\n ds.remove(id);\n } else {\n\n inserted.push(id);\n }\n\n if (ltNew[id].x === undefined) {\n withoutPosition.push(id);\n }\n\n ds.add(ltNew[id]);\n }\n\n for (var _id in ltOld) {\n if (!ltNew[_id]) {\n removed.push(_id);\n ds.remove(_id);\n }\n }\n\n return {\n withoutPosition: withoutPosition,\n inserted: inserted,\n updated: updated,\n removed: removed\n };\n};\n\n/**\n * Returns the tmap id that is stored in a designated field in the tiddler.\n *\n * @param tiddler\n * @return {string} the tmap id of this tiddler\n */\nvar getId = exports.getId = function getId(tiddler) {\n return wikiUtils.getTiddler(tiddler).fields['tmap.id'];\n};\n\n/**\n * Returns all other tiddlers that have the same tmap.id field entry.\n *\n * Note: typically tiddlers don't have the same id assigned, however,\n * this can happen when tiddlers are imported or cloned.\n *\n * @param {Tiddler} tiddler\n * @return {array<TiddlerReference>} a list of tiddlers with the same id as the\n * provided tiddler (excluding the provided tiddler itself).\n */\nvar getDublicates = exports.getDublicates = function getDublicates(tiddler) {\n\n var id = getId(tiddler);\n\n if (!id) {\n\n return [];\n }\n\n var tiddlers = wikiUtils.getTiddlersWithField('tmap.id', id, { limit: 2 });\n delete tiddlers[wikiUtils.getTiddlerRef(tiddler)];\n\n return Object.keys(tiddlers);\n};\n\n/**\n * Function that searches an array for an object with a property\n * having a certain value.\n *\n * Attention: Not the item itself but the item's key is returned.\n *\n * @param {Collection} col - The collection to search in.\n * @param {string} key - The property name to look for.\n * @param {*} [val] - An optional value that the object's property must have\n * in order to match.\n * @param {number} [limit] - An optional result limit (>0) to stop the search.\n * @return {Array<Id>} An array containing the indeces of matching items.\n */\nvar keysOfItemsWithProperty = exports.keysOfItemsWithProperty = function keysOfItemsWithProperty(col, key, val, limit) {\n\n col = getIterableCollection(col);\n\n var keys = Object.keys(col);\n var result = [];\n\n limit = typeof limit === 'number' ? limit : keys.length;\n\n for (var i = 0, l = keys.length; i < l; i++) {\n var index = keys[i];\n if (_typeof(col[index]) === 'object' && col[index][key]) {\n if (!val || col[index][key] === val) {\n result.push(index);\n if (result.length === limit) {\n break;\n }\n }\n }\n }\n\n return result;\n};\n\n/**\n *\n * @param col\n * @param key\n * @param val\n * @return {*}\n */\nvar keyOfItemWithProperty = exports.keyOfItemWithProperty = function keyOfItemWithProperty(col, key, val) {\n return keysOfItemsWithProperty(col, key, val, 1)[0];\n};\n\n/**\n * In a collection where all elements have a **distinct** property\n * `lookupKey`, use the value of each element's `lookupKey` as key\n * to identify the object. If no property `lookupKey` is specified,\n * the collection's values are used as keys and `true` is used as value,\n * however, if the used keys are not strings, an error is thrown.\n *\n * @param {Collection} col - The collection for which to create a lookup table.\n * @param {string} [lookupKey] - The property name to use as index in\n * the lookup table. If not specified, the collection values are tried\n * to be used as indeces.\n * @return {Hashmap} The lookup table.\n */\nvar getLookupTable = exports.getLookupTable = function getLookupTable(col, lookupKey) {\n\n col = getIterableCollection(col);\n\n var lookupTable = basicUtils.makeHashMap();\n var keys = Object.keys(col);\n\n for (var i = 0, l = keys.length; i < l; i++) {\n\n var key = keys[i];\n var idx = lookupKey ? col[key][lookupKey] : col[key];\n var type = typeof idx === 'undefined' ? 'undefined' : _typeof(idx);\n\n if (type === 'string' && idx !== '' || type === 'number') {\n if (!lookupTable[idx]) {\n // doesn't exist yet!\n lookupTable[idx] = lookupKey ? col[key] : true;\n continue;\n }\n }\n\n // @todo use exception class\n throw new Error('Cannot use \"' + idx + '\" as lookup table index');\n }\n\n return lookupTable;\n};\n\n/**\n * Alias for {@link getLookupTable}\n */\nvar getArrayValuesAsHashmapKeys = exports.getArrayValuesAsHashmapKeys = getLookupTable;\n\n/**\n *\n * @param viewLabel\n * @param type\n */\nvar getSnapshotTitle = exports.getSnapshotTitle = function getSnapshotTitle(viewLabel, type) {\n return 'Snapshot \\u2013 ' + viewLabel + ' (' + new Date().toDateString() + ').' + (type || 'png');\n};\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/lib/utils/tmap.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/utils": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/utils",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.utils = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/utils\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\nvar _basic = require('$:/plugins/felixhayashi/tiddlymap/js/lib/utils/basic');\n\nvar basicUtils = _interopRequireWildcard(_basic);\n\nvar _thirdParty = require('$:/plugins/felixhayashi/tiddlymap/js/lib/utils/thirdParty');\n\nvar thirdPartyUtils = _interopRequireWildcard(_thirdParty);\n\nvar _wiki = require('$:/plugins/felixhayashi/tiddlymap/js/lib/utils/wiki');\n\nvar wikiUtils = _interopRequireWildcard(_wiki);\n\nvar _tmap = require('$:/plugins/felixhayashi/tiddlymap/js/lib/utils/tmap');\n\nvar tMapUtils = _interopRequireWildcard(_tmap);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n/*** Code **********************************************************/\n\n/**\n * A utilities class that contains universally used helper functions\n * to abbreviate code and make my life easier.\n *\n * ATTENTION: This module must not require any other tiddlymap file\n * in order to avoid cyclic dependencies. For the same reason,\n * it must also not access the `$tm.*` object.\n *\n * Exceptions to this restriction:\n * - The utils module may access all `$tm.*` properties\n * defined in startup.environment.\n * - The utils module may require vendor libs or tiddlymap libs\n * that only require vendor libs themselves.\n *\n * @see Dom utilities {@link https://github.com/Jermolene/TiddlyWiki5/blob/master/core/modules/utils/*}\n * @namespace utils\n */\nvar utils = exports.utils = _extends({}, basicUtils, thirdPartyUtils, wikiUtils, tMapUtils);\n\nexports.default = utils;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/lib/utils/utils.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/lib/utils/wiki": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/lib/utils/wiki",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.touch = exports.addTiddler = exports.getTiddlersByPrefix = exports.getTiddlerWithField = exports.getTiddlersWithField = exports.deleteByPrefix = exports.cp = exports.mv = exports.addTWlisteners = exports.getChildWidgetByProperty = exports.getMergedTiddlers = exports.isSystemOrDraft = exports.isDraft = exports.setText = exports.getText = exports.isLeftVersionGreater = exports.getEntry = exports.setEntry = exports.clone = exports.writeFieldData = exports.parseFieldData = exports.isPreviewed = exports.notify = exports.registerTransclude = exports.getElementNode = exports.getTiddlerNode = exports.getTranscludeNode = exports.isMatch = exports.getMatches = exports.moveFieldValues = exports.deleteTiddlers = exports.setField = exports.setSidebarTab = exports.tiddlerExists = exports.getField = exports.getTiddler = exports.getTiddlerRef = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _exception = require('$:/plugins/felixhayashi/tiddlymap/js/exception');\n\nvar _basic = require('$:/plugins/felixhayashi/tiddlymap/js/lib/utils/basic');\n\nvar basicUtils = _interopRequireWildcard(_basic);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/lib/utils/wiki\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\n/**\n * Gets a tiddler reference from a tRef or tObj\n *\n * @param {Tiddler|string} tiddler - A tiddler reference or object.\n * @return {TiddlerReference|null} A tiddler reference (title)\n */\nvar getTiddlerRef = exports.getTiddlerRef = function getTiddlerRef(tiddler) {\n\n if (tiddler instanceof $tw.Tiddler) {\n\n return tiddler.fields.title;\n } else if (typeof tiddler === 'string') {\n\n return tiddler;\n } else {\n\n throw new _exception.InvalidArgumentException(tiddler);\n }\n};\n\n/**\n * Similar to {@code wiki.getTiddler()} but also accepts a tObj as\n * argument, thus, making it unnecessary to always differentiate or remember\n * if we are dealing with an object or a reference.\n *\n * @see https://github.com/Jermolene/TiddlyWiki5/blob/master/boot/boot.js#L866\n * @param {Tiddler} tiddler - A tiddler reference or object.\n * @return {Tiddler} A tiddler object.\n */\nvar getTiddler = exports.getTiddler = function getTiddler(tiddler) {\n return $tw.wiki.getTiddler(tiddler instanceof $tw.Tiddler ? tiddler.fields.title : tiddler);\n};\n\n/**\n * Get a tiddler's field value. If the field does not exist or\n * its value is an empty string, return the default or an empty\n * string.\n */\nvar getField = exports.getField = function getField(tiddler, field) {\n var defValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\n\n var tObj = getTiddler(tiddler);\n return !tObj ? defValue : tObj.fields[field] || defValue;\n};\n\n/**\n * Checks if tiddlers (including shadow tiddlers) exist.\n *\n * @param {Tiddler} tiddler\n * @return {boolean} True if the tiddler exists, false otherwise\n */\nvar tiddlerExists = exports.tiddlerExists = function tiddlerExists(tiddler) {\n\n if (!tiddler) {\n return false;\n }\n\n var tRef = getTiddlerRef(tiddler);\n\n return Boolean(tRef && ($tw.wiki.tiddlerExists(tRef) || $tw.wiki.isShadowTiddler(tRef)));\n};\n\nvar setSidebarTab = exports.setSidebarTab = function setSidebarTab(tRef) {\n\n setText(getTiddlersByPrefix('$:/state/tab/sidebar-')[0], tRef);\n};\n\n/**\n * Set a tiddler field to a given value.\n *\n * Setting the title field to another value will clone the tiddler.\n * In this case, better use @link{clone} as this is\n * semantically stronger.\n *\n * This method is guarded against\n * https://github.com/Jermolene/TiddlyWiki5/issues/2025\n *\n * @return {$tw.Tiddler|undefined} The tiddler object containing\n * the field with the assigned value.\n */\nvar setField = exports.setField = function setField(tiddler, field, value) {\n\n if (!tiddler || !field) {\n return;\n }\n\n var tRef = getTiddlerRef(tiddler);\n var fields = _defineProperty({\n title: tRef\n }, field, value);\n\n // do not use any tObj provided, it may result in a lost update!\n var tObj = $tw.wiki.getTiddler(tRef, true);\n\n if (field !== 'text' && tObj && !tObj.fields.text) {\n fields.text = '';\n }\n\n tObj = new $tw.Tiddler(tObj, fields);\n $tw.wiki.addTiddler(tObj);\n\n return tObj;\n};\n\n/**\n * Pendant to tw native {@code addTiddlers()}.\n *\n * Also removes tiddlers from the river.\n *\n * @param {TiddlerCollection} tiddlers - A collection of tiddlers\n * to be removed.\n */\nvar deleteTiddlers = exports.deleteTiddlers = function deleteTiddlers(tiddlers) {\n\n var keys = Object.keys(tiddlers);\n var storyList = $tw.wiki.getTiddlerList('$:/StoryList');\n\n for (var i = keys.length; i--;) {\n var tRef = getTiddlerRef(tiddlers[keys[i]]);\n if (!$tw.wiki.tiddlerExists(tiddlers[keys[i]])) {\n // this check is important!\n // see https://github.com/Jermolene/TiddlyWiki5/issues/1919\n continue;\n }\n\n var index = storyList.indexOf(tRef);\n if (index !== -1) {\n // tiddler is displayed in river\n storyList.splice(index, 1);\n setField('$:/StoryList', 'list', storyList);\n }\n\n // finally delete the tiddler;\n\n\n $tw.wiki.deleteTiddler(tRef);\n }\n};\n\nvar moveFieldValues = exports.moveFieldValues = function moveFieldValues(oldName, newName, isRemoveOldField, isIncludeSystemTiddlers, tiddlers) {\n\n if (oldName === newName) return;\n\n var allTiddlers = tiddlers || $tw.wiki.allTitles();\n\n for (var i = allTiddlers.length; i--;) {\n\n var tObj = getTiddler(allTiddlers[i]);\n\n if (tObj.isDraft() || !tObj.fields[oldName]) {\n continue;\n }\n\n if (!isIncludeSystemTiddlers && $tw.wiki.isSystemTiddler(allTiddlers[i])) {\n continue;\n }\n\n var fields = _defineProperty({}, newName, tObj.fields[oldName]);\n\n if (isRemoveOldField) {\n fields[oldName] = undefined;\n }\n $tw.wiki.addTiddler(new $tw.Tiddler(tObj, fields));\n }\n};\n\n/**\n * This function returns all tiddlers that match the filter.\n *\n * @Todo: skip drafts! Or not?\n *\n * @param {TiddlyWikiFilter} filter - The filter to use.\n * @param {TiddlerCollection} [tiddlers] - A set of tiddlers used as\n * source. If not defined, all tiddlers and system tiddlers are\n * selected. Shadows are *not* included.\n * @return {Array.<TiddlerReference>}\n */\nvar getMatches = exports.getMatches = function getMatches(filter, tiddlers, widget) {\n\n // use wiki as default source\n var source = undefined;\n\n // shortcuts for performance\n var wiki = $tw.wiki;\n\n if (typeof filter === 'string') {\n filter = wiki.compileFilter(filter);\n }\n\n // if a source is provided, create an iterator callback\n if (tiddlers != null && (typeof tiddlers === 'undefined' ? 'undefined' : _typeof(tiddlers)) === 'object') {\n\n if (!Array.isArray(tiddlers)) {\n tiddlers = Object.keys(tiddlers);\n }\n\n source = function source(callback) {\n for (var i = tiddlers.length; i--;) {\n var tObj = wiki.getTiddler(tiddlers[i]);\n callback(tObj, tiddlers[i]);\n }\n };\n }\n\n return filter.call(wiki, source, widget);\n};\n\n/**\n * Tries to match a single tiddler object against a filter.\n * Returns a boolean value.\n *\n * @param {Tiddler} tiddler - The object to apply the filter to.\n * @param {TiddlyWikiFilter} filter - The filter to use.\n * @return {boolean} True if the tiddler matches the filter, false otherwise.\n */\nvar isMatch = exports.isMatch = function isMatch(tiddler, filter) {\n return getTiddlerRef(tiddler) === getMatches(filter, [getTiddlerRef(tiddler)])[0];\n};\n\n/**\n *\n * @param {Tiddler} tiddler\n * @param {boolean} isBlock\n */\nvar getTranscludeNode = exports.getTranscludeNode = function getTranscludeNode(tiddler, isBlock) {\n return {\n type: 'transclude',\n attributes: {\n tiddler: {\n type: 'string',\n value: getTiddlerRef(tiddler) } },\n children: [],\n isBlock: !!isBlock\n };\n};\n\n/**\n *\n * @param {Tiddler} tiddler\n */\nvar getTiddlerNode = exports.getTiddlerNode = function getTiddlerNode(tiddler) {\n return {\n type: 'tiddler',\n attributes: {\n tiddler: {\n type: 'string', value: getTiddlerRef(tiddler) } },\n children: []\n };\n};\n\n/**\n *\n * @param type\n * @param className\n * @param text\n */\nvar getElementNode = exports.getElementNode = function getElementNode(type, className, text) {\n return {\n type: 'element',\n tag: type,\n attributes: {\n class: {\n type: 'string',\n value: className } },\n children: text ? [{ type: 'text', text: text }] : []\n };\n};\n\n/**\n *\n * @param {Widget} widget\n * @param {string} name\n * @param {Tiddler} tiddler\n * @return {*}\n */\nvar registerTransclude = exports.registerTransclude = function registerTransclude(widget, name, tiddler) {\n\n // if an instance exists, remove it\n basicUtils.removeArrayElement(widget.children, widget[name]);\n\n widget[name] = widget.makeChildWidget(getTranscludeNode(tiddler, true));\n widget.children.push(widget[name]);\n\n return widget[name];\n};\n\n/**\n * This function uses the tw-notification mechanism to display a\n * temporary message.\n *\n * @see https://github.com/Jermolene/TiddlyWiki5/blob/master/core/modules/utils/dom/notifier.js\n * @param {string} message - A short message to display.\n */\nvar notify = exports.notify = function notify(message) {\n\n // @todo add to environment\n var notifyTiddlerRef = '$:/temp/tiddlymap/notify';\n\n $tw.wiki.addTiddler(new $tw.Tiddler({\n title: notifyTiddlerRef,\n text: message\n }));\n\n $tw.notifier.display(notifyTiddlerRef);\n};\n\n/**\n * The function allows to detect whether a widget is displayed\n * in preview or not.\n */\nvar isPreviewed = exports.isPreviewed = function isPreviewed(widget) {\n if (!widget) {\n return false;\n }\n\n // TODO: in the wiki utils we should not know about TiddlyMap domNode property!\n if (widget.domNode.isTiddlyWikiFakeDom) {\n return true;\n }\n\n if (widget.getVariable('tv-tiddler-preview')) {\n return true;\n } else {\n // fallback for < v5.1.9\n var cls = 'tc-tiddler-preview-preview';\n // TODO: in the wiki utils we should not know about TiddlyMap domNode property!\n return !!basicUtils.getAncestorWithClass(widget.parentDomNode, cls);\n }\n};\n\n/**\n * Parse json from field or return default value on error.\n *\n * @param {Tiddler} tiddler - The tiddler containing the json.\n * @param {string} field - The field with the json data.\n * @param {Object} [data] - An optional default value.\n * @return {*} Either the parsed data or the default data.\n */\nvar parseFieldData = exports.parseFieldData = function parseFieldData(tiddler) {\n var field = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n var data = arguments[2];\n\n\n var tObj = getTiddler(tiddler);\n\n if (!tObj) {\n return data;\n }\n\n return basicUtils.parseJSON(tObj.fields[field], data);\n};\n\n/**\n * Serialize json data and store it in a tiddler's field.\n *\n * @param {Tiddler} tiddler - The tiddler to store the json in.\n * @param {string} field - The field that will store the json.\n * @param {Object} data - The json data.\n * @param {int} [indent = 0] - the indentation\n */\nvar writeFieldData = exports.writeFieldData = function writeFieldData(tiddler, field, data, indent) {\n\n if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) !== 'object') {\n return;\n }\n\n indent = parseInt(indent);\n indent = indent > 0 && field === 'text' ? indent : 0;\n\n setField(tiddler, field, JSON.stringify(data, null, indent));\n};\n\n/**\n * Clone a tiddler and give it another title.\n * This means the tiddlers are equal except from their titles.\n */\nvar clone = exports.clone = function clone(src, dest) {\n\n setField(src, 'title', dest);\n};\n\n/**\n * Set the value of a data tiddler entry (index) to a given value\n */\nvar setEntry = exports.setEntry = function setEntry(tiddler, prop, value) {\n\n $tw.wiki.setText(getTiddlerRef(tiddler), null, prop, value);\n};\n\n/**\n * Get the value of a data tiddler entry (index)\n */\nvar getEntry = exports.getEntry = function getEntry(tiddler, prop, defValue) {\n\n var data = $tw.wiki.getTiddlerData(getTiddlerRef(tiddler), {});\n return data[prop] == null ? defValue : data[prop];\n};\n\n//~ utils.getNestedProperty = function(obj, propPath) {\n//~\n//~ propPath = propPath.split(\".\");\n//~ for (var i = propPath.length; i--;) {\n//~ if (obj !== null && typeof obj === \"object\") {\n//~ obj = obj[propPath[i]];\n//~ }\n//~\n//~ };\n\n/**\n * Compare versions.\n * @return {boolean} Unlike `$tw.utils.checkVersions`, this function\n * only returns true if the left argument is greater than the right\n * argument.\n */\nvar isLeftVersionGreater = exports.isLeftVersionGreater = function isLeftVersionGreater(v1, v2) {\n return v1 !== v2 && $tw.utils.checkVersions(v1, v2);\n};\n\n/**\n *\n * @param tiddler\n * @param defValue\n */\nvar getText = exports.getText = function getText(tiddler, defValue) {\n return getField(tiddler, 'text', defValue);\n};\n\n/**\n *\n * @param tiddler\n * @param value\n */\nvar setText = exports.setText = function setText(tiddler, value) {\n\n setField(tiddler, 'text', value);\n};\n\n/**\n * Checks whether a tiddler is a draft or not.\n *\n * @param {Tiddler} tiddler - The tiddler to check on.\n */\nvar isDraft = exports.isDraft = function isDraft(tiddler) {\n\n var tObj = getTiddler(tiddler);\n return tObj && tObj.isDraft();\n};\n\n/**\n * Get a tiddler's text or otherwise return a default text.\n */\nvar isSystemOrDraft = exports.isSystemOrDraft = function isSystemOrDraft(tiddler) {\n return $tw.wiki.isSystemTiddler(getTiddlerRef(tiddler)) || isDraft(tiddler);\n};\n\n/**\n * Function to merge an array of tiddlers into a single tiddler.\n *\n * @param {Array<TiddlerReference|Tiddler>} tiddlers - The\n * tiddlers to merge.\n * @param {string} [title=null] - The title where the result is\n * written to. If not specified, the first array item is used\n * as output title.\n */\nvar getMergedTiddlers = exports.getMergedTiddlers = function getMergedTiddlers(tiddlers, title) {\n\n if (!Array.isArray(tiddlers)) {\n return;\n }\n\n // turn all array elements into tiddler objects\n for (var i = tiddlers.length; i--;) {\n tiddlers[i] = getTiddler(tiddlers[i]);\n }\n\n if (!tiddlers.length) {\n return;\n }\n\n tiddlers.push({ title: title || tiddlers[0].fields.title }, $tw.wiki.getModificationFields(), $tw.wiki.getCreationFields());\n\n // add context for `apply()` function\n tiddlers.unshift(null);\n\n return new (Function.prototype.bind.apply($tw.Tiddler, tiddlers))();\n};\n\n/**\n * Depth first search\n */\nvar getChildWidgetByProperty = exports.getChildWidgetByProperty = function getChildWidgetByProperty(widget, prop, val) {\n\n var children = widget.children;\n for (var i = children.length; i--;) {\n var child = children[i];\n if (child[prop] === val) {\n return child;\n } else {\n child = getChildWidgetByProperty(child, prop, val);\n if (child) {\n return child;\n }\n }\n }\n};\n\n/**\n * Register listeners to widget using a hashmap.\n *\n * @param {Hashmap<Key, Function>} listeners - The listeners to attach.\n * @param {Widget} widget - the widget to attach the listeners to.\n * @param {Object} context - The context to bind the listeners to.\n */\nvar addTWlisteners = exports.addTWlisteners = function addTWlisteners(listeners, widget, context) {\n\n for (var id in listeners) {\n widget.addEventListener(id, listeners[id].bind(context));\n }\n};\n\n/**\n * Renames all tiddler titles that are prefixed with `oldPrefix`\n * into titles that are prefixed with `newPrefix` by replacing\n * `oldPrefix` with `newPrefix`.\n *\n * The force option somewhat ensures atomicity.\n *\n * @param {string} oldPrefix - Moves all tiddlers with this prefix.\n * @param {string} newPrefix - All tiddlers moved tiddlers will\n * receive this new prefix.\n * @param {boolean} [isForce=false] - If a new title would override\n * an existing title, and `force` is not set, then nothing will\n * happen and undefined is returned by the function.\n * @param {boolean} [isDelete=true] - True, if the tiddlers with the\n * old prefix should be deleted or false, if they should be kept.\n * @returns {Object<string, string>} - A hashmap that maps the old\n * and the new path.\n */\nvar mv = exports.mv = function mv(oldPrefix, newPrefix, isForce, isDelete) {\n\n if (oldPrefix === newPrefix || !oldPrefix || !newPrefix) {\n return;\n }\n\n isForce = typeof isForce === 'boolean' ? isForce : false;\n isDelete = typeof isDelete === 'boolean' ? isDelete : true;\n\n // prepare\n var targets = getTiddlersByPrefix(oldPrefix);\n var fromToMapper = basicUtils.makeHashMap();\n\n for (var i = targets.length; i--;) {\n\n var oldTRef = targets[i];\n var newTRef = oldTRef.replace(oldPrefix, newPrefix);\n if ($tw.wiki.tiddlerExists(newTRef) && !isForce) {\n return; // undefined\n }\n fromToMapper[oldTRef] = newTRef;\n }\n\n for (var _oldTRef in fromToMapper) {\n\n setField(_oldTRef, 'title', fromToMapper[_oldTRef]);\n if (isDelete) {\n $tw.wiki.deleteTiddler(_oldTRef);\n }\n }\n\n return fromToMapper;\n};\n\n/**\n * Clones all tiddler titles that are prefixed with `oldPrefix`\n * into titles that are instead prefixed with `newPrefix`.\n *\n * The force option somewhat ensures atomicity.\n *\n * @param {string} oldPrefix - Moves all tiddlers with this prefix.\n * @param {string} newPrefix - All tiddlers moved tiddlers will\n * receive this new prefix.\n * @param {boolean} [isForce=false] - If a new title would override\n * an existing title, and `force` is not set, then nothing will\n * happen and undefined is returned by the function.\n * @returns {Object<string, string>} - A hashmap that maps the old\n * and the new path.\n */\nvar cp = exports.cp = function cp(oldPrefix, newPrefix, isForce) {\n return mv(oldPrefix, newPrefix, isForce, false);\n};\n\n/**\n * Delete all tiddlers with a given prefix.\n *\n * @param {string} prefix - The prefix\n */\nvar deleteByPrefix = exports.deleteByPrefix = function deleteByPrefix(prefix, tiddlers) {\n\n if (!prefix) {\n return;\n }\n\n tiddlers = tiddlers || $tw.wiki.allTitles();\n\n var deletedTiddlers = [];\n for (var i = tiddlers.length; i--;) {\n if (basicUtils.startsWith(tiddlers[i], prefix)) {\n $tw.wiki.deleteTiddler(tiddlers[i]);\n deletedTiddlers.push(deletedTiddlers[i]);\n }\n }\n\n return deletedTiddlers;\n};\n\n/**\n * Returns all tiddlers that possess a property with a certain value.\n *\n * @param {string} fieldName - The property name to look for.\n * @param {string} [value] - If provided, the field's value must\n * equal this value in order to match.\n * @param {Hashmap} [options] - Further options.\n * @param {TiddlerCollection} [options.tiddlers=$tw.wiki.allTitles()] - A collection\n * of tiddlers to perform the search on.\n * @param {boolean} [options.isIncludeDrafts=false] - True if drafts of the found\n * tiddlers are also included in the result set.\n * @param {number} [options.limit] - A positive number delimiting the maximum\n * number of results.\n * tiddlers are also included in the result set.\n * @return {Hashmap.<TiddlerReference, Tiddler>} Result\n */\nvar getTiddlersWithField = exports.getTiddlersWithField = function getTiddlersWithField(fieldName, value) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\n var tiddlers = options.tiddlers || $tw.wiki.allTitles();\n var isIncludeDrafts = options.isIncludeDrafts === true;\n var result = basicUtils.makeHashMap();\n var keys = Object.keys(tiddlers);\n var hasOwnProp = $tw.utils.hop;\n var limit = options.limit || 0;\n\n for (var i = keys.length; i--;) {\n\n var tObj = getTiddler(tiddlers[keys[i]]);\n var fields = tObj.fields;\n if (hasOwnProp(fields, fieldName) && (!hasOwnProp(fields, 'draft.of') || isIncludeDrafts)) {\n if (!value || fields[fieldName] === value) {\n result[fields.title] = tObj;\n if (--limit === 0) {\n break;\n }\n }\n }\n }\n\n return result;\n};\n\n/**\n *\n * @param name\n * @param value\n */\nvar getTiddlerWithField = exports.getTiddlerWithField = function getTiddlerWithField(name, value) {\n return Object.keys(getTiddlersWithField(name, value, { limit: 1 }))[0];\n};\n\n/**\n * Iterates over all tiddlers in a given way and returns tiddlers\n * whose title matches the prefix string.\n *\n * @param {string} prefix - The prefix to match\n * @param {Hashmap} [options] - An options object.\n * @param {string} [options.iterator=\"each\"] - A tw store iterator\n * function, e.g. \"eachShadow\" or \"ShadowPlusTiddlers\".\n * @param {boolean} [options.removePrefix= false] - Whether to remove\n * the prefix or to leave it.\n * @return {Array<string>} The matches with or without the prefix.\n */\nvar getTiddlersByPrefix = exports.getTiddlersByPrefix = function getTiddlersByPrefix(prefix) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n var removePrefix = options.removePrefix === true;\n var result = [];\n var iterator = $tw.wiki[options.iterator || 'each'];\n\n iterator(function (tObj, tRef) {\n if (basicUtils.startsWith(tRef, prefix)) {\n result.push(removePrefix ? basicUtils.getWithoutPrefix(tRef, prefix) : tRef);\n }\n });\n\n return result;\n};\n\n/**\n * Advanced addTiddler method.\n *\n * It adds timestamps and only adds the tiddler if it doesn't exist\n * yet or the force option is used.\n *\n * This method is guarded against\n * https://github.com/Jermolene/TiddlyWiki5/issues/2025\n */\nvar addTiddler = exports.addTiddler = function addTiddler(tiddler, isForce) {\n\n var tObj = getTiddler(tiddler);\n\n if (!isForce && tObj) {\n return tObj;\n }\n\n tObj = new $tw.Tiddler({\n title: tiddler,\n text: ''\n }, $tw.wiki.getModificationFields(), $tw.wiki.getCreationFields());\n\n $tw.wiki.addTiddler(tObj);\n\n return tObj;\n};\n\nvar touch = exports.touch = function touch(tRef) {\n setField(tRef, 'modified', new Date());\n};\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/lib/utils/wiki.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/macro/tmap": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/macro/tmap",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.params = exports.name = exports.run = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; // @preserve\n/*\\\ntitle: $:/plugins/felixhayashi/tiddlymap/js/macro/tmap\ntype: application/javascript\nmodule-type: macro\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\nvar _EdgeType = require('$:/plugins/felixhayashi/tiddlymap/js/EdgeType');\n\nvar _EdgeType2 = _interopRequireDefault(_EdgeType);\n\nvar _ViewAbstraction = require('$:/plugins/felixhayashi/tiddlymap/js/ViewAbstraction');\n\nvar _ViewAbstraction2 = _interopRequireDefault(_ViewAbstraction);\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*** Code **********************************************************/\n\nvar name = 'tmap';\nvar params = getParamSlots(5);\n\n/**\n * @this MacroCallWidget\n * @return {string} the result of the operation or an empty string.\n * @private\n */\nfunction run() {\n\n this.substVarRefs = this.substituteVariableReferences;\n\n var fn = command[arguments[0]];\n var result = null;\n\n if (typeof fn === 'function') {\n var args = Array.prototype.slice.call(arguments, 1);\n result = fn.apply(this, args);\n }\n\n return typeof result === 'string' ? result : '';\n}\n\n/**\n * unfortunately tw forces us to specify params in advance so I\n * will reserve some argument slots here.\n * @private\n */\nfunction getParamSlots(maxArgs) {\n\n var arr = [];\n for (var i = 0; i < maxArgs; i++) {\n arr.push({ name: 'arg' + i });\n }\n\n return arr;\n}\n\n/**\n * In connection with tiddlymap, this macro allows us to access\n * system information from within tiddlers as well as to execute\n * some util functions.\n *\n * Every command will be called with `this` pointing to the current\n * MacroCallWidget instance!\n *\n * @private\n */\nvar command = _utils2.default.makeHashMap();\n\n/**\n * Returns the basename of the string\n *\n * @see {@link utils.basename}\n */\ncommand.basename = function (separator) {\n\n var str = this.getVariable('currentTiddler');\n return _utils2.default.getBasename(str, separator);\n};\n\n/**\n * TW messes with svg urls so we always use base64 encoding when\n * a data uri is requested as macro call\n */\ncommand.datauri = function (tiddler, type) {\n\n return _utils2.default.getDataUri(tiddler, type, true);\n};\n\ncommand.testJSON = function (fieldName) {\n\n var tObj = $tw.wiki.getTiddler(this.getVariable('currentTiddler'));\n\n try {\n JSON.parse(tObj.fields[fieldName]);\n return 'valid';\n } catch (SyntaxError) {\n return 'malformed';\n }\n};\n\ncommand.splitAndSelect = function (separator, index) {\n\n var str = this.getVariable('currentTiddler');\n var result = str.split(separator)[index];\n\n return result != null ? result : str;\n};\n\ncommand.concat = function () {\n\n var str = '';\n for (var i = 1, l = arguments.length; i < l; i++) {\n str += arguments[i];\n }\n return str;\n};\n\ncommand.uuid = function () {\n\n return _utils2.default.genUUID();\n};\n\ncommand.regRepl = function () {\n\n var oldStr = this.substVarRefs(arguments[0]);\n var regStr = arguments[1];\n var newStr = this.substVarRefs(arguments[2]);\n var regFlags = this.substVarRefs(arguments[4]);\n\n return oldStr.replace(new RegExp(regStr, regFlags), newStr);\n};\n\ncommand.halfOfString = function () {\n\n var str = this.substVarRefs(arguments[0]);\n\n if (!str) {\n return '';\n }\n\n return str.substr(0, Math.ceil(str.length / 2));\n};\n\ncommand.isETyVisible = function (view, userInput) {\n\n view = new _ViewAbstraction2.default(view);\n\n var id = command.getETyId.call(this, view, userInput);\n\n return '' + view.isEdgeTypeVisible(id);\n};\n\ncommand.getETyId = function (view, userInput) {\n\n view = new _ViewAbstraction2.default(view);\n\n var type = _EdgeType2.default.getInstance(userInput || this.getVariable('currentTiddler'));\n\n if (!type.namespace) {\n var _EdgeType$getIdParts = _EdgeType2.default.getIdParts(type.id),\n marker = _EdgeType$getIdParts.marker,\n _name = _EdgeType$getIdParts.name;\n\n var namespace = view.getConfig('edge_type_namespace');\n\n type = _EdgeType2.default.getInstance(_EdgeType2.default.getId(marker, namespace, _name));\n }\n\n return type.id;\n};\n\ncommand.scale = function () {\n\n var str = '';\n for (var i = 1, l = parseInt(arguments[0]); i < l; i++) {\n str += '[[' + i + ']]';\n }\n return str;\n};\n\ncommand.mergeFields = function () {\n\n var tObj = _utils2.default.getTiddler(arguments[0]);\n var prefix = arguments[1];\n var separator = arguments[2] || ' ';\n\n if (!tObj) return;\n\n var fields = _utils2.default.getPropertiesByPrefix(tObj.fields, prefix);\n var str = '';\n for (var name in fields) {\n\n if (typeof fields[name] === 'string') {\n\n str += fields[name] + separator;\n }\n }\n return str;\n};\n\ncommand.option = function (path, unit) {\n\n if (typeof $tm == \"undefined\") {\n // this macro is referenced from css which means we cannot\n // expect $tm to exist, e.g when rendering static css\n // @see https://github.com/felixhayashi/TW5-TiddlyMap/issues/257#issuecomment-427343226\n return '';\n }\n\n var prop = $tm;\n var propertyPath = path.split('.');\n\n for (var i = 0; i < propertyPath.length; i++) {\n if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) == 'object' && prop[propertyPath[i]]) {\n prop = prop[propertyPath[i]];\n }\n }\n\n // TODO: ugly, use regex\n if (unit && typeof prop === 'string' && _utils2.default.hasSubString(unit) && prop.lastIndexOf(unit) + unit.length === prop.length) {\n prop = prop + unit;\n }\n\n return prop;\n};\n\n/*** Exports *******************************************************/\n\nexports.run = run;\nexports.name = name;\nexports.params = params;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/macro/MapMacro.js.map\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/plugins/felixhayashi/tiddlymap/js/Adapter": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/Adapter",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/Adapter\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\nvar _ViewAbstraction = require('$:/plugins/felixhayashi/tiddlymap/js/ViewAbstraction');\n\nvar _ViewAbstraction2 = _interopRequireDefault(_ViewAbstraction);\n\nvar _EdgeType = require('$:/plugins/felixhayashi/tiddlymap/js/EdgeType');\n\nvar _EdgeType2 = _interopRequireDefault(_EdgeType);\n\nvar _NodeType = require('$:/plugins/felixhayashi/tiddlymap/js/NodeType');\n\nvar _NodeType2 = _interopRequireDefault(_NodeType);\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _Edge = require('$:/plugins/felixhayashi/tiddlymap/js/Edge');\n\nvar _Edge2 = _interopRequireDefault(_Edge);\n\nvar _vis = require('$:/plugins/felixhayashi/vis/vis.js');\n\nvar _vis2 = _interopRequireDefault(_vis);\n\nvar _environment = require('$:/plugins/felixhayashi/tiddlymap/js/lib/environment');\n\nvar env = _interopRequireWildcard(_environment);\n\nvar _contrastcolour = require('$:/core/modules/macros/contrastcolour.js');\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/***************************** CODE ********************************/\n\n/**\n * This library acts as an abstraction layer above the tiddlywiki\n * system. All the provided methods give the api-user the chance\n * to interact with tiddlywiki as if it was a simple graph database.\n *\n * Everything that is related to retrieving or inserting nodes and\n * edges is handled by the adapter class.\n *\n * You don't need to create your own instance of this class.\n * The adapter service may be accessed from anywhere using\n * `$tm.apapter`.\n *\n * @constructor\n */\nvar Adapter = function () {\n\n /**\n * @param {Tracker} tracker\n * @param {EdgeTypeSubscriberRegistry} edgeTypeSubscriberRegistry\n */\n function Adapter(tracker, edgeTypeSubscriberRegistry) {\n _classCallCheck(this, Adapter);\n\n this.getTiddlerById = tracker.getTiddlerById.bind(tracker);\n this.getId = tracker.getIdByTiddler.bind(tracker);\n this.assignId = tracker.assignId.bind(tracker);\n\n this.edgeTypeSubscriberRegistry = edgeTypeSubscriberRegistry;\n\n this.indeces = $tm.indeces;\n this.wiki = $tw.wiki;\n\n this.visShapesWithTextInside = _utils2.default.getLookupTable(['ellipse', 'circle', 'database', 'box', 'text']);\n }\n\n /**\n * This function will delete the specified edge object from the system.\n *\n * @param {Edge} edge - The edge to be deleted. The edge necessarily\n * needs to possess an `id` and a `from` property.\n * @return {Edge} The deleted edge is returned.\n */\n\n\n _createClass(Adapter, [{\n key: 'deleteEdge',\n value: function deleteEdge(edge) {\n\n return this._processEdge(edge, 'delete');\n }\n\n /**\n * Persists an edge by storing the vector (from, to, type).\n *\n * @param {Edge} edge - The edge to be saved. The edge necessarily\n * needs to possess a `to` and a `from` property.\n * @return {Edge} The newly inserted edge.\n */\n\n }, {\n key: 'insertEdge',\n value: function insertEdge(edge) {\n\n return this._processEdge(edge, 'insert');\n }\n\n /**\n * Removes multiple edges from several stores.\n *\n * @param {EdgeCollection} edges - The edges to be deleted.\n */\n\n }, {\n key: 'deleteEdges',\n value: function deleteEdges(edges) {\n\n edges = _utils2.default.convert(edges, 'array');\n for (var i = edges.length; i--;) {\n this.deleteEdge(edges[i]);\n }\n }\n\n /**\n * Private function to handle the insertion or deletion of an edge.\n * It prepares the process according to the action type and delegates\n * the task to more specific functions.\n *\n * @private\n * @return {Edge} The processed edge.\n */\n\n }, {\n key: '_processEdge',\n value: function _processEdge(edge, action) {\n\n $tm.logger('debug', 'Edge', action, edge);\n\n // get from-node and corresponding tiddler\n var fromTRef = this.getTiddlerById(edge.from);\n\n if (!fromTRef || !_utils2.default.tiddlerExists(fromTRef)) {\n return;\n }\n\n var tObj = _utils2.default.getTiddler(fromTRef);\n var type = this.indeces.allETy[edge.type] || _EdgeType2.default.getInstance(edge.type);\n var handlers = this.edgeTypeSubscriberRegistry.getAllForType(type);\n var fn = action + 'Edge';\n\n for (var i = handlers.length; i--;) {\n handlers[i][fn](tObj, edge, type);\n }\n\n // if type didn't exist yet, create it\n if (action === 'insert' && !type.exists()) {\n type.save();\n }\n\n return edge;\n }\n\n /**\n * This function will return an adjacency list for the nodes\n * present in the current system. The list may be restricted by\n * optional filters.\n *\n * @param {string} [groupBy='to'] - Specifies by which property the\n * adjacency list is indexed. May be either 'from' or 'to'.\n * @param {Hashmap} [opts] - An optional options object.\n * @param {Hashmap} [opts.typeWL] - A whitelist lookup-table\n * that restricts which edge-types are included.\n * @param {Hashmap} [opts.edges] - A set of edges on which basis\n * the adjacency list is build. If not provided,\n * all edges in the system are considered.\n * @return {Object<Id, Array<Edge>>} For each key (a node id) an\n * array of edges pointing 'from' (or 'to'; depends on `groupBy`)\n * is supplied as value.\n */\n\n }, {\n key: 'getAdjacencyList',\n value: function getAdjacencyList(groupBy) {\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n $tm.start('Creating adjacency list');\n\n if (!opts.edges) {\n var tRefs = _utils2.default.getMatches(env.selector.allPotentialNodes);\n opts.edges = this.getEdgesForSet(tRefs, opts.toWL, opts.typeWL);\n }\n\n var adjList = _utils2.default.groupByProperty(opts.edges, groupBy || 'to');\n\n $tm.stop('Creating adjacency list');\n\n return adjList;\n }\n\n /**\n * This function will return all neighbours of a graph denoted by\n * a set of tiddlers.\n *\n * @todo parts of this code may be outsourced into a function to\n * prevent repeating code.\n *\n * @param {Array<TiddlerReference>} matches - The original set that\n * defines the starting point for the neighbourhood discovery\n * @param {Hashmap} [opts] - An optional options object.\n * @param {Hashmap} [opts.typeWL] - A whitelist lookup-table\n * that restricts which edges are travelled to reach a neighbour.\n * @param {Hashmap} [opts.edges] - An initial set of edges that is\n * used in the first step to reach immediate neighbours, if no\n * set of edges is specified, all exsisting edges will be considered.\n * @param {number} [opts.steps] - An integer value that specifies\n * the scope of the neighbourhood. A node is considered a neighbour\n * if it can be reached within the given number of steps starting\n * from original set of tiddlers returned by the node filter.\n * @param {Hashmap} [opts.addProperties] - a hashmap\n * containing properties to be added to each node.\n * For example:\n * {\n * group: 'g1',\n * color: 'red'\n * }\n * @return {Object} An object of the form:\n * {\n * nodes: { *all neighbouring nodes* },\n * edges: { *all edges connected to neighbours* },\n * }\n */\n\n }, {\n key: 'getNeighbours',\n value: function getNeighbours(matches) {\n var _this = this;\n\n var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n $tm.start('Get neighbours');\n\n var addProperties = opts.addProperties,\n toWL = opts.toWL,\n typeWL = opts.typeWL,\n steps = opts.steps;\n var allETy = this.indeces.allETy;\n\n // index of all tiddlers have already are been visited, either by\n // having been included in the original set, or by having been\n // recorded as neighbour during the discovery.\n\n var visited = _utils2.default.getArrayValuesAsHashmapKeys(matches);\n var view = _ViewAbstraction2.default.exists(opts.view) ? new _ViewAbstraction2.default(opts.view) : null;\n var allEdgesLeadingToNeighbours = _utils2.default.makeHashMap();\n var allNeighbours = _utils2.default.makeHashMap();\n var maxSteps = parseInt(steps) > 0 ? steps : 1;\n var direction = opts.direction || view && view.getConfig('neighbourhood_directions');\n var isWalkBoth = !direction || direction === 'both';\n var isWalkIn = isWalkBoth || direction === 'in';\n var isWalkOut = isWalkBoth || direction === 'out';\n\n // in order to apply the node-filter also to neighbours we need to make it\n // include all tiddlers in the filter's source (e.g. a tiddler and a few neighbours)\n // and then apply the filter – which now has the chance to take away tiddlers\n // a few filters from the set\n var neighFilter = view && '[all[]] ' + view.getNodeFilter('raw');\n\n // adjacency receives whitelists through opts\n var adjList = this.getAdjacencyList('to', opts);\n\n var addAsNeighbour = function addAsNeighbour(edge, role, neighboursOfThisStep) {\n allEdgesLeadingToNeighbours[edge.id] = edge;\n var tRef = _this.getTiddlerById(edge[role]);\n\n if (view && _utils2.default.isTrue($tm.config.sys.nodeFilterNeighbours) && !_utils2.default.isMatch(tRef, neighFilter)) {\n return;\n }\n\n if (!visited[tRef]) {\n visited[tRef] = true;\n var node = _this.makeNode(tRef, addProperties);\n if (node) {\n // saveguard against obsolete edges or other problems\n // record node\n allNeighbours[node.id] = node;\n neighboursOfThisStep.push(tRef);\n }\n }\n };\n\n // needed later\n var step = void 0;\n\n // loop if still steps to be taken and we have a non-empty starting set\n for (step = 0; step < maxSteps && matches.length; step++) {\n\n // neighbours that are discovered in the current step;\n // starting off from the current set of matches;\n var neighboursOfThisStep = [];\n\n // loop over all nodes in the original set\n for (var i = matches.length; i--;) {\n\n if (_utils2.default.isSystemOrDraft(matches[i])) {\n // = this might happen if the user manually created edges\n // that link to a system/draft tiddler or if the original\n // set contained system/draft tiddlers.\n continue;\n }\n\n // get all outgoing edges\n // = edges originating from the starting set and point outwards\n var outgoing = this.getEdges(matches[i], toWL, typeWL);\n for (var id in outgoing) {\n\n var t = allETy[outgoing[id].type];\n if (isWalkBoth || isWalkOut && t.toArrow || isWalkIn && t.invertedArrow) {\n\n addAsNeighbour(outgoing[id], 'to', neighboursOfThisStep);\n }\n }\n\n // get all incoming edges\n // = edges originating from outside pointing to the starting set\n var incoming = adjList[this.getId(matches[i])];\n if (!incoming) {\n continue;\n }\n\n for (var j = incoming.length; j--;) {\n var _t = allETy[incoming[j].type];\n if (isWalkBoth || isWalkIn && _t.toArrow || isWalkOut && _t.invertedArrow) {\n addAsNeighbour(incoming[j], 'from', neighboursOfThisStep);\n }\n }\n }\n\n // the current set of newly discovered neighbours forms the\n // starting point for the next discovery\n matches = neighboursOfThisStep;\n }\n\n var neighbourhood = {\n nodes: allNeighbours,\n edges: allEdgesLeadingToNeighbours\n };\n\n $tm.logger('debug', 'Retrieved neighbourhood', neighbourhood, 'steps', step);\n\n $tm.stop('Get neighbours');\n\n return neighbourhood;\n }\n\n /**\n * This function will assemble a graph object based on the supplied\n * node and edge filters. Optionally, a neighbourhood may be\n * merged into the graph neighbourhood.\n *\n * @param {string|ViewAbstraction} [view] - The view in which\n * the graph will be displayed.\n * @param {string|ViewAbstraction} [filter] - If supplied,\n * this will act as node filter that defines which nodes\n * are to be displayed in the graph; a possible view node filter\n * would be ignored.\n * @param {Hashmap} [edgeTypeWL] - A whitelist lookup-table\n * that restricts which edges are travelled to reach a neighbour.\n * @param {number} [neighbourhoodScope] - An integer value that\n * specifies the scope of the neighbourhood in steps.\n * See {@link Adapter#getNeighbours}\n * @return {Object} An object of the form:\n * {\n * nodes: { *all nodes in the graph* },\n * edges: { *all edges in the graph* },\n * }\n * Neighbours will be receive the 'tmap:neighbour' type.\n */\n\n }, {\n key: 'getGraph',\n value: function getGraph() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n view = _ref.view,\n filter = _ref.filter,\n edgeTypeWL = _ref.edgeTypeWL,\n neighbourhoodScope = _ref.neighbourhoodScope;\n\n $tm.start('Assembling Graph');\n\n view = _ViewAbstraction2.default.exists(view) ? new _ViewAbstraction2.default(view) : null;\n var matches = _utils2.default.getMatches(filter || view && view.getNodeFilter('compiled'));\n var neighScope = parseInt(neighbourhoodScope || view && view.getConfig('neighbourhood_scope'));\n var typeWL = edgeTypeWL || view && view.getEdgeTypeFilter('whitelist');\n var toWL = _utils2.default.getArrayValuesAsHashmapKeys(matches);\n\n var graph = {\n edges: this.getEdgesForSet(matches, toWL, typeWL),\n nodes: this.selectNodesByReferences(matches, {\n view: view,\n outputType: 'hashmap'\n })\n };\n\n if (neighScope) {\n var neighbours = this.getNeighbours(matches, {\n steps: neighScope,\n view: view,\n typeWL: typeWL,\n addProperties: {\n group: 'tmap:neighbour'\n }\n });\n\n // add neighbours (nodes and edges) to graph\n Object.assign(graph.nodes, neighbours.nodes);\n Object.assign(graph.edges, neighbours.edges);\n\n if (view && view.isEnabled('show_inter_neighbour_edges')) {\n var nodeTRefs = this.getTiddlersByIds(neighbours.nodes);\n // this time we need a whitelist based on the nodeTRefs\n var _toWL = _utils2.default.getArrayValuesAsHashmapKeys(nodeTRefs);\n Object.assign(graph.edges, this.getEdgesForSet(nodeTRefs, _toWL));\n }\n }\n\n // this is pure maintainance!\n removeObsoleteViewData(graph.nodes, view);\n\n // add styles to nodes\n this.attachStylesToNodes(graph.nodes, view);\n\n $tm.stop('Assembling Graph');\n\n $tm.logger('debug', 'Assembled graph:', graph);\n\n return graph;\n }\n\n /**\n * Returns all edges stored in a given tiddler. Any edge stored in a\n * tiddler is orginally an outgoing edge. Depending on how the user\n * changes the arrow head (by manipulating the Visjs edge-type style),\n * the edge may change its orientation and become an incoming edge or\n * bi-directional. Therefore, the edges retrieved may be incoming,\n * outgoing or both!\n *\n * Returned edges may be of the following type:\n *\n * - Edges stored in the tiddler text (=links).\n * - Edges stored in fields denoted by magic edge-types.\n * - TiddlyMap edges stored in a json format\n *\n * @param {Tiddler} tiddler - A tiddler reference or object from\n * which to retrieve the edges.\n * @param {Hashmap<TiddlerReference, boolean>} [toWL]\n * A hashmap on which basis it is decided, whether to include\n * an edge that leads to a certain tiddler in the result or not.\n * In this case, all edges stored in the tiddler are treated as\n * outgoing and the arrow head is ignored. If not specified,\n * all edges are included.\n * @param {Hashmap<string, boolean>} [typeWL]\n * A hashmap on which basis it is decided, whether to include\n * an edge of a given type in the result or not. If not\n * specified, all edges are included.\n */\n\n }, {\n key: 'getEdges',\n value: function getEdges(tiddler, toWL, typeWL) {\n\n var tObj = _utils2.default.getTiddler(tiddler);\n\n if (!tObj || _utils2.default.isSystemOrDraft(tObj)) {\n return;\n }\n\n var allETy = this.indeces.allETy;\n\n var edges = _utils2.default.makeHashMap();\n var eTySubscribers = this.edgeTypeSubscriberRegistry.getAll();\n\n for (var i = 0, l = eTySubscribers.length; i < l; i++) {\n Object.assign(edges, eTySubscribers[i].loadEdges(tObj, toWL, typeWL));\n }\n\n for (var id in edges) {\n\n var edge = edges[id];\n\n // check exists for historical reasons...\n if (!edge.from || !edge.to) {\n continue;\n }\n\n var type = allETy[edge.type] || _EdgeType2.default.getInstance(edge.type);\n addStyleToEdge(edges[id], type);\n\n edges[id] = edge;\n }\n\n return edges;\n }\n\n /**\n * The method will return all outgoing edges for a subset of tiddlers.\n *\n * @param {Array<Tiddler>} tiddlers - The set of tiddlers to consider.\n * @param toWL\n * @param typeWL\n * @return {Hashmap<Id, Edge>} An edge collection.\n */\n\n }, {\n key: 'getEdgesForSet',\n value: function getEdgesForSet(tiddlers, toWL, typeWL) {\n\n var edges = _utils2.default.makeHashMap();\n for (var i = tiddlers.length; i--;) {\n Object.assign(edges, this.getEdges(tiddlers[i], toWL, typeWL));\n }\n\n return edges;\n }\n\n /**\n * Select all edges of a given type.\n *\n * @param {string|EdgeType} type - Either the edge type id (name) or an EdgeType object.\n */\n\n }, {\n key: 'selectEdgesByType',\n value: function selectEdgesByType(type) {\n\n var typeWL = _utils2.default.makeHashMap(_defineProperty({}, _EdgeType2.default.getInstance(type).id, true));\n\n return this.getEdgesForSet(this.getAllPotentialNodes(), null, typeWL);\n }\n\n /**\n *\n * @return {*}\n */\n\n }, {\n key: 'getAllPotentialNodes',\n value: function getAllPotentialNodes() {\n\n return _utils2.default.getMatches($tm.selector.allPotentialNodes);\n }\n }, {\n key: '_processEdgesWithType',\n\n\n /**\n * Deletes or renames all edges of a given type.\n *\n * @param {string|EdgeType} type - Either the edge type id (name) or an EdgeType object.\n * @param {('rename'|'delete')} [action='delete']\n * @param {string} [newName]\n */\n value: function _processEdgesWithType(type, _ref2) {\n var action = _ref2.action,\n newName = _ref2.newName;\n\n\n type = _EdgeType2.default.getInstance(type);\n\n $tm.logger('debug', 'Processing edges', type, action);\n\n // get edges\n var edges = this.selectEdgesByType(type);\n\n if (action === 'rename') {\n\n // clone type first to prevent auto-creation\n new _EdgeType2.default(newName, type).save();\n }\n\n for (var id in edges) {\n\n this._processEdge(edges[id], 'delete');\n\n if (action === 'rename') {\n edges[id].type = newName;\n this._processEdge(edges[id], 'insert');\n }\n }\n\n // finally remove the old type\n this.wiki.deleteTiddler(type.fullPath);\n }\n\n /**\n * Returns a set of nodes that corresponds to a set of tiddlers.\n *\n * @param {TiddlerCollection} tiddlers - A collection of tiddlers.\n * @param {Hashmap} [addProperties] - a hashmap\n * @param {CollectionTypeString} [outputType='dataset'] - The result type.\n *\n * @return {NodeCollection} A collection of a type specified in the options.\n */\n\n }, {\n key: 'selectNodesByReferences',\n value: function selectNodesByReferences(tiddlers) {\n var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n addProperties = _ref3.addProperties,\n outputType = _ref3.outputType;\n\n var result = _utils2.default.makeHashMap();\n var keys = Object.keys(tiddlers);\n\n for (var i = keys.length; i--;) {\n\n var node = this.makeNode(tiddlers[keys[i]], addProperties);\n if (node) {\n result[node.id] = node;\n }\n }\n\n return _utils2.default.convert(result, outputType);\n }\n\n /**\n * Retrieve nodes based on the a list of ids that corrspond to tiddlers\n * id fields.\n *\n * @param {Array.<Id>|Hashmap.<Id, *>|vis.DataSet} nodeIds - The ids of the tiddlers\n * that represent the nodes.\n * @param {Hashmap} [options] - See {@link Adapter#selectNodesByReferences}.\n * @return {NodeCollection} A collection of a type specified in the options.\n */\n\n }, {\n key: 'selectNodesByIds',\n value: function selectNodesByIds(nodeIds, options) {\n\n var tRefs = this.getTiddlersByIds(nodeIds);\n\n return this.selectNodesByReferences(tRefs, options);\n }\n\n /**\n * Select a single node by id.\n *\n * @param {Id} id - A node's id\n * @param {Hashmap} [options]\n * Except from the outputType option, all options\n * are inherited from {@link Adapter#selectNodesByIds}.\n * @return {Node|undefined} A node or nothing.\n */\n\n }, {\n key: 'selectNodeById',\n value: function selectNodeById(id, options) {\n\n options = Object.assign({}, options, { outputType: 'hashmap' });\n var result = this.selectNodesByIds([id], options);\n\n return result[id];\n }\n\n /**\n * Deletes a node type from the system.\n * @param {NodeType|string} type - the node type id or the actual NodeType\n */\n\n }, {\n key: 'removeNodeType',\n value: function removeNodeType(type) {\n\n type = _NodeType2.default.getInstance(type);\n this.wiki.deleteTiddler(type.fullPath);\n }\n\n /**\n * Gets a Node representation for a tiddler.\n *\n * @param {Tiddler} tiddler - the tiddler to represent as node\n * @param {Object} protoNode - default node properties\n *\n * @return {Node|void}\n */\n\n }, {\n key: 'makeNode',\n value: function makeNode(tiddler, protoNode) {\n\n var tObj = _utils2.default.getTiddler(tiddler);\n\n if (!tObj || _utils2.default.isSystemOrDraft(tObj)) return;\n\n // merge(!) so later node manipulations do not affect other nodes\n var node = _utils2.default.merge({}, protoNode);\n\n // note: assignId() will not assign an id if the tiddler already has one\n node.id = this.assignId(tObj);\n\n // backreference to tiddler;\n // https://github.com/felixhayashi/TW5-TiddlyMap/issues/304\n node.tRef = tObj.fields.title;\n\n // add label\n var label = tObj.fields[$tm.field.nodeLabel];\n node.label = (label && $tm.field.nodeLabel !== 'title' ? this.wiki.renderText('text/plain', 'text/vnd-tiddlywiki', label) : tObj.fields.title).replace('\\\\n', '\\n');\n\n return node;\n }\n\n /**\n * Return node styles that are inherited from system styles or node types.\n *\n * @param nodes\n * @return {Object<TiddlerReference, Object>}\n */\n\n }, {\n key: 'getInheritedNodeStyles',\n value: function getInheritedNodeStyles(nodes) {\n\n var src = this.getTiddlersByIds(nodes);\n var protoByTRef = {};\n var glNTy = this.indeces.glNTy;\n\n for (var i = glNTy.length; i--;) {\n var type = glNTy[i];\n\n var inheritors = [];\n if (type.id === 'tmap:neighbour') {\n // special case\n for (var id in nodes) {\n\n if (nodes[id].group === 'tmap:neighbour') {\n\n inheritors.push(this.getTiddlerById(id));\n }\n }\n } else {\n inheritors = type.getInheritors(src);\n }\n\n for (var j = inheritors.length; j--;) {\n var tRef = inheritors[j];\n var proto = protoByTRef[tRef] = protoByTRef[tRef] || {};\n proto.style = _utils2.default.merge(proto.style || {}, type.style);\n\n // ATTENTION: only override proto icons when the type provides\n // an icon since otherwise we might erase previously\n // inherited icons.\n if (type['fa-icon']) {\n proto['fa-icon'] = type['fa-icon'];\n } else if (type['tw-icon']) {\n proto['tw-icon'] = type['tw-icon'];\n }\n }\n }\n\n return protoByTRef;\n }\n\n /**\n * Adds styles to nodes.\n *\n * @param {Object<string, Node>} nodes\n * @param {ViewAbstraction|string} view\n */\n\n }, {\n key: 'attachStylesToNodes',\n value: function attachStylesToNodes(nodes, view) {\n\n view = _ViewAbstraction2.default.exists(view) ? new _ViewAbstraction2.default(view) : null;\n\n var inheritedStyles = this.getInheritedNodeStyles(nodes);\n var viewNodeData = view ? view.getNodeData() : _utils2.default.makeHashMap();\n var isStaticMode = view && !view.isEnabled('physics_mode');\n\n for (var id in nodes) {\n\n var tRef = this.getTiddlerById(id);\n var tObj = this.wiki.getTiddler(tRef);\n var fields = tObj.fields;\n var node = nodes[id];\n var icon = void 0;\n\n // == group styles ==\n\n var inheritedStyle = inheritedStyles[tRef];\n\n if (inheritedStyle) {\n\n _utils2.default.merge(node, inheritedStyle.style);\n icon = getIcon(inheritedStyle['fa-icon'], inheritedStyle['tw-icon']);\n }\n\n // == global node styles ==\n\n // background color\n if (fields.color) {\n node.color = fields.color;\n }\n\n // global node style from vis editor\n if (fields['tmap.style']) {\n _utils2.default.merge(node, _utils2.default.parseJSON(fields['tmap.style']));\n }\n\n icon = getIcon(fields['tmap.fa-icon'], fields['icon']) || icon;\n\n // == local node styles ==\n\n // local node style and positions\n\n var nodeData = viewNodeData[id];\n\n if (nodeData) {\n\n _utils2.default.merge(node, nodeData);\n if (isStaticMode) {\n // fix x if x-position is set; same for y\n node.fixed = {\n x: node.x != null,\n y: node.y != null\n };\n }\n\n icon = getIcon(nodeData['fa-icon'], nodeData['tw-icon']) || icon;\n }\n\n // == tweaks ==\n\n var isColorObject = node.color !== null && _typeof(node.color) === 'object';\n // color/border-color may be undefined\n var color = isColorObject ? node.color.background : node.color;\n\n node.color = {\n background: color,\n border: isColorObject ? node.color.border : undefined\n };\n\n // ATTENTION: this function needs to be called after color is assigned\n addNodeIcon(node, icon);\n\n // determine font color if not defined via a group- or node-style;\n // in case of global and local default styles, the user is responsible\n // him- or herself to adjust the font\n node.font = node.font || {};\n\n if (node.shape && !this.visShapesWithTextInside[node.shape]) {\n node.font.color = 'black'; // force a black color\n } else if (!node.font.color && color) {\n node.font.color = (0, _contrastcolour.run)(color, color, 'black', 'white');\n }\n\n if (node.shape === 'icon' && _typeof(node.icon) === 'object') {\n node.icon.color = color;\n }\n }\n\n if (view) {\n var _node = nodes[view.getConfig('central-topic')];\n if (_node) {\n _utils2.default.merge(_node, this.indeces.glNTyById['tmap:central-topic'].style);\n }\n }\n }\n\n /**\n * This function will remove all tiddlers from the wiki that correspond\n * to a node in the collection. Drafts are also removed. The default\n * storylist is updated eventually.\n * call deleteNode which does the following\n * 1. get id using IdByT\n * 2. remove id using adapter.deleteEdgesByTo(idByT[tRef])\n * 3. remove from all indeces\n *\n * @see: https://github.com/Jermolene/TiddlyWiki5/issues/1550\n *\n * @param {Node|string} node.\n */\n\n }, {\n key: 'deleteNode',\n value: function deleteNode(node) {\n\n if (!node) {\n return;\n }\n\n var id = (typeof node === 'undefined' ? 'undefined' : _typeof(node)) === 'object' ? node.id : node;\n var tRef = this.getTiddlerById(id);\n\n // delete tiddler and remove it from the river; this will\n // automatically remove the global node style and the outgoing edges\n\n if (tRef) {\n // checking for tRef is needed;\n // see: https://github.com/Jermolene/TiddlyWiki5/issues/1919\n _utils2.default.deleteTiddlers([tRef]);\n }\n\n // delete local node-data in views containing the node\n\n var viewRefs = _utils2.default.getMatches(env.selector.allViews);\n for (var i = viewRefs.length; i--;) {\n var view = new _ViewAbstraction2.default(viewRefs[i]);\n view.removeNode(id);\n }\n\n // remove obsolete connected edges\n\n var neighbours = this.getNeighbours([tRef]);\n this.deleteEdges(neighbours.edges);\n\n // -------------------------------------------\n // NEVER DELETE AN INDEX THAT ALREADY EXISTED!\n // -------------------------------------------\n // Some instances may have cached the index and get confused!\n // It does not do harm to leave indeces as is since we do not\n // iterate over them(!) and when a tiddler has the same title or\n // id as a deleted tiddler, which is highly unlikely, then it will\n // simply override the index, which is totally fine. The indeces\n // are refreshed on every boot anyway so it is not a big deal.\n //\n // THEREFORE:\n //\n // DO NOT DO delete this.tById[id];\n // DO NOT DO delete this.idByT[tRef];\n }\n\n /**\n * Delete all nodes from the system.\n *\n * @param {string[]} ids ids\n */\n\n }, {\n key: 'deleteNodes',\n value: function deleteNodes(ids) {\n\n for (var i = ids.length; i--;) {\n this.deleteNode(ids[i]);\n }\n }\n\n /**\n * Create a new tiddler that gets a non-existant title and is opened\n * for edit. If a view is registered, the fields of the tiddler match\n * the current view. If arguments network and position are specified,\n * the node is also inserted directly into the graph at the given\n * position.\n *\n * @TODO: Description is obsolete!\n *\n * @param {object} node A node object to be inserted\n * @param {ViewAbstraction|string} view - used to set positions and register the node to\n * @param {Tiddler} protoTiddler\n */\n\n }, {\n key: 'insertNode',\n value: function insertNode() {\n var node = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var view = arguments[1];\n var protoTiddler = arguments[2];\n\n\n // title might has changed after generateNewTitle()\n node.label = this.wiki.generateNewTitle(node.label || _utils2.default.getRandomLabel());\n\n // add to tiddler store\n var tObj = new $tw.Tiddler({ text: '' }, // https://github.com/Jermolene/TiddlyWiki5/issues/2025\n protoTiddler, {\n title: node.label, // force title\n 'tmap.id': null // force empty id (generated later)\n }, this.wiki.getModificationFields(), this.wiki.getCreationFields());\n\n this.wiki.addTiddler(tObj);\n\n node = this.makeNode(tObj, node);\n\n if (_ViewAbstraction2.default.exists(view)) {\n new _ViewAbstraction2.default(view).addNode(node);\n }\n\n return node;\n }\n\n /**\n * Retrieve tiddlers based on the a list of corresponding ids.\n *\n * @param {Array.<Id>|Hashmap.<Id, *>|vis.DataSet} nodeIds - The ids.\n * @return {Array<TiddlerReference>} The resulting tiddlers.\n */\n\n }, {\n key: 'getTiddlersByIds',\n value: function getTiddlersByIds(nodeIds) {\n\n // transform into a hashmap with all values being true\n if (Array.isArray(nodeIds)) {\n nodeIds = _utils2.default.getArrayValuesAsHashmapKeys(nodeIds);\n } else if (nodeIds instanceof _vis2.default.DataSet) {\n nodeIds = _utils2.default.getLookupTable(nodeIds, 'id'); // use id field as key\n }\n\n var result = [];\n for (var id in nodeIds) {\n var tRef = this.getTiddlerById(id);\n if (tRef) {\n result.push(tRef);\n }\n }\n\n return result;\n }\n }]);\n\n return Adapter;\n}();\n\n/**** Helper *******************************************************/\n\n/**\n * Returns the short symbol identifier (`` → `f206`).\n *\n * @param str FontAwesome id\n * @return {string}\n */\n\n\nvar getFAdigits = function getFAdigits(str) {\n return str.length === 4 ? str : str.substr(3, 4);\n};\n\n/**\n * Adds an icon to the specified node.\n *\n * @param {Node} node\n * @param {Object} icon\n */\nvar addNodeIcon = function addNodeIcon(node, icon) {\n\n if (!icon) {\n return;\n }\n\n // Font Awesome style\n\n if (icon.fa) {\n\n node.shape = 'icon';\n node.icon = {\n shape: 'icon',\n face: 'FontAwesome',\n color: node.color,\n code: String.fromCharCode('0x' + getFAdigits(icon.fa))\n };\n\n if (node.size) {\n node.icon.size = node.size;\n }\n\n return;\n }\n\n // TiddlyWiki stored icons\n\n if (icon.tw) {\n\n var imgTObj = _utils2.default.getTiddler(icon.tw);\n\n if (!imgTObj) {\n return;\n }\n\n if (imgTObj.fields['_canonical_uri']) {\n // image is a url address\n\n node.image = imgTObj.fields['_canonical_uri'];\n node.shape = 'image';\n } else if (imgTObj.fields.text) {\n\n node.image = _utils2.default.getDataUri(imgTObj);\n node.shape = 'image';\n }\n }\n};\n\n/**\n * Garbage collector for obsolete node data.\n *\n * @param {Object<string, Node>} nodes\n * @param {ViewAbstraction|string} view\n */\nvar removeObsoleteViewData = function removeObsoleteViewData(nodes, view) {\n\n if (!_ViewAbstraction2.default.exists(view) || !nodes) {\n return;\n }\n\n view = new _ViewAbstraction2.default(view);\n\n var data = view.getNodeData();\n\n var obsoleteDataItems = 0;\n for (var id in data) {\n if (nodes[id] === undefined && data[id] != null) {\n // we only set this to undefined as deletion would\n // slow down V8, however, this necessarily requires\n // a safeguard agains recursion: data[id] != null\n\n data[id] = undefined;\n obsoleteDataItems++;\n }\n }\n\n if (obsoleteDataItems) {\n $tm.logger('debug', '[Cleanup]', 'Removed obsolete node data:', view.getLabel(), obsoleteDataItems);\n view.saveNodeData(data);\n }\n};\n\n/**\n * Sets up an edge object that is ready to be consumed by vis.\n *\n * @param {Edge} edge\n * @param {EdgeType} type\n */\nvar addStyleToEdge = function addStyleToEdge(edge, type) {\n\n edge = Object.assign(edge, type.style);\n\n if (_utils2.default.isTrue(type['show-label'], true)) {\n edge.label = type.getLabel();\n }\n};\n\nvar getIcon = function getIcon(faIcon, twIcon) {\n return faIcon && { fa: faIcon } || twIcon && { tw: twIcon };\n};\n\n/*** Exports *******************************************************/\n\nexports.default = Adapter;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/services/Adapter.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/CallbackManager": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/CallbackManager",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/CallbackManager\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Makes it possible to register callbacks for tiddler changes.\n */\nvar CallbackManager = function () {\n function CallbackManager() {\n _classCallCheck(this, CallbackManager);\n\n this.callbacks = _utils2.default.makeHashMap();\n this.logger = $tm.logger;\n this.wiki = $tw.wiki;\n }\n\n /**\n * The callback mechanism allows to dynamically listen to tiddler\n * changes without hardcoding a change-check for a tiddler name\n * in the refresh function.\n *\n * @param {TiddlerReference} tRef - A tiddler whose change triggers\n * the callback.\n * @param {function} callback - A function that is called when the\n * tiddler has changed.\n * @param {boolean} [isDeleteOnCall=true] - True if to delete the\n * callback once it has been called, false otherwise.\n */\n\n\n _createClass(CallbackManager, [{\n key: 'add',\n value: function add(tRef, callback) {\n var isDeleteOnCall = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n\n this.logger('debug', 'A callback was registered for changes of \"' + tRef + '\"');\n this.callbacks[tRef] = {\n execute: callback,\n isDeleteOnCall: isDeleteOnCall\n };\n }\n }, {\n key: 'remove',\n\n\n /**\n * Removes the callback from the list of tiddler callbacks.\n */\n value: function remove(refOrRefList) {\n\n if (!refOrRefList) {\n return;\n }\n\n if (typeof refOrRefList === 'string') {\n refOrRefList = [refOrRefList];\n }\n\n for (var i = refOrRefList.length; i--;) {\n var tRef = refOrRefList[i];\n if (this.callbacks[tRef]) {\n this.logger('debug', 'Deleting callback for \"' + tRef + '\"');\n delete this.callbacks[tRef];\n }\n }\n }\n }, {\n key: 'refresh',\n\n\n /**\n * this method has to be implemented at the top of the refresh method.\n * It checks for changed tiddlers that have\n * registered callbacks. If `deleteOnCall` was specified during\n * registration of the callback, the callback will be deleted\n * automatically.\n */\n value: function refresh(changedTiddlers) {\n\n if (this.callbacks.length == 0) {\n return;\n }\n\n for (var tRef in changedTiddlers) {\n\n if (!this.callbacks[tRef]) {\n continue;\n }\n\n if (this.wiki.getTiddler(tRef)) {\n\n this.logger('debug', 'Executing a callback for: ' + tRef);\n this.callbacks[tRef].execute(tRef);\n\n // a continue prevents deleting the callback\n if (!this.callbacks.isDeleteOnCall) {\n continue;\n }\n }\n\n this.remove(tRef);\n }\n }\n }]);\n\n return CallbackManager;\n}();\n\n/*** Exports *******************************************************/\n\nexports.default = CallbackManager;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/services/CallbackManager.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/startup/caretaker": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/startup/caretaker",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.startup = exports.synchronous = exports.before = exports.after = exports.platforms = exports.name = undefined;\n\nvar _rebuilders;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/startup/caretaker\ntype: application/javascript\nmodule-type: startup\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\nvar _vis = require('$:/plugins/felixhayashi/tiddlymap/js/config/vis');\n\nvar _vis2 = _interopRequireDefault(_vis);\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _Fixer = require('$:/plugins/felixhayashi/tiddlymap/js/Fixer');\n\nvar _Fixer2 = _interopRequireDefault(_Fixer);\n\nvar _Adapter = require('$:/plugins/felixhayashi/tiddlymap/js/Adapter');\n\nvar _Adapter2 = _interopRequireDefault(_Adapter);\n\nvar _tracker = require('$:/plugins/felixhayashi/tiddlymap/js/services/tracker');\n\nvar _tracker2 = _interopRequireDefault(_tracker);\n\nvar _EdgeTypeSubscriberRegistry = require('$:/plugins/felixhayashi/tiddlymap/js/EdgeTypeSubscriberRegistry');\n\nvar _EdgeTypeSubscriberRegistry2 = _interopRequireDefault(_EdgeTypeSubscriberRegistry);\n\nvar _DialogManager = require('$:/plugins/felixhayashi/tiddlymap/js/DialogManager');\n\nvar _DialogManager2 = _interopRequireDefault(_DialogManager);\n\nvar _CallbackManager = require('$:/plugins/felixhayashi/tiddlymap/js/CallbackManager');\n\nvar _CallbackManager2 = _interopRequireDefault(_CallbackManager);\n\nvar _ViewAbstraction = require('$:/plugins/felixhayashi/tiddlymap/js/ViewAbstraction');\n\nvar _ViewAbstraction2 = _interopRequireDefault(_ViewAbstraction);\n\nvar _EdgeType = require('$:/plugins/felixhayashi/tiddlymap/js/EdgeType');\n\nvar _EdgeType2 = _interopRequireDefault(_EdgeType);\n\nvar _NodeType = require('$:/plugins/felixhayashi/tiddlymap/js/NodeType');\n\nvar _NodeType2 = _interopRequireDefault(_NodeType);\n\nvar _vis3 = require('$:/plugins/felixhayashi/vis/vis.js');\n\nvar _vis4 = _interopRequireDefault(_vis3);\n\nvar _environment = require('$:/plugins/felixhayashi/tiddlymap/js/lib/environment');\n\nvar env = _interopRequireWildcard(_environment);\n\nvar _URL = require('$:/plugins/felixhayashi/tiddlymap/js/URL');\n\nvar _URL2 = _interopRequireDefault(_URL);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/*** Code **********************************************************/\n\n/**\n * This module is responsible for registering a global namespace\n * under $tw and loading (and refreshing) the configuration and services.\n *\n * Attention: Careful with the order of the function calls in this\n * functions body!\n *\n */\nvar init = function init() {\n\n window.$tm = _extends({}, env, { utils: _utils2.default, url: new _URL2.default(window.location.href) });\n\n // cleanup previous session\n cleanup();\n\n registerPublicClasses($tm);\n\n // build and integrate global options\n updateGlobals($tm);\n\n // register meta file (if not done yet)\n createMetaFile($tm.logger);\n\n // create indeces\n var indeces = attachIndeces($tm);\n\n // create services\n var services = getInitializedServices(indeces);\n Object.assign($tm, services);\n\n // load defaults\n loadDefaultView($tm.config.sys.defaultView);\n\n // Run the fixer to update older wikis\n services.fixer.fix();\n\n // all graphs need to register here. @see routineWalk()\n $tm.registry = [];\n setInterval(routineCheck, 5000);\n\n // AT THE VERY END: register change listener with the callback manager\n registerChangeListener($tm.callbackManager);\n\n // register DOM listeners\n registerMousemoveListener();\n registerClickListener();\n\n // check for fullscreen directives\n if ($tm.url.query['tmap-enlarged']) {\n prepareFullscreenStart($tm.url);\n }\n\n // issue notification\n $tm.logger('warn', 'TiddlyMap\\'s caretaker successfully started');\n};\n\n/**\n * Injects dependencies and registers services\n *\n * @param indeces\n * @return Object\n */\nvar getInitializedServices = function getInitializedServices(indeces) {\n\n var tracker = new _tracker2.default(fixer);\n\n // inject modules\n var handler = $tw.modules.applyMethods('tmap.edgetypehandler');\n var edgeTypeSubscriberRegistry = new _EdgeTypeSubscriberRegistry2.default(handler, indeces.allETy, tracker);\n\n // attach the adapter object to the tiddlymap namespace\n var adapter = new _Adapter2.default(tracker, edgeTypeSubscriberRegistry);\n\n var callbackManager = new _CallbackManager2.default();\n var dialogManager = new _DialogManager2.default(callbackManager);\n\n var fixer = new _Fixer2.default(adapter, $tm.logger, indeces.glNTy);\n\n return {\n edgeTypeSubscriberRegistry: edgeTypeSubscriberRegistry,\n tracker: tracker,\n adapter: adapter,\n callbackManager: callbackManager,\n dialogManager: dialogManager,\n fixer: fixer\n };\n};\n\n/**\n * make classes available for console users\n */\nvar registerPublicClasses = function registerPublicClasses(parent) {\n parent.keycharm = _vis4.default.keycharm;\n parent.NodeType = _NodeType2.default;\n parent.EdgeType = _EdgeType2.default;\n parent.ViewAbstraction = _ViewAbstraction2.default;\n};\n\n/**\n * This function will append the global options to the tree. In case\n * this function is called again, only the option leafs are rebuild\n * so a process may safely store a reference to a branch of the option\n * tree as the reference doesn't change.\n *\n * ATTENTION: For the path options, no trailing or double slashes!\n * This is NOT unix where paths are normalized (// is not rewritten to /).\n *\n * @see\n * - [TW5] Is there a designated place for TW plugins to store stuff in the dom?\n * https://groups.google.com/forum/#!topic/tiddlywikidev/MZZ37XiVcvY\n * @param {object} parent The root where to insert the options into\n */\nvar attachOptions = function attachOptions(parent) {\n\n var p = parent;\n\n // default configurations mixed with user config\n if (!p.config) p.config = _utils2.default.makeHashMap();\n\n // Never modify the imported config objects; instead, merge them\n // into a new object\n\n // attention! it is a tw-data-tiddler!\n p.config.sys = _utils2.default.merge(p.config.sys, _utils2.default.unflatten($tw.wiki.getTiddlerData(env.ref.sysUserConf)));\n\n // CAREFUL: Never merge directly into the default vis config object\n p.config.vis = _utils2.default.merge({}, _vis2.default, _utils2.default.parseFieldData(env.ref.visUserConf));\n\n // a shortcut for fields property\n if (!p.field) p.field = _utils2.default.makeHashMap();\n $tw.utils.extend(p.field, p.config.sys.field);\n};\n\n/**\n * This function will cache/index some tiddler properties as javascript\n * objects for faster access.\n */\nvar attachIndeces = function attachIndeces(parent) {\n\n $tm.start('Attaching Indeces');\n\n parent.indeces = parent.indeces || {};\n\n updateNodeTypesIndeces(parent.indeces);\n updateEdgeTypesIndeces(parent.indeces);\n\n $tm.stop('Attaching Indeces');\n\n return parent.indeces;\n};\n\n/**\n * For faster access to node-type styles, we store all node-type\n * objects as indeces in a table.\n *\n * Types without a filter are not indexed since they are either\n * special types that TiddlyMap manually assignes (e.g. tmap:neighbour,\n * or tmap:selected).\n *\n * Indeces added to the indeces chain:\n * 1. glNTy – all global node types\n *\n * @param {Object} [parent] - The global indeces object indeces.\n * If not stated, $tm.indeces is used.\n * @param {Array<TiddlerReference>} [allTiddlers] - The tiddlers to\n * use as basis for this index. If not stated, all tiddlers in\n * the wiki are used.\n */\nvar updateNodeTypesIndeces = function updateNodeTypesIndeces(parent) {\n\n parent = parent || $tm.indeces;\n\n var typePath = $tm.path.nodeTypes;\n var glNTy = parent.glNTy = [];\n var glNTyById = parent.glNTyById = _utils2.default.makeHashMap();\n\n $tw.wiki.eachTiddlerPlusShadows(function (tObj, tRef) {\n if (_utils2.default.startsWith(tRef, typePath)) {\n var type = _NodeType2.default.getInstance(tRef);\n glNTyById[type.id] = type;\n glNTy.push(type);\n }\n });\n\n glNTy.sort(function (a, b) {\n return a.priority - b.priority;\n });\n};\n\nvar updateEdgeTypesIndeces = function updateEdgeTypesIndeces(parent) {\n\n parent = parent || $tm.indeces;\n\n var typePath = $tm.path.edgeTypes;\n var allETy = parent.allETy = _utils2.default.makeHashMap();\n\n $tw.wiki.eachTiddlerPlusShadows(function (tObj, tRef) {\n\n if (_utils2.default.startsWith(tRef, typePath)) {\n\n var et = _EdgeType2.default.getInstance(tRef);\n allETy[et.id] = et;\n }\n });\n\n if ($tm.edgeTypeSubscriberRegistry) {\n $tm.edgeTypeSubscriberRegistry.updateIndex(allETy);\n }\n};\n\n/**\n * This function attaches all the top level functions to the\n * tiddlymap namespace.\n *\n * This will add the\n * 1. global logger method,\n * 2. the notify method\n * 3. the stopwatch methods `start` and `stop`.\n *\n * @param {Hashmap} parent - The parent object to attach the options to.\n */\nvar attachFunctions = function attachFunctions(parent) {\n\n var fn = parent;\n var nirvana = function nirvana() {/* /dev/null */};\n\n if (_utils2.default.isTrue($tm.config.sys.debug, false) && console) {\n\n /**\n * A logging mechanism that uses the first argument as type and\n * passes all consequent arguments as console arguments. The\n * reason for this functions existence is to be able to switch\n * off the logging without redirecting every single console function\n * such as log, debug, warn etc. Plus, we have more control over\n * the logging.\n *\n * @see http://stackoverflow.com/questions/5538972/console-log-apply-not-working-in-ie9\n * @see http://stackoverflow.com/questions/9521921/why-does-console-log-apply-throw-an-illegal-invocation-error\n *\n * @param {string} type - The type of the message (debug, info, warning…)\n * which is exactly the same as in `console[type]`.\n * @param {...*} message - An infinite number of arguments to be printed\n * (just like console).\n */\n fn.logger = function () /* type, [messages,] messages */{\n if (arguments.length < 2) return;\n var args = Array.prototype.slice.call(arguments);\n var arg1 = args.shift(args);\n var type = console.hasOwnProperty(arg1) ? arg1 : 'debug';\n console[type].apply(console, args);\n };\n\n fn.start = function (timerName) {\n console.time('[timer] ' + timerName);\n };\n\n fn.stop = function (timerName) {\n console.timeEnd('[timer] ' + timerName);\n };\n } else {\n\n fn.logger = fn.start = fn.stop = nirvana;\n }\n\n fn.notify = _utils2.default.isTrue($tm.config.sys.notifications) ? _utils2.default.notify : nirvana;\n};\n\n/**\n * This periodic check is needed to trigger a cleanup if a graph is\n * removed since a graph itself cannot react to its destruction.\n * This includes removing listeners that were not attached to the\n * local container or calling the vis destructor.\n *\n * @todo Specify which functions are required for widgets that register\n * themselves in the registry.\n */\nvar routineCheck = function routineCheck() {\n\n for (var i = $tm.registry.length; i--;) {\n var widget = $tm.registry[i];\n\n if (!widget.destruct || !widget.isZombieWidget) return; // no duck!\n\n if (widget.isZombieWidget()) {\n // removed!\n $tm.logger('warn', 'a widget will be removed');\n $tm.registry.splice(i, 1);\n widget.destruct();\n }\n }\n};\n\n/**\n * Every widget that has registered itself in the registry\n * will receive the `updates` object. The `updates` object is a more\n * advanced\n *\n * @param {Updates} updates\n */\nvar dispatchUpdates = function dispatchUpdates(updates) {\n\n var registry = $tm.registry;\n for (var i = registry.length; i--;) {\n\n var widget = registry[i];\n\n if (widget.update && widget.isZombieWidget && !widget.isZombieWidget()) {\n widget.update(updates);\n }\n }\n};\n\n/**\n * We need to do this check as TiddlyWiki does not allow us to hook into the\n * clone process to find out whether a node was cloned.\n *\n * @param tObj\n */\nvar checkForClone = function checkForClone(tObj) {\n\n var tRefs = _utils2.default.getDublicates(tObj);\n\n if (!tRefs.length) {\n return;\n }\n\n // remove any defined edges\n _utils2.default.setField(tObj, 'tmap.edges', undefined);\n\n // force override id\n $tm.tracker.assignId(tObj, true);\n\n // inform the user about what we did\n $tm.dialogManager.open('dublicateIdInfo', {\n param: {\n changedTiddler: tObj.fields.title,\n filter: _utils2.default.joinAndWrap(tRefs, '[[', ']]'),\n id: _utils2.default.getId(tObj)\n }\n });\n};\n\n/**\n * Builds and registers globals and the functions that depend on them.\n */\nvar updateGlobals = function updateGlobals(parent) {\n\n attachOptions($tm);\n attachFunctions($tm);\n\n // attention: logger() cannot be called before functions are rebuild\n $tm.logger('warn', 'Rebuilt globals');\n};\n\nvar lastCurrentTiddler = null;\nvar updateLiveViewTrigger = function updateLiveViewTrigger(changedTiddlers) {\n\n if (changedTiddlers['$:/HistoryList']) {\n var tRef = _utils2.default.getField('$:/HistoryList', 'current-tiddler');\n } else if (changedTiddlers['$:/temp/focussedTiddler']) {\n var tRef = _utils2.default.getField('$:/temp/focussedTiddler', 'text');\n }\n\n if (tRef != null && lastCurrentTiddler !== tRef) {\n lastCurrentTiddler = tRef;\n _utils2.default.setField('$:/temp/tmap/currentTiddler', 'text', tRef);\n }\n};\n\n/**\n * Only for debugging\n */\nvar printChanges = function printChanges(changedTiddlers, loopCount) {\n\n if (!_utils2.default.isTrue($tm.config.sys.debug, false)) return;\n\n $tm.logger('warn', '=== Refresh ' + loopCount + ' ===');\n\n for (var tRef in changedTiddlers) {\n\n var c = changedTiddlers[tRef].deleted ? '[Deleted]' : '[Modified]';\n\n $tm.logger('warn', c, tRef, $tw.wiki.getTiddler(tRef));\n }\n};\n\n/**\n * Saves the last mousemove event under $tm.mouse\n */\nvar registerMousemoveListener = function registerMousemoveListener() {\n\n $tm.mouse = {};\n\n var fn = function fn(evt) {\n $tm.mouse = evt;\n };\n window.addEventListener('mousemove', fn, false);\n};\n\n/**\n * @TODO: suggest this to Jeremy for TW popup handling\n */\nvar registerClickListener = function registerClickListener() {\n\n var tempPopups = $tm.path.tempPopups;\n window.addEventListener('click', function (evt) {\n\n var popupStates = _utils2.default.getTiddlersByPrefix(tempPopups);\n\n for (var i = popupStates.length; i--;) {\n if (_utils2.default.getText(popupStates[i])) break;\n }\n\n if (i === -1) return;\n\n if (!$tw.utils.hasClass(evt.target, 'tc-drop-down') && !_utils2.default.getAncestorWithClass(evt.target, 'tc-drop-down')) {\n // = clicked on an element that isn't a dropdown or inside one\n for (var i = popupStates.length; i--;) {\n _utils2.default.setText(popupStates[i], '');\n }\n }\n }, false);\n};\n\n/**\n * Registers a change listener that will dispatch\n * @param callbackManager\n */\nvar registerChangeListener = function registerChangeListener(callbackManager) {\n\n var loopCount = 0;\n\n $tw.wiki.addEventListener('change', function (changedTiddlers) {\n\n $tm.start('Caretaker handling changes');\n\n printChanges(changedTiddlers, loopCount++);\n callbackManager.refresh(changedTiddlers);\n\n var updates = { changedTiddlers: {} };\n\n for (var tRef in changedTiddlers) {\n\n var tObj = _utils2.default.getTiddler(tRef);\n\n if (tObj && tObj.isDraft()) {\n continue;\n }\n\n var isHandled = handleTiddlerChange(tRef, tObj, updates);\n\n if (isHandled) {\n updates.changedTiddlers[tRef] = changedTiddlers[tRef];\n }\n }\n\n dispatchUpdates(updates);\n\n // NOTE: changes will affect the next refresh cycle\n updateLiveViewTrigger(changedTiddlers);\n\n $tm.stop('Caretaker handling changes');\n });\n};\n\n/**\n * Mapping of paths and callbacks that should be invoked if tiddlers\n * within theses paths change.\n */\nvar rebuilders = (_rebuilders = {}, _defineProperty(_rebuilders, env.path.options, updateGlobals), _defineProperty(_rebuilders, env.path.nodeTypes, updateNodeTypesIndeces), _defineProperty(_rebuilders, env.path.edgeTypes, updateEdgeTypesIndeces), _rebuilders);\n\n/**\n * This function will deal with tiddler changes and will log changes\n * to the provided `updates` object.\n *\n * @param {TiddlerReference} tRef\n * @param {$tw.Tiddler} tObj\n * @param {Updates} updates\n */\nvar handleTiddlerChange = function handleTiddlerChange(tRef, tObj, updates) {\n\n if ($tw.wiki.isSystemTiddler(tRef)) {\n\n for (var path in rebuilders) {\n if (_utils2.default.startsWith(tRef, path) && !updates[path]) {\n $tm.logger('warn', '[System change]', path);\n rebuilders[path]();\n updates[path] = true;\n }\n }\n } else if (tObj) {\n // created or modified\n\n if (tObj.fields.text === undefined) {\n // sic; '' is ok\n // to make sure that the tiddler's body is fully loaded\n // we postpone the handling of the tiddler\n // see https://github.com/felixhayashi/TW5-TiddlyMap/issues/222#issuecomment-268978764\n $tw.wiki.dispatchEvent('lazyLoad', tRef);\n\n return false;\n }\n\n checkForClone(tObj);\n\n // call assignId IN ANY CASE to make sure the index\n // stays intact, also after a renaming operation\n $tm.tracker.assignId(tObj);\n } else {\n // deleted or renamed\n\n var id = $tm.tracker.getIdByTiddler(tRef);\n\n if (!id) {\n // ignore tiddler without id\n return false;\n }\n\n var tRefWithId = _utils2.default.getTiddlerWithField('tmap.id', id);\n\n if (tRefWithId) {\n // only renamed\n\n $tm.logger('warn', '[Renamed]', tRef, 'into', tRefWithId);\n } else {\n // removed\n\n // remove node; any edges pointing in/out; update indeces\n // CAREFUL with recursion here!\n $tm.adapter.deleteNode(id);\n }\n }\n\n return true;\n};\n\n/**\n * Remove temp files from previous session.\n */\nvar cleanup = function cleanup() {\n\n _utils2.default.deleteByPrefix('$:/temp/felixhayashi');\n _utils2.default.deleteByPrefix('$:/temp/tiddlymap');\n _utils2.default.deleteByPrefix('$:/temp/tmap');\n};\n\n/**\n * Register the view that should be displayed at startup.\n */\nvar loadDefaultView = function loadDefaultView(defaultView) {\n\n if (defaultView) {\n _utils2.default.setText(env.ref.defaultViewHolder, $tm.config.sys.defaultView);\n }\n};\n\n/**\n * Init the wiki so we can start the main editor with the specified\n * view in fullscreen mode.\n *\n * @param {ViewAbstraction|string} view\n */\nvar prepareFullscreenStart = function prepareFullscreenStart(view) {\n var _env$ref = env.ref,\n mainEditor = _env$ref.mainEditor,\n defaultViewHolder = _env$ref.defaultViewHolder;\n\n\n _utils2.default.setSidebarTab(mainEditor);\n\n if (_ViewAbstraction2.default.exists(view)) {\n view = new _ViewAbstraction2.default(view);\n _utils2.default.setField(defaultViewHolder, 'text', view.getLabel());\n }\n};\n\n/**\n * The meta file keeps track of installation data.\n */\nvar createMetaFile = function createMetaFile(logger) {\n\n if (_utils2.default.tiddlerExists(env.ref.sysMeta)) {\n return;\n }\n\n logger('warn', 'Creating meta file');\n\n var plugin = $tw.wiki.getTiddler(env.path.pluginRoot);\n\n $tw.wiki.setTiddlerData(env.ref.sysMeta, {\n // the version originally installed\n originalVersion: plugin.fields.version,\n // the data structure in use corresponds to version x\n // if the structure is obsolete, it will be automatically\n // fixed by the fixer module.\n dataStructureState: '0.6.9',\n // whether or not to display a welcome message\n showWelcomeMessage: true\n });\n};\n\n/*** Exports *******************************************************/\n\nvar name = exports.name = 'tmap.caretaker';\nvar platforms = exports.platforms = ['browser'];\nvar after = exports.after = ['startup'];\nvar before = exports.before = ['rootwidget'];\nvar synchronous = exports.synchronous = true;\nvar startup = exports.startup = init;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/services/Caretaker.js.map\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/plugins/felixhayashi/tiddlymap/js/DialogManager": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/DialogManager",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/DialogManager\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _CallbackManager = require('$:/plugins/felixhayashi/tiddlymap/js/CallbackManager');\n\nvar _CallbackManager2 = _interopRequireDefault(_CallbackManager);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * The DialogManager is responsible for preparing, displaying and\n * finalizing all the dialogs.\n */\nvar DialogManager = function () {\n\n /**\n * @param {CallbackManager} callbackManager - A callback manager that\n * is informed about changed tiddlers and keeps track of the\n * various tiddlers produced during the dialog process.\n * @param {Object} [context] - An optional *this*-reference to bind the\n * callback of each called dialog to. Otherwise, the callback of\n * each dialog has to be bound manually to the callback if required.\n */\n function DialogManager(callbackManager, context) {\n _classCallCheck(this, DialogManager);\n\n // create callback registry\n this.callbackManager = callbackManager;\n this.context = context;\n }\n\n /**\n * This function opens a dialog based on a skeleton and some fields and eventually\n * calls a callback once the dialog is closed. The callback contains an indicator\n * whether the dialog subject was confirmed or the operation cancelled. In any\n * case the output tiddler is passed to the callback. Each dialog may write its\n * changes to this tiddler in order to store the dialog result and make it available\n * to the callback.\n *\n * How does it work?\n *\n * The output of the dialog process is stored in a temporary tiddler that is only known\n * to the current instance of the dialog. This way it is ensured that only the dialog process\n * that created the temporary tiddler will retrieve the result. Now we are able to\n * provide unambigous and unique correspondance to dialog callbacks.\n * Any dialog output is stored in a unique output-tiddler. Once there is a result,\n * a new result tiddler is created with indicators how to interpret the output.\n * The result tiddler can be understood as exit code that is independent of the output.\n * It is the result tiddler that triggers the dialog callback that was registered before.\n * the output is then read immediately from the output-tiddler.\n *\n * @param {string} templateId - The dialog id which is the basename of\n * the template title.\n * @param {Hashmap} [param] - All properties (except those with special meanings)\n * of param will be accessible as variables in the modal\n * @param {string} [param.subtitle] -\n * @param {string} [param.cancelButtonLabel] - The label of the cancel button.\n * @param {string} [param.confirmButtonLabel] - The label of the confirm button.\n * @param {function} [callback] - A function with the signature\n * function(isConfirmed, outputTObj). `outputTObj` contains data\n * produced by the dialog (can be undefined even if confirmed!).\n * Be careful: the tiddler that outputTObj represents is deleted immediately.\n * @return {$tw.Tiddler} The dialog tddler object with all its fields.\n */\n\n\n _createClass(DialogManager, [{\n key: 'open',\n value: function open(templateId) {\n var param = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var callback = arguments[2];\n\n\n if (_utils2.default.isTrue($tm.config.sys.suppressedDialogs[templateId], false)) {\n $tm.logger('warning', 'Suppressed dialog', templateId);\n return;\n }\n\n $tm.logger('debug', 'Dialog param object', param);\n\n if (typeof callback === 'function' && this.context) {\n callback = callback.bind(this.context);\n }\n\n // create a temporary tiddler reference for the dialog\n var dialogTRef = $tm.path.tempRoot + '/dialog-' + _utils2.default.genUUID();\n\n // get the dialog template\n var skeleton = _utils2.default.getTiddler($tm.path.dialogs + '/' + templateId);\n\n // fields used to handle the dialog process\n var dialog = {\n title: dialogTRef,\n buttons: skeleton.fields['buttons'] || 'ok_cancel',\n classes: 'tmap-modal-content ' + skeleton.fields['classes'],\n output: dialogTRef + '/output',\n result: dialogTRef + '/result',\n temp: dialogTRef + '/temp',\n template: skeleton.fields.title,\n templateId: templateId,\n currentTiddler: dialogTRef + '/output',\n text: _utils2.default.getText($tm.path.dialogs)\n };\n\n _utils2.default.touch(dialog.output);\n\n if (param.dialog) {\n\n if (param.dialog.preselects) {\n\n // register preselects\n $tw.wiki.addTiddler(new $tw.Tiddler({ title: dialog.output }, _utils2.default.flatten(param.dialog.preselects)));\n\n // remove preselects from param object\n delete param.dialog.preselects;\n }\n\n // extend the dialog object with parameters provided by the user\n _utils2.default.merge(dialog, param.dialog);\n }\n\n // force the footer to be set to the wrapper\n // the footer wrapper will determine the footer from the\n // buttons field/variable\n dialog.footer = _utils2.default.getText($tm.path.footers);\n\n // flatten dialog and param object\n dialog = _utils2.default.flatten(dialog);\n param = _utils2.default.flatten(param);\n\n var fn = function fn(tRef) {\n\n DialogManager.getElement('hidden-close-button').click();\n\n var triggerTObj = $tw.wiki.getTiddler(tRef);\n var isConfirmed = triggerTObj.fields.text;\n\n var outputTObj = null;\n if (isConfirmed) {\n outputTObj = $tw.wiki.getTiddler(dialog.output);\n } else {\n $tm.notify('operation cancelled');\n }\n\n if (typeof callback === 'function') {\n callback(isConfirmed, outputTObj);\n }\n\n // close and remove all tiddlers used by the dialog\n _utils2.default.deleteByPrefix(dialogTRef);\n };\n\n // add trigger\n this.callbackManager.add(dialog.result, fn, true);\n\n // create dialog\n var dialogTiddler = new $tw.Tiddler(skeleton, param, dialog);\n $tw.wiki.addTiddler(dialogTiddler);\n\n $tm.logger('debug', 'Opening dialog', dialogTiddler);\n\n $tw.rootWidget.dispatchEvent({\n type: 'tm-modal',\n param: dialogTiddler.fields.title,\n paramObject: dialogTiddler.fields\n });\n\n DialogManager.addKeyBindings();\n\n return dialogTiddler;\n }\n }], [{\n key: 'getElement',\n value: function getElement(name) {\n\n return _utils2.default.getFirstElementByClassName('tmap-' + name);\n }\n\n /**\n * This method will search for form elements that have the class\n * `tmap-trigger-field` set, which means that TiddlyMap shall\n * perform a button press when a key combo occurs while the field\n * has focus. To know which button to press on what key event,\n * it looks for classes of the form: tmap-triggers-BUTTONNAME-on-KEYCOMBO.\n */\n\n }, {\n key: 'addKeyBindings',\n value: function addKeyBindings() {\n\n var keys = $tm.keycharm({\n container: _utils2.default.getFirstElementByClassName('tc-modal')\n });\n\n var re = /tmap-triggers-(.+?)-on-(.+?)(?:\\s|$)/;\n var triggers = document.getElementsByClassName('tmap-trigger-field');\n\n var _loop = function _loop(i) {\n var classNames = triggers[i].className.split(' ');\n\n var _loop2 = function _loop2(j) {\n var matches = classNames[j].match(re);\n if (!matches) {\n // don't care\n return 'continue';\n }\n var buttonName = matches[1];\n var key = matches[2];\n var buttonElement = DialogManager.getElement(buttonName);\n if (!buttonElement) {\n return 'continue';\n }\n keys.bind(key, function () {\n if (document.getElementsByClassName(classNames[j]).length) {\n // only click button if trigger is active (i.e. still in focus)\n // see https://github.com/felixhayashi/TW5-TiddlyMap/issues/280\n buttonElement.click();\n }\n });\n };\n\n for (var j = classNames.length; j--;) {\n var _ret2 = _loop2(j);\n\n if (_ret2 === 'continue') continue;\n }\n };\n\n for (var i = triggers.length; i--;) {\n _loop(i);\n }\n }\n }]);\n\n return DialogManager;\n}();\n\n/*** Exports *******************************************************/\n\nexports.default = DialogManager;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/services/DialogManager.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/Fixer": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/Fixer",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/Fixer\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _ViewAbstraction = require('$:/plugins/felixhayashi/tiddlymap/js/ViewAbstraction');\n\nvar _ViewAbstraction2 = _interopRequireDefault(_ViewAbstraction);\n\nvar _EdgeType = require('$:/plugins/felixhayashi/tiddlymap/js/EdgeType');\n\nvar _EdgeType2 = _interopRequireDefault(_EdgeType);\n\nvar _NodeType = require('$:/plugins/felixhayashi/tiddlymap/js/NodeType');\n\nvar _NodeType2 = _interopRequireDefault(_NodeType);\n\nvar _environment = require('$:/plugins/felixhayashi/tiddlymap/js/lib/environment');\n\nvar env = _interopRequireWildcard(_environment);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/*** Code **********************************************************/\n\nvar Fixer = function () {\n\n /**\n * @param {Adapter} adapter\n * @param {Object} logger\n * @param {Object} glNTy\n */\n function Fixer(adapter, logger, glNTy) {\n _classCallCheck(this, Fixer);\n\n this.adapter = adapter;\n this.logger = logger;\n this.wiki = $tw.wiki;\n this.glNTy = glNTy;\n }\n\n _createClass(Fixer, [{\n key: 'moveEdges',\n value: function moveEdges(path, view) {\n\n var matches = _utils2.default.getTiddlersByPrefix(path);\n for (var i = 0; i < matches.length; i++) {\n\n // create edge type\n var type = _utils2.default.getBasename(matches[i]);\n\n if (type === '__noname__') {\n type = 'tmap:unknown';\n }\n\n type = _EdgeType2.default.getInstance(type);\n\n if (!type.exists()) {\n type.save();\n }\n\n // move edges\n var edges = this.wiki.getTiddlerData(matches[i]);\n for (var j = 0; j < edges.length; j++) {\n // prefix formerly private edges with view name as namespace\n edges[j].type = (view ? view + ':' : '') + type.id;\n this.adapter.insertEdge(edges[j]);\n }\n\n // finally remove the store\n this.wiki.deleteTiddler(matches[i]);\n }\n }\n }, {\n key: 'executeUpgrade',\n value: function executeUpgrade(toVersion, curVersion, upgrade) {\n\n if (!_utils2.default.isLeftVersionGreater(toVersion, curVersion)) {\n // = current data structure version is newer than version we want to upgrade to.\n return;\n }\n\n // issue debug message\n this.logger('debug', 'Upgrading data structure to ' + toVersion);\n // execute fix\n var msg = upgrade();\n // update meta\n _utils2.default.setEntry(env.ref.sysMeta, 'dataStructureState', toVersion);\n\n return msg;\n }\n }, {\n key: 'fixId',\n\n\n /**\n * Special fix that is not invoked along with the other fixes but\n * when creating the index (see caretaker code).\n *\n * Changes:\n * 1. The node id field is moved to tmap.id if **original version**\n * is below v0.9.2.\n */\n value: function fixId() {\n\n var meta = this.wiki.getTiddlerData(env.ref.sysMeta, {});\n\n this.executeUpgrade('0.9.2', meta.dataStructureState, function () {\n\n if (_utils2.default.isLeftVersionGreater('0.9.2', meta.originalVersion)) {\n // path of the user conf at least in 0.9.2\n var userConf = '$:/plugins/felixhayashi/tiddlymap/config/sys/user';\n var nodeIdField = _utils2.default.getEntry(userConf, 'field.nodeId', 'tmap.id');\n _utils2.default.moveFieldValues(nodeIdField, 'tmap.id', true, false);\n }\n });\n }\n }, {\n key: 'fix',\n value: function fix() {\n var _this = this;\n\n var meta = this.wiki.getTiddlerData(env.ref.sysMeta, {});\n\n this.logger('debug', 'Fixer is started');\n this.logger('debug', 'Data-structure currently in use: ', meta.dataStructureState);\n\n /**\n * Changes:\n * 1. Edges are stored in tiddlers instead of type based edge stores\n * 2. No more private views\n */\n this.executeUpgrade('0.7.0', meta.dataStructureState, function () {\n\n // move edges that were formerly \"global\"\n _this.moveEdges('$:/plugins/felixhayashi/tiddlymap/graph/edges', null);\n\n // move edges that were formerly bound to view (\"private\")\n var filter = env.selector.allViews;\n var viewRefs = _utils2.default.getMatches(filter);\n for (var i = 0; i < viewRefs.length; i++) {\n var view = new _ViewAbstraction2.default(viewRefs[i]);\n _this.moveEdges(view.getRoot() + '/graph/edges', view);\n }\n });\n\n /**\n * Changes:\n * 1. Changes to the live view filter and refresh trigger field\n */\n this.executeUpgrade('0.7.32', meta.dataStructureState, function () {\n\n if (!_ViewAbstraction2.default.exists('Live View')) {\n\n return;\n }\n\n var liveView = new _ViewAbstraction2.default('Live View');\n\n // Only listen to the current tiddler of the history list\n liveView.setNodeFilter('[field:title{$:/temp/tmap/currentTiddler}]', true);\n\n liveView.setConfig({\n 'refresh-trigger': null, // delete the field (renamed)\n 'refresh-triggers': $tw.utils.stringifyList(['$:/temp/tmap/currentTiddler'])\n });\n });\n\n /**\n * Changes:\n * 1. Group styles for matches and neighbours are now modulized\n * and stored as node-types.\n * 2. vis user configuration is restored unflattened!\n * The user only interacts through the GUI.\n * 3. If the node id field was \"id\" it is moved to tmap.id\n */\n this.executeUpgrade('0.9.0', meta.dataStructureState, function () {\n\n var confRef = env.ref.visUserConf;\n var userConf = _utils2.default.unflatten(_this.wiki.getTiddlerData(confRef, {}));\n\n if (_typeof(userConf.groups) === 'object') {\n\n var type = _NodeType2.default.getInstance('tmap:neighbour');\n type.setStyle(userConf.groups['neighbours']);\n type.save();\n\n delete userConf.groups;\n _this.wiki.setTiddlerData(confRef, userConf);\n }\n });\n\n /**\n * Changes:\n * 1. The node id field is moved to tmap.id if **original version**\n * is below v0.9.2.\n */\n this.fixId();\n\n /**\n * This will ensure that all node types have a prioritization field\n * set.\n */\n this.executeUpgrade('0.9.16', meta.dataStructureState, function () {\n\n for (var i = _this.glNTy.length; i--;) {\n _this.glNTy[i].save(null, true);\n }\n });\n\n /**\n * Fixes the live tab\n */\n this.executeUpgrade('0.10.3', meta.dataStructureState, function () {\n\n var liveTab = env.ref.liveTab;\n if (_utils2.default.getTiddler(liveTab).hasTag('$:/tags/SideBar')) {\n this.wiki.deleteTiddler(liveTab);\n _utils2.default.setField(liveTab, 'tags', '$:/tags/SideBar');\n }\n });\n\n /**\n * 1) Fixes the edge type filter. Before, an empty filter was\n * treated as default filter, i.e. no links and tags shown.\n * Now an empty filter means that we show all edge types.\n *\n * 2) Adds prefix to hide private edges per default\n *\n * 3) Corrects view-namespaces (formerly stored with colon).\n *\n */\n this.executeUpgrade('0.11.0', meta.dataStructureState, function () {\n\n var views = _utils2.default.getMatches(env.selector.allViews);\n\n for (var i = views.length; i--;) {\n\n var view = new _ViewAbstraction2.default(views[i]);\n var eTyFilter = view.getEdgeTypeFilter('raw');\n var confKey = 'edge_type_namespace';\n view.setConfig(confKey, view.getConfig(confKey));\n\n var f = env.filter.defaultEdgeTypeFilter;\n\n if (eTyFilter) {\n\n // remove any occurences of the egde type path prefix\n var edgeTypePath = env.path.edgeTypes;\n eTyFilter = _utils2.default.replaceAll(eTyFilter, '', [edgeTypePath, edgeTypePath + '/', '[prefix[' + edgeTypePath + ']]', '[prefix[' + edgeTypePath + '/]]', ['[suffix[tw-body:link]]', '[[tw-body:link]]'], ['[suffix[tw-list:tags]]', '[[tw-list:tags]]'], ['[suffix[tw-list:list]]', '[[tw-body:list]]'], ['[suffix[tmap:unknown]]', '[[tmap:unknown]]'], ['[suffix[unknown]]', '[[tmap:unknown]]']]);\n\n f = '-[prefix[_]] ' + eTyFilter;\n }\n\n view.setEdgeTypeFilter(f);\n }\n });\n }\n }]);\n\n return Fixer;\n}();\n\n/*** Exports *******************************************************/\n\nexports.default = Fixer;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/services/Fixer.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/startup/listener": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/startup/listener",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.startup = exports.synchronous = exports.before = exports.after = exports.platforms = exports.name = undefined;\n\nvar _NodeType = require('$:/plugins/felixhayashi/tiddlymap/js/NodeType');\n\nvar _NodeType2 = _interopRequireDefault(_NodeType);\n\nvar _EdgeType = require('$:/plugins/felixhayashi/tiddlymap/js/EdgeType');\n\nvar _EdgeType2 = _interopRequireDefault(_EdgeType);\n\nvar _Edge = require('$:/plugins/felixhayashi/tiddlymap/js/Edge');\n\nvar _Edge2 = _interopRequireDefault(_Edge);\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _vis = require('$:/plugins/felixhayashi/tiddlymap/js/config/vis');\n\nvar _vis2 = _interopRequireDefault(_vis);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*** Code **********************************************************/\n\n/**\n * @param {Object} param - event.param\n */\nvar handleCancelDialog = function handleCancelDialog(_ref) {\n var param = _ref.param;\n\n _utils2.default.setField(param, 'text', '');\n};\n\n/**\n * @param {Object} paramObject - event.paramObject\n */\n// @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/startup/listener\ntype: application/javascript\nmodule-type: startup\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\nvar handleClearTiddler = function handleClearTiddler() {\n var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n paramObject = _ref2.paramObject;\n\n var title = paramObject.title,\n keep = paramObject.keep;\n\n\n if (!title) return;\n\n var tObj = _utils2.default.getTiddler(title);\n var originalFields = tObj ? tObj.fields : {};\n var fieldsToKeep = keep ? keep.split() : [];\n var cloneFields = {\n title: title,\n text: '' // see https://github.com/Jermolene/TiddlyWiki5/issues/2025\n };\n\n for (var i = fieldsToKeep.length; i--;) {\n var fieldName = fieldsToKeep[i];\n cloneFields[fieldName] = originalFields[fieldName];\n }\n\n $tw.wiki.deleteTiddler(title);\n $tw.wiki.addTiddler(new $tw.Tiddler(cloneFields));\n};\n\n/**\n * @param {Object} paramObject - event.paramObject\n */\nvar handleMixTiddlers = function handleMixTiddlers(_ref3) {\n var _ref3$paramObject = _ref3.paramObject,\n paramObject = _ref3$paramObject === undefined ? {} : _ref3$paramObject;\n var tiddlersStringArray = paramObject.tiddlers,\n output = paramObject.output;\n\n\n if (!tiddlersStringArray || !output) return;\n\n var tiddlers = $tw.utils.parseStringArray(tiddlersStringArray);\n var tObj = _utils2.default.getMergedTiddlers(tiddlers, output);\n\n $tw.wiki.addTiddler(tObj);\n};\n\n/**\n * @param {string} param - event.param\n */\nvar handleConfirmDialog = function handleConfirmDialog(_ref4) {\n var param = _ref4.param;\n\n\n _utils2.default.setField(param, 'text', '1');\n};\n\n/**\n * @param {Object} paramObject - event.paramObject\n */\nvar handleSuppressDialog = function handleSuppressDialog(_ref5) {\n var paramObject = _ref5.paramObject;\n var dialog = paramObject.dialog,\n suppress = paramObject.suppress;\n\n\n if (_utils2.default.isTrue(suppress, false)) {\n _utils2.default.setEntry($tm.ref.sysUserConf, 'suppressedDialogs.' + dialog, true);\n }\n};\n\n/**\n * @param {Object} paramObject - event.paramObject\n */\nvar handleDownloadGraph = function handleDownloadGraph(_ref6) {\n var paramObject = _ref6.paramObject;\n var view = paramObject.view;\n\n var graph = $tm.adapter.getGraph({ view: view });\n\n graph.nodes = _utils2.default.convert(graph.nodes, 'array');\n graph.edges = _utils2.default.convert(graph.edges, 'array');\n\n var tRef = '$:/temp/tmap/export';\n\n _utils2.default.setField(tRef, 'text', JSON.stringify(graph, null, 2));\n\n $tw.rootWidget.dispatchEvent({\n type: 'tm-download-file',\n param: tRef,\n paramObject: {\n filename: view + '.json'\n }\n });\n};\n\n/**\n *\n */\nvar handleConfigureSystem = function handleConfigureSystem() {\n\n var allTiddlers = _utils2.default.getMatches($tm.selector.allPotentialNodes);\n var allEdges = $tm.adapter.getEdgesForSet(allTiddlers);\n var plugin = $tw.wiki.getTiddler($tm.path.pluginRoot).fields;\n var meta = $tw.wiki.getTiddlerData($tm.ref.sysMeta);\n var hasLiveTab = _utils2.default.getTiddler($tm.ref.liveTab).hasTag('$:/tags/SideBar');\n\n var args = {\n numberOfNodes: '' + allTiddlers.length,\n numberOfEdges: '' + Object.keys(allEdges).length,\n pluginVersion: 'v' + plugin.version,\n dataStructureVersion: 'v' + meta.dataStructureState,\n dialog: {\n preselects: {\n 'liveTab': '' + hasLiveTab,\n 'vis-inherited': JSON.stringify(_vis2.default),\n 'config.vis': _utils2.default.getText($tm.ref.visUserConf),\n 'config.sys': $tm.config.sys\n }\n }\n };\n\n $tm.dialogManager.open('globalConfig', args, function (isConfirmed, outTObj) {\n\n if (!isConfirmed) return;\n\n var config = _utils2.default.getPropertiesByPrefix(outTObj.fields, 'config.sys.', true);\n\n // CAREFUL: this is a data tiddler!\n $tw.wiki.setTiddlerData($tm.ref.sysUserConf, config);\n\n // show or hide the live tab; to hide the live tab, we override\n // the shadow tiddler; to show it, we remove the overlay again.\n if (_utils2.default.isTrue(outTObj.fields.liveTab, false)) {\n _utils2.default.setField($tm.ref.liveTab, 'tags', '$:/tags/SideBar');\n } else {\n $tw.wiki.deleteTiddler($tm.ref.liveTab);\n }\n\n // tw doesn't translate the json to an object so this is already a string\n _utils2.default.setField($tm.ref.visUserConf, 'text', outTObj.fields['config.vis']);\n });\n};\n\n/**\n * @param {Object} paramObject - event.paramObject\n */\nvar handleGenerateWidget = function handleGenerateWidget(_ref7) {\n var _ref7$paramObject = _ref7.paramObject,\n paramObject = _ref7$paramObject === undefined ? {} : _ref7$paramObject;\n\n\n var options = {\n dialog: {\n preselects: {\n 'var.view': paramObject.view || $tm.misc.defaultViewLabel\n }\n }\n };\n\n $tm.dialogManager.open('widgetCodeGenerator', options);\n};\n\n/**\n * @param {Object} paramObject - event.paramObject\n */\nvar handleRemoveEdge = function handleRemoveEdge(_ref8) {\n var paramObject = _ref8.paramObject;\n\n\n $tm.adapter.deleteEdge(paramObject);\n};\n\n/**\n * @param {Object} paramObject - event.paramObject\n */\nvar handleCreateEdge = function handleCreateEdge(_ref9) {\n var paramObject = _ref9.paramObject;\n var from = paramObject.from,\n to = paramObject.to,\n isForce = paramObject.force;\n\n\n if (!from || !to) return;\n\n if (_utils2.default.tiddlerExists(from) && _utils2.default.tiddlerExists(to) || isForce) {\n\n // will not override any existing tiddlers…\n _utils2.default.addTiddler(to);\n _utils2.default.addTiddler(from);\n\n var edge = new _Edge2.default($tm.adapter.makeNode(from).id, $tm.adapter.makeNode(to).id, paramObject.label, paramObject.id);\n\n $tm.adapter.insertEdge(edge);\n $tm.notify('Edge inserted');\n }\n};\n\n/**\n * @param {string} type - event.type\n * @param {Object} [paramObject] - event.paramObject\n */\nvar handleOpenTypeManager = function handleOpenTypeManager(_ref10) {\n var type = _ref10.type,\n _ref10$paramObject = _ref10.paramObject,\n paramObject = _ref10$paramObject === undefined ? {} : _ref10$paramObject;\n\n\n // either 'manage-edge-types' or 'manage-node-types'\n var mode = type.match(/tmap:tm-(.*)/)[1];\n\n if (mode === 'manage-edge-types') {\n var topic = 'Edge-Type Manager';\n var allTypesSelector = $tm.selector.allEdgeTypes;\n var typeRootPath = $tm.path.edgeTypes;\n } else {\n var topic = 'Node-Type Manager';\n var allTypesSelector = $tm.selector.allNodeTypes;\n var typeRootPath = $tm.path.nodeTypes;\n }\n\n var args = {\n mode: mode,\n topic: topic,\n searchSelector: allTypesSelector,\n typeRootPath: typeRootPath\n };\n\n var dialogTObj = $tm.dialogManager.open('MapElementTypeManager', args);\n\n if (paramObject.type) {\n handleLoadTypeForm({\n paramObject: {\n mode: mode,\n id: paramObject.type,\n output: dialogTObj.fields['output']\n }\n });\n }\n};\n\n/**\n * @param {string} id - The id of a {@link MapElementType}\n * @param {('manage-edge-types'|'manage-node-types')} mode\n * @param {TiddlerReference} output\n */\nvar handleLoadTypeForm = function handleLoadTypeForm(_ref11) {\n var _ref11$paramObject = _ref11.paramObject,\n mode = _ref11$paramObject.mode,\n id = _ref11$paramObject.id,\n output = _ref11$paramObject.output;\n\n\n var outTRef = output;\n var type = mode === 'manage-edge-types' ? _EdgeType2.default.getInstance(id) : _NodeType2.default.getInstance(id);\n\n // inject all the type data as fields into the dialog output\n type.save(outTRef, true);\n\n // fields that need preprocessing\n\n if (mode === 'manage-edge-types') {\n var usage = $tm.adapter.selectEdgesByType(type);\n var count = Object.keys(usage).length;\n _utils2.default.setField(outTRef, 'temp.usageCount', count);\n }\n\n $tw.wiki.addTiddler(new $tw.Tiddler(_utils2.default.getTiddler(outTRef), {\n 'typeTRef': type.fullPath,\n 'temp.idImmutable': type.isShipped ? 'true' : '',\n 'temp.newId': type.id,\n 'vis-inherited': JSON.stringify($tm.config.vis)\n }));\n\n // reset the tabs to default\n _utils2.default.deleteByPrefix('$:/state/tabs/MapElementTypeManager');\n};\n\n/**\n * @param {Object} paramObject - event.paramObject\n */\nvar handleSaveTypeForm = function handleSaveTypeForm(_ref12) {\n var paramObject = _ref12.paramObject;\n\n\n var tObj = _utils2.default.getTiddler(paramObject.output);\n if (!tObj) return;\n\n var id = tObj.fields.id;\n var mode = paramObject.mode;\n\n if (_utils2.default.isTrue(tObj.fields['temp.deleteType'], false)) {\n deleteType(mode, id, tObj);\n } else {\n saveType(mode, id, tObj);\n }\n};\n\nvar deleteType = function deleteType(mode, id, dialogOutput) {\n\n var type = mode === 'manage-edge-types' ? _EdgeType2.default.getInstance(id) : _NodeType2.default.getInstance(id);\n\n $tm.logger('debug', 'Deleting type', type);\n\n if (mode === 'manage-edge-types') {\n $tm.adapter._processEdgesWithType(type, { action: 'delete' });\n } else {\n $tm.adapter.removeNodeType(type);\n }\n\n $tw.wiki.addTiddler(new $tw.Tiddler({\n title: _utils2.default.getTiddlerRef(dialogOutput)\n }));\n\n $tm.notify('Deleted type');\n};\n\n/**\n * @param {string} id - The id of a {@link MapElementType}\n * @param {('manage-edge-types'|'manage-node-types')} mode\n * @param {TiddlerReference} output\n */\nvar saveType = function saveType(mode, id, output) {\n\n var tObj = _utils2.default.getTiddler(output);\n\n // update the type with the form data\n var Type = mode === 'manage-edge-types' ? _EdgeType2.default : _NodeType2.default;\n var type = new Type(id, tObj);\n type.save();\n\n var newId = tObj.fields['temp.newId'];\n\n if (newId && newId !== tObj.fields['id']) {\n //renamed\n\n if (mode === 'manage-edge-types') {\n\n $tm.adapter._processEdgesWithType(type, {\n action: 'rename',\n newName: newId\n });\n } else {\n\n new _NodeType2.default(newId, type).save();\n $tw.wiki.deleteTiddler(type.fullPath);\n }\n\n _utils2.default.setField(tObj, 'id', newId);\n }\n\n $tm.notify('Saved type data');\n};\n\n/**\n * @param {string} id - The id of a {@link MapElementType}\n * @param {('manage-edge-types'|'manage-node-types')} mode\n * @param {TiddlerReference} output\n */\nvar handleCreateType = function handleCreateType(_ref13) {\n var _ref13$paramObject = _ref13.paramObject,\n mode = _ref13$paramObject.mode,\n _ref13$paramObject$id = _ref13$paramObject.id,\n id = _ref13$paramObject$id === undefined ? 'New type' : _ref13$paramObject$id,\n output = _ref13$paramObject.output;\n\n\n var type = mode === 'manage-edge-types' ? new _EdgeType2.default(id) : new _NodeType2.default(id);\n\n type.save();\n\n handleLoadTypeForm({ paramObject: { id: type.id, mode: mode, output: output } });\n};\n\n/*** Exports *******************************************************/\n\nvar name = exports.name = 'tmap.listener';\nvar platforms = exports.platforms = ['browser'];\nvar after = exports.after = ['rootwidget', 'tmap.caretaker'];\nvar before = exports.before = ['story'];\nvar synchronous = exports.synchronous = true;\nvar startup = exports.startup = function startup() {\n _utils2.default.addTWlisteners({\n 'tmap:tm-remove-edge': handleRemoveEdge,\n 'tmap:tm-load-type-form': handleLoadTypeForm,\n 'tmap:tm-save-type-form': handleSaveTypeForm,\n 'tmap:tm-create-type': handleCreateType,\n 'tmap:tm-create-edge': handleCreateEdge,\n 'tmap:tm-suppress-dialog': handleSuppressDialog,\n 'tmap:tm-generate-widget': handleGenerateWidget,\n 'tmap:tm-download-graph': handleDownloadGraph,\n 'tmap:tm-configure-system': handleConfigureSystem,\n 'tmap:tm-manage-edge-types': handleOpenTypeManager,\n 'tmap:tm-manage-node-types': handleOpenTypeManager,\n 'tmap:tm-cancel-dialog': handleCancelDialog,\n 'tmap:tm-clear-tiddler': handleClearTiddler,\n 'tmap:tm-merge-tiddlers': handleMixTiddlers,\n 'tmap:tm-confirm-dialog': handleConfirmDialog\n }, $tw.rootWidget, undefined);\n};\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/services/Listener.js.map\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/plugins/felixhayashi/tiddlymap/js/services/tracker": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/services/tracker",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/services/tracker\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/***************************** CODE ********************************/\n\n/**\n *\n */\nvar Tracker = function () {\n function Tracker(fixer) {\n _classCallCheck(this, Tracker);\n\n this.wiki = $tw.wiki;\n this.logger = $tm.logger;\n\n this._createIndex();\n }\n\n /**\n * TiddlyMap uses ids to reference tiddlers. This function creates\n * a table that maps ids to tRefs and vice versa.\n *\n * Two indeces are added to the indeces chain:\n * 1. tById – tiddler references by id\n * 2. idByT – ids by tiddler references\n *\n * @param {Array<TiddlerReference>} [allTiddlers] - The tiddlers to\n * use as basis for this index. If not stated, all tiddlers in\n * the wiki are used.\n */\n\n\n _createClass(Tracker, [{\n key: '_createIndex',\n value: function _createIndex() {\n\n var tById = this.tById = {}; // tiddlerById\n var idByT = this.idByT = {}; // idByTiddler\n\n this.wiki.each(function (tObj, tRef) {\n\n if (_utils2.default.isSystemOrDraft(tObj)) {\n return;\n }\n\n // will create id if not present\n var id = tObj.fields['tmap.id'];\n if (!id) {\n id = _utils2.default.genUUID();\n _utils2.default.setField(tObj, 'tmap.id', id);\n }\n\n tById[id] = tRef; // tiddlerById\n idByT[tRef] = id; // idByTiddler\n });\n }\n\n /**\n * This method will assign an id to an *existing* tiddler that does\n * not already possess and id. Any assigned id will be registered\n * at the id->tiddler index.\n *\n * @param {Tiddler} tiddler - The tiddler to assign the id to.\n * @param {boolean} isForce - True if the id should be overridden,\n * false otherwise. Only works if the id field is not set to title.\n *\n * @return {Id} The assigned or retrieved id.\n */\n\n }, {\n key: 'assignId',\n value: function assignId(tiddler, isForce) {\n\n // Note: always reload from store to avoid setting wrong ids on tiddler\n // being in the role of from and to at the same time.\n var tObj = _utils2.default.getTiddler(tiddler);\n\n if (!tObj) {\n throw new ResourceNotFoundException(tiddler);\n }\n\n var id = tObj.fields['tmap.id'];\n\n if (!id || isForce) {\n id = _utils2.default.genUUID();\n _utils2.default.setField(tObj, 'tmap.id', id);\n this.logger('info', 'Assigning new id to', tObj.fields.title);\n }\n\n // blindly update the index IN ANY CASE because tiddler may have\n // an id but it is not indexed yet (e.g. because of renaming operation)\n this.tById[id] = tObj.fields.title;\n this.idByT[tObj.fields.title] = id;\n\n return id;\n }\n\n /**\n * @param {Tiddler} tiddler\n * @return string\n */\n\n }, {\n key: 'getIdByTiddler',\n value: function getIdByTiddler(tiddler) {\n\n return this.idByT[_utils2.default.getTiddlerRef(tiddler)];\n }\n }, {\n key: 'getIdsByTiddlers',\n value: function getIdsByTiddlers() {\n return this.idByT;\n }\n }, {\n key: 'getTiddlersByIds',\n value: function getTiddlersByIds() {\n return this.tById;\n }\n\n /**\n * @param id\n * @return {TiddlerReference} tiddler\n */\n\n }, {\n key: 'getTiddlerById',\n value: function getTiddlerById(id) {\n\n return this.tById[id];\n }\n }]);\n\n return Tracker;\n}();\n\n/*** Exports *******************************************************/\n\nexports.default = Tracker;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/services/Tracker.js.map\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/felixhayashi/tiddlymap/js/widget/MapConfigWidget": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/widget/MapConfigWidget",
"text": "'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/widget/MapConfigWidget\ntype: application/javascript\nmodule-type: widget\n\n@preserve\n\n\\*/\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _vis = require('$:/plugins/felixhayashi/vis/vis.js');\n\nvar _vis2 = _interopRequireDefault(_vis);\n\nvar _widget = require('$:/core/modules/widgets/widget.js');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Wrapper for the Visjs configurator.\n *\n * ```\n * <$tmap-config\n * inherited=\"FIELDNAME FIELDNAME …\"\n * extension=\"FIELDNAME\"\n * changes=\"FIELDNAME\" (default: same field as extension)\n * override=\"true|false\" (default: false)\n * mode=\"manage-*\"\n * refresh-trigger=\"tRef\" />\n * ```\n *\n * @constructor\n */\nfunction MapConfigWidget(parseTreeNode, options) {\n\n // call the parent constructor\n _widget.widget.call(this);\n\n // call initialise on prototype\n this.initialise(parseTreeNode, options);\n\n // make the html attributes available to this widget\n this.computeAttributes();\n}\n\n// !! EXTENSION !!\nMapConfigWidget.prototype = Object.create(_widget.widget.prototype);\n// !! EXTENSION !!\n\n/**\n * Method to render this widget into the DOM.\n *\n * @override\n */\nMapConfigWidget.prototype.render = function (parent, nextSibling) {\n\n // remember our place in the dom\n this.parentDomNode = parent;\n\n if (!this.domNode) {\n this.domNode = this.document.createElement('div');\n $tw.utils.addClass(this.domNode, 'tmap-config-widget');\n parent.insertBefore(this.domNode, nextSibling);\n }\n\n if (this.network) {\n\n // destroy any previous instance\n this.network.destroy();\n }\n\n // create container for vis configurator; destroyed when vis is destroyed\n this.networkContainer = document.createElement('div');\n this.domNode.appendChild(this.networkContainer);\n\n // get environment\n this.refreshTrigger = this.getAttribute('refresh-trigger');\n this.pipeTRef = this.getVariable('currentTiddler');\n this.inheritedFields = $tw.utils.parseStringArray(this.getAttribute('inherited'));\n this.extensionTField = this.getAttribute('extension');\n this.mode = this.getAttribute('mode');\n\n // load inherited options\n for (var i = 0; i < this.inheritedFields.length; i++) {\n var fieldName = this.inheritedFields[i];\n var style = _utils2.default.parseFieldData(this.pipeTRef, fieldName, {});\n\n // maybe the inherited options also come without a top level property\n // so we do the same here to…\n // TODO looks clumsy; do it in a more generic way…\n if (this.mode === 'manage-edge-types') {\n if (!style.edges) {\n style = { edges: style };\n }\n } else if (this.mode === 'manage-node-types') {\n if (!style.nodes) {\n style = { nodes: style };\n }\n }\n\n this.inherited = _utils2.default.merge(this.inherited, style);\n }\n\n // load extension to the inherited options; since we store vis config\n // for nodes and edges without the top level property, we may need to\n // append it again, if not done so already.\n this.extension = _utils2.default.parseFieldData(this.pipeTRef, this.extensionTField, {});\n // TODO looks clumsy; do it in a more generic way…\n if (this.mode === 'manage-edge-types') {\n if (!this.extension.edges) {\n this.extension = { edges: this.extension };\n }\n } else if (this.mode === 'manage-node-types') {\n if (!this.extension.nodes) {\n this.extension = { nodes: this.extension };\n }\n }\n\n // we record all changes in a separate variable\n var isSaveOnlyChanges = _utils2.default.isTrue(this.getAttribute('save-only-changes'));\n this.changes = isSaveOnlyChanges ? {} : this.extension;\n\n var data = { nodes: [], edges: [] };\n var options = _utils2.default.merge({}, this.inherited, this.extension);\n $tw.utils.extend(options, {\n configure: {\n enabled: true,\n showButton: false,\n filter: this.getOptionFilter(this.mode)\n }\n });\n\n this.network = new _vis2.default.Network(this.networkContainer, data, options);\n this.network.on('configChange', this.handleConfigChange.bind(this));\n\n // giving the parent a css height will prevent it from jumping\n // back when the network is destroyed and the network\n // container is removed.\n // fixes https://github.com/almende/vis/issues/1568\n var height = this.parentDomNode.getBoundingClientRect().height;\n this.parentDomNode.style['height'] = height + 'px';\n\n var reset = this.handleResetEvent.bind(this);\n this.networkContainer.addEventListener('reset', reset, false);\n\n // register this graph at the caretaker's graph registry\n $tm.registry.push(this);\n\n this.enhanceConfigurator();\n};\n\n/**\n * I only receive the option that has actually changed\n */\nMapConfigWidget.prototype.handleResetEvent = function (ev) {\n var change = {};\n change[ev.detail.trigger.path] = null;\n this.handleConfigChange(change);\n};\n\n/**\n * I only receive the option that has actually changed\n */\nMapConfigWidget.prototype.handleConfigChange = function (change) {\n\n var flatChanges = _utils2.default.flatten(this.changes);\n var flatChange = _utils2.default.flatten(change);\n var confPath = Object.keys(_utils2.default.flatten(change))[0];\n var isReset = flatChange[confPath] === null;\n\n if (isReset) {\n // we interpret this as delete\n\n flatChanges[confPath] = undefined;\n this.changes = _utils2.default.unflatten(flatChanges);\n } else {\n\n this.changes = _utils2.default.merge(this.changes, change);\n }\n\n // when storing edge- or node-styles we strip the root property\n var options = _utils2.default.merge({}, this.changes);\n if (this.mode === 'manage-node-types') {\n options = options['nodes'];\n }\n if (this.mode === 'manage-edge-types') {\n options = options['edges'];\n }\n\n // save changes\n _utils2.default.writeFieldData(this.pipeTRef, this.extensionTField, options, $tm.config.sys.jsonIndentation);\n\n // hack to ensure vis doesn't scroll\n var cls = 'vis-configuration-wrapper';\n var div = this.networkContainer.getElementsByClassName(cls)[0];\n div.style.height = div.getBoundingClientRect().height + 'px';\n\n if (isReset) {\n\n // we need to use a timeout here, otherwise we cause a vis bug\n // since it is in the middle of storing the value!\n window.setTimeout(this.refresh.bind(this), 0);\n } else {\n\n // add active-config indicators\n window.setTimeout(this.enhanceConfigurator.bind(this), 50);\n }\n};\n\n/**\n * enhanceConfigurator over all config items and add an indicator.\n */\nMapConfigWidget.prototype.enhanceConfigurator = function () {\n\n var cls = 'vis-configuration-wrapper';\n var elements = this.networkContainer.getElementsByClassName(cls)[0].children;\n var list = [];\n var changes = _utils2.default.flatten(this.changes);\n for (var i = 0; i < elements.length; i++) {\n if (!elements[i].classList.contains('vis-config-item')) continue;\n\n var conf = new VisConfElement(elements[i], list, i);\n list.push(conf);\n\n if (conf.level === 0) continue;\n\n conf.setActive(!!changes[conf.path]);\n }\n};\n\n/**\n *\n * @param {DOMElement} The config item element.\n * @param {Array<VisConfElement>} a list of VisConfElements of which\n * this element is also part of.\n * @param {number} the position in the list\n */\nfunction VisConfElement(el, list, pos) {\n\n var getByCls = 'getElementsByClassName';\n\n this.el = el;\n this.labelEl = el[getByCls]('vis-config-label')[0] || el[getByCls]('vis-config-header')[0] || el;\n var labelText = this.labelEl.innerText || this.labelEl.textContent;\n this.label = labelText && labelText.match(/([a-zA-Z0-9]+)/)[1];\n this.level = parseInt(el.className.match(/.*vis-config-s(.).*/)[1]) || 0;\n\n this.path = this.label;\n\n if (this.level > 0) {\n for (var i = pos; i--;) {\n var prev = list[i];\n if (prev.level < this.level) {\n this.path = prev.path + '.' + this.path;\n break;\n }\n }\n }\n}\n\nVisConfElement.prototype.setActive = function (isEnable) {\n\n if (!isEnable) return;\n\n // cannot use utils.hasKeyWithPrefix because some keys start with\n // same value as others\n var cls = 'tmap-vis-config-item-' + (isEnable ? 'active' : 'inactive');\n $tw.utils.addClass(this.el, cls);\n\n if (isEnable) {\n\n var button = document.createElement('button');\n button.innerHTML = 'reset';\n button.className = 'tmap-config-item-reset';\n\n var self = this;\n\n button.addEventListener('click', function (ev) {\n ev.currentTarget.dispatchEvent(new CustomEvent('reset', {\n detail: { trigger: self },\n bubbles: true,\n cancelable: true\n }));\n }, false);\n\n this.el.appendChild(button);\n }\n};\n\n/**\n *\n *\n */\nMapConfigWidget.prototype.getOptionFilter = function (mode) {\n\n var whitelist = {\n nodes: {\n borderWidth: true,\n borderWidthSelected: true,\n color: {\n background: true,\n border: true\n },\n font: {\n color: true,\n size: true\n },\n icon: true,\n labelHighlightBold: false,\n shadow: true,\n shape: true,\n shapeProperties: {\n borderDashes: true\n\n },\n size: true\n },\n edges: {\n arrows: true,\n color: true,\n dashes: true,\n font: true,\n labelHighlightBold: false,\n length: true,\n selfReferenceSize: false,\n shadow: true,\n smooth: true,\n width: true\n },\n interaction: {\n hideEdgesOnDrag: true,\n hideNodesOnDrag: true,\n tooltipDelay: true\n },\n layout: {\n hierarchical: false\n },\n manipulation: {\n initiallyActive: true\n },\n physics: {\n forceAtlas2Based: {\n gravitationalConstant: true,\n springLength: true,\n springConstant: true,\n damping: true,\n centralGravity: true\n }\n }\n };\n\n if (mode === 'manage-edge-types') {\n whitelist = { edges: whitelist.edges };\n } else if (mode === 'manage-node-types') {\n whitelist = { nodes: whitelist.nodes };\n } else {\n whitelist.edges.arrows = false;\n }\n\n return function (option, path) {\n\n // operate on a clone; add option as element\n path = path.concat([option]);\n\n var wlObj = whitelist;\n for (var i = 0, l = path.length; i < l; i++) {\n if (wlObj[path[i]] === true) {\n return true;\n } else if (wlObj[path[i]] == null) {\n return false;\n } // else assume object\n wlObj = wlObj[path[i]];\n }\n\n return false;\n };\n};\n\n/**\n * A zombie widget is a widget that is removed from the dom tree\n * but still referenced or still partly executed -- I mean\n * otherwise you couldn't call this function, right?\n *\n * @TODO Outsource this as interface or common super class\n */\nMapConfigWidget.prototype.isZombieWidget = function () {\n\n return !document.body.contains(this.parentDomNode);\n};\n\n/**\n * called from outside.\n *\n * @TODO Outsource this as interface or common super class\n */\nMapConfigWidget.prototype.destruct = function () {\n\n if (this.network) {\n this.network.destroy();\n }\n};\n\n/**\n * This function is called by the system to notify the widget about\n * tiddler changes.\n *\n * @override\n */\nMapConfigWidget.prototype.refresh = function (changedTiddlers) {\n\n if (this.isZombieWidget() || !this.network) return;\n\n if (!changedTiddlers || changedTiddlers[this.refreshTrigger]) {\n this.refreshSelf();\n return true;\n }\n};\n\nMapConfigWidget.prototype.setNull = function (obj) {\n\n for (var p in obj) {\n\n if (_typeof(obj[p]) == 'object') {\n\n this.setNull(obj[p]);\n } else {\n\n obj[p] = undefined;\n }\n }\n};\n\n/*** Exports *******************************************************/\n\nexports['tmap-config'] = MapConfigWidget;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/widget/ConfigurationWidget.js.map\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/felixhayashi/tiddlymap/js/widget/EdgeListWidgetItem": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/widget/EdgeListWidgetItem",
"text": "'use strict';\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _widget = require('$:/core/modules/widgets/widget.js');\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/widget/EdgeListWidgetItem\ntype: application/javascript\nmodule-type: widget\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\n/*** Code **********************************************************/\n\nvar EdgeListItemWidget = function (_Widget) {\n _inherits(EdgeListItemWidget, _Widget);\n\n function EdgeListItemWidget(parseTreeNode, options) {\n _classCallCheck(this, EdgeListItemWidget);\n\n var _this = _possibleConstructorReturn(this, (EdgeListItemWidget.__proto__ || Object.getPrototypeOf(EdgeListItemWidget)).call(this, parseTreeNode, options));\n\n _this.arrows = $tm.misc.arrows;\n\n return _this;\n }\n\n _createClass(EdgeListItemWidget, [{\n key: 'execute',\n value: function execute() {\n\n var item = this.parseTreeNode;\n var tRef = $tm.tracker.getTiddlerById(item.neighbour.id);\n\n // make edge properties available as variables\n var edge = _utils2.default.flatten(item.edge);\n\n for (var p in edge) {\n if (typeof edge[p] === 'string') {\n this.setVariable('edge.' + p, edge[p]);\n }\n }\n\n // Perspective: Neighbour\n this.setVariable('currentTiddler', tRef);\n this.setVariable('neighbour', tRef);\n\n var type = $tm.indeces.allETy[edge.type];\n var indexedAs = edge.to === item.neighbour.id ? 'to' : 'from';\n var arrow = indexedAs;\n\n if (type.biArrow) {\n arrow = 'bi';\n } else {\n if (indexedAs === 'to' && type.invertedArrow) {\n arrow = 'from';\n } else if (indexedAs === 'from' && type.invertedArrow) {\n arrow = 'to';\n }\n }\n\n this.setVariable('direction', arrow);\n this.setVariable('directionSymbol', arrow === 'bi' ? this.arrows.bi : arrow === 'from' ? this.arrows.in : this.arrows.out);\n\n // Construct the child widgets\n this.makeChildWidgets();\n }\n }, {\n key: 'refresh',\n value: function refresh(changedTiddlers) {\n\n return this.refreshChildren(changedTiddlers);\n }\n }]);\n\n return EdgeListItemWidget;\n}(_widget.widget);\n\n/*** Exports *******************************************************/\n\nexports['tmap-edgelistitem'] = EdgeListItemWidget;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/widget/EdgeListItemWidget.js.map\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/felixhayashi/tiddlymap/js/widget/EdgeListWidget": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/widget/EdgeListWidget",
"text": "'use strict';\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _widget = require('$:/core/modules/widgets/widget.js');\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/widget/EdgeListWidget\ntype: application/javascript\nmodule-type: widget\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\n/*** Code **********************************************************/\n\nvar EdgeListWidget = function (_Widget) {\n _inherits(EdgeListWidget, _Widget);\n\n function EdgeListWidget(parseTreeNode, options) {\n _classCallCheck(this, EdgeListWidget);\n\n return _possibleConstructorReturn(this, (EdgeListWidget.__proto__ || Object.getPrototypeOf(EdgeListWidget)).call(this, parseTreeNode, options));\n }\n\n _createClass(EdgeListWidget, [{\n key: 'render',\n value: function render(parent, nextSibling) {\n\n this.parentDomNode = parent;\n this.computeAttributes();\n this.execute();\n this.renderChildren(parent, nextSibling);\n }\n }, {\n key: 'execute',\n value: function execute() {\n\n var nodes = [this.getVariable('currentTiddler')];\n var filter = this.getAttribute('filter', '');\n var direction = this.getAttribute('direction', 'both');\n var allETy = $tm.indeces.allETy;\n var matches = _utils2.default.getEdgeTypeMatches(filter, allETy);\n\n var options = {\n typeWL: _utils2.default.getLookupTable(matches),\n direction: direction\n };\n\n // retrieve nodes and edges\n\n var _$tm$adapter$getNeigh = $tm.adapter.getNeighbours(nodes, options),\n neighbours = _$tm$adapter$getNeigh.nodes,\n edges = _$tm$adapter$getNeigh.edges;\n\n var entries = [];\n for (var id in edges) {\n\n var edge = edges[id];\n var neighbour = neighbours[edge.to] || neighbours[edge.from];\n\n if (!neighbour) {\n // obsolete edge from old times;\n continue;\n }\n\n // make item template\n entries.push({\n type: 'tmap-edgelistitem',\n edge: edge,\n typeWL: options.typeWL,\n neighbour: neighbour,\n // the children of this widget (=what is wrapped inside the\n // widget-element's body) is used as template for the list items\n children: this.parseTreeNode.children\n });\n }\n\n if (!entries.length) {\n\n this.wasEmpty = true;\n entries = this.getEmptyMessage();\n } else if (this.wasEmpty) {\n\n // we need to remove the empty message\n this.removeChildDomNodes();\n }\n\n this.makeChildWidgets(entries);\n }\n }, {\n key: 'getEmptyMessage',\n value: function getEmptyMessage() {\n\n var parser = this.wiki.parseText('text/vnd.tiddlywiki', this.getAttribute('emptyMessage', ''), { parseAsInline: true });\n\n return parser ? parser.tree : [];\n }\n }, {\n key: 'refresh',\n value: function refresh(changedTiddlers) {\n\n var changedAttributes = this.computeAttributes();\n\n if (_utils2.default.hasElements(changedAttributes)) {\n\n this.refreshSelf();\n\n return true;\n }\n\n for (var tRef in changedTiddlers) {\n if (!_utils2.default.isSystemOrDraft(tRef)) {\n\n this.refreshSelf();\n\n return true;\n }\n }\n\n // let children decide for themselves\n return this.refreshChildren(changedTiddlers);\n }\n }]);\n\n return EdgeListWidget;\n}(_widget.widget);\n\n/*** Exports *******************************************************/\n\nexports['tmap-connections'] = EdgeListWidget;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/widget/EdgeListWidget.js.map\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/felixhayashi/tiddlymap/js/widget/MapWidget": {
"title": "$:/plugins/felixhayashi/tiddlymap/js/widget/MapWidget",
"text": "'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.tiddlymap = exports.tmap = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _CallbackManager = require('$:/plugins/felixhayashi/tiddlymap/js/CallbackManager');\n\nvar _CallbackManager2 = _interopRequireDefault(_CallbackManager);\n\nvar _ViewAbstraction = require('$:/plugins/felixhayashi/tiddlymap/js/ViewAbstraction');\n\nvar _ViewAbstraction2 = _interopRequireDefault(_ViewAbstraction);\n\nvar _EdgeType = require('$:/plugins/felixhayashi/tiddlymap/js/EdgeType');\n\nvar _EdgeType2 = _interopRequireDefault(_EdgeType);\n\nvar _Popup = require('$:/plugins/felixhayashi/tiddlymap/js/Popup');\n\nvar _Popup2 = _interopRequireDefault(_Popup);\n\nvar _vis = require('$:/plugins/felixhayashi/vis/vis.js');\n\nvar _vis2 = _interopRequireDefault(_vis);\n\nvar _widget = require('$:/core/modules/widgets/widget.js');\n\nvar _utils = require('$:/plugins/felixhayashi/tiddlymap/js/utils');\n\nvar _utils2 = _interopRequireDefault(_utils);\n\nvar _SelectionRectangle = require('$:/plugins/felixhayashi/tiddlymap/js/lib/SelectionRectangle');\n\nvar _SelectionRectangle2 = _interopRequireDefault(_SelectionRectangle);\n\nvar _environment = require('$:/plugins/felixhayashi/tiddlymap/js/lib/environment');\n\nvar env = _interopRequireWildcard(_environment);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // @preserve\n/*\\\n\ntitle: $:/plugins/felixhayashi/tiddlymap/js/widget/MapWidget\ntype: application/javascript\nmodule-type: widget\n\n@preserve\n\n\\*/\n\n/*** Imports *******************************************************/\n\n/*** Code **********************************************************/\n\n/**\n * The map widget is responsible for drawing the actual network\n * diagrams.\n *\n * @constructor\n */\nvar MapWidget = function (_Widget) {\n _inherits(MapWidget, _Widget);\n\n function MapWidget(parseTreeNode, options) {\n _classCallCheck(this, MapWidget);\n\n // create shortcuts for services and frequently used vars\n var _this = _possibleConstructorReturn(this, (MapWidget.__proto__ || Object.getPrototypeOf(MapWidget)).call(this, parseTreeNode, options));\n\n _this.getAttr = _this.getAttribute;\n _this.isDebug = _utils2.default.isTrue($tm.config.sys.debug, false);\n\n // force early binding of functions to this context\n _utils2.default.bindTo(_this, ['constructTooltip', 'handleResizeEvent', 'handleClickEvent', 'handleCanvasKeyup', 'handleCanvasKeydown', 'handleCanvasScroll', 'handleCanvasMouseMove', 'handleWidgetKeyup', 'handleWidgetKeydown', 'handleTriggeredRefresh', 'handleContextMenu']);\n\n // instanciate managers\n _this.callbackManager = new _CallbackManager2.default();\n\n // make the html attributes available to this widget\n _this.computeAttributes();\n _this.editorMode = _this.getAttr('editor');\n _this.clickToUse = _utils2.default.isTrue(_this.getAttr('click-to-use'), false);\n\n // who am I? the id is used for debugging and special cases\n _this.id = _this.getAttr('object-id') || _this.getStateQualifier();\n\n _this.widgetPopupsPath = $tm.path.tempPopups + '/' + _this.id;\n\n // register listeners that are available in editor mode\n if (_this.editorMode) {\n _utils2.default.addTWlisteners({\n 'tmap:tm-create-view': _this.handleCreateView,\n 'tmap:tm-rename-view': _this.handleRenameView,\n 'tmap:tm-delete-view': _this.handleDeleteView,\n 'tmap:tm-delete-element': _this.handleDeleteElement,\n 'tmap:tm-edit-view': _this.handleEditView,\n 'tmap:tm-generate-widget': _this.handleGenerateWidget,\n 'tmap:tm-toggle-central-topic': _this.handleSetCentralTopic,\n 'tmap:tm-save-canvas': _this.handleSaveCanvas\n }, _this, _this);\n }\n\n // register listeners that are available in any case\n _utils2.default.addTWlisteners({\n 'tmap:tm-focus-node': _this.handleFocusNode,\n 'tmap:tm-reset-focus': _this.repaintGraph\n }, _this, _this);\n\n // Visjs handlers\n _this.visListeners = {\n 'click': _this.handleVisSingleClickEvent,\n 'doubleClick': _this.handleVisDoubleClickEvent,\n 'stabilized': _this.handleVisStabilizedEvent,\n 'selectNode': _this.handleVisSelectNode,\n 'deselectNode': _this.handleVisDeselectNode,\n 'dragStart': _this.handleVisDragStart,\n 'dragEnd': _this.handleVisDragEnd,\n 'hoverNode': _this.handleVisHoverElement,\n 'hoverEdge': _this.handleVisHoverElement,\n 'blurNode': _this.handleVisBlurElement,\n 'blurEdge': _this.handleVisBlurElement,\n 'beforeDrawing': _this.handleVisBeforeDrawing,\n 'afterDrawing': _this.handleVisAfterDrawing,\n 'stabilizationProgress': _this.handleVisLoading,\n 'stabilizationIterationsDone': _this.handleVisLoadingDone\n };\n\n _this.windowDomListeners = {\n 'resize': [_this.handleResizeEvent, false],\n 'click': [_this.handleClickEvent, false],\n 'mousemove': [_this.handleCanvasMouseMove, true]\n };\n\n _this.canvasDomListeners = {\n 'keyup': [_this.handleCanvasKeyup, true],\n 'keydown': [_this.handleCanvasKeydown, true],\n 'mousewheel': [_this.handleCanvasScroll, true],\n 'DOMMouseScroll': [_this.handleCanvasScroll, true],\n 'contextmenu': [_this.handleContextMenu, true]\n };\n\n _this.widgetDomListeners = {\n 'keyup': [_this.handleWidgetKeyup, true],\n 'keydown': [_this.handleWidgetKeydown, true]\n };\n\n _this.conVector = { from: null, to: null };\n return _this;\n }\n\n /**\n * This handler will open a dialog that allows the user to create a\n * new relation between two edges. This includes, that the user\n * gets a chance to specify the edgetype of the connection.\n *\n * If an edge-type namespace has been declared for the entire view,\n * then add it to the `id` of the specified type…\n * - …if the type doesn't exist yet.\n * - …if the type doesn't contain a namespace already, regardless\n * whether it exists or not.\n *\n * Once the user confirmed the dialog, the edge is persisted.\n *\n * Note: this should not trigger a zoom.\n *\n * @param {Edge} edge - A javascript object that contains at least\n * the properties 'from' and 'to'\n * @param {function} [callback] - A function with the signature\n * function(isConfirmed);\n */\n\n\n _createClass(MapWidget, [{\n key: 'handleConnectionEvent',\n value: function handleConnectionEvent(edge, callback) {\n var _this2 = this;\n\n var eTyFilter = this.view.getEdgeTypeFilter();\n\n var param = {\n fromLabel: $tm.adapter.selectNodeById(edge.from).label,\n toLabel: $tm.adapter.selectNodeById(edge.to).label,\n view: this.view.getLabel(),\n eTyFilter: eTyFilter.raw\n };\n\n $tm.dialogManager.open('getEdgeType', param, function (isConfirmed, outTObj) {\n\n if (isConfirmed) {\n\n var str = _utils2.default.getText(outTObj);\n var type = _EdgeType2.default.getInstance(str);\n\n if (!type.namespace) {\n var _EdgeType$getIdParts = _EdgeType2.default.getIdParts(type.id),\n marker = _EdgeType$getIdParts.marker,\n name = _EdgeType$getIdParts.name;\n\n var namespace = _this2.view.getConfig('edge_type_namespace');\n type = _EdgeType2.default.getInstance(_EdgeType2.default.getId(marker, namespace, name));\n }\n\n // persist the type if it doesn't exist\n if (!type.exists()) {\n type.save();\n }\n\n // add type to edge\n edge.type = type.id;\n $tm.adapter.insertEdge(edge);\n\n // prevent zoom\n _this2.isPreventZoomOnNextUpdate = true;\n\n if (!_this2.view.isEdgeTypeVisible(type)) {\n\n $tm.dialogManager.open('edgeNotVisible', {\n type: type.id,\n view: _this2.view.getLabel(),\n eTyFilter: eTyFilter.pretty\n });\n }\n }\n\n if (typeof callback === 'function') {\n callback(isConfirmed);\n }\n });\n }\n\n /**\n * The first time a map is opened, we want to display a welcome message.\n * Once shown, a flag is set and the message is not displayed again.\n */\n\n }, {\n key: 'checkForFreshInstall',\n value: function checkForFreshInstall() {\n\n if (!_utils2.default.getEntry($tm.ref.sysMeta, 'showWelcomeMessage', true)) {\n return;\n }\n\n _utils2.default.setEntry($tm.ref.sysMeta, 'showWelcomeMessage', false);\n\n var args = {\n dialog: {\n preselects: {\n \"config.storyview\": \"true\",\n \"config.navigation\": \"true\",\n \"config.sidebar\": \"true\",\n \"config.demo\": \"true\"\n }\n }\n };\n\n $tm.dialogManager.open('welcome', args, function (isConfirmed, outTObj) {\n\n var config = _utils2.default.getPropertiesByPrefix(outTObj.fields, 'config.', true);\n\n if (config['storyview'] && _utils2.default.tiddlerExists('$:/plugins/felixhayashi/topstoryview')) {\n _utils2.default.setText('$:/view', 'top');\n }\n\n if (config['navigation']) {\n _utils2.default.setText('$:/config/Navigation/openLinkFromInsideRiver', 'above');\n _utils2.default.setText('$:/config/Navigation/openLinkFromOutsideRiver', 'top');\n }\n\n if (config['sidebar']) {\n _utils2.default.setText('$:/themes/tiddlywiki/vanilla/options/sidebarlayout', 'fixed-fluid');\n }\n\n if (config['demo']) {\n var view = $tm.misc.defaultViewLabel;\n\n var n1 = $tm.adapter.insertNode({ label: 'Have fun with', x: 0, y: 0 }, view);\n var n2 = $tm.adapter.insertNode({ label: 'TiddlyMap!!', x: 100, y: 100 }, view);\n\n $tm.adapter.insertEdge({ from: n1.id, to: n2.id });\n }\n\n if (Object.keys(config).length) {\n // trigger a save and reload message\n _utils2.default.touch('$:/plugins/felixhayashi/tiddlymap');\n }\n });\n }\n\n /**\n * A very basic dialog that will tell the user he/she has to make\n * a choice.\n *\n * @param {function} [callback] - A function with the signature\n * function(isConfirmed).\n * @param {string} [message] - An small optional message to display.\n */\n\n }, {\n key: 'openStandardConfirmDialog',\n value: function openStandardConfirmDialog(callback, message) {\n\n var param = { message: message };\n $tm.dialogManager.open('getConfirmation', param, callback);\n }\n\n /**\n * An extention of the default logger mechanism. It works like\n * `this.logger` but will include the object id of the widget\n * instance.\n *\n * @param {string} type - The type of the message (debug, info, warning…)\n * which is exactly the same as in `console[type]`.\n * @param {...*} message - An infinite number of arguments to be printed\n * (just like console).\n */\n\n }, {\n key: 'logger',\n value: function logger(type, message /*, more stuff*/) {\n\n if (this.isDebug) {\n\n var args = Array.prototype.slice.call(arguments, 1);\n args.unshift('@' + this.id);\n args.unshift(type);\n $tm.logger.apply(this, args);\n }\n }\n\n /**\n * Method to render this widget into the DOM.\n *\n * Note that we do not add this.domNode to the list of domNodes\n * since this widget does never remove itself during a refresh.\n *\n * @override\n */\n\n }, {\n key: 'render',\n value: function render(parent, nextSibling) {\n\n this.parentDomNode = parent;\n\n this.domNode = this.document.createElement('div');\n parent.insertBefore(this.domNode, nextSibling);\n\n // add widget classes\n this.registerClassNames(this.domNode);\n\n // get view and view holder\n this.viewHolderRef = this.getViewHolderRef();\n this.view = this.getView();\n\n // create the header div\n this.graphBarDomNode = this.document.createElement('div');\n $tw.utils.addClass(this.graphBarDomNode, 'tmap-topbar');\n this.domNode.appendChild(this.graphBarDomNode);\n\n // create body div\n this.graphDomNode = this.document.createElement('div');\n this.domNode.appendChild(this.graphDomNode);\n\n $tw.utils.addClass(this.graphDomNode, 'tmap-vis-graph');\n\n if (_utils2.default.isPreviewed(this)) {\n\n $tw.utils.addClass(this.domNode, 'tmap-static-mode');\n this.renderPreview(this.graphBarDomNode, this.graphDomNode);\n } else {\n\n // render the full widget\n this.renderFullWidget(this.domNode, this.graphBarDomNode, this.graphDomNode);\n }\n }\n\n /**\n * When the widget is only previewed we do some alternative rendering.\n */\n\n }, {\n key: 'renderPreview',\n value: function renderPreview(header, body) {\n\n var snapshotTRef = this.view.getRoot() + '/snapshot';\n var snapshotTObj = _utils2.default.getTiddler(snapshotTRef);\n\n var label = this.document.createElement('span');\n label.innerHTML = this.view.getLabel();\n label.className = 'tmap-view-label';\n header.appendChild(label);\n\n if (snapshotTObj) {\n\n // Construct child widget tree\n var placeholder = this.makeChildWidget(_utils2.default.getTranscludeNode(snapshotTRef), true);\n placeholder.renderChildren(body, null);\n } else {\n\n $tw.utils.addClass(body, 'tmap-graph-placeholder');\n }\n }\n\n /**\n * The standard way of rendering.\n * Attention: BE CAREFUL WITH THE ORDER OF FUNCTION CALLS IN THIS FUNCTION.\n */\n\n }, {\n key: 'renderFullWidget',\n value: function renderFullWidget(widget, header, body) {\n\n // add window and widget dom node listeners\n _utils2.default.setDomListeners('add', window, this.windowDomListeners);\n _utils2.default.setDomListeners('add', widget, this.widgetDomListeners);\n\n // add a loading bar\n this.addLoadingBar(this.domNode);\n\n // prepare the tooltip for graph elements\n this.tooltip = new _Popup2.default(this.domNode, {\n className: 'tmap-tooltip',\n showDelay: $tm.config.sys.popups.delay\n });\n\n // prepare the context menu\n this.contextMenu = new _Popup2.default(this.domNode, {\n className: 'tmap-context-menu',\n showDelay: 0,\n hideOnClick: true,\n leavingDelay: 999999\n });\n\n // register\n this.sidebar = _utils2.default.getFirstElementByClassName('tc-sidebar-scrollable');\n this.isInSidebar = this.sidebar && !this.domNode.isTiddlyWikiFakeDom && this.sidebar.contains(this.domNode);\n\n // *first* inject the bar\n this.rebuildEditorBar(header);\n\n // *second* initialise graph variables and render the graph\n this.initAndRenderGraph(body);\n\n // register this graph at the caretaker's graph registry\n $tm.registry.push(this);\n\n // if any refresh-triggers exist, register them\n this.reloadRefreshTriggers();\n\n // maybe display a welcome message\n this.checkForFreshInstall();\n\n if (this.id === $tm.misc.mainEditorId) {\n\n var url = $tm.url;\n if (url && url.query['tmap-enlarged']) {\n\n this.toggleEnlargedMode(url.query['tmap-enlarged']);\n //~ this.setView(url.query['tmap-view']);\n }\n }\n }\n\n /**\n * Add some classes to give the user a chance to apply some css\n * to different graph modes.\n */\n\n }, {\n key: 'registerClassNames',\n value: function registerClassNames(parent) {\n\n var addClass = $tw.utils.addClass;\n\n // add main class\n addClass(parent, 'tmap-widget');\n\n if (this.clickToUse) {\n addClass(parent, 'tmap-click-to-use');\n }\n\n if (this.getAttr('editor') === 'advanced') {\n addClass(parent, 'tmap-advanced-editor');\n }\n\n if (this.getAttr('design') === 'plain') {\n addClass(parent, 'tmap-plain-design');\n }\n\n if (!_utils2.default.isTrue(this.getAttr('show-buttons'), true)) {\n addClass(parent, 'tmap-no-buttons');\n }\n\n if (this.getAttr('class')) {\n addClass(parent, this.getAttr('class'));\n }\n }\n\n /**\n * Adds a loading bar div below the parent.\n */\n\n }, {\n key: 'addLoadingBar',\n value: function addLoadingBar(parent) {\n\n this.graphLoadingBarDomNode = this.document.createElement('progress');\n $tw.utils.addClass(this.graphLoadingBarDomNode, 'tmap-loading-bar');\n parent.appendChild(this.graphLoadingBarDomNode);\n }\n\n /**\n * The editor bar contains a bunch of widgets that allow the user\n * to manipulate the current view.\n *\n * Attention: The Editor bar needs to render *after* the graph\n * because some elements depend on the graph's nodes which are\n * calculated when the network is created.\n *\n * @see https://groups.google.com/forum/#!topic/tiddlywikidev/sJrblP4A0o4\n * @see blob/master/editions/test/tiddlers/tests/test-wikitext-parser.js\n */\n\n }, {\n key: 'rebuildEditorBar',\n value: function rebuildEditorBar() {\n\n this.removeChildDomNodes();\n\n // register dialog variables\n\n var view = this.view;\n\n var unicodeBtnClass = 'tmap-unicode-button';\n var activeUnicodeBtnClass = unicodeBtnClass + ' tmap-active-button';\n var variables = {\n widgetQualifier: this.getStateQualifier(),\n widgetTempPath: this.widgetTempPath,\n widgetPopupsPath: this.widgetPopupsPath,\n isViewBound: String(this.isViewBound()),\n viewRoot: view.getRoot(),\n viewLabel: view.getLabel(),\n viewHolder: this.getViewHolderRef(),\n edgeTypeFilter: view.edgeTypeFilterTRef,\n allEdgesFilter: $tm.selector.allEdgeTypes,\n neighScopeBtnClass: view.isEnabled('neighbourhood_scope') ? activeUnicodeBtnClass : unicodeBtnClass,\n rasterMenuBtnClass: view.isEnabled('raster') ? activeUnicodeBtnClass : unicodeBtnClass\n };\n\n for (var name in variables) {\n this.setVariable(name, variables[name]);\n }\n\n // Construct the child widget tree\n var body = _utils2.default.getTiddlerNode(view.getRoot());\n\n if (this.editorMode === 'advanced') {\n\n body.children.push(_utils2.default.getTranscludeNode($tm.ref.graphBar));\n } else {\n\n var el = _utils2.default.getElementNode('span', 'tmap-view-label', view.getLabel());\n body.children.push(el);\n }\n\n body.children.push(_utils2.default.getTranscludeNode($tm.ref.focusButton));\n\n this.makeChildWidgets([body]);\n this.renderChildren(this.graphBarDomNode, this.graphBarDomNode.firstChild);\n }\n\n /**\n * This function is called by the system to notify the widget about\n * tiddler changes. It is ignored by TiddlyMap.\n *\n * ATTENTION: TiddlyMap doesn't use the refresh mechanism here.\n * The caretaker module dispatches an `updates` object that provides\n * more advanced information, tailored to the needs of TiddlyMap.\n * These updates are picked up by {@link MapWidget#update}.\n *\n * @override\n */\n\n }, {\n key: 'refresh',\n value: function refresh(changedTiddlers) {\n\n // TiddlyMap never needs a full refresh so we return false\n return false;\n }\n\n /**\n * This function is called by the caretaker module to notify the\n * widget about tiddler changes.\n *\n * TiddlyMap is interested in the following changes:\n *\n * - Callbacks have been triggered (e.g. dialog results)\n * - A view has been switched\n * - A view has been modified (= configured)\n * - Global options have changed\n * - Node- or edge-types have changed\n * - Graph elements have changed\n * - Changes to the graph's topbar\n *\n * @override\n * @see https://groups.google.com/d/msg/tiddlywikidev/hwtX59tKsIk/EWSG9glqCnsJ\n */\n\n }, {\n key: 'update',\n value: function update(updates) {\n\n if (!this.network || this.isZombieWidget() || _utils2.default.isPreviewed(this)) {\n return;\n }\n\n var changedTiddlers = updates.changedTiddlers;\n\n // check for callback changes\n\n this.callbackManager.refresh(changedTiddlers);\n\n if (this.isViewSwitched(changedTiddlers) || this.hasChangedAttributes() // widget html code changed\n || updates[env.path.options] // global options changed\n || changedTiddlers[this.view.getRoot()] // view's main config changed\n ) {\n\n this.logger('warn', 'View switched config changed');\n\n this.isPreventZoomOnNextUpdate = false;\n this.view = this.getView(true);\n this.reloadRefreshTriggers();\n this.rebuildEditorBar();\n this.reloadBackgroundImage();\n this.initAndRenderGraph(this.graphDomNode);\n } else {\n // view has not been switched\n\n // give the view a chance to refresh itself\n var isViewUpdated = this.view.update(updates);\n\n if (isViewUpdated) {\n\n this.logger('warn', 'View components modified');\n this.rebuildGraph({ resetFocus: { delay: 1000, duration: 1000 } });\n } else {\n // neither view switch or view modification\n\n if (updates[env.path.nodeTypes] || this.hasChangedElements(changedTiddlers)) {\n this.rebuildGraph();\n }\n\n // give children a chance to update themselves\n this.refreshChildren(changedTiddlers);\n }\n }\n }\n }, {\n key: 'hidePopups',\n value: function hidePopups(delay, isForce) {\n\n this.tooltip.hide(delay, isForce);\n this.contextMenu.hide(0, true);\n }\n\n /**\n * Refresh-triggers are tiddlers whose mere occurrence in the\n * changedTiddlers list forces tiddlymap to reassert\n * whether a filter expression returns the same set of matches as it\n * is currently displayed in the graph.\n *\n * The raison d'etre for refresh-triggers is that a filter may contain\n * implicit text-references or variables that may require a filter to be\n * reasserted even though, the filter expression itself did not change.\n *\n * For example a filter `[field:title{$:/HistoryList!!current-tiddler}]`\n * requires a `$:/HistoryList` refresh trigger to be added to the view so\n * everytime the `$:/HistoryList` tiddler changes, the filter gets\n * reasserted.\n */\n\n }, {\n key: 'reloadRefreshTriggers',\n value: function reloadRefreshTriggers() {\n\n // remove old triggers (if there are any)\n this.callbackManager.remove(this.refreshTriggers);\n\n // load new trigger list either from attribute or view config\n var str = this.getAttr('refresh-triggers') || this.view.getConfig('refresh-triggers');\n this.refreshTriggers = $tw.utils.parseStringArray(str) || [];\n\n this.logger('debug', 'Registering refresh trigger', this.refreshTriggers);\n\n // TODO: not nice, if more than one trigger changed it\n // will cause multiple reassertments\n for (var i = this.refreshTriggers.length; i--;) {\n this.callbackManager.add(this.refreshTriggers[i], this.handleTriggeredRefresh, false);\n }\n }\n\n /**\n * Calling this method will cause the graph to be rebuild, which means\n * the graph data is refreshed. A rebuild of the graph will always\n * cause the network to stabilize again.\n *\n * @param {Hashmap} [resetFocus=null] - If not false or null,\n * this object requires two properties to be set: `delay` (the\n * time to wait before starting the fit), `duration` (the length\n * of the fit animation).\n */\n\n }, {\n key: 'rebuildGraph',\n value: function rebuildGraph() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n resetFocus = _ref.resetFocus;\n\n if (_utils2.default.isPreviewed(this)) {\n\n return;\n }\n\n this.logger('debug', 'Rebuilding graph');\n\n this.hidePopups(0, true);\n\n // always reset to allow handling of stabilized-event!\n this.hasNetworkStabilized = false;\n\n var changes = this.rebuildGraphData();\n\n if (changes.changedNodes.withoutPosition.length) {\n\n // force resetFocus\n resetFocus = resetFocus || { delay: 1000, duration: 1000 };\n\n if (!this.view.isEnabled('physics_mode')) {\n\n // in static mode we need to ensure that objects spawn\n // near center so we need to set physics from\n // zero to something. Yes, we override the users\n // central gravity value… who cares about central\n // gravity in static mode anyways.\n var physics = this.visOptions.physics;\n physics[physics.solver].centralGravity = 0.25;\n this.network.setOptions(this.visOptions);\n }\n }\n\n if (!_utils2.default.hasElements(this.graphData.nodesById)) {\n return;\n }\n\n if (resetFocus) {\n\n if (!this.isPreventZoomOnNextUpdate) {\n\n // see https://github.com/almende/vis/issues/987#issuecomment-113226216\n // see https://github.com/almende/vis/issues/939\n this.network.stabilize();\n this.resetFocus = resetFocus;\n }\n\n this.isPreventZoomOnNextUpdate = false;\n }\n }\n\n /**\n * WARNING: Do not change this functionname as it is used by the\n * caretaker's routinely checkups.\n */\n\n }, {\n key: 'getContainer',\n value: function getContainer() {\n\n return this.domNode;\n }\n\n /**\n *\n */\n\n }, {\n key: 'rebuildGraphData',\n value: function rebuildGraphData() {\n\n $tm.start('Reloading Network');\n\n var graph = $tm.adapter.getGraph({ view: this.view });\n\n var changedNodes = _utils2.default.refreshDataSet(this.graphData.nodes, // dataset\n graph.nodes // new nodes\n );\n\n var changedEdges = _utils2.default.refreshDataSet(this.graphData.edges, // dataset\n graph.edges // new edges\n );\n\n // create lookup tables\n\n this.graphData.nodesById = graph.nodes;\n this.graphData.edgesById = graph.edges;\n\n // TODO: that's a performance killer. this should be loaded when\n // the search is actually used!\n // update: Careful when refactoring, some modules are using this…\n _utils2.default.setField('$:/temp/tmap/nodes/' + this.view.getLabel(), 'list', $tm.adapter.getTiddlersByIds(graph.nodes));\n\n $tm.stop('Reloading Network');\n\n return { changedEdges: changedEdges, changedNodes: changedNodes };\n }\n }, {\n key: 'isViewBound',\n value: function isViewBound() {\n\n return _utils2.default.startsWith(this.getViewHolderRef(), $tm.path.localHolders);\n }\n\n /**\n * A view is switched, if the holder was changed.\n * Also if a view suddenly doesn't exist anymore we consider this\n * a trigger for a view change.\n */\n\n }, {\n key: 'isViewSwitched',\n value: function isViewSwitched(changedTiddlers) {\n\n return !_ViewAbstraction2.default.exists(this.view) || changedTiddlers[this.getViewHolderRef()];\n }\n\n /**\n * A view is switched, if the holder was changed.\n */\n\n }, {\n key: 'hasChangedAttributes',\n value: function hasChangedAttributes() {\n\n return Object.keys(this.computeAttributes()).length;\n }\n\n /**\n * Rebuild or update the graph if one of the following is true:\n *\n * 1. A tiddler currently contained as node in the graph has been\n * deleted or modified. This also includes tiddlers that are\n * represented as neighbours in the graph.\n * 2. The neighbourhood is shown and a non-system tiddler has changed.\n * 3. A tiddler that matches the node filter has been modified\n * (not deleted).\n *\n * Since edges are stored in tiddlers themselves, any edge modification\n * is always accounted for as in this case the tiddler holding the\n * edge would be included as changed tiddler.\n *\n * @param {Hashmap<TiddlerReference, *>} changedTiddlers - A list of\n * tiddler changes.\n *\n * @return {boolean} true if the graph needs a refresh.\n */\n\n }, {\n key: 'hasChangedElements',\n value: function hasChangedElements(changedTiddlers) {\n\n var maybeMatches = [];\n var inGraph = this.graphData.nodesById;\n var isShowNeighbourhood = this.view.isEnabled('neighbourhood_scope');\n\n for (var tRef in changedTiddlers) {\n\n if (_utils2.default.isSystemOrDraft(tRef)) {\n\n continue;\n }\n\n if (inGraph[$tm.adapter.getId(tRef)] || isShowNeighbourhood) {\n\n return true;\n }\n\n if (changedTiddlers[tRef].modified) {\n // may be a match so we store this and process it later\n maybeMatches.push(tRef);\n }\n }\n\n if (maybeMatches.length) {\n\n var nodeFilter = this.view.getNodeFilter('compiled');\n var matches = _utils2.default.getMatches(nodeFilter, maybeMatches);\n\n return !!matches.length;\n }\n }\n\n /**\n * Rebuild the graph\n *\n * @see http://visjs.org/docs/network.html\n * @see http://visjs.org/docs/dataset.html\n */\n\n }, {\n key: 'initAndRenderGraph',\n value: function initAndRenderGraph(parent) {\n var _this3 = this;\n\n // make sure to destroy any previous instance\n if (this.network) {\n this._destructVis();\n }\n\n this.logger('info', 'Initializing and rendering the graph');\n\n if (!this.isInSidebar) {\n this.callbackManager.add('$:/state/sidebar', this.handleResizeEvent);\n }\n\n this.visOptions = this.getVisOptions();\n\n this.graphData = {\n nodes: new _vis2.default.DataSet(),\n edges: new _vis2.default.DataSet(),\n nodesById: _utils2.default.makeHashMap(),\n edgesById: _utils2.default.makeHashMap()\n };\n\n this.tooltip.setEnabled(_utils2.default.isTrue($tm.config.sys.popups.enabled, true));\n\n this.network = new _vis2.default.Network(parent, this.graphData, this.visOptions);\n // after vis.Network has been instantiated, we fetch a reference to\n // the canvas element\n this.canvas = parent.getElementsByTagName('canvas')[0];\n this.networkDomNode = _utils2.default.getFirstElementByClassName('vis-network', parent, true);\n // just to be sure\n this.canvas.tabIndex = 0;\n\n for (var event in this.visListeners) {\n this.network.on(event, this.visListeners[event].bind(this));\n }\n\n this.addGraphButtons({\n 'fullscreen-button': function fullscreenButton() {\n _this3.toggleEnlargedMode('fullscreen');\n },\n 'halfscreen-button': function halfscreenButton() {\n _this3.toggleEnlargedMode('halfscreen');\n }\n });\n\n _utils2.default.setDomListeners('add', this.canvas, this.canvasDomListeners);\n\n this.reloadBackgroundImage();\n this.rebuildGraph({\n resetFocus: { delay: 0, duration: 0 }\n });\n this.handleResizeEvent();\n this.canvas.focus();\n }\n }, {\n key: 'handleCanvasKeyup',\n value: function handleCanvasKeyup(ev) {\n var _this4 = this;\n\n var nodeIds = this.network.getSelectedNodes();\n\n // this.isCtrlKeyDown = ev.ctrlKey;\n\n if (ev.ctrlKey) {\n // ctrl key is hold down\n ev.preventDefault();\n\n if (ev.keyCode === 88) {\n // x\n if (this.editorMode) {\n this.handleAddNodesToClipboard('move');\n } else {\n $tm.notify('Map is read only!');\n }\n } else if (ev.keyCode === 67) {\n // c\n this.handleAddNodesToClipboard('copy');\n } else if (ev.keyCode === 86) {\n // v\n this.handlePasteNodesFromClipboard();\n } else if (ev.keyCode === 65) {\n // a\n var allNodes = Object.keys(this.graphData.nodesById);\n this.network.selectNodes(allNodes);\n } else if (ev.keyCode === 49 || ev.keyCode === 50) {\n // 1 || 2\n if (nodeIds.length !== 1) return;\n\n var role = ev.keyCode === 49 ? 'from' : 'to';\n $tm.notify(_utils2.default.ucFirst(role) + '-part selected');\n\n this.conVector[role] = nodeIds[0];\n if (this.conVector.from && this.conVector.to) {\n // create the edge\n this.handleConnectionEvent(this.conVector, function () {\n // reset both properties, regardless whether confirmed\n _this4.conVector = { from: null, to: null };\n });\n }\n }\n } else {\n // ctrl is not pressed\n\n if (ev.keyCode === 13) {\n // ENTER\n\n if (nodeIds.length !== 1) return;\n\n this.openTiddlerWithId(nodeIds[0]);\n }\n }\n }\n }, {\n key: 'handleCanvasKeydown',\n value: function handleCanvasKeydown(ev) {\n\n if (ev.keyCode === 46) {\n // delete\n ev.preventDefault();\n this.handleRemoveElements(this.network.getSelection());\n }\n }\n }, {\n key: 'handleDeleteElement',\n value: function handleDeleteElement(ev) {\n\n var id = ev.paramObject.id;\n var elements = id ? [id] : this.network.getSelectedNodes();\n\n this.handleRemoveElements({ nodes: elements });\n }\n\n /**\n *\n * @param ev\n */\n\n }, {\n key: 'handleCanvasMouseMove',\n value: function handleCanvasMouseMove(ev) {\n var network = this.network;\n\n\n if (!(ev.ctrlKey && ev.buttons)) {\n\n if (this.selectRect) {\n this.selectRect = null;\n var _selectedNodes = network.getSelectedNodes();\n $tm.notify(_selectedNodes.length + ' nodes selected');\n network.redraw();\n }\n\n return;\n }\n\n // prevent vis' network drag if ctrl key and mouse button is pressed\n ev.preventDefault();\n ev.stopPropagation();\n\n if (!this.domNode.contains(ev.target)) {\n // since we are using a global mouse listener, we need to check whether\n // we are actually inside our widget, so we stop updating the selectRect\n return;\n }\n\n var mouse = network.DOMtoCanvas({ x: ev.offsetX, y: ev.offsetY });\n\n if (!this.selectRect) {\n this.selectRect = new _SelectionRectangle2.default(mouse.x, mouse.y);\n }\n\n // register new coordinates\n this.selectRect.span(mouse.x, mouse.y);\n // retrieve current mouse positions\n var nodePositions = network.getPositions();\n // we include previously selected nodes in the new set\n var selectedNodes = network.getSelectedNodes();\n\n for (var id in nodePositions) {\n\n if (this.selectRect.isPointWithin(nodePositions[id]) && !_utils2.default.inArray(id, selectedNodes)) {\n selectedNodes.push(id);\n }\n }\n\n network.selectNodes(selectedNodes);\n this.assignActiveStyle(selectedNodes);\n\n network.redraw();\n }\n\n //https://github.com/almende/vis/blob/111c9984bc4c1870d42ca96b45d90c13cb92fe0a/lib/network/modules/InteractionHandler.js\n\n }, {\n key: 'handleCanvasScroll',\n value: function handleCanvasScroll(ev) {\n\n var isZoomAllowed = !!(this.isInSidebar || // e.g. the map editor in the sidebar\n ev.ctrlKey || this.enlargedMode || this.clickToUse && this.networkDomNode.classList.contains('vis-active'));\n\n var interaction = this.visOptions.interaction;\n\n var isVisSettingInSync = isZoomAllowed === interaction.zoomView;\n\n if (isZoomAllowed || !isVisSettingInSync) {\n ev.preventDefault();\n }\n\n if (!isVisSettingInSync) {\n // prevent visjs from reacting to this event as we first need to sync states\n ev.stopPropagation();\n\n interaction.zoomView = isZoomAllowed;\n this.network.setOptions({ interaction: { zoomView: isZoomAllowed } });\n\n return false;\n }\n }\n\n /**\n * Called when the user click on the canvas with the right\n * mouse button. A context menu is opened.\n */\n\n }, {\n key: 'handleContextMenu',\n value: function handleContextMenu(ev) {\n var _this5 = this;\n\n ev.preventDefault();\n\n var network = this.network;\n\n\n this.hidePopups(0, true);\n\n var nodeId = network.getNodeAt({ x: ev.offsetX, y: ev.offsetY });\n if (!nodeId) return;\n\n // ids of selected nodes\n var selectedNodes = network.getSelectedNodes();\n\n if (!_utils2.default.inArray(nodeId, selectedNodes)) {\n // unselect other nodes and select this one instead…\n selectedNodes = [nodeId];\n network.selectNodes(selectedNodes);\n }\n\n this.contextMenu.show(selectedNodes, function (selectedNodes, div) {\n\n var mode = selectedNodes.length > 1 ? 'multi' : 'single';\n var tRef = '$:/plugins/felixhayashi/tiddlymap/editor/contextMenu/node';\n\n _utils2.default.registerTransclude(_this5, 'contextMenuWidget', tRef);\n _this5.contextMenuWidget.setVariable('mode', mode);\n _this5.contextMenuWidget.render(div);\n });\n }\n }, {\n key: 'handleWidgetKeyup',\n value: function handleWidgetKeyup(ev) {}\n }, {\n key: 'handleWidgetKeydown',\n value: function handleWidgetKeydown(ev) {\n\n if (ev.ctrlKey) {\n // ctrl key is hold down\n ev.preventDefault();\n\n if (ev.keyCode === 70) {\n // f\n ev.preventDefault();\n\n var focusButtonStateTRef = this.widgetPopupsPath + '/focus';\n _utils2.default.setText(focusButtonStateTRef, _utils2.default.getText(focusButtonStateTRef) ? '' : '1');\n\n // note: it is ok to focus the graph right after this,\n // if the focus button is activated it will steal the focus anyway\n } else {\n\n return;\n }\n } else if (ev.keyCode === 120) {\n // F9\n ev.preventDefault();\n this.toggleEnlargedMode('halfscreen');\n } else if (ev.keyCode === 121) {\n // F10\n ev.preventDefault();\n this.toggleEnlargedMode('fullscreen');\n } else if (ev.keyCode === 27) {\n // ESC\n ev.preventDefault();\n\n _utils2.default.deleteByPrefix(this.widgetPopupsPath);\n } else {\n return;\n }\n\n this.canvas.focus();\n }\n }, {\n key: 'handlePasteNodesFromClipboard',\n value: function handlePasteNodesFromClipboard() {\n\n if (!this.editorMode) {\n $tm.notify('Map is read only!');\n return;\n }\n\n if (!$tm.clipBoard || $tm.clipBoard.type !== 'nodes') {\n $tm.notify('TiddlyMap clipboad is empty!');\n }\n\n var nodes = $tm.clipBoard.nodes;\n var ids = Object.keys(nodes);\n\n for (var i = ids.length; i--;) {\n\n var id = ids[i];\n\n if (this.graphData.nodesById[id]) {\n // node already present in this view\n continue;\n }\n\n this.view.addNode(nodes[id]);\n\n // paste nodes so we can select them!\n this.graphData.nodes.update({ id: id });\n }\n\n this.network.selectNodes(ids);\n\n this.rebuildGraph({ resetFocus: { delay: 0, duration: 0 } });\n\n $tm.notify('pasted ' + ids.length + ' nodes into map.');\n }\n }, {\n key: 'handleAddNodesToClipboard',\n value: function handleAddNodesToClipboard(mode) {\n\n var nodeIds = this.network.getSelectedNodes();\n\n if (!nodeIds.length) {\n return;\n }\n\n $tm.clipBoard = {\n type: 'nodes',\n nodes: this.graphData.nodes.get(nodeIds, { returnType: 'Object' })\n };\n\n $tm.notify('Copied ' + nodeIds.length + ' nodes to clipboard');\n\n if (mode === 'move') {\n for (var i = nodeIds.length; i--;) {\n this.view.removeNode(nodeIds[i]);\n }\n }\n\n // prevent zoom\n this.isPreventZoomOnNextUpdate = true;\n }\n\n /**\n * @todo Instead of redrawing the whole graph when an edge or node is\n * added it may be worth considering only getting the element from the\n * adapter and directly inserting it into the graph and *avoid* a\n * reload of the graph via `rebuildGraph`!\n *\n * @todo: too much recomputation -> outsource\n */\n\n }, {\n key: 'getVisOptions',\n value: function getVisOptions() {\n var _this6 = this;\n\n // merge options\n var globalOptions = $tm.config.vis;\n var localOptions = _utils2.default.parseJSON(this.view.getConfig('vis'));\n var options = _utils2.default.merge({}, globalOptions, localOptions);\n\n options.clickToUse = this.clickToUse;\n options.manipulation.enabled = !!this.editorMode;\n\n options.manipulation.deleteNode = function (data, callback) {\n _this6.handleRemoveElements(data);\n _this6.resetVisManipulationBar(callback);\n };\n\n options.manipulation.deleteEdge = function (data, callback) {\n _this6.handleRemoveElements(data);\n _this6.resetVisManipulationBar(callback);\n };\n\n options.manipulation.addEdge = function (data, callback) {\n _this6.handleConnectionEvent(data);\n _this6.resetVisManipulationBar(callback);\n };\n\n options.manipulation.addNode = function (data, callback) {\n _this6.handleInsertNode(data);\n _this6.resetVisManipulationBar(callback);\n };\n\n options.manipulation.editNode = function (data, callback) {\n _this6.handleEditNode(data);\n _this6.resetVisManipulationBar(callback);\n };\n\n options.interaction.zoomView = !!(this.isInSidebar || this.enlargedMode);\n\n // not allowed\n options.manipulation.editEdge = false;\n\n // make sure the actual solver is an object\n var physics = options.physics;\n physics[physics.solver] = physics[physics.solver] || {};\n\n physics.stabilization.iterations = 1000;\n\n this.logger('debug', 'Loaded graph options', options);\n\n return options;\n }\n }, {\n key: 'resetVisManipulationBar',\n value: function resetVisManipulationBar(visCallback) {\n\n if (visCallback) {\n visCallback(null);\n }\n\n this.network.disableEditMode();\n this.network.enableEditMode();\n }\n }, {\n key: 'isVisInEditMode',\n value: function isVisInEditMode() {\n\n return this.graphDomNode.getElementsByClassName('vis-button vis-back').length > 0;\n }\n\n /**\n * Create an empty view. A dialog is opened that asks the user how to\n * name the view. The view is then registered as current view.\n */\n\n }, {\n key: 'handleCreateView',\n value: function handleCreateView() {\n var _this7 = this;\n\n var args = {\n view: this.view.getLabel()\n };\n\n $tm.dialogManager.open('createView', args, function (isConfirmed, outTObj) {\n\n if (!isConfirmed) return;\n\n var label = _utils2.default.getField(outTObj, 'name');\n var isClone = _utils2.default.getField(outTObj, 'clone', false);\n\n if (_ViewAbstraction2.default.exists(label)) {\n\n $tm.notify('Forbidden! View already exists!');\n\n return;\n }\n\n if (isClone && _this7.view.isLiveView()) {\n $tm.notify('Forbidden to clone the live view!');\n return;\n }\n\n var newView = new _ViewAbstraction2.default(label, {\n isCreate: true,\n protoView: isClone ? _this7.view : null\n });\n\n _this7.setView(newView);\n });\n }\n }, {\n key: 'handleRenameView',\n value: function handleRenameView() {\n var _this8 = this;\n\n if (this.view.isLocked()) {\n\n $tm.notify('Forbidden!');\n return;\n }\n\n var references = this.view.getOccurrences();\n\n var args = {\n count: references.length.toString(),\n refFilter: _utils2.default.joinAndWrap(references, '[[', ']]')\n };\n\n $tm.dialogManager.open('renameView', args, function (isConfirmed, outTObj) {\n\n if (!isConfirmed) {\n return;\n }\n\n var label = _utils2.default.getText(outTObj);\n\n if (!label) {\n\n $tm.notify('Invalid name!');\n } else if (_ViewAbstraction2.default.exists(label)) {\n\n $tm.notify('Forbidden! View already exists!');\n } else {\n\n _this8.view.rename(label);\n _this8.setView(_this8.view);\n }\n });\n }\n }, {\n key: 'handleEditView',\n value: function handleEditView() {\n var _this9 = this;\n\n var visInherited = JSON.stringify($tm.config.vis);\n var data = this.graphData;\n\n var viewConfig = this.view.getConfig();\n\n var preselects = {\n 'filter.prettyNodeFltr': this.view.getNodeFilter('pretty'),\n 'filter.prettyEdgeFltr': this.view.getEdgeTypeFilter('pretty'),\n 'vis-inherited': visInherited\n };\n\n var args = {\n view: this.view.getLabel(),\n createdOn: this.view.getCreationDate(true),\n numberOfNodes: Object.keys(data.nodesById).length.toString(),\n numberOfEdges: Object.keys(data.edgesById).length.toString(),\n dialog: {\n preselects: $tw.utils.extend({}, viewConfig, preselects)\n }\n };\n\n $tm.dialogManager.open('configureView', args, function (isConfirmed, outTObj) {\n\n if (!isConfirmed) {\n return;\n }\n\n var config = _utils2.default.getPropertiesByPrefix(outTObj.fields, 'config.', true);\n\n // ATTENTION: needs to be tested before applying new config!\n var prvBg = _this9.view.getConfig('background_image');\n\n _this9.view.setConfig(config);\n if (config['physics_mode'] && !_this9.view.isEnabled('physics_mode')) {\n // when not in physics mode, store positions\n // to prevent floating afterwards\n _this9.view.saveNodePositions(_this9.network.getPositions());\n }\n\n var curBg = _this9.view.getConfig('background_image');\n if (curBg && curBg !== prvBg) {\n $tm.notify('Background changed! You may need to zoom out a bit.');\n }\n\n var nf = _utils2.default.getField(outTObj, 'filter.prettyNodeFltr', '');\n var eTf = _utils2.default.getField(outTObj, 'filter.prettyEdgeFltr', '');\n\n _this9.view.setNodeFilter(nf);\n _this9.view.setEdgeTypeFilter(eTf);\n });\n }\n\n /**\n * Triggers a download dialog where the user can store the canvas\n * as png on his/her harddrive.\n */\n\n }, {\n key: 'handleSaveCanvas',\n value: function handleSaveCanvas() {\n var _this10 = this;\n\n var tempImagePath = '$:/temp/tmap/snapshot';\n this.createAndSaveSnapshot(tempImagePath);\n var defaultName = _utils2.default.getSnapshotTitle(this.view.getLabel(), 'png');\n\n var args = {\n dialog: {\n snapshot: tempImagePath,\n width: this.canvas.width.toString(),\n height: this.canvas.height.toString(),\n preselects: {\n name: defaultName,\n action: 'download'\n }\n }\n };\n\n $tm.dialogManager.open('saveCanvas', args, function (isConfirmed, outTObj) {\n if (!isConfirmed) return;\n\n // allow the user to override the default name or if name is\n // empty use the original default name\n defaultName = outTObj.fields.name || defaultName;\n\n var action = outTObj.fields.action;\n\n if (action === 'download') {\n _this10.handleDownloadSnapshot(defaultName);\n } else if (action === 'wiki') {\n _utils2.default.cp(tempImagePath, defaultName, true);\n _this10.dispatchEvent({\n type: 'tm-navigate', navigateTo: defaultName\n });\n } else if (action === 'placeholder') {\n _this10.view.addPlaceholder(tempImagePath);\n }\n\n // in any case\n $tw.wiki.deleteTiddler('$:/temp/tmap/snapshot');\n });\n }\n }, {\n key: 'handleDownloadSnapshot',\n value: function handleDownloadSnapshot(title) {\n\n var a = this.document.createElement('a');\n var label = this.view.getLabel();\n a.download = title || _utils2.default.getSnapshotTitle(label, 'png');\n a.href = this.getSnapshot();\n\n // we cannot simply call click() on <a>; chrome is cool with it but\n // firefox requires us to create a mouse event…\n var event = new MouseEvent('click');\n a.dispatchEvent(event);\n }\n }, {\n key: 'createAndSaveSnapshot',\n value: function createAndSaveSnapshot(title) {\n\n var tRef = title || this.view.getRoot() + '/snapshot';\n $tw.wiki.addTiddler(new $tw.Tiddler({\n title: tRef,\n type: 'image/png',\n text: this.getSnapshot(true),\n modified: new Date()\n }));\n\n return tRef;\n }\n }, {\n key: 'getSnapshot',\n value: function getSnapshot(stripPreamble) {\n\n var data = this.canvas.toDataURL('image/png');\n\n return stripPreamble ? _utils2.default.getWithoutPrefix(data, 'data:image/png;base64,') : data;\n }\n }, {\n key: 'handleDeleteView',\n value: function handleDeleteView() {\n var _this11 = this;\n\n var viewname = this.view.getLabel();\n\n if (this.view.isLocked()) {\n\n $tm.notify('Forbidden!');\n return;\n }\n\n // regex is non-greedy\n\n var references = this.view.getOccurrences();\n if (references.length) {\n\n var fields = {\n count: references.length.toString(),\n refFilter: _utils2.default.joinAndWrap(references, '[[', ']]')\n };\n\n $tm.dialogManager.open('cannotDeleteViewDialog', fields);\n\n return;\n }\n\n var message = '\\n You are about to delete the view \\'\\'' + viewname + '\\'\\'\\n (no tiddler currently references this view).\\n ';\n\n this.openStandardConfirmDialog(function (isConfirmed) {\n // TODO: this dialog needs an update\n\n if (!isConfirmed) {\n return;\n }\n\n _this11.view.destroy();\n _this11.setView($tm.misc.defaultViewLabel);\n var msg = 'view \"' + viewname + '\\' deleted';\n _this11.logger('debug', msg);\n $tm.notify(msg);\n }, message);\n }\n\n /**\n * This will rebuild the graph after a trigger has been activated.\n *\n * Prior to TiddlyMap v0.9, an additional check was performed\n * to verify, if the graph had actually changed before rebuilding\n * the graph. This check, however, was an overkill and as such removed.\n */\n\n }, {\n key: 'handleTriggeredRefresh',\n value: function handleTriggeredRefresh(trigger) {\n\n this.logger('log', trigger, 'Triggered a refresh');\n\n // special case for the live tab\n if (this.id === 'live_tab') {\n var curTiddler = _utils2.default.getTiddler(_utils2.default.getText(trigger));\n if (curTiddler) {\n var view = curTiddler.fields['tmap.open-view'] || $tm.config.sys.liveTab.fallbackView;\n if (view && view !== this.view.getLabel()) {\n this.setView(view);\n return;\n }\n }\n }\n\n this.rebuildGraph({\n resetFocus: {\n delay: 1000,\n duration: 1000\n }\n });\n }\n\n /**\n * Called by vis when the user tries to delete nodes or edges.\n * The action is delegated to subhandlers.\n *\n * @param {Array<Id>} nodes - Removed edges.\n * @param {Array<Id>} edges - Removed nodes.\n */\n\n }, {\n key: 'handleRemoveElements',\n value: function handleRemoveElements(_ref2) {\n var nodes = _ref2.nodes,\n edges = _ref2.edges;\n\n\n if (nodes.length) {\n // the adapter also removes edges when nodes are removed.\n this.handleRemoveNodes(nodes);\n } else if (edges.length) {\n this.handleRemoveEdges(edges);\n }\n\n this.resetVisManipulationBar();\n }\n }, {\n key: 'handleRemoveEdges',\n value: function handleRemoveEdges(edgeIds) {\n\n $tm.adapter.deleteEdges(this.graphData.edges.get(edgeIds));\n $tm.notify('edge' + (edgeIds.length > 1 ? 's' : '') + ' removed');\n }\n\n /**\n * Handler that guides the user through the process of deleting a node\n * from the graph. The nodes may be removed from the filter (if possible)\n * or from the system.\n *\n * Note: this should not trigger a zoom.\n */\n\n }, {\n key: 'handleRemoveNodes',\n value: function handleRemoveNodes(nodeIds) {\n var _this12 = this;\n\n var tiddlers = $tm.adapter.getTiddlersByIds(nodeIds);\n var params = {\n 'count': nodeIds.length.toString(),\n 'tiddlers': $tw.utils.stringifyList(tiddlers),\n dialog: {\n preselects: {\n 'delete-from': 'filter'\n }\n }\n };\n\n $tm.dialogManager.open('deleteNodeDialog', params, function (isConfirmed, outTObj) {\n\n if (!isConfirmed) return;\n\n var deletionCount = 0;\n\n for (var i = nodeIds.length; i--;) {\n var success = _this12.view.removeNode(nodeIds[i]);\n if (success) {\n deletionCount++;\n }\n }\n\n if (outTObj.fields['delete-from'] === 'system') {\n\n // will also delete edges\n $tm.adapter.deleteNodes(nodeIds);\n deletionCount = nodeIds.length; // we just say so ;)\n }\n\n // prevent zoom\n _this12.isPreventZoomOnNextUpdate = true;\n\n $tm.notify('\\n Removed ' + deletionCount + '\\n of ' + nodeIds.length + '\\n from ' + outTObj.fields['delete-from'] + '\\n ');\n });\n }\n\n /**\n * Calling this function will toggle the enlargement of the map\n * instance. Markers need to be added at various places to ensure the\n * map stretches properly. This includes marking ancestor dom nodes\n * to be able to shift the stacking context.\n *\n * @param {string} type - either 'halfscreen' or 'fullscreen'.\n */\n\n }, {\n key: 'toggleEnlargedMode',\n value: function toggleEnlargedMode(type) {\n\n if (!this.isInSidebar && type === 'halfscreen') {\n return;\n }\n\n this.logger('log', 'Toggled graph enlargement');\n\n var enlargedMode = this.enlargedMode;\n\n // in any case, exit enlarged mode if active\n if (enlargedMode) {\n\n // reset click to use\n this.network.setOptions({ clickToUse: this.clickToUse });\n\n // remove markers\n _utils2.default.findAndRemoveClassNames(['tmap-has-' + enlargedMode + '-widget', 'tmap-' + enlargedMode]);\n\n // reset flag\n this.enlargedMode = null;\n document.body.scrollTop = this.scrollTop;\n }\n\n if (!enlargedMode || enlargedMode !== type && (type === 'fullscreen' || type === 'halfscreen' && !this.isInSidebar)) {\n\n this.scrollTop = document.body.scrollTop;\n\n this.enlargedMode = type;\n\n var pContainer = this.isInSidebar ? this.sidebar : _utils2.default.getFirstElementByClassName('tc-story-river');\n\n $tw.utils.addClass(this.document.body, 'tmap-has-' + type + '-widget');\n $tw.utils.addClass(pContainer, 'tmap-has-' + type + '-widget');\n $tw.utils.addClass(this.domNode, 'tmap-' + type);\n\n // disable click to use by force\n this.network.setOptions({ clickToUse: false });\n\n $tm.notify('Toggled ' + type + ' mode');\n }\n\n // always do resize\n this.handleResizeEvent();\n }\n }, {\n key: 'handleGenerateWidget',\n value: function handleGenerateWidget(event) {\n\n $tw.rootWidget.dispatchEvent({\n type: 'tmap:tm-generate-widget',\n paramObject: { view: this.view.getLabel() }\n });\n }\n }, {\n key: 'handleSetCentralTopic',\n value: function handleSetCentralTopic(_ref3) {\n var paramObject = _ref3.paramObject;\n\n\n var nodeId = paramObject.id || this.network.getSelectedNodes()[0];\n\n if (nodeId === this.view.getConfig('central-topic')) {\n nodeId = '';\n }\n\n this.view.setCentralTopic(nodeId);\n }\n\n /**\n * Called by vis when the graph has stabilized itself.\n *\n * ATTENTION: never store positions in a view's map during stabilize\n * as this will affect other graphs positions and will cause recursion!\n * Storing positions inside vis' nodes is fine though\n */\n\n }, {\n key: 'handleVisStabilizedEvent',\n value: function handleVisStabilizedEvent(properties) {\n\n if (this.hasNetworkStabilized) {\n return;\n }\n\n this.hasNetworkStabilized = true;\n this.logger('log', 'Network stabilized after', properties.iterations, 'iterations');\n\n if (!this.view.isEnabled('physics_mode')) {\n // static mode\n\n // store positions if new nodes without position were added\n var nodes = this.graphData.nodesById;\n var idsOfNodesWithoutPosition = [];\n\n for (var id in nodes) {\n if (nodes[id].x === undefined) {\n idsOfNodesWithoutPosition.push(id);\n }\n }\n\n if (idsOfNodesWithoutPosition.length) {\n this.setNodesMoveable(idsOfNodesWithoutPosition, false);\n $tm.notify(idsOfNodesWithoutPosition.length + ' nodes were added to the graph');\n }\n\n // after storing positions, set gravity to zero again\n var physics = this.visOptions.physics;\n physics[physics.solver].centralGravity = 0;\n this.network.setOptions(this.visOptions);\n }\n\n if (this.resetFocus) {\n this.fitGraph(this.resetFocus.delay, this.resetFocus.duration);\n this.resetFocus = null;\n }\n }\n\n /**\n * Zooms on a specific node in the graph\n */\n\n }, {\n key: 'handleFocusNode',\n value: function handleFocusNode(_ref4) {\n var tRef = _ref4.param;\n\n\n this.network.focus($tm.adapter.getId(tRef), {\n scale: 1.5,\n animation: true\n });\n }\n\n /**\n * A zombie widget is a widget that is removed from the dom tree\n * but still referenced or still partly executed -- I mean\n * otherwise you couldn't call this function, right?\n *\n * If TiddlyMap is executed in a fake environment, the function\n * always returns true.\n */\n\n }, {\n key: 'isZombieWidget',\n value: function isZombieWidget() {\n\n return this.domNode.isTiddlyWikiFakeDom === true || !this.document.body.contains(this.getContainer());\n }\n\n /**\n * This method allows us to specify after what time and for how long\n * the zoom-to-fit process should be executed for a graph.\n *\n * @param {number} [delay=0] - How long to wait before starting to zoom.\n * @param {number} [duration=0] - After the delay, how long should it\n * take for the graph to be zoomed.\n */\n\n }, {\n key: 'fitGraph',\n value: function fitGraph() {\n var _this13 = this;\n\n var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n\n // clear any existing fitting attempt\n clearTimeout(this.activeFitTimeout);\n\n var fit = function fit() {\n\n // happens when widget is removed after stabilize but before fit\n if (_this13.isZombieWidget()) {\n return;\n }\n\n // fixes #97\n _this13.network.redraw();\n\n _this13.network.fit({ // v4: formerly zoomExtent\n animation: {\n duration: duration,\n easingFunction: 'easeOutQuart'\n }\n });\n };\n\n this.activeFitTimeout = setTimeout(fit, delay);\n }\n\n /**\n * Spawns a dialog in which the user can specify node attributes.\n * Once the dialog is closed, the node is inserted into the current\n * view, unless the operation was cancelled.\n */\n\n }, {\n key: 'handleInsertNode',\n value: function handleInsertNode(node) {\n var _this14 = this;\n\n $tm.dialogManager.open('addNodeToMap', {}, function (isConfirmed, outTObj) {\n\n if (!isConfirmed) {\n return;\n }\n\n var tRef = _utils2.default.getField(outTObj, 'draft.title');\n\n if (_utils2.default.tiddlerExists(tRef)) {\n\n // Todo: use graphData and test if node is match (!=neighbour)\n if (_utils2.default.isMatch(tRef, _this14.view.getNodeFilter('compiled'))) {\n\n $tm.notify('Node already exists');\n\n return;\n } else {\n\n node = $tm.adapter.makeNode(tRef, node);\n _this14.view.addNode(node);\n }\n } else {\n\n var tObj = new $tw.Tiddler(outTObj, { 'draft.title': null });\n\n node.label = tRef;\n $tm.adapter.insertNode(node, _this14.view, tObj);\n }\n\n // prevent zoom\n _this14.isPreventZoomOnNextUpdate = true;\n });\n }\n\n /**\n * Open the node editor to style the node.\n */\n\n }, {\n key: 'handleEditNode',\n value: function handleEditNode(node) {\n var _this15 = this;\n\n var tRef = $tm.tracker.getTiddlerById(node.id);\n var tObj = _utils2.default.getTiddler(tRef);\n var globalDefaults = JSON.stringify($tm.config.vis);\n var localDefaults = this.view.getConfig('vis');\n var nodes = {};\n nodes[node.id] = node;\n var nodeStylesByTRef = $tm.adapter.getInheritedNodeStyles(nodes);\n var groupStyles = JSON.stringify(nodeStylesByTRef[tRef]);\n var globalNodeStyle = JSON.stringify(_utils2.default.merge({}, { color: tObj.fields['color'] }, _utils2.default.parseJSON(tObj.fields['tmap.style'])));\n\n var viewLabel = this.view.getLabel();\n\n // we copy the object since we intend to modify it.\n // NOTE: A deep copy would be needed if a nested property were modified\n // In that case, use $tw.utils.deepCopy.\n var nodeData = _extends({}, this.view.getNodeData(node.id));\n // we need to delete the positions so they are not reset when a user\n // resets the style…\n delete nodeData.x;\n delete nodeData.y;\n\n var args = {\n 'view': viewLabel,\n 'tiddler': tObj.fields.title,\n 'tidColor': tObj.fields['color'],\n 'tidIcon': tObj.fields[$tm.field.nodeIcon] || tObj.fields['tmap.fa-icon'],\n 'tidLabelField': 'global.' + $tm.field.nodeLabel,\n 'tidIconField': 'global.' + $tm.field.nodeIcon,\n dialog: {\n preselects: {\n 'inherited-global-default-style': globalDefaults,\n 'inherited-local-default-style': localDefaults,\n 'inherited-group-styles': groupStyles,\n 'global.tmap.style': globalNodeStyle,\n 'local-node-style': JSON.stringify(nodeData)\n }\n }\n };\n\n // function to iterate over attributes that shall be available\n // in the dialog.\n var addToPreselects = function addToPreselects(scope, store, keys) {\n for (var i = keys.length; i--;) {\n args.dialog.preselects[scope + '.' + keys[i]] = store[keys[i]] || '';\n }\n };\n\n // local values are retrieved from the view's node data store\n addToPreselects('local', nodeData, ['label', 'tw-icon', 'fa-icon', 'open-view']);\n\n // global values are taken from the tiddler's field object\n addToPreselects('global', tObj.fields, [$tm.field.nodeLabel, $tm.field.nodeIcon, 'tmap.fa-icon', 'tmap.open-view']);\n\n $tm.dialogManager.open('editNode', args, function (isConfirmed, outTObj) {\n\n if (!isConfirmed) return;\n\n var fields = outTObj.fields;\n\n // save or remove global individual style\n var global = _utils2.default.getPropertiesByPrefix(fields, 'global.', true);\n for (var p in global) {\n\n _utils2.default.setField(tRef, p, global[p] || undefined);\n }\n\n // save local individual data (style + config)\n var local = _utils2.default.getPropertiesByPrefix(fields, 'local.', true);\n\n // CAREFUL: Never change 'local-node-style' to 'local.node-style'\n // (with a dot) because it will get included in the loop!\n var data = _utils2.default.parseJSON(fields['local-node-style'], {});\n\n for (var _p in local) {\n data[_p] = local[_p] || undefined;\n }\n\n _this15.view.saveNodeStyle(node.id, data);\n\n _this15.isPreventZoomOnNextUpdate = true;\n });\n }\n\n /**\n * This handler is registered at and called by the vis network event\n * system.\n */\n\n }, {\n key: 'handleVisSingleClickEvent',\n value: function handleVisSingleClickEvent(properties) {\n\n var isActivated = _utils2.default.isTrue($tm.config.sys.singleClickMode);\n if (isActivated && !this.editorMode) {\n this.handleOpenMapElementEvent(properties);\n }\n }\n\n /**\n * This handler is registered at and called by the vis network event\n * system.\n *\n * @see Coordinates not passed on click/tap events within the properties object\n * @see https://github.com/almende/vis/issues/440\n *\n * @properties a list of nodes and/or edges that correspond to the\n * click event.\n */\n\n }, {\n key: 'handleVisDoubleClickEvent',\n value: function handleVisDoubleClickEvent(properties) {\n\n if (properties.nodes.length || properties.edges.length) {\n\n if (this.editorMode || !_utils2.default.isTrue($tm.config.sys.singleClickMode)) {\n\n this.handleOpenMapElementEvent(properties);\n }\n } else {\n // = clicked on an empty spot\n\n if (this.editorMode) {\n this.handleInsertNode(properties.pointer.canvas);\n }\n }\n }\n }, {\n key: 'handleOpenMapElementEvent',\n value: function handleOpenMapElementEvent(_ref5) {\n var nodes = _ref5.nodes,\n edges = _ref5.edges;\n\n\n if (nodes.length) {\n // clicked on a node\n\n var node = this.graphData.nodesById[nodes[0]];\n if (node['open-view']) {\n $tm.notify('Switching view');\n this.setView(node['open-view']);\n } else {\n this.openTiddlerWithId(nodes[0]);\n }\n } else if (edges.length) {\n // clicked on an edge\n\n this.logger('debug', 'Clicked on an Edge');\n var typeId = this.graphData.edgesById[edges[0]].type;\n this.handleEditEdgeType(typeId);\n } else {\n\n return;\n }\n\n this.hidePopups(0, true);\n }\n }, {\n key: 'handleEditEdgeType',\n value: function handleEditEdgeType(type) {\n\n if (!this.editorMode) return;\n\n var behaviour = $tm.config.sys.edgeClickBehaviour;\n if (behaviour !== 'manager') return;\n\n $tw.rootWidget.dispatchEvent({\n type: 'tmap:tm-manage-edge-types',\n paramObject: {\n type: type\n }\n });\n }\n }, {\n key: 'handleResizeEvent',\n\n\n /**\n * Listener will be removed if the parent is not part of the dom anymore\n *\n * @see https://groups.google.com/d/topic/tiddlywikidev/yuQB1KwlKx8/discussion [TW5] Is there a destructor for widgets?\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Node.contains\n */\n value: function handleResizeEvent(event) {\n\n if (this.isZombieWidget()) return;\n\n var height = this.getAttr('height');\n var width = this.getAttr('width');\n\n if (this.isInSidebar) {\n\n var rect = this.domNode.getBoundingClientRect();\n var distRight = 15;\n width = document.body.clientWidth - rect.left - distRight + 'px';\n\n var distBottom = parseInt(this.getAttr('bottom-spacing')) || 15;\n var calculatedHeight = window.innerHeight - rect.top;\n height = calculatedHeight - distBottom + 'px';\n }\n\n this.domNode.style.height = height || '300px';\n this.domNode.style.width = width;\n\n this.repaintGraph(); // redraw graph\n }\n\n /**\n * used to prevent nasty deletion as edges are not unselected when leaving vis\n */\n\n }, {\n key: 'handleClickEvent',\n value: function handleClickEvent(evt) {\n\n if (this.isZombieWidget() || !this.network) return;\n\n if (!this.graphDomNode.contains(evt.target)) {\n // clicked outside\n\n var selected = this.network.getSelection();\n if (selected.nodes.length || selected.edges.length) {\n this.logger('debug', 'Clicked outside; deselecting nodes/edges');\n // upstream bug: this.network.unselectAll() doesn't work\n this.network.selectNodes([]); // deselect nodes and edges\n this.resetVisManipulationBar();\n }\n } else {\n\n this.canvas.focus();\n }\n\n if (evt.button !== 2) {\n // not the right button\n this.contextMenu.hide(0, true);\n }\n }\n }, {\n key: 'handleVisSelectNode',\n value: function handleVisSelectNode(_ref6) {\n var nodes = _ref6.nodes;\n\n\n if (!this.isDraggingAllowed(nodes)) {\n return;\n }\n\n // assign selected style\n this.assignActiveStyle(nodes);\n }\n }, {\n key: 'isDraggingAllowed',\n value: function isDraggingAllowed(_ref7) {\n var nodes = _ref7.nodes;\n\n return this.editorMode || this.view.isEnabled('physics_mode');\n }\n\n /**\n * Assign some styles when the graph element becomes active, i.e.\n * it is selected or hovered over.\n *\n * @param {Id|Array<Id>} nodeIds - A single id or an Array of ids.\n */\n\n }, {\n key: 'assignActiveStyle',\n value: function assignActiveStyle(nodeIds) {\n\n if (!Array.isArray(nodeIds)) nodeIds = [nodeIds];\n\n var defaultColor = this.visOptions.nodes.color;\n\n // iterate over selected nodes\n for (var i = nodeIds.length; i--;) {\n var id = nodeIds[i];\n var node = this.graphData.nodesById[id];\n var colorObj = _utils2.default.merge({}, defaultColor, node.color);\n this.graphData.nodes.update({\n id: id,\n color: {\n highlight: colorObj,\n hover: colorObj\n }\n });\n }\n }\n }, {\n key: 'handleVisDeselectNode',\n value: function handleVisDeselectNode(properties) {}\n\n //~ var prevSelectedNodes = properties.previousSelection.nodes;\n //~ for (var i = prevSelectedNodes.length; i--;) {\n //~ };\n\n /**\n * Called by vis when the dragging of a node(s) has ended.\n * Vis passes an object containing event-related information.\n *\n * @param {Array<Id>} nodes - Array of ids of the nodes\n * that were being dragged.\n */\n\n }, {\n key: 'handleVisDragEnd',\n value: function handleVisDragEnd(_ref8) {\n var nodes = _ref8.nodes;\n\n\n if (!nodes.length) {\n return;\n }\n\n if (nodes.length === 1 && this.view.isEnabled('raster')) {\n var pos = this.network.getPositions()[nodes[0]];\n this.graphData.nodes.update(_extends({\n id: nodes[0]\n }, _utils2.default.getNearestRasterPosition(pos, parseInt(this.view.getConfig('raster')))));\n }\n\n // reset store\n this.draggedNode = null;\n\n // fix node again and store positions\n // if in static mode, fixing will be ignored\n this.setNodesMoveable(nodes, false);\n }\n\n /**\n *\n * @param context2d\n */\n\n }, {\n key: 'handleVisBeforeDrawing',\n value: function handleVisBeforeDrawing(context2d) {\n var view = this.view,\n network = this.network,\n backgroundImage = this.backgroundImage;\n\n\n if (backgroundImage) {\n context2d.drawImage(backgroundImage, 0, 0);\n }\n\n if (view.isEnabled('raster')) {\n _utils2.default.drawRaster(context2d, network.getScale(), network.getViewPosition(), parseInt(view.getConfig('raster')));\n }\n }\n\n /**\n *\n * @param context2d\n */\n\n }, {\n key: 'handleVisAfterDrawing',\n value: function handleVisAfterDrawing(context2d) {\n\n if (this.selectRect) {\n\n var rect = this.selectRect.getRect();\n\n context2d.beginPath();\n context2d.globalAlpha = 0.5;\n context2d.fillStyle = '#EAFFEF';\n context2d.fillRect.apply(context2d, _toConsumableArray(rect));\n\n context2d.beginPath();\n context2d.globalAlpha = 1;\n context2d.strokeStyle = '#B4D9BD';\n context2d.strokeRect.apply(context2d, _toConsumableArray(rect));\n }\n\n if (this.draggedNode && this.view.isEnabled('raster')) {\n\n var pos = this.network.getPositions()[this.draggedNode];\n var rPos = _utils2.default.getNearestRasterPosition(pos, parseInt(this.view.getConfig('raster')));\n\n context2d.strokeStyle = 'green';\n context2d.fillStyle = 'green';\n\n context2d.beginPath();\n context2d.moveTo(pos.x, pos.y);\n context2d.lineTo(rPos.x, rPos.y);\n context2d.stroke();\n context2d.beginPath();\n context2d.arc(rPos.x, rPos.y, 5, 0, Math.PI * 2);\n context2d.fill();\n }\n }\n\n /**\n * called by tooltip class when tooltip is displayed;\n */\n\n }, {\n key: 'constructTooltip',\n value: function constructTooltip(signature, div) {\n\n var ev = _utils2.default.parseJSON(signature);\n var id = ev.node || ev.edge;\n\n var text = null;\n var outType = 'text/html';\n var inType = 'text/vnd-tiddlywiki';\n\n if (ev.node) {\n // node\n\n var tRef = $tm.tracker.getTiddlerById(id);\n var tObj = _utils2.default.getTiddler(tRef);\n\n var descr = tObj.fields[$tm.field.nodeInfo];\n\n if (descr) {\n\n div.innerHTML = $tw.wiki.renderText(outType, inType, descr);\n } else if (tObj.fields.text) {\n\n // simply rendering the text is not sufficient as this prevents\n // us from updating the tooltip content on refresh. So we need\n // to create a temporary widget that is registered to the dom\n // node passed by the tooltip.\n\n _utils2.default.registerTransclude(this, 'tooltipWidget', tRef);\n this.tooltipWidget.setVariable('tv-tiddler-preview', 'yes');\n this.tooltipWidget.render(div);\n } else {\n\n div.innerHTML = tRef;\n }\n } else {\n // edge\n\n var edge = this.graphData.edgesById[id];\n var type = $tm.indeces.allETy[edge.type];\n\n if (type.description) {\n text = $tw.wiki.renderText(outType, inType, type.description);\n }\n\n div.innerHTML = text || type.label || type.id;\n }\n }\n }, {\n key: 'handleVisHoverElement',\n value: function handleVisHoverElement(ev) {\n\n if ($tm.mouse.buttons) return;\n\n //~ this.graphDomNode.style.cursor = 'pointer';\n\n var id = ev.node || ev.edge;\n var signature = JSON.stringify(ev);\n\n if (ev.node) {\n\n // override the hover color\n this.assignActiveStyle(id);\n }\n\n // show tooltip if not in edit mode\n if (!this.isVisInEditMode() && !this.contextMenu.isShown()) {\n var populator = this.constructTooltip;\n this.tooltip.show(signature, populator);\n }\n }\n }, {\n key: 'handleVisBlurElement',\n value: function handleVisBlurElement(ev) {\n\n this.tooltip.hide();\n }\n }, {\n key: 'handleVisLoading',\n value: function handleVisLoading(_ref9) {\n var total = _ref9.total,\n iterations = _ref9.iterations;\n\n\n // we only start to show the progress bar after a while\n //~ if (params.iterations / params.total < 0.05) return;\n\n this.graphLoadingBarDomNode.style.display = 'block';\n this.graphLoadingBarDomNode.setAttribute('max', total);\n this.graphLoadingBarDomNode.setAttribute('value', iterations);\n\n //~ var text = 'Loading ' + Math.round((iterations / total) * 100) + '%';\n //~ this.graphLoadingBarDomNode.innerHTML = text;\n }\n }, {\n key: 'handleVisLoadingDone',\n value: function handleVisLoadingDone(params) {\n\n this.graphLoadingBarDomNode.style.display = 'none';\n }\n\n /**\n * Called by vis when a node is being dragged.\n * Vis passes an object containing event-related information.\n * @param {Array<Id>} nodes - Array of ids of the nodes\n * that were being dragged.\n */\n\n }, {\n key: 'handleVisDragStart',\n value: function handleVisDragStart(_ref10) {\n var nodes = _ref10.nodes;\n\n\n if (!nodes.length ||\n // we do not allow nodes to be dragged if not in editor mode\n // except cases physics is enabled\n !this.isDraggingAllowed(nodes)) {\n return;\n }\n\n this.hidePopups(0, true);\n this.assignActiveStyle(nodes);\n this.setNodesMoveable(nodes, true);\n\n if (nodes.length === 1) {\n this.draggedNode = nodes[0];\n }\n }\n\n /**\n * called from outside.\n */\n\n }, {\n key: 'destruct',\n value: function destruct() {\n\n // while the container should be destroyed and the listeners\n // garbage collected, we remove them manually just to be save\n\n _utils2.default.setDomListeners('remove', window, this.windowDomListeners);\n _utils2.default.setDomListeners('remove', this.domNode, this.widgetDomListeners);\n\n this._destructVis();\n }\n\n /**\n * Only destructs stuff related to vis.\n */\n\n }, {\n key: '_destructVis',\n value: function _destructVis() {\n\n if (!this.network) return;\n\n _utils2.default.setDomListeners('remove', this.canvas, this.canvasDomListeners);\n\n this.network.destroy();\n this.network = null;\n }\n\n /**\n * Opens the tiddler that corresponds to the given id either as\n * modal (when in fullscreen mode) or in the story river.\n */\n\n }, {\n key: 'openTiddlerWithId',\n value: function openTiddlerWithId(id) {\n var _this16 = this;\n\n var tRef = $tm.tracker.getTiddlerById(id);\n\n this.logger('debug', 'Opening tiddler', tRef, 'with id', id);\n\n if (this.enlargedMode === 'fullscreen') {\n\n var draftTRef = $tw.wiki.findDraft(tRef);\n var wasInDraftAlready = !!draftTRef;\n\n if (!wasInDraftAlready) {\n\n var type = 'tm-edit-tiddler';\n this.dispatchEvent({ type: type, tiddlerTitle: tRef });\n draftTRef = $tw.wiki.findDraft(tRef);\n }\n\n var args = { draftTRef: draftTRef, originalTRef: tRef };\n\n $tm.dialogManager.open('fullscreenTiddlerEditor', args, function (isConfirmed, outTObj) {\n\n if (isConfirmed) {\n\n var _type = 'tm-save-tiddler';\n _this16.dispatchEvent({ type: _type, tiddlerTitle: draftTRef });\n } else if (!wasInDraftAlready) {\n\n // also removes the draft from the river before deletion!\n _utils2.default.deleteTiddlers([draftTRef]);\n }\n\n // in any case, remove the original tiddler from the river\n var type = 'tm-close-tiddler';\n _this16.dispatchEvent({ type: type, tiddlerTitle: tRef });\n });\n } else {\n\n var bounds = this.domNode.getBoundingClientRect();\n\n this.dispatchEvent({\n type: 'tm-navigate',\n navigateTo: tRef,\n navigateFromTitle: this.getVariable('storyTiddler'),\n navigateFromNode: this,\n navigateFromClientRect: {\n top: bounds.top,\n left: bounds.left,\n width: bounds.width,\n right: bounds.right,\n bottom: bounds.bottom,\n height: bounds.height\n }\n });\n }\n }\n\n /**\n * The view holder is a tiddler that stores a references to the current\n * view. If the graph is not bound to a view by the user via an\n * attribute, the default view holder is used. Otherwise, a temporary\n * holder is created whose value is set to the view specified by the user.\n * This way, the graph is independent from view changes made in a\n * tiddlymap editor.\n *\n * This function will only calculate a new reference to the holder\n * on first call (that is when no view holder is registered to 'this'.\n *\n */\n\n }, {\n key: 'getViewHolderRef',\n value: function getViewHolderRef() {\n\n // the viewholder is never recalculated once it exists\n if (this.viewHolderRef) {\n return this.viewHolderRef;\n }\n\n this.logger('info', 'Retrieving or generating the view holder reference');\n\n // if given, try to retrieve the viewHolderRef by specified attribute\n var viewName = this.getAttr('view');\n var holderRef = null;\n\n if (viewName) {\n\n this.logger('log', 'User wants to bind view \"' + viewName + '\\' to graph');\n\n var viewRef = $tm.path.views + '/' + viewName;\n\n if ($tw.wiki.getTiddler(viewRef)) {\n\n // create a view holder that is exclusive for this graph\n\n holderRef = $tm.path.localHolders + '/' + _utils2.default.genUUID();\n this.logger('log', 'Created an independent temporary view holder \"' + holderRef + '\"');\n\n // we do not use setView here because it would store and reload the view unnecessarily...\n _utils2.default.setText(holderRef, viewRef);\n\n this.logger('log', 'View \"' + viewRef + '\\' inserted into independend holder');\n } else {\n this.logger('log', 'View \"' + viewName + '\" does not exist');\n }\n }\n\n if (!holderRef) {\n this.logger('log', 'Using default (global) view holder');\n holderRef = $tm.ref.defaultViewHolder;\n }\n\n return holderRef;\n }\n\n /**\n * This function will switch the current view reference of the\n * view holder.\n *\n * NOTE:\n * The changes will be picked up in the next refresh cycle.\n * This function will never update the view object currently\n * held by this widget (this.view)! This would create a race\n * condition where the view has changed, but the graph data hasn't\n * and maybe a stabilization event fires in this moment. At this point\n * it would work with graph data that doesn't relate to the view\n * and do bad things, trust me, big time bad things.\n *\n * @param {ViewAbstraction|string} view – A reference to the view.\n * @param {string} [viewHolderRef] – A reference to the view holder.\n */\n\n }, {\n key: 'setView',\n value: function setView(view, viewHolderRef) {\n\n if (!_ViewAbstraction2.default.exists(view)) {\n\n return;\n }\n\n view = new _ViewAbstraction2.default(view);\n\n var viewLabel = view.getLabel();\n viewHolderRef = viewHolderRef || this.viewHolderRef;\n this.logger('info', 'Inserting view \"' + viewLabel + '\" into holder \"' + viewHolderRef + '\"');\n $tw.wiki.addTiddler(new $tw.Tiddler({\n title: viewHolderRef,\n text: viewLabel\n }));\n\n // we don't wait til next render-cycle (which would leave tiddlymap in\n // a rather undefined state) but update immediately.\n this.update({\n changedTiddlers: _defineProperty({}, viewHolderRef, true)\n });\n }\n\n /**\n * This function will return a view abstraction that is based on the\n * view specified in the view holder of this graph.\n *\n * @param {boolean} noCache - Retrieve the view reference again\n * from the holder and recreate the view abstraction object.\n * @return {ViewAbstraction} the view\n */\n\n }, {\n key: 'getView',\n value: function getView(noCache) {\n\n if (!noCache && this.view) {\n return this.view;\n }\n\n var viewHolderRef = this.getViewHolderRef();\n\n // transform into view object\n var ref = _utils2.default.getText(viewHolderRef);\n\n this.logger('debug', 'Retrieved view from holder');\n\n var view = void 0;\n\n if (_ViewAbstraction2.default.exists(ref)) {\n\n view = new _ViewAbstraction2.default(ref);\n } else {\n\n this.logger('debug', 'Warning: View \"' + ref + '\" doesn\\'t exist. Default is used instead.');\n view = new _ViewAbstraction2.default('Default');\n }\n\n return view;\n }\n }, {\n key: 'reloadBackgroundImage',\n value: function reloadBackgroundImage(msg) {\n var _this17 = this;\n\n this.backgroundImage = null;\n\n var bgFieldValue = this.view.getConfig('background_image');\n var imgTObj = _utils2.default.getTiddler(bgFieldValue);\n if (!imgTObj && !bgFieldValue) return;\n\n var img = new Image();\n var ajaxCallback = function ajaxCallback(b64) {\n img.src = b64;\n };\n img.onload = function () {\n // only now set the backgroundImage to the img object!\n _this17.backgroundImage = img;\n _this17.repaintGraph();\n };\n\n if (imgTObj) {\n // try loading from tiddler\n var urlField = imgTObj.fields['_canonical_uri'];\n if (urlField) {\n // try loading by uri field\n _utils2.default.getImgFromWeb(urlField, ajaxCallback);\n } else if (imgTObj.fields.text) {\n // try loading from base64\n img.src = $tw.utils.makeDataUri(imgTObj.fields.text, imgTObj.fields.type);\n }\n } else if (bgFieldValue) {\n // try loading directly from reference\n _utils2.default.getImgFromWeb(bgFieldValue, ajaxCallback);\n }\n }\n\n /**\n * The graph of this widget is only repainted if the following counts:\n *\n * The network object exists (prerequisit).\n *\n * 1. We are not in fullscreen at all\n * 2. This particular graph instance is currently running fullscreen.\n */\n\n }, {\n key: 'repaintGraph',\n value: function repaintGraph() {\n\n var isInFS = $tw.utils.hasClass(this.document.body, 'tmap-has-fullscreen-widget');\n if (this.network && (!isInFS || isInFS && this.enlargedMode)) {\n\n this.logger('info', 'Repainting the whole graph');\n\n this.network.redraw();\n this.fitGraph(0, 1000);\n }\n }\n\n /**\n * If a button is enabled it means it is displayed on the graph canvas.\n *\n * @param {string} name - The name of the button to enabled. Has to\n * correspond with the css button name.\n * @param {boolean} enable - True if the button should be visible,\n * false otherwise.\n */\n\n }, {\n key: 'setGraphButtonEnabled',\n value: function setGraphButtonEnabled(name, enable) {\n\n var className = 'vis-button tmap-' + name;\n var b = _utils2.default.getFirstElementByClassName(className, this.domNode);\n $tw.utils.toggleClass(b, 'tmap-button-enabled', enable);\n }\n\n /**\n * Allow the given nodes to be moveable.\n *\n * @param {Array<number>} nodeIds - The ids of the nodes for which\n * we allow or disallow the movement.\n * @param {boolean} isMoveable - True, if the nodes are allowed to\n * move or be moved.\n */\n\n }, {\n key: 'setNodesMoveable',\n value: function setNodesMoveable(nodeIds, isMoveable) {\n\n if (!nodeIds || !nodeIds.length || this.view.isEnabled('physics_mode')) {\n // = no ids passed or in floating mode\n return;\n }\n\n var updates = [];\n var isFixed = !isMoveable;\n for (var i = nodeIds.length; i--;) {\n\n updates.push({\n id: nodeIds[i],\n fixed: { x: isFixed, y: isFixed }\n });\n }\n\n this.graphData.nodes.update(updates);\n\n if (isFixed) {\n\n this.logger('debug', 'Fixing', updates.length, 'nodes');\n\n // if we fix nodes in static mode then we also store the positions\n this.view.saveNodePositions(this.network.getPositions());\n // prevent zoom\n this.isPreventZoomOnNextUpdate = true;\n }\n }\n\n /**\n * This function will create the dom elements for all tiddlymap-vis\n * buttons and register the event listeners.\n *\n * @param {Object<string, function>} buttonEvents - The label of the\n * button that is used as css class and the click handler.\n */\n\n }, {\n key: 'addGraphButtons',\n value: function addGraphButtons(buttonEvents) {\n\n var parent = _utils2.default.getFirstElementByClassName('vis-navigation', this.domNode);\n\n for (var name in buttonEvents) {\n var div = this.document.createElement('div');\n div.className = 'vis-button tmap-' + name;\n\n div.addEventListener('click', buttonEvents[name].bind(this), false);\n parent.appendChild(div);\n\n this.setGraphButtonEnabled(name, true);\n }\n }\n }]);\n\n return MapWidget;\n}(_widget.widget);\n\n/*** Exports *******************************************************/\n\nexports.tmap = MapWidget;\nexports.tiddlymap = MapWidget;\n//# sourceMappingURL=./maps/felixhayashi/tiddlymap/js/widget/MapWidget.js.map\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/felixhayashi/tiddlymap/license": {
"title": "$:/plugins/felixhayashi/tiddlymap/license",
"subtitle": "License",
"caption": "License",
"text": "\\rules except wikilink\n\n!! TiddlyMap\n\nCopyright (c) 2014, Felix Küppers\nAll rights reserved.\n\nTiddlyMap is licensed under the [[BSD 2-Clause License|http://opensource.org/licenses/BSD-2-Clause]]. For the exact license terms, please visit [[https://github.com/felixhayashi/TW5-TiddlyMap/blob/master/LICENSE]]. \n\n!! TiddlyWiki\n\nCreated by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright © Jeremy Ruston 2004-2007 Copyright © UnaMesa Association 2007-2014\n\nPublished under the following [licenses](https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses):\n\n# BSD 3-clause \"New\" or \"Revised\" License (including any right to adopt any future version of a license if permitted)\n# Creative Commons Attribution 3.0 (including any right to adopt any future version of a license if permitted)\n\n!! Vis.js\n\nCopyright (c) 2014 [Almende B.V.](https://github.com/almende/vis)\n\nPublished under the following licenses:\n\n# Apache License Version 2.0, January 2004 http://www.apache.org/licenses/\n# MIT License (MIT)\n"
},
"$:/plugins/felixhayashi/tiddlymap/readme": {
"title": "$:/plugins/felixhayashi/tiddlymap/readme",
"text": "* Please refer to the project-readme hosted at [[https://github.com/felixhayashi/TW5-TiddlyMap]].\n* A demo with several examples and explanations can be found at [[http://tiddlymap.org]]."
},
"$:/plugins/felixhayashi/tiddlymap/graph/edgeTypes/tmap:unknown": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/edgeTypes/tmap:unknown",
"description": "Automatically assigned to an edge that does not have a type assigned",
"style": "{\"color\":\"gray\"}",
"show-label": "false"
},
"$:/plugins/felixhayashi/tiddlymap/graph/edgeTypes/tw-body:link": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/edgeTypes/tw-body:link",
"description": "A link that is contained in the tiddler's body pointing to another resource.",
"style": "{\"color\":\"orange\", \"dashes\":true}",
"label": "links to",
"text": ""
},
"$:/plugins/felixhayashi/tiddlymap/graph/edgeTypes/tw-list:list": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/edgeTypes/tw-list:list",
"description": "Contained in a list of this tiddler",
"style": "{ \"color\": \"red\", \"dashes\":true}",
"label": "listed in",
"text": ""
},
"$:/plugins/felixhayashi/tiddlymap/graph/edgeTypes/tw-list:tags": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/edgeTypes/tw-list:tags",
"description": "A tag that refers to a tiddler of the same name.",
"style": "{ \"color\": \"darkslategray\", \"dashes\":true}",
"label": "tagged with"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/default": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/default",
"caption": "Overview",
"text": "\\rules except wikilink\n\n<div class=\"tmap-flash-message tmap-plain\">\n Please visit the [[online docs|http://tiddlymap.org/Documentation]]\n for more information about the available global options.\n</div>\n<table class=\"tmap-key-value-table\">\n <tr>\n <th align=\"left\">Plugin version</th>\n <td><<pluginVersion>></td>\n </tr>\n<!--\n <tr>\n <th align=\"left\">Datastructure version</th>\n <td><<dataStructureVersion>></td>\n </tr>\n-->\n <tr>\n <th align=\"left\">Nodes in system</th>\n <td><<numberOfNodes>></td>\n </tr>\n <tr>\n <th align=\"left\">Edges in system</th>\n <td><<numberOfEdges>></td>\n </tr>\n</table>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/editor": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/editor",
"caption": "Editor",
"text": "\\rules except wikilink\n\n<table class=\"tmap-config-table\">\n <<tmap-row type:\"input-checkbox\"\n title:\"Show Neighbour­hood menu\"\n field:\"config.sys.editorMenuBar.showNeighScopeButton\"\n descr:\"Show or hide the neighbourhood menu button.\">>\n <<tmap-row type:\"input-checkbox\"\n title:\"Show Screen­shot menu\"\n field:\"config.sys.editorMenuBar.showScreenshotButton\"\n descr:\"Show or hide the screenshot menu button.\">>\n <<tmap-row type:\"input-checkbox\"\n title:\"Show Raster­ menu\"\n field:\"config.sys.editorMenuBar.showRasterMenuButton\"\n descr:\"Show or hide the raster menu button.\">>\n</table>\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/fields": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/fields",
"caption": "Field settings",
"text": "\\rules except wikilink\n\n<table class=\"tmap-config-table\">\n <<tmap-row type:\"input-text\"\n title:\"Node-icon field\"\n field:\"config.sys.field.nodeIcon\" \n descr:\"Local image used as node image in the graphs.\">>\n <<tmap-row type:\"input-text\"\n title:\"Node-label field\"\n field:\"config.sys.field.nodeLabel\" \n descr:\"Alternative node label to use instead of the title.\">>\n <<tmap-row type:\"input-text\"\n title:\"Node-info field\"\n field:\"config.sys.field.nodeInfo\" \n descr:\"Field used as tooltip when hovering over a node in a graph.\"\n note:\"It is prohibited to use the text field here.\">>\n</table> \n\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/interaction": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/interaction",
"caption": "Interaction & behaviour",
"text": "\\rules except wikilink\n\n<table class=\"tmap-config-table\">\n <$macrocall type=\"input-select\"\n $name=\"tmap-row\"\n title=\"Default startup view\"\n field=\"config.sys.defaultView\"\n nochoice=\"Last view used at startup\"\n selectFilter=<<tmap \"option\" \"selector.allViewsByLabel\">>\n descr=\"The view to display at startup\" />\n <<tmap-row type:\"input-checkbox\"\n title:\"Show popups\"\n field:\"config.sys.popups.enabled\"\n descr:\"Set this to true if you want to see automatic\n popups in the map.\">>\n <$list filter=\"[config.sys.popups.enabled[true]]\">\n <<tmap-row type:\"input-text\"\n title:\"Popup delay\"\n field:\"config.sys.popups.delay\"\n descr:\"The time in miliseconds that needs to pass after\n a tooltip is triggered.\">>\n <<tmap-row type:\"input-text\"\n title:\"Popup width\"\n field:\"config.sys.popups.width\"\n descr:\"The default max-width of the popup.\"\n note:\"Make sure you added the desired unit (e.g. `px`).\n Requires a wiki refresh.\">>\n <<tmap-row type:\"input-text\"\n title:\"Popup height\"\n field:\"config.sys.popups.height\"\n descr:\"The default max-height of the popup.\"\n note:\"Make sure you added desired the unit (e.g. `px`).\n Requires a wiki refresh.\">>\n </$list>\n <<tmap-row type:\"input-checkbox\"\n title:\"Allow single click mode\"\n field:\"config.sys.singleClickMode\"\n descr:\"A single click on a node is sufficient to open the\n corresponding tiddler.\"\n note:\"Drag and drop will still work and does not cause a\n tiddler to be opened. Single click is never active in\n the map editor.\">>\n <<tmap-row type:\"input-select\"\n title:\"Edge click behaviour\"\n field:\"config.sys.edgeClickBehaviour\"\n selectFilter:\"[[nothing|Nothing]]\n [[manager|Open edge-type manager]]\"\n descr:\"What should happen when you click on an edge?\">>\n <<tmap-row type:\"input-select\" title:\"Raster size\" field:\"config.sys.raster\"\n selectFilter:\"[[|disabled]] [[5|5px]] [[10|10px]] [[15|15px]] [[20|20px]] [[30|30px]] [[40|40px]]\"\n descr:\"Snap nodes to an invisible raster of the given size after drag'n'drop.\"\n note:\"Only works when the view is not in floating mode\">>\n <<tmap-row type:\"input-checkbox\"\n title:\"Apply node-filter to neighbours\"\n field:\"config.sys.nodeFilterNeighbours\"\n descr:\"If checked, neighbours displayed in the map will be filtered\n by the view's node-filter. Otherwise the node-filter will only be used\n to filter the original set of nodes in the map\">>\n</table>\n\n!! Suppressed dialogs\n\n<div class=\"tmap-flash-message tmap-plain\">\n Dialogs that you decided to suppress in the past are listed here.\n Remove the checkmark to enable dialogs again.\n</div>\n\n<table class=\"tmap-config-table\">\n <$list\n filter=\"[<output>fields[]prefix[config.sys.suppressedDialogs]]\"\n emptyMessage=\"–\">\n <$set name=\"dialogName\" value=<<tmap basename \".\">>>\n <$macrocall $name=\"tmap-row\"\n type=\"input-checkbox\"\n title=\"Suppress '$(dialogName)$' dialog\"\n field=<<currentTiddler>> />\n </$set>\n <br />\n </$list>\n</table>\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/liveTab": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/liveTab",
"caption": "Live tab",
"text": "\\rules except wikilink\n\n<table class=\"tmap-config-table\">\n <<tmap-row type:\"input-checkbox\"\n title:\"Show Live tab\"\n field:\"liveTab\" \n descr:\"Show or hide the live tab in the sidebar.\">>\n <$macrocall type=\"input-select\"\n $name=\"tmap-row\"\n title=\"Fallback view\"\n field=\"config.sys.liveTab.fallbackView\" \n selectFilter=<<tmap \"option\" \"selector.allViewsByLabel\">>\n descr=\"The view to display in the sidebar's live tab in\n case the current tiddler did not specify a view\n to open.\" />\n</table>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig",
"subtitle": "{{$:/core/images/options-button}} Global configuration of TiddlyMap",
"classes": "tmap-remove-top-space",
"text": "\\rules except wikilink\n\n<$macrocall $name=\"tabs\"\n default=<<concat \"$(template)$/default\">>\n tabsList=\"[all[shadows]prefix<template>] -[<template>]\"\n/>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/verbosity": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/verbosity",
"caption": "Verbosity",
"text": "\\rules except wikilink\n\n<div class=\"tmap-flash-message tmap-plain\">\n Here you can restrict the system's talkativeness.\n</div>\n\n<table class=\"tmap-config-table\">\n <<tmap-row type:\"input-checkbox\"\n title:\"Debug output\"\n field:\"config.sys.debug\" \n descr:\"Set this to true if you want debug information to be\n displayed in the browser console.\">>\n <<tmap-row type:\"input-checkbox\"\n title:\"Show notifications\"\n field:\"config.sys.notifications\" \n descr:\"Set this to true if you want to receive fade-out\n notifications for important events.\">>\n</table> "
},
"$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/vis": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/vis",
"classes": "tmap-remove-top-space",
"caption": "Graph",
"text": "\\rules except wikilink\n\n<div class=\"tmap-flash-message tmap-info\">\n The global vis configurations will affect all views and their\n elements (nodes and edges) unless they are overridden on a lower\n level. All options below are documented at\n [[vis.js.org|http://visjs.org/docs/network]].\n</div>\n<div class=\"tmap-flash-message tmap-info\">\n Only config items that you actually changed have an effect on\n the graph. Other options are visible, yet, inactive.\n</div>\n<$tmap-config\n mode=\"manage-config\"\n inherited=\"vis-inherited\"\n extension=\"config.vis\" />"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/configureView/default": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/configureView/default",
"caption": "Overview",
"text": "\\rules except wikilink\n\n<div class=\"tmap-flash-message tmap-info\">\n All configurations __only__ affect this view.\n</div>\n\n<table class=\"tmap-key-value-table\">\n <tr>\n <th align=\"left\">Created on</th>\n <td><<createdOn>></td>\n </tr>\n <tr>\n <th align=\"left\">Nodes contained in graph</th>\n <td><<numberOfNodes>></td>\n </tr>\n <tr>\n <th align=\"left\">Edges contained in graph</th>\n <td><<numberOfEdges>></td>\n </tr>\n</table>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters",
"caption": "Edit filters",
"text": "\\rules except wikilink\n\n<div class=\"tmap-flash-message tmap-info\">\n Completely new to filters? Please read\n [[Introduction to filter notation|http://tiddlywiki.com/#Introduction%20to%20filter%20notation]]\n first.\n</div>\n\n<fieldset>\n <legend>Filters <sup>[1]</sup></legend>\n <table class=\"tmap-config-table tmap-large-input\">\n <<tmap-row type:\"input-textarea\"\n title:\"Node filter\"\n field:\"filter.prettyNodeFltr\"\n descr:\"In the map, only those tiddlers that match this filter\n are shown. Drafts and system tiddlers are automatically\n excluded.\">>\n <<tmap-row type:\"input-textarea\"\n title:\"Edge-type filter\"\n field:\"filter.prettyEdgeFltr\" \n descr:\"Only edges with a type that matches the filter are shown.\">>\n </table> \n</fieldset>\n\n---\n\n<sup>[1]</sup> In the editors above, a new line is equivalent to a space symbol.<br />\n<sup>[2]</sup> It is suggested to read\n[[Node and edge-type filters|http://tiddlymap.org#Node%20and%20edge-type%20filters]]\nand [[Edge-type namespaces|http://tiddlymap.org#Node%20and%20edge-type%20filters]]\nbefore using Tiddlymap's filter editor."
},
"$:/plugins/felixhayashi/tiddlymap/dialog/configureView/layout": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/configureView/layout",
"caption": "Layout",
"text": "\\rules except wikilink\n\n<table class=\"tmap-config-table\">\n <<tmap-row type:\"input-checkbox\"\n title:\"Floating nodes\"\n field:\"config.physics_mode\" \n descr:\"Set this to true if you want your nodes to freely\n swirl around.\">>\n <<tmap-row type:\"input-text\"\n title:\"Background image\"\n field:\"config.background_image\" \n descr:\"The title of an image tiddler to be used as background\n in the view.\"\n note:\"You can also use an image url directly, however, the\n image needs be stored under the same domain as your wiki.\n Otherwise, it won't be displayed!\">>\n</table>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/configureView/namespace": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/configureView/namespace",
"caption": "Namespace",
"text": "\\rules except wikilink\n\n<table class=\"tmap-config-table tmap-small-input\">\n <<tmap-row type:\"input-text\"\n title:\"Edge-type namespace\"\n field:\"config.edge_type_namespace\" \n descr:\"A namespace (like `foaf` in `foaf:knows`) that will be\n automatically added to all edge types you create in\n this view. The namespace is only added if the types\n do not exist yet and do not have a namespace assigned yet.\n Namespaces are always hidden in the graph.\"\n note:\"Most likely, you don't want the edges created with this\n namespace to leak into other views, moreover, you don't\n want edges that do not possess the namespace ever to be\n shown here. In this case, use a private marker (`_`)\n in front of your namespace, e.g. `_mynamespace` and use\n an appropriate edge type filter, i.e. `+[prefix[_mynamespace]]`\n For further information see:\n \n * [[Edge-type namespaces|http://tiddlymap.org/#Edge-type%20namespaces]]\n * [[Private edge types|http://tiddlymap.org/#Private%20edge%20types]]\n \">>\n</table>\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/configureView": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/configureView",
"subtitle": "{{$:/core/images/options-button}} View configuration -- <<view>>",
"text": "\\rules except wikilink\n\n\\define privateEdgeTypes() [[private edge-types|http://tiddlymap.org/#Private%20edge%20types]]\n\n<$macrocall $name=\"tabs\"\n default=<<concat \"$(template)$/default\">>\n tabsList=\"[all[shadows]prefix<template>] -[<template>]\"\n/>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/configureView/vis": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/configureView/vis",
"caption": "Graph",
"text": "\\rules except wikilink\n\n<div class=\"tmap-flash-message tmap-info\">\n The local vis configurations will affect all\n elements (nodes and edges) of this view, unless they are\n overridden on a lower level. All options below are documented at\n [[vis.js.org|http://visjs.org/docs/network]].\n</div>\n<div class=\"tmap-flash-message tmap-info\">\n Only config items that you actually changed have an effect on the\n graph. Other options are visible, yet, inactive.\n</div>\n<$tmap-config\n mode=\"manage-config\"\n inherited=\"vis-inherited\"\n extension=\"config.vis\" />"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/getEdgeType": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/getEdgeType",
"subtitle": "{{$:/plugins/felixhayashi/tiddlymap/icon}} Edge type specification",
"text": "\\rules except wikilink\n\\rules except underscore\n\n\\define filter() $(allEdgeTypes)$ +[search:title[$(term)$]]\n\n\\define badge(color, label, tooltip)\n<span style=\"background: $color$\" title=\"$tooltip$\">$label$</span>\n\\end\n\n\\define badges()\n<$tiddler tiddler={{!!text}}>\n<$set name=\"id\" value=<<tmap \"getETyId\" \"$(view)$\">>>\n<$set name=\"isVisible\" value=<<tmap \"isETyVisible\" \"$(view)$\">>>\n<div class=\"tmap-badges\">\n <span\n style=\"background: darkslategray\"\n title=\"Your input translates into this id.\">\n <<id>>\n </span>\n <$list filter=\"[<isVisible>regexp[true]]\">\n <<badge \"green\" \"visible\" \"Matches your view's filter\">>\n </$list>\n <$list filter=\"[<isVisible>regexp[false]]\">\n <<badge \"red\" \"not visible\" \"Doesn't match your view's filter\">>\n </$list>\n <$list filter=\"[<id>!regexp[^tmap:unknown$]]\" variable=\"item\">\n <$list filter=\"[<id>regexp[^_]]\">\n <<badge \"purple\" \"private\" \"Not shown in other views per default\">>\n </$list>\n <$list filter=\"[<id>regexp[.+:.+]]\">\n <<badge \"orange\" \"namespace\" \"This type is prefixed with a proper namespace\">>\n </$list>\n </$list>\n</div>\n</$set>\n</$set>\n</$tiddler>\n\\end\n\n\\define search()\n<p>\n You are about to connect \"<$text text=\"$(fromLabel)$\" />\"\n with \"<$text text=\"$(toLabel)$\" />\". Please specify a type.\n</p>\n<table id=\"tmap-search-table\">\n <tr>\n <td><b>Type:</b></td>\n <td>\n <$edit-text\n focus=\"true\"\n field=\"text\"\n type=\"text\"\n tag=\"input\"\n default=\"\"\n class=\"tmap-trigger-field\n tmap-triggers-ok-button-on-enter\n tmap-triggers-cancel-button-on-esc\" />\n <<badges>>\n </td>\n </tr>\n <tr>\n <td></td>\n <td>\n <$set name=\"term\" value={{!!text}}>\n <$set name=\"allEdgeTypes\" value=<<tmap \"option\" \"selector.allEdgeTypesById\">>>\n <ul class=\"tmap-small-list\">\n <$list filter=<<filter>>>\n <li>\n <$button class=\"tc-btn-invisible tmap-link\">\n <$view field=\"title\" />\n <$action-setfield $tiddler=<<output>> text={{!!title}} />\n </$button>\n </li>\n </$list>\n </ul>\n </$set>\n </$set>\n </td>\n </tr>\n</table>\n\\end\n\n<$list filter=\"[<temp>!has[more]]\" variable=\"item\"><<search>></$list>\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/addNodeToMap": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/addNodeToMap",
"subtitle": "{{$:/core/images/tag-button}} Add node",
"classes": "tmap-modal-add-node",
"text": "\\rules except wikilink\n\n\\define backButtonText() back to list\n\\define outputAndTemplate() [[$(output)$]] [[$(template)$]]\n\n\\define editor()\n <$button class=\"tmap-go-back tc-btn-invisible\">\n {{$:/core/images/chevron-left}} <<backButtonText>>\n <$action-deletefield $tiddler=<<temp>> more template />\n <$action-sendmessage\n $message=\"tmap:tm-clear-tiddler\"\n keep=\"draft.title\"\n title=<<output>> />\n </$button>\n\n <$list filter=\"[<output>get[draft.title]is[tiddler]]\">\n <div class=\"tmap-flash-message tmap-warning\">\n Tiddler already exists! Use another title or click\n \"<<backButtonText>>\" to cancel your edit.\n </div>\n </$list>\n\n <div class=\"tmap-modal-editor\">\n <table class=\"tmap-config-table\">\n <tr class=\"tmap-template-select\">\n <td>Template</td>\n <td>\n <$select\n tiddler=<<temp>>\n field=\"template\">\n <option value=\"\"></option>\n <$list filter=<<tmap \"option\" \"selector.allPotentialNodes\">>>\n <option><$view field=\"title\" /></option>\n </$list>\n </$select>\n <$button>Load\n <$action-sendmessage\n $message=\"tmap:tm-clear-tiddler\"\n keep=\"draft.title\"\n title=<<output>> />\n <$list filter=\"[<temp>get[template]]\" variable=\"template\">\n <$action-sendmessage\n $message=\"tmap:tm-merge-tiddlers\"\n tiddlers=<<outputAndTemplate>>\n output=<<output>> />\n <$action-deletefield $tiddler=<<output>> tmap.id tmap.edges />\n </$list>\n </$button>\n </td>\n <td>Press the \"load\" button to activate the template.</td>\n </tr>\n </table>\n <$importvariables filter=\"[all[tiddlers+shadows]prefix[$:/core/macros/]]\">\n <$set name=\"currentTiddler\" value=<<output>>>\n <$transclude tiddler=\"$:/core/ui/EditTemplate\" mode=\"block\" />\n </$set>\n </$importvariables>\n </div>\n\\end\n\n\\define search()\n<p>Add an existing tiddler to the map or create a new one.</p>\n<table id=\"tmap-search-table\">\n <tr>\n <td><b>Title:</b></td>\n <td>\n <$edit-text\n tiddler=<<output>>\n field=\"draft.title\"\n focus=\"true\"\n type=\"text\"\n tag=\"input\"\n default=\"\"\n class=\"tmap-trigger-field\n tmap-triggers-ok-button-on-enter\n tmap-triggers-cancel-button-on-esc\" />\n <$list filter=\"[<output>get[draft.title]!is[tiddler]]\">\n <$button\n tooltip=\"The tiddler does not exist yet and you may edit it\n before it is added to the map\">\n {{$:/core/images/edit-button}}\n <$action-setfield $tiddler=<<temp>> more=\"true\" />\n </$button> <sup>[1]</sup>\n </$list>\n </td>\n </tr>\n <tr>\n <td></td>\n <td>\n <$set name=\"term\" value={{!!draft.title}}>\n <ul class=\"tmap-small-list\">\n <$list filter=\"[search:title<term>!is[system]!has[draft.of]]\">\n <li>\n <$button class=\"tc-btn-invisible tmap-link\">\n <$view field=\"title\" />\n <$action-setfield $tiddler=<<output>> draft.title={{!!title}} />\n </$button>\n </li>\n </$list>\n </ul>\n </$set>\n </td>\n </tr>\n</table>\n\n<$list filter=\"[<output>get[draft.title]!is[tiddler]]\">\n<hr />\n<sup>[1]</sup>\n<small>\n The tiddler does not exist yet and you may edit it\n before it is added to the map\n</small>\n</$list>\n\\end\n\n<$list filter=\"[<temp>!has[more]]\" variable=\"item\"><<search>></$list>\n<$list filter=\"[<temp>has[more]]\" variable=\"item\"><<editor>></$list>\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/cannotDeleteViewDialog": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/cannotDeleteViewDialog",
"subtitle": "{{$:/core/images/locked-padlock}} You cannot delete this view!",
"buttons": "ok",
"text": "\\rules except wikilink\n\nIt is not possible to delete the current view as ''<<count>>'' tiddlers\nare referencing it. To delete the view you must first remove the tiddlymap\nwidgets in the tiddlers listed below or change their view attributes.\n\n''References''\n\n<ul>\n<$list filter=<<refFilter>> variable=\"item\">\n <li><$link><<item>></$link></li>\n</$list>\n</ul>\n\nAfter the references are removed, you may delete the view.\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/getConfirmation": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/getConfirmation",
"subtitle": "{{$:/core/images/import-button}} You must confirm in order to proceed!",
"text": "\\rules except wikilink\n\n<<message>>\n\n''Are you really sure you want to do this?''"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/createView": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/createView",
"subtitle": "{{$:/core/images/new-button}} Creating a new view",
"text": "\\rules except wikilink\n\n<table class=\"tmap-config-table\">\n <<tmap-row type:\"input-text\"\n title:\"View name\"\n field:\"name\"\n focus:\"true\"\n class:\"tmap-trigger-field\n tmap-triggers-ok-button-on-enter\n tmap-triggers-cancel-button-on-esc\"\n descr:\"The name for the new view. If no name is entered,\n the program will invent one for you.\"\n note:\"You cannot override an existing view. In this case,\n you need to delete the old view first! You must no use\n slashes (`/`) in the name.\">>\n <<tmap-row type:\"input-checkbox\"\n title:\"Clone view\"\n field:\"clone\"\n descr:\"Use the view that is currently displayed in the\n editor as blueprint. The view will be an __exact__\n clone of the current one, only with a different\n name.\">>\n</table>\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/deleteNodeDialog": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/deleteNodeDialog",
"subtitle": "{{$:/core/images/delete-button}} You are about to delete <<count>> nodes",
"text": "\\rules except wikilink\n\n''Please choose an option or abort:''\n\n<$radio tiddler=<<output>> field=\"delete-from\" value=\"system\">\n Delete nodes from system <sup>[1]</sup>\n</$radio><br />\n<$radio tiddler=<<output>> field=\"delete-from\" value=\"filter\">\n Delete nodes from graph's filter <sup>[2]</sup>\n</$radio>\n\nThe following nodes will be deleted:\n\n<ul>\n<$list filter=<<tiddlers>>>\n <li><$view tiddler={{!!title}} field=\"title\" /></li>\n</$list>\n</ul>\n\n---\n\n<sup>[1]</sup>\n<small>This will delete all nodes, their corresponding tiddlers and all connected edges.</small><br/>\n<sup>[2]</sup>\n<small>''Important:'' Removing a node from the graph's filter only works, if the node has been added in the map editor per double click or via \"Add Node\". If the node hasn't been added as mentioned above, you need to change the underlying tiddler in a way that it doesn't match your filter anymore, if you don't want it to be displayed in the graph.</small>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/dublicateIdInfo": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/dublicateIdInfo",
"subtitle": "{{$:/core/images/info-button}} Dublicate id detected",
"buttons": "ok_suppress",
"text": "\\rules except wikilink\n\nTiddlyMap requires the value of the id field (\"tmap.id\") to be\nunique in order to correctly identify nodes and tiddlers.\n\nThe id of the \"<<param.changedTiddler>>\" already exists for these tiddlers:\n\n<ul>\n<$list filter=<<param.filter>> variable=\"item\">\n <li><$link><<item>></$link></li>\n</$list>\n</ul>\n\nTherefore TiddlyMap\n\n* assigned a new id to tiddler \"<<param.changedTiddler>>\"\n* removed all edges from \"<<param.changedTiddler>>\"\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/edgeNotVisible": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/edgeNotVisible",
"subtitle": "{{$:/core/images/info-button}} Edge will not be visible in view \"<<view>>\"",
"buttons": "ok_suppress",
"text": "\\rules except wikilink\n\nYou just created an edge of type\n<code><$text text=<<type>> /></code> that will not be\nvisible in this view because it doesn't match your\nedge-type filter settings.\n\nThe current edge-type filter of view \"<<view>>\" looks like this:\n\n<pre><code><$text text=<<eTyFilter>> /></code></pre>\n\nTo have the newly added type displayed in your view, adjust your\nedge-type filter accordingly. \n\nSome suggestions:\n\n<ul>\n <li>\n Explicitly add the type to the filter:\n <code><$text text=\"[[\" /><$text text=<<type>> /><$text text=\"]]\" /></code>\n </li>\n <li>\n <$set\n filter=\"[<type>regexp[:]splitbefore[:]]\"\n name=\"prefix\"\n emptyValue=<<tmap halfOfString \"$(type)$\">>>\n Add a filter rule (e.g. a prefix filter) that will match\n your type: <code>[prefix[<<prefix>>]]</code>\n </$set>\n </li>\n <li>Make your current view-filter less restrictive.</li>\n</ul>\n\nFor further information, please see:\n[[Node and edge-type filters|http://tiddlymap.org#Node%20and%20edge-type%20filters]]."
},
"$:/plugins/felixhayashi/tiddlymap/dialog/editNode/default": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/editNode/default",
"caption": "Global node style",
"classes": "tmap-remove-top-space",
"text": "\\rules except wikilink\n\n<div class=\"tmap-flash-message tmap-info\">\n A node's ''global configuration''\n (also referred to as //global individual config//) defines its\n individual appearance and behaviour in all views.\n</div>\n<<maybeShowTidColorWarning>>\n \n<$macrocall $name=\"sharedSettings\"\n twIconField=<<tidIconField>>\n faIconField=\"global.tmap.fa-icon\"\n labelField=<<tidLabelField>> />\n\n<$macrocall $name=\"visConfiguration\"\n mode=\"manage-node-types\"\n extensionField=\"global.tmap.style\"\n styleName=\"node's global style\"\n inheritedList=\"[[inherited-global-default-style]]\n [[inherited-local-default-style]]\n [[inherited-group-styles]]\" />"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/editNode/local": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/editNode/local",
"caption": "Local node style",
"classes": "tmap-remove-top-space",
"text": "\\rules except wikilink\n \n<div class=\"tmap-flash-message tmap-info\">\n The ''local node configuration'' \n (also referred to as //view-specific node configuration//)\n overrides the //global individual configuration// and only affects\n the node's appearance and behaviour in the current view.\n</div>\n<<maybeShowTidColorWarning>>\n\n<fieldset>\n <legend>Behaviour</legend>\n <table class=\"tmap-config-table\">\n <$macrocall type=\"input-select\"\n $name=\"tmap-row\"\n title=\"Open view\"\n field=\"local.open-view\"\n nochoice=\"Disabled\"\n selectFilter=<<tmap \"option\" \"selector.allViewsByLabel\">>\n descr=\"Clicking on this node will open the specified\n view instead of the tiddler represented by this node.\" />\n </table>\n</fieldset>\n\n<$macrocall $name=\"sharedSettings\"\n twIconField=\"local.tw-icon\"\n faIconField=\"local.fa-icon\"\n labelField=\"local.label\" />\n \n<$macrocall $name=\"visConfiguration\"\n mode=\"manage-node-types\"\n extensionField=\"local-node-style\"\n styleName=\"node's local style\"\n inheritedList=\"[[inherited-global-default-style]]\n [[inherited-local-default-style]]\n [[inherited-group-styles]]\n [[global.tmap.style]]\" />"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/editNode": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/editNode",
"subtitle": "{{$:/core/images/edit-button}} Editing style of node \"<<tiddler>>\"",
"classes": "tmap-remove-top-space",
"text": "\\rules except wikilink\n\n\\define maybeShowTidColorWarning()\n <$list filter=\"[<tidColor>regexp[.+]]\">\n <div class=\"tmap-flash-message tmap-warning\">\n You have set the tiddler's color\n field to \"<<tidColor>>\". This value will be completely ignored\n when you change node's color properties in the vis editor below.\n </div>\n </$list>\n\\end\n\n\\define iconSettings(twIconField, faIconField)\n <fieldset>\n <legend>Icon Settings</legend>\n <table class=\"tmap-config-table\">\n <<tmap-row type:\"input-text\"\n title:\"TW-icon\"\n field:\"$twIconField$\"\n descr:\"A tiddlywiki image reference.\n For example '$:/core/icon' for Movotun Jack.\">>\n <<tmap-row type:\"input-text\"\n title:\"FA-icon\"\n field:\"$faIconField$\"\n descr:\"A Font Awesome icon code.\n For example 'f206' for the bicycle symbol.\">>\n </table>\n </fieldset>\n\\end\n\n\\define sharedSettings(twIconField, faIconField, labelField)\n <fieldset>\n <legend>General Settings</legend>\n <table class=\"tmap-config-table\">\n <<tmap-row type:\"input-text\"\n title:\"Label\"\n field:\"$labelField$\"\n descr:\"Use this value as node label.\">>\n </table>\n </fieldset>\n <!-- display icon fieldset -->\n <<iconSettings \"$twIconField$\" \"$faIconField$\">> \n\\end\n\n<$macrocall\n $name=\"tabs\"\n default=<<concat \"$(template)$/default\">>\n tabsList=\"[all[shadows]prefix<template>] -[<template>]\"\n/>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/fullscreenTiddlerEditor/draft": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/fullscreenTiddlerEditor/draft",
"caption": "Draft",
"text": "\\rules except wikilink\n\n<div class=\"tmap-modal-editor\">\n <$importvariables filter=\"[all[tiddlers+shadows]prefix[$:/core/macros/]]\">\n <$set name=\"currentTiddler\" value=<<draftTRef>> >\n <$transclude tiddler=\"$:/core/ui/EditTemplate\" field=\"text\" mode=\"block\" />\n </$set>\n </$importvariables>\n</div>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/fullscreenTiddlerEditor/original": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/fullscreenTiddlerEditor/original",
"caption": "Current Version",
"text": "\\rules except wikilink\n\n<div class=\"tmap-modal-editor\">\n <$importvariables filter=\"[all[tiddlers+shadows]prefix[$:/core/macros/]]\">\n <$set name=\"currentTiddler\" value=<<originalTRef>> >\n <$transclude tiddler=\"$:/core/ui/ViewTemplate\" field=\"text\" mode=\"block\" />\n </$set>\n </$importvariables>\n</div>\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/fullscreenTiddlerEditor": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/fullscreenTiddlerEditor",
"subtitle": "{{$:/core/images/edit-button}} <<originalTRef>>",
"classes": "tmap-modal-fullscreen-editor tmap-remove-top-space",
"text": "\\rules except wikilink\n\n\\define defaultTab() $:/plugins/felixhayashi/tiddlymap/dialog/fullscreenTiddlerEditor/original\n\n<$macrocall $name=\"tabs\"\n default=<<defaultTab>>\n tabsList=\"[all[shadows]prefix[$:/plugins/felixhayashi/tiddlymap/dialog/fullscreenTiddlerEditor/]]\" />"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/fieldChanged": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/fieldChanged",
"subtitle": "{{$:/core/images/info-button}} The field \"<<name>>\" changed",
"text": "\\rules except wikilink\n\nYou changed the field \"<<name>>\" from \"<<oldValue>>\" to \"<<newValue>>\".\n\nIt is recommended to let TiddlyMap copy all values from the former field \"<<oldValue>>\" to the new field \"<<newValue>>\" so the data stored in \"<<oldValue>>\" is not lost. This operation has to be done now or never.\n\nDo you want to move each tiddler's existing \"<<oldValue>>\" value to \"<<newValue>>\"? Please note that any value currently stored in \"<<newValue>>\" would consequently be overridden and the old field \"<<oldValue>>\" would be eventually removed!"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/fullscreenNotSupported": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/fullscreenNotSupported",
"subtitle": "{{$:/core/images/info-button}} Your machine does not support fullscreen",
"buttons": "ok_suppress",
"text": "\\rules except wikilink\n\nPlease have a look [[here|http://caniuse.com/#feat=fullscreen]] to see a list of supported devices/browsers.\n\nSorry for this :("
},
"$:/plugins/felixhayashi/tiddlymap/dialog/renameView": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/renameView",
"subtitle": "{{$:/core/images/tag-button}} Please specify a view name",
"text": "\\rules except wikilink\n\n''Name:''\n<$edit-text focus=\"true\" tiddler=<<output>> field=\"text\" type=\"text\" tag=\"input\" default=\"\"\n class=\"tmap-trigger-field tmap-triggers-ok-button-on-enter\" />\n\nNote that ''<<count>>'' tiddlers are referencing this view.\n\n<$reveal type=\"nomatch\" text=\"0\" default=<<count>>>\n\nRenaming the view will cause the reference to be invalid.\nIt is recommended to first remove the tiddlymap widgets in\nthe tiddlers listed below or change their view attributes\naccordingly.\n\n''References''\n\n<ul>\n<$list filter=<<refFilter>> variable=\"item\">\n <li><$text text=<<item>> /></li>\n</$list>\n</ul>\n\n</$reveal>\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/saveCanvas": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/saveCanvas",
"subtitle": "{{$:/core/images/options-button}} Save a snapshot image of view \"<<view>>\"",
"text": "\\rules except wikilink\n\n\\define preview()\n<div class=\"tmap-save-canvas-preview\">\n <$transclude tiddler=<<snapshot>> /><br />\n Measures: <<width>> × <<height>>\n</div>\n\\end\n\n<table class=\"tmap-config-table\">\n<!--\n <<tmap-row type:\"input-text\"\n title:\"Name\"\n field:\"name\">\n-->\n<$macrocall $name=\"tmap-row\"\n type=\"input-text\"\n title=\"Name\"\n field=\"name\"\n descr=<<preview>> />\n</table>\n\n<fieldset><legend>Options</legend>\n <table class=\"tmap-config-table\">\n <<tmap-row type:\"input-radio\"\n title:\"Action\"\n field:\"action\" \n selectFilter:\"[[download|Download]]\n [[wiki|Save in wiki]]\n [[placeholder|Use as placeholder for this view]]\"\n descr:\"Save the image by downloading it to your computer or\n save it as a tiddler in your wiki.<br /><br />\n A third option is to make TiddlyMap use this image as\n placeholder for the current view. Placeholders are used\n when tiddlers are exported in form of static html\n or when editing a tiddler while having the preview\n shown. In this case the title input is ignored.\">>\n </table>\n</fieldset>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog",
"text": "\\rules except wikilink\n\n<div class=<<classes>>>\n<$importvariables\n filter=\"[[$:/plugins/felixhayashi/tiddlymap/misc/macros]]\n [[$:/core/macros/tabs]]\">\n<$transclude tiddler=<<template>> mode=\"block\" />\n</$importvariables>\n</div>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/welcome": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/welcome",
"subtitle": "{{$:/core/images/info-button }} Welcome",
"buttons": "ok",
"text": "\\rules except wikilink\n\nIt seems that you freshly installed TiddlyMap.\n\n* In case you need any help, please consult the [[online docs|http://tiddlymap.org#Documentation]] first.\n* You are welcome to create an [[issue|https://github.com/felixhayashi/TW5-TiddlyMap/issues]] at GitHub for any bug you discover.\n* Make sure to revisit the [[demo site|http://tiddlymap.org]] to see whether your version is up-to-date.\n* If you like TiddlyMap, please give it a star at [[GitHub|https://github.com/felixhayashi/TW5-TiddlyMap]] or tell your friends about it :)\n* ''Please note:'' TiddlyMap is distributed under the [[BSD 2-Clause License|http://opensource.org/licenses/BSD-2-Clause]], which belongs to the same license family, as the license used by TiddlyWiki. By using this plugin you agree to the product's [[License Terms|https://github.com/felixhayashi/TW5-TiddlyMap/blob/master/LICENSE]].\n\nEnjoy!\n\n---\n\nTiddlyMap will configure your wiki for optimal use. Everything can be changed back later by you, via the TiddlyWiki configurations panel, so no worries. If you checked some of the options below, please save & restart after closing this dialog.\n\n<table class=\"tmap-config-table\">\n <<tmap-row type:\"input-checkbox\"\n title:\"Optimize storyview\"\n field:\"config.storyview\"\n descr:\"Sets the storyview to 'top' for optimal scrolling.\">>\n <<tmap-row type:\"input-checkbox\"\n title:\"Optimize sidebar\"\n field:\"config.sidebar\"\n descr:\"Sets sidebar layout to 'fixed-fluid' for larger editor.\">>\n <<tmap-row type:\"input-checkbox\"\n title:\"Optimize navigation\"\n field:\"config.navigation\"\n descr:\"Sets navigation style to open tiddlers at top for better map navigation.\">>\n <<tmap-row type:\"input-checkbox\"\n title:\"Create demo welcome map\"\n field:\"config.demo\"\n descr:\"Creates a little hello world welcome map for you.\">>\n</table>\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/widgetCodeGenerator": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/widgetCodeGenerator",
"subtitle": "{{$:/core/images/permalink-button}} Widget Code Generator",
"buttons": "close",
"text": "\\rules except wikilink\n\n<div class=\"tmap-flash-message tmap-info\">\n Use the code below to embed a view in a tiddler.\n</div>\n\n<pre style=\"white-space: normal;\">\n<$tmap\n\n<$list filter=\"[<output>has[var.view]]\">\n view=\"<$view field='var.view' />\"</$list>\n<$list filter=\"[<output>field:var.click-to-use[true]]\">\n click-to-use=\"true\"</$list>\n<$list filter=\"[<output>has[var.editor]]\">\n editor=\"<$view field='var.editor' />\"</$list>\n<$list filter=\"[<output>has[var.width]]\">\n width=\"<$view field='var.width' />\"</$list>\n<$list filter=\"[<output>has[var.height]]\">\n height=\"<$view field='var.height' />\"</$list>\n<$list filter=\"[<output>has[var.class]]\">\n class=\"<$view field='var.class' />\"</$list>\n<$list filter=\"[<output>field:var.show-buttons[false]]\">\n show-buttons=\"false\"</$list>\n<$list filter=\"[<output>has[var.design]]\">\n design=\"<$view field='var.design' />\"</$list>></$tmap>\n</pre>\n\n<fieldset>\n <legend>Parameters</legend> \n <table class=\"tmap-config-table\">\n <$macrocall type=\"input-select\"\n $name=\"tmap-row\"\n title=\"View\"\n field=\"var.view\"\n nochoice=\" \"\n selectFilter=<<tmap \"option\" \"selector.allViewsByLabel\">>\n descr=\"The view to bind the wiedget to\" />\n <<tmap-row type:\"input-select\"\n title:\"Editor bar\"\n field:\"var.editor\"\n selectFilter:\"[[|Hidden]]\n [[vis|Simple]]\n [[advanced|Advanced]]\"\n descr:\"Whether the widget should act as an editor or not.\">>\n <<tmap-row type:\"input-select\"\n title:\"Design\"\n field:\"var.design\"\n selectFilter:\"[[|Normal]]\n [[plain|Plain]]\"\n descr:\"Usually a header is displayed and borders. Plain\n design will only show the mere graph.\">>\n <<tmap-row type:\"input-text\"\n title:\"Height\"\n field:\"var.height\"\n descr:\"Graph's height in css units. Defaults to '300px'.\">>\n <<tmap-row type:\"input-text\"\n title:\"Width\"\n field:\"var.width\"\n descr:\"Graph's width in css units. Defaults to '100%'.\">>\n <<tmap-row type:\"input-text\"\n title:\"Class\"\n field:\"var.class\"\n descr:\"A custom class to apply your own css.\">>\n <<tmap-row type:\"input-checkbox\"\n title:\"Click to use\"\n field:\"var.click-to-use\"\n default:\"false\"\n descr:\"A click is needed to enable the graph.\">>\n <<tmap-row type:\"input-checkbox\"\n title:\"Show buttons\"\n field:\"var.show-buttons\"\n default:\"true\"\n descr:\"Show or hide the graph's navigation buttons.\">>\n </table>\n</fieldset>"
},
"$:/plugins/felixhayashi/tiddlymap/dialogFooter/close": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialogFooter/close",
"text": "\\rules except wikilink\n\n<$button class=\"tmap-dialog-button tmap-close-button\" tooltip=\"Close this dialog\">Close\n\n <!-- trigger dialog callback -->\n <$action-setfield $tiddler=<<result>> text=\"1\" />\n \n</$button>\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialogFooter/ok": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialogFooter/ok",
"text": "\\rules except wikilink\n\n<$button class=\"tmap-dialog-button tmap-ok-button\" tooltip=\"Confirm dialog\">OK\n\n <!-- trigger dialog callback -->\n <$action-setfield $tiddler=<<result>> text=\"1\" />\n \n</$button>\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialogFooter/ok_cancel": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialogFooter/ok_cancel",
"text": "\\rules except wikilink\n\n<$transclude tiddler=\"$:/plugins/felixhayashi/tiddlymap/dialogFooter/ok\" mode=\"inline\" />\n<$button class=\"tmap-dialog-button tmap-cancel-button\" tooltip=\"Close dialog without saving\">Cancel\n <!-- trigger dialog callback -->\n <$action-setfield $tiddler=<<result>> text=\"\" />\n</$button>\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialogFooter/ok_suppress": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialogFooter/ok_suppress",
"text": "\\rules except wikilink\n\n<$set name=\"currentTiddler\" value=<<title>> >\n\n<$checkbox field=\"suppress\" checked=\"1\" unchecked=\"0\" default=\"0\"> Do not show this dialog again</$checkbox>\n<$button class=\"tmap-dialog-button tmap-ok-button\" tooltip=\"Confirm this dialog\">OK\n\n <!-- trigger dialog callback -->\n <$action-setfield $tiddler=<<result>> text=\"1\" />\n \n <!-- suppress dialog in the future -->\n <$action-sendmessage $message=\"tmap:tm-suppress-dialog\"\n dialog=<<templateId>>\n suppress={{!!suppress}} />\n \n</$button>\n\n</$set>"
},
"$:/plugins/felixhayashi/tiddlymap/dialogFooter": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialogFooter",
"text": "\\rules except wikilink\n\n\\define footer() $:/plugins/felixhayashi/tiddlymap/dialogFooter/$(buttons)$\n\n<$transclude tiddler=<<footer>> />\n\n<!-- we need this button to be able to close a tiddler from outside programmatically -->\n<$button class=\"tmap-hidden-close-button\" message=\"tm-close-tiddler\" />"
},
"$:/plugins/felixhayashi/tiddlymap/dialogFooter/element_type_manager": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialogFooter/element_type_manager",
"text": "\\rules except wikilink\n\n<$button\n class=\"tmap-dialog-button tmap-save-button\"\n tooltip=\"Save the current changes\">Save\n <$action-sendmessage\n $message=\"tmap:tm-save-type-form\"\n mode=<<mode>>\n output=<<output>> />\n</$button>\n<$button\n class=\"tmap-dialog-button tmap-cancel-button\"\n tooltip=\"Cancel the most resent changes and exit\">Quit\n <$action-setfield $tiddler=<<result>> text=\"1\" />\n</$button>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager/deleteType": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager/deleteType",
"caption": "Removal",
"text": "\\rules except wikilink\n\n\\define manage-edge-types()\n <$macrocall $name=\"tmap-row\"\n type=\"input-checkbox\"\n title=\"Delete type\"\n field=\"temp.deleteType\"\n default={{!id}}\n readonly={{!!temp.idImmutable}}\n descr=\"If you want to delete this type, set this to true\n and click the save button afterwards. Predefined system\n types cannot be deleted.\" note=\"Consequently, all edges\n of this type will be deleted.\" />\n\\end\n\n\\define manage-node-types()\n <$macrocall $name=\"tmap-row\"\n type=\"input-checkbox\"\n title=\"Delete type\"\n field=\"temp.deleteType\"\n default={{!id}}\n readonly={{!!temp.idImmutable}}\n descr=\"If you want to delete this type, set this to true and\n click the save button afterwards. Predefined system\n types cannot be deleted.\" />\n\\end\n\n<table class=\"tmap-config-table\"><$macrocall $name=<<mode>> /></table>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager/description": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager/description",
"caption": "Description",
"text": "\\rules except wikilink\n\n\\define manage-edge-types()\n <<tmap-row type:\"input-textarea\"\n title:\"Description\"\n field:\"description\"\n descr:\"An optional description for this type. The\n description will be displayed as tooltip when\n moving the mouse over an edge of this type.\">>\n\\end\n\n\\define manage-node-types()\n <<tmap-row type:\"input-textarea\"\n title:\"Description\"\n field:\"description\" \n descr:\"An optional description for this type.\">>\n\\end\n\n<table class=\"tmap-config-table\">\n <$macrocall $name=<<mode>> />\n</table>\n\n"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager/generalSettings": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager/generalSettings",
"caption": "General",
"text": "\\rules except wikilink\n\n\\define manage-edge-types()\n <<tmap-row type:\"input-text\"\n title:\"Label\"\n field:\"label\" \n descr:\"An optional alias used as edge-label.\">>\n <<tmap-row type:\"input-checkbox\"\n title:\"Show label\"\n field:\"show-label\"\n default:\"true\"\n descr:\"If unchecked, no edge label will be displayed.\">>\n\\end\n\\define manage-node-types()\n <$list filter=\"[<currentTiddler>!regexp:id[tmap:]]\">\n <<tmap-row type:\"input-textarea\"\n title:\"Scope\"\n field:\"scope\" \n descr:\"A filter expression that defines, which nodes inherit\n this node-type and its style.\">>\n </$list>\n <$macrocall type=\"input-select\"\n $name=\"tmap-row\" \n title=\"Priority\"\n field=\"priority\"\n selectFilter=<<tmap \"scale\" \"100\">>\n descr=\"When a type has a a higher priority than another type,\n its style will override the other style\" />\n\\end\n\n<table class=\"tmap-config-table\">\n <$macrocall\n $name=\"tmap-row\"\n title=\"Identifier\"\n field=\"temp.newId\"\n type=\"input-text\"\n default={{!!id}}\n readonly={{!!temp.idImmutable}}\n descr=\"A unique identifier\"\n />\n <$macrocall $name=<<mode>> />\n</table>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager/overview": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager/overview",
"caption": "Overview",
"text": "\\rules except wikilink\n\n\\define date(f) <$view field=$f$ format=\"date\" template=\"DDth mmm hh:mm:ss\"/>\n\n! <$link to={{!!typeTRef}}><$view field=\"id\" /></$link>\n\n<table class=\"tmap-key-value-table\">\n <tr>\n <th align=\"left\">Created on</th>\n <td>\n <<date \"created\">>\n </td>\n </tr>\n <tr>\n <th align=\"left\">Modified on</th>\n <td><<date \"modified\">></td>\n </tr>\n <tr>\n <th align=\"left\">Usage count</th>\n <td>\n <span class=\"tmap-edge-type-specific\">\n <$view field=\"temp.usageCount\" />\n </span>\n <span class=\"tmap-node-type-specific\">\n <$count filter={{!!scope}}>0</$count>\n </span>\n </td>\n </tr>\n</table>\n\n<$view field=\"description\">//No description available//</$view>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager/styling": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager/styling",
"caption": "Styling",
"text": "\\rules except wikilink\n\n\\define url()\n <$set\n filter=\"[<mode>prefix[manage-edge-types]]\"\n name=\"module\"\n value=\"edges\"\n emptyValue=\"nodes\">\n [[visjs.org|http://visjs.org/docs/network/$(module)$]]\n </$set>\n\\end\n\n<fieldset class=\"tmap-node-type-specific\">\n <legend>Icon Settings</legend>\n <table class=\"tmap-config-table\">\n <<tmap-row type:\"input-text\"\n title:\"TW-icon\"\n field:\"tw-icon\"\n descr:\"A tiddlywiki image reference.\n For example '$:/core/icon' for Movotun Jack.\">>\n <<tmap-row type:\"input-text\"\n title:\"FA-icon\"\n field:\"fa-icon\"\n descr:\"A Font Awesome icon code.\n For example 'f206' for the bicycle symbol.\">>\n </table>\n</fieldset>\n\n<fieldset><legend>Visjs styles</legend>\n <div class=\"tmap-flash-message tmap-info\">\n All visjs options below are documented at <<url>>.\n </div>\n <div class=\"tmap-flash-message tmap-info\">\n Only config items that you actually changed have an effect on\n the graph. Other options are visible, yet, inactive.\n </div>\n <$tmap-config\n mode=<<mode>>\n inherited=\"vis-inherited\"\n extension=\"style\" />\n</fieldset>"
},
"$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager": {
"title": "$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager",
"subtitle": "{{$:/core/images/tag-button}} <<topic>>",
"buttons": "element_type_manager",
"classes": "tmap-remove-top-space",
"text": "\\rules except wikilink\n\n\\define defaultTab()\n$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager/overview\n\\end\n\n\\define settingsTab()\n$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager/generalSettings\n\\end\n\n\\define tabsFilter()\n[all[shadows]prefix[$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager/]]\n\\end\n\n\\define searchFilter()\n$(searchSelector)$\n+[sort[title]nsort[priority]]\n+[removeprefix<typeRootPath>removeprefix[/]]\n+[search:title{$:/temp/tmap/MapElementTypeSearch}]\n\\end\n\n\\define managerClass() tmap-$(mode)$\n\n\\define typePath() $(typeRootPath)$/$(id)$\n\n<div id=\"tmap-element-type-manager\" class=<<managerClass>>>\n <div>\n <div class=\"tmap-searchbar\">\n <$edit-text\n focus=\"true\"\n tiddler=\"$:/temp/tmap/MapElementTypeSearch\"\n type=\"text\"\n tag=\"input\"\n default=\"\" />\n <$list filter=\"[{$:/temp/tmap/MapElementTypeSearch}regexp[.+]]\n +[addprefix[/]]\n +[addprefix<typeRootPath>]\n +[!is[tiddler]!is[shadow]]\">\n <$button tooltip=\"Create a new type of this name\">\n {{$:/core/images/new-button}}\n <$action-sendmessage\n $message=\"tmap:tm-create-type\"\n mode=<<mode>>\n id={{$:/temp/tmap/MapElementTypeSearch}}\n output=<<output>> />\n <$action-setfield $tiddler=\"$:/temp/tmap/MapElementTypeSearch\" text=\"\" />\n </$button>\n </$list>\n\n </div>\n <ul>\n <$list\n filter=<<searchFilter>>\n emptyMessage=<<noTypeFound>>\n variable=\"id\">\n <li>\n <span class=\"tmap-ranking tmap-node-type-specific\">\n # <$view tiddler=<<typePath>> field=\"priority\">1</$view>\n </span>\n <$button class=\"tc-btn-invisible tmap-link\"><<id>>\n <$action-setfield\n $tiddler=<<qualify \"$:/state/tabs/MapElementTypeManager\">>\n text=<<defaultTab>> />\n <$action-sendmessage\n $message=\"tmap:tm-load-type-form\"\n id=<<id>>\n mode=<<mode>>\n output=<<output>> />\n </$button>\n </li>\n </$list>\n </ul>\n </div>\n <div>\n <$reveal type=\"nomatch\" text=\"\" default={{!!id}} >\n <$macrocall\n $name=\"tabs\"\n default=<<defaultTab>>\n state=\"$:/state/tabs/MapElementTypeManager\"\n tabsList=<<tabsFilter>> />\n </$reveal>\n <$reveal type=\"match\" text=\"\" default={{!!id}} >\n <div class=\"tmap-flash-message tmap-info\">\n Please select a type from the list or create a new one by\n entering the type name in the search field on the left.\n </div>\n <div class=\"tmap-flash-message tmap-info tmap-node-type-specific\">\n The number next to the node-type label represents it's priority.\n </div>\n </$reveal>\n </div>\n</div>\n"
},
"$:/plugins/felixhayashi/tiddlymap/editor/contextMenu/node": {
"title": "$:/plugins/felixhayashi/tiddlymap/editor/contextMenu/node",
"text": "\\define single()\n <$list filter=\"\n [[tmap:tm-toggle-central-topic, $:/core/images/star-filled, Toggle central topic]]\n [[tmap:tm-delete-element, $:/core/images/delete-button, Delete node]]\">\n <$button class=\"tc-btn-invisible\">\n <$action-sendmessage $message=<<tmap \"splitAndSelect\" \", \" \"0\">> />\n <$transclude tiddler=<<tmap \"splitAndSelect\" \", \" \"1\">> />\n <<tmap \"splitAndSelect\" \", \" \"2\">>\n </$button>\n </$list>\n\\end\n\n\\define multi()\n <$list filter=\"\n [[tmap:tm-delete-element, $:/core/images/delete-button, Delete selected nodes]]\">\n <$button class=\"tc-btn-invisible\">\n <$action-sendmessage $message=<<tmap \"splitAndSelect\" \", \" \"0\">> />\n <$transclude tiddler=<<tmap \"splitAndSelect\" \", \" \"1\">> />\n <<tmap \"splitAndSelect\" \", \" \"2\">>\n </$button>\n </$list>\n\\end\n\n<div class=\"tc-drop-down\">\n <$macrocall $name=<<mode>> />\n</div>"
},
"$:/plugins/felixhayashi/tiddlymap/misc/advancedEditorBar": {
"title": "$:/plugins/felixhayashi/tiddlymap/misc/advancedEditorBar",
"text": "\\rules except wikilink\n\\define showEdgeField() show-$(curEdgeId)$\n\n<!-- === View Switcher ========================================== -->\n\n<div class=\"tmap-menu-bar\">\n View:\n <$reveal type=\"match\" text=\"false\" default=<<isViewBound>> >\n <$select\n tiddler=<<viewHolder>>\n field=\"text\"\n default=<<viewLabel>> >\n <$list filter=<<tmap \"option\" \"selector.allViewsByLabel\">> >\n <option value={{!!title}}>\n <$view tiddler={{!!title}} field=\"title\" />\n </option>\n </$list>\n </$select>\n </$reveal>\n <$reveal type=\"match\" text=\"true\" default=<<isViewBound>> >\n <b><<viewLabel>></b>\n </$reveal>\n\n<!-- === Menu =================================================== -->\n\n <$button\n popup=<<qualify \"$:/temp/menu\">>\n tooltip=\"Open the Menu\">{{$:/core/images/menu-button}}\n </$button>\n\n <$reveal type=\"popup\" position=\"below\" state=<<qualify \"$:/temp/menu\">> >\n <div class=\"tc-drop-down\">\n <a href=\"http://tiddlymap.org#Documentation\" target=\"_blank\">\n {{$:/core/images/info-button}} Open online help\n </a>\n <$button class=\"tc-btn-invisible\" message=\"tmap:tm-create-view\">\n {{$:/core/images/new-button}} Create new view\n </$button>\n <$button class=\"tc-btn-invisible\" message=\"tmap:tm-generate-widget\">\n {{$:/core/images/permalink-button}} Grab widget code\n </$button>\n <div class=\"tmap-list-separator\">Global configurations:</div>\n <$button class=\"tc-btn-invisible\" message=\"tmap:tm-configure-system\">\n {{$:/core/images/options-button}} Configure TiddlyMap\n </$button>\n <$button class=\"tc-btn-invisible\" message=\"tmap:tm-manage-edge-types\">\n <span class=\"tmap-unicode-icon\">◭</span> Manage edge-types\n </$button>\n <$button class=\"tc-btn-invisible\" message=\"tmap:tm-manage-node-types\">\n <span class=\"tmap-unicode-icon\">▢</span> Manage node-types\n </$button>\n <div class=\"tmap-view-actions\">\n <div class=\"tmap-list-separator\">Actions for this view:</div>\n <$button class=\"tc-btn-invisible\" message=\"tmap:tm-edit-view\">\n {{$:/core/images/options-button}} Configure view\n </$button>\n <$button class=\"tc-btn-invisible\" message=\"tmap:tm-rename-view\">\n {{$:/core/images/tag-button}} Rename view\n </$button>\n <$button class=\"tc-btn-invisible\" message=\"tmap:tm-delete-view\">\n {{$:/core/images/delete-button}} Delete view\n </$button>\n </div>\n </div>\n </$reveal>\n\n<!-- === Neighbourhood menu ===================================== -->\n\n <$reveal\n type=\"match\"\n text=\"true\"\n default=<<tmap \"option\"\n \"config.sys.editorMenuBar.showNeighScopeButton\">>>\n <$button\n class=<<neighScopeBtnClass>>\n tooltip=\"Change the neighbourhood scope\"\n popup=<<qualify \"$:/temp/neighScope\">>>\n ☀\n </$button>\n </$reveal>\n\n <$reveal type=\"popup\" position=\"below\" state=<<qualify \"$:/temp/neighScope\">> >\n <div class=\"tc-drop-down\">\n <div class=\"tmap-list-separator\">Neighbourhood scope</div>\n <$button class=\"tc-btn-invisible\">None\n <$action-setfield\n $tiddler=<<viewRoot>>\n config.neighbourhood_scope=\"\" />\n </$button>\n <$list filter=\"[[1|1 step distance]]\n [[2|2 step distance]]\n [[3|3 step distance]]\n [[4|4 step distance]]\n [[5|5 step distance]]\">\n <$button class=\"tc-btn-invisible\">\n <<tmap \"splitAndSelect\" \"|\" \"1\">>\n <$action-setfield\n $tiddler=<<viewRoot>>\n config.neighbourhood_scope=<<tmap \"splitAndSelect\" \"|\" \"0\">> />\n </$button>\n </$list>\n <$button class=\"tc-btn-invisible\">No limit\n <$action-setfield\n $tiddler=<<viewRoot>>\n config.neighbourhood_scope=\"100\" />\n </$button>\n <div class=\"tmap-list-separator\">Neighbourhood traversal</div>\n <$radio field=\"config.neighbourhood_directions\" value=\"in\"> Incoming</$radio><br />\n <$radio field=\"config.neighbourhood_directions\" value=\"out\"> Outgoing</$radio><br />\n <$radio field=\"config.neighbourhood_directions\" value=\"\"> Both</$radio>\n <div class=\"tmap-list-separator\">Other</div>\n <$checkbox field=\"config.show_inter_neighbour_edges\"\n checked=\"true\" unchecked=\"false\"> Inter-neighbour edges</$checkbox>\n\n </div>\n </$reveal>\n\n<!-- === Export menu ============================================ -->\n\n <$reveal\n type=\"match\"\n text=\"true\"\n default=<<tmap \"option\" \"config.sys.editorMenuBar.showScreenshotButton\">>>\n <$button tooltip=\"Open the map-export menu\" popup=<<qualify \"$:/temp/mapExport\">>>\n {{$:/core/images/download-button}}\n </$button>\n </$reveal>\n\n <$reveal type=\"popup\" position=\"below\" state=<<qualify \"$:/temp/mapExport\">>>\n <div class=\"tc-drop-down\">\n <$button\n class=\"tc-btn-invisible\"\n tooltip=\"Export the graph and all its elements\n in form of a JSON file\">\n {{$:/core/images/permalink-button}} Save as JSON file\n <$action-sendmessage\n $message=\"tmap:tm-download-graph\"\n view=<<viewLabel>> />\n </$button>\n <$button\n class=\"tc-btn-invisible\"\n tooltip=\"Create a png image to download or save it\n as image or view-placeholder in your wiki\">\n {{$:/core/images/palette}} Save as png image\n <$action-sendmessage $message=\"tmap:tm-save-canvas\" />\n </$button>\n </div>\n </$reveal>\n\n<!-- === Raster menu ============================================ -->\n\n <$reveal\n type=\"match\"\n text=\"true\"\n default=<<tmap \"option\" \"config.sys.editorMenuBar.showRasterMenuButton\">>>\n <$button\n tooltip=\"Change the raster of your map\"\n class=<<rasterMenuBtnClass>>\n popup=<<qualify \"$:/temp/rasterMenu\">>>\n ⩩\n </$button>\n </$reveal>\n\n <$reveal type=\"popup\" position=\"below\" state=<<qualify \"$:/temp/rasterMenu\">>>\n <div class=\"tc-drop-down\">\n <$button class=\"tc-btn-invisible\">Disable raster\n <$action-setfield\n $tiddler=<<viewRoot>>\n config.raster=\"\" />\n </$button>\n <div class=\"tmap-list-separator\">Raster sizes</div>\n <$list filter=\"[[50|50px]]\n [[75|75px]]\n [[100|100px]]\n [[150|150px]]\">\n <$button class=\"tc-btn-invisible\">\n <<tmap \"splitAndSelect\" \"|\" \"1\">>\n <$action-setfield\n $tiddler=<<viewRoot>>\n config.raster=<<tmap \"splitAndSelect\" \"|\" \"0\">> />\n </$button>\n </$list>\n </div>\n </$reveal>\n\n</div>\n"
},
"$:/plugins/felixhayashi/tiddlymap/misc/focusButton": {
"title": "$:/plugins/felixhayashi/tiddlymap/misc/focusButton",
"text": "\\define filter() [list[$:/temp/tmap/nodes/$(viewLabel)$]search:title{$:/temp/tmap/bar/search}]\n\\define concat(str) $str$\n\n\\define state() $(widgetPopupsPath)$/focus\n\n<div class=\"tmap-focus-button\">\n <$reveal type=\"match\" state=<<state>> text=\"\">\n <$button\n tooltip=\"Zoom on a specific node\"\n class=<<tv-config-toolbar-class>>>{{$:/core/images/advanced-search-button}}\n <$action-setfield $tiddler=\"$:/temp/tmap/bar/search\" text=\"\" />\n <$action-setfield $tiddler=<<state>> text=\"1\" />\n </$button>\n </$reveal>\n <$reveal type=\"nomatch\" state=<<state>> text=\"\">\n <$button\n tooltip=\"Close zoom popup\"\n class=<<tv-config-toolbar-class>>>{{$:/core/images/advanced-search-button}}\n <$action-setfield $tiddler=<<state>> text=\"\" />\n </$button>\n <div class=\"tmap-search-dropdown\">\n <div class=\"tc-drop-down\">\n <$edit-text\n focus=\"true\"\n tiddler=\"$:/temp/tmap/bar/search\"\n field=\"text\"\n type=\"text\"\n tag=\"input\"\n default=\"\" />\n <small><$count filter=<<filter>> /> results</small>\n <hr />\n <div class=\"tmap-very-small-list\">\n <$list filter=<<filter>>\n variable=\"item\"\n emptyMessage=\"//No results//\">\n <$button\n class=\"tc-btn-invisible\"\n message=\"tmap:tm-focus-node\"\n param=<<item>>>\n <$view tiddler=<<item>> field=\"title\" />\n </$button>\n </$list>\n </div>\n </div>\n </div>\n </$reveal>\n</div>"
},
"$:/plugins/felixhayashi/tiddlymap/hook/editor": {
"title": "$:/plugins/felixhayashi/tiddlymap/hook/editor",
"caption": "Map",
"tags": "$:/tags/SideBar",
"text": "\\define width() calc(100% - 15px)\n\n<div class=\"tmap-mobile-editor\">\n <div class=\"tmap-flash-message tmap-warning\">\n The editor is not displayed in mobile mode.\n </div>\n</div>\n<div class=\"tmap-desktop-editor\">\n <$tiddlymap\n class=\"tmap-sidebar-map-editor\"\n editor=\"advanced\"\n object-id=\"main_editor\"\n click-to-use=\"false\">\n </$tiddlymap>\n</div>"
},
"$:/plugins/felixhayashi/tiddlymap/hook/liveTab": {
"title": "$:/plugins/felixhayashi/tiddlymap/hook/liveTab",
"caption": "Live",
"text": "\\define width() calc(100% - 15px)\n\n<div class=\"tmap-mobile-editor\">\n <div class=\"tmap-flash-message tmap-warning\">\n The live tab is not displayed in mobile mode.\n </div>\n</div>\n<div class=\"tmap-desktop-editor\">\n <$set name=\"view\"\n filter=\"[{$:/temp/tmap/currentTiddler}get[tmap.open-view]]\"\n emptyValue=<<tmap \"option\" \"config.sys.liveTab.fallbackView\">>>\n <div>\n <$tiddlymap\n view=<<view>>\n click-to-use=\"false\"\n refresh-triggers=\"$:/temp/tmap/currentTiddler\"\n object-id=\"live_tab\">\n </$tiddlymap>\n </div>\n </$set> \n</div>"
},
"$:/plugins/felixhayashi/tiddlymap/misc/quickConnectButton": {
"title": "$:/plugins/felixhayashi/tiddlymap/misc/quickConnectButton",
"tags": "$:/tags/ViewToolbar",
"description": "{{$:/language/Buttons/TiddlyMap/Hint}}",
"caption": "{{$:/plugins/felixhayashi/tiddlymap/icon}} {{$:/language/Buttons/TiddlyMap/Caption}}",
"text": "\\define buttonClass() $(tv-config-toolbar-class)$ $(additional-classes)$\n\n\\define nonExistentItem()\n<<item>> <span style=\"color: #9E9E9E\">(will be created)</span>\n\\end\n\n\\define noConnectionsMsg()\n<tr><td colspan=\"4\">//No connections found!//</td></tr>\n\\end\n\n\\define normalSearchFilter()\n[!is[system]!has[draft.of]search:title{$:/temp/quickConnectSearch}sortcs[title]limit[50]]\n\\end\n\n\\define regexSearchFilter()\n[!is[system]!has[draft.of]regexp{$:/temp/quickConnectSearch}sortcs[title]limit[50]]\n\\end\n\n\\define showButton(state)\n<$button set=\"$:/temp/tmap/state/popup/quickConnect\"\n setTo=\"$state$\" tooltip={{$:/language/Buttons/TiddlyMap/Hint}} \n aria-label={{$:/language/Buttons/TiddlyMap/Caption}}\n class=<<buttonClass>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">{{$:/plugins/felixhayashi/tiddlymap/icon}}</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/TiddlyMap/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n\\define searchResults()\n<td>\n <$button tooltip=\"Create incoming edge\">\n <<tmap \"option\" \"misc.arrows.in\">>\n <$action-sendmessage $message=\"tmap:tm-create-edge\"\n from=<<item>>\n to=<<currentTiddler>>\n force=\"true\"\n label={{$:/temp/quickConnectSearch/type}}\n view={{$:/temp/quickConnectSearch/view}} />\n </$button>\n</td>\n<td>\n <$button tooltip=\"Create outgoing edge\">\n <<tmap \"option\" \"misc.arrows.out\">>\n <$action-sendmessage $message=\"tmap:tm-create-edge\"\n from=<<currentTiddler>>\n to=<<item>>\n force=\"true\"\n label={{$:/temp/quickConnectSearch/type}}\n view={{$:/temp/quickConnectSearch/view}} />\n </$button>\n</td>\n<td>\n <$list\n filter=\"[<item>is[tiddler]]\"\n emptyMessage=<<nonExistentItem>>>\n <$view tiddler=<<item>> field=\"title\" />\n </$list>\n</td>\n\\end\n\n\\define hidePopup()\n<$macrocall $name=\"showButton\" state=<<qualify>> />\n\\end\n\n\\define showPopup()\n<$set name=\"additional-classes\" value=\"tmap-active-button\">\n <$macrocall $name=\"showButton\" state=\"\" />\n</$set>\n<$set\n name=\"searchFilter\"\n filter=\"[field:title[$:/state/tmap/tid-toolbar]has[re-filter]]\"\n value=<<regexSearchFilter>>\n emptyValue=<<normalSearchFilter>>>\n<div class=\"tmap-quick-connect tc-reveal tc-popup\">\n <div class=\"tc-drop-down\">\n <div class=\"title\">Create connection</div>\n <table class=\"tmap-quick-connect-search-bar\">\n <tr>\n <td>Type:</td>\n <td>\n <$edit-text\n tiddler=\"$:/temp/quickConnectSearch/type\"\n field=\"text\"\n type=\"text\"\n tag=\"input\"\n default=\"\" />\n <$select tiddler=\"$:/temp/quickConnectSearch/type\" default=\"\">\n <option></option>\n <$list filter=<<tmap \"option\" \"selector.allEdgeTypesById\">>>\n <option>{{!!title}}</option>\n </$list>\n </$select>\n </td>\n </tr>\n <tr>\n <td>Search:</td>\n <td>\n <$edit-text tiddler=\"$:/temp/quickConnectSearch\" type=\"text\" tag=\"input\" default=\"\"></$edit-text>\n <$checkbox\n tiddler=\"$:/state/tmap/tid-toolbar\"\n field=\"re-filter\"\n checked=\"1\"\n unchecked=\"\"\n default=\"\"> regexp\n </$checkbox>\n<!--\n <small>(<$count filter=<<searchFilter>> /> results)</small>\n-->\n </td>\n </tr>\n </table>\n <table class=\"tmap-create-connection-table\">\n <tr>\n <td colspan=\"2\">\n <table class=\"tmap-very-small-list\">\n <$list\n filter=<<searchFilter>>\n variable=\"item\">\n <tr><<searchResults>></tr>\n </$list>\n <tr>\n <$list filter=\"[{$:/temp/quickConnectSearch}regexp[.+]] -[is[tiddler]]\" variable=\"item\">\n <<searchResults>>\n </$list>\n </tr>\n </table>\n </td>\n </tr>\n </table>\n <div class=\"title\">Existing Connections</div>\n <div class=\"tmap-quick-connect-existing-bar\">\n <$select\n tiddler=\"$:/state/tmap/tid-toolbar\"\n field=\"direction\"\n default=\"both\">\n <option value=\"both\">both</option>\n <option value=\"in\">incoming</option>\n <option value=\"out\">outgoing</option>\n </$select>\n <$checkbox\n tiddler=\"$:/state/tmap/tid-toolbar\"\n field=\"filter.links\"\n checked=\"-[[tw-body:link]]\"\n unchecked=\"\"\n default=\"\"> hide links\n </$checkbox>\n </div>\n <table class=\"tmap-connection-table\">\n<!--\n <tr>\n <th></th>\n <th>Tiddler</th>\n <th>Type</th>\n <th></th>\n </tr>\n-->\n \n <$tmap-connections\n filter=<<tmap mergeFields \"$:/state/tmap/tid-toolbar\" \"filter.\">>\n direction={{$:/state/tmap/tid-toolbar!!direction}}\n emptyMessage=<<noConnectionsMsg>>>\n <tr>\n <td title=<<direction>>><<directionSymbol>></td>\n <td><$link to=<<neighbour>>><$view field=\"title\" /></$link></td>\n <td><<edge.type>></td>\n <td>\n <$button\n tooltip=\"Delete this connection\"\n class=\"tc-btn-invisible\">{{$:/core/images/close-button}}\n <$action-sendmessage $message=\"tmap:tm-remove-edge\"\n id=<<edge.id>>\n from=<<edge.from>>\n to=<<edge.to>>\n type=<<edge.type>> />\n </$button>\n </td>\n </tr>\n </$tmap-connections>\n </table> \n </div>\n</div>\n</$set>\n\\end\n\n<$list filter=\"[all[current]is[tiddler]]\"><$list filter=\"[{$:/temp/tmap/state/popup/quickConnect}prefix<qualify>]\" variable=\"item\" emptyMessage=<<hidePopup>>><<showPopup>></$list></$list>"
},
"$:/plugins/felixhayashi/tiddlymap/media/fullscreen.png": {
"title": "$:/plugins/felixhayashi/tiddlymap/media/fullscreen.png",
"type": "image/png",
"text": "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"
},
"$:/plugins/felixhayashi/tiddlymap/media/halfscreen.png": {
"title": "$:/plugins/felixhayashi/tiddlymap/media/halfscreen.png",
"type": "image/png",
"text": "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"
},
"$:/plugins/felixhayashi/tiddlymap/icon": {
"title": "$:/plugins/felixhayashi/tiddlymap/icon",
"tags": "$:/tags/Image",
"text": "<svg\n xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:cc=\"http://creativecommons.org/ns#\"\n xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n xmlns:svg=\"http://www.w3.org/2000/svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"\n class=\"tc-image-tiddlymap-button tc-image-button\"\n version=\"1.1\"\n width=\"22pt\"\n height=\"22pt\"\n viewBox=\"0 0 128 128\">\n <defs\n id=\"defs4\">\n <marker\n refX=\"0\"\n refY=\"0\"\n orient=\"auto\"\n id=\"Arrow1Lend\"\n style=\"overflow:visible\">\n <path\n d=\"M 0,0 5,-5 -12.5,0 5,5 0,0 z\"\n transform=\"matrix(-0.8,0,0,-0.8,-10,0)\"\n id=\"path3850\"\n style=\"fill-rule:evenodd;stroke:#000000;stroke-width:1pt\" />\n </marker>\n <marker\n refX=\"0\"\n refY=\"0\"\n orient=\"auto\"\n id=\"Arrow1Lstart\"\n style=\"overflow:visible\">\n <path\n d=\"M 0,0 5,-5 -12.5,0 5,5 0,0 z\"\n transform=\"matrix(0.8,0,0,0.8,10,0)\"\n id=\"path3847\"\n style=\"fill-rule:evenodd;stroke:#000000;stroke-width:1pt\" />\n </marker>\n <inkscape:path-effect\n effect=\"skeletal\"\n id=\"path-effect4329\" />\n <inkscape:path-effect\n effect=\"skeletal\"\n id=\"path-effect4321\" />\n <inkscape:path-effect\n effect=\"skeletal\"\n id=\"path-effect4315\" />\n <inkscape:path-effect\n effect=\"skeletal\"\n id=\"path-effect4307\" />\n <inkscape:path-effect\n effect=\"skeletal\"\n id=\"path-effect4299\" />\n <inkscape:path-effect\n effect=\"skeletal\"\n id=\"path-effect4293\" />\n </defs>\n <g\n transform=\"translate(0,-1024.5289)\"\n id=\"layer1\">\n <path\n d=\"m 17.867073,4.5821643 a 3.7249374,3.7249374 0 1 1 -7.449875,0 3.7249374,3.7249374 0 1 1 7.449875,0 z\"\n transform=\"matrix(-6.3328802,0,0,6.2775831,193.9581,1100.3667)\"\n id=\"path4139-1-14\"\n style=\"fill-opacity:1;fill-rule:nonzero\" />\n <path\n d=\"M 77.450496,1064.5069 C 58.849552,1025.9634 15.704158,1023.3858 2.8821873e-7,1034.558 L 0.02388589,1035.2674 C 24.502636,1022.2072 44.810725,1042.1507 60.163934,1074.112 z\"\n id=\"path4337\"\n style=\"fill-opacity:1;stroke-width:0.58181816;stroke-miterlimit:4;stroke-dasharray:none;marker-start:none;marker-end:none\" />\n <path\n d=\"m 12.878637,11.280739 4.75937,-2.7478243 4.759371,-2.7478236 0,5.4956479 0,5.495648 -4.759371,-2.747824 z\"\n transform=\"matrix(4.6545455,0,0,4.6545455,-13.580429,1027.7638)\"\n id=\"path3004\"\n style=\"fill-opacity:1;fill-rule:nonzero\" />\n </g>\n <metadata\n id=\"metadata3772\">\n <rdf:RDF>\n <cc:Work\n rdf:about=\"\">\n <dc:title></dc:title>\n <dc:format>image/svg+xml</dc:format>\n <dc:type\n rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" />\n </cc:Work>\n </rdf:RDF>\n </metadata>\n</svg>\n"
},
"$:/plugins/felixhayashi/tiddlymap/media/surface.png": {
"title": "$:/plugins/felixhayashi/tiddlymap/media/surface.png",
"type": "image/png",
"text": "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"
},
"$:/language/Buttons/TiddlyMap/Caption": {
"title": "$:/language/Buttons/TiddlyMap/Caption",
"text": "tiddlymap"
},
"$:/language/Buttons/TiddlyMap/Hint": {
"title": "$:/language/Buttons/TiddlyMap/Hint",
"text": "Toggle TiddlyMap actions"
},
"$:/plugins/felixhayashi/tiddlymap/misc/macros": {
"title": "$:/plugins/felixhayashi/tiddlymap/misc/macros",
"text": "\\define concat(str) $str$\n\n\\define input-text(field, index, default, readonly, class, focus)\n <$reveal type=\"match\" text=\"\" default=\"$readonly$\">\n <$edit-text\n tiddler=<<output>>\n field=\"$field$\"\n index=\"$index$\"\n type=\"text\"\n tag=\"input\"\n default=\"$default$\"\n focus=\"$focus$\"\n class=\"$class$\" />\n </$reveal>\n <$reveal type=\"nomatch\" text=\"\" default=\"$readonly$\">\n <input type=\"text\" value=\"$default$\" readonly=\"true\" disabled=\"true\" />\n </$reveal>\n\\end\n\n\\define input-button(field, index, default, default, label:\"Proceed\")\n <div class=\"tmap-button-wrapper\">\n <$button>$label$\n <$action-setfield $tiddler=<<output>> $field=\"$field$\" index=\"$index$\" $value=\"$default$\" />\n </$button>\n </div>\n\\end\n\n\\define input-textarea(field, index, default, default, class, focus)\n <$edit-text\n tiddler=<<output>>\n field=\"$field$\"\n index=\"$index$\"\n autoHeight=\"no\"\n type=\"text\"\n tag=\"textarea\"\n default=\"$default$\"\n class=\"$class$\"\n focus=\"$focus$\" />\n\\end\n\n\\define input-checkbox(field, index, readonly, default)\n <$reveal type=\"match\" text=\"\" default=\"$readonly$\">\n <$checkbox\n tiddler=<<output>>\n field=\"$field$\"\n index=\"$index$\"\n checked=\"true\"\n unchecked=\"false\"\n default=\"$default$\" />\n </$reveal>\n <$reveal type=\"nomatch\" text=\"\" default=\"$readonly$\">\n <input type=\"checkbox\" value=\"$default$\" readonly=\"true\" disabled=\"true\" />\n </$reveal>\n\\end\n\n\\define input-multi-checkbox(selectFilter, invert:\"no\", default)\n <div class=\"tmap-no-stretch\">\n <$list\n filter=\"$selectFilter$\"\n emptyMessage=\"– This list contains no items –\">\n <$checkbox\n tiddler=<<output>>\n tag=<<tmap \"splitAndSelect\" \"|\" \"0\">>>\n <$view\n tiddler=<<tmap \"splitAndSelect\" \"|\" \"1\">>\n field=\"title\" />\n </$checkbox><br />\n </$list>\n </div>\n\\end\n\n\\define input-select(field, index, selectFilter, default, nochoice)\n <$select\n tiddler=<<output>>\n field=\"$field$\"\n index=\"$index$\"\n default=\"$default$\">\n <$set name=\"nochoice\" value=\"$nochoice$\">\n <$list filter=\"[<nochoice>regexp[.+]]\">\n <option value=\"\"><b><<nochoice>></b></option>\n </$list>\n </$set>\n <$list filter=\"$selectFilter$\">\n <option value=<<tmap \"splitAndSelect\" \"|\" \"0\">> >\n <$view tiddler=<<tmap \"splitAndSelect\" \"|\" \"1\">> field=\"title\" />\n </option>\n </$list>\n </$select>\n\\end\n\n\\define input-radio(field, index, selectFilter, default)\n <$list filter=\"$selectFilter$\">\n <$radio\n tiddler=<<output>>\n field=\"$field$\"\n index=\"$index$\"\n value=<<tmap \"splitAndSelect\" \"|\" \"0\">>>\n <<tmap \"splitAndSelect\" \"|\" \"1\">>\n </$radio><br />\n </$list>\n\\end\n\n\\define tmap-row(title, field, index, type, descr, note, label, default, readonly, reset, selectFilter, nochoice, invert, class, focus)\n <tr>\n <td class=\"tmap-title\">$title$:</td>\n <td>\n <<$type$\n field:\"$field$\"\n index:\"$index$\"\n readonly:\"$readonly$\"\n default:\"$default$\"\n label:\"$label$\"\n invert:\"$invert$\"\n selectFilter:\"$selectFilter$\"\n nochoice:\"$nochoice$\"\n focus:\"$focus$\"\n class:\"$class$\">>\n <$reveal type=\"match\" text=\"true\" default=\"$reset$\">\n <$button>reset\n <$action-setfield $tiddler=<<output>> $field=\"$field$\" $index=\"$index$\" $value=\"$default$\" />\n </$button>\n </$reveal>\n </td>\n <td>\n <span class=\"tmap-description\">$descr$</span>\n <$reveal type=\"nomatch\" text=\"\" default=\"$note$\">\n <div class=\"tmap-note\">''Note:'' $note$</div>\n </$reveal>\n </td>\n </tr>\n\\end\n\n\\define visConfiguration(inheritedList, extensionField, styleName:\"style\")\n <fieldset><legend>Visjs configurations ($styleName$)</legend>\n <div class=\"tmap-flash-message tmap-info\">\n Only config items that you actually changed have an effect on\n the graph. Other options are visible, yet, inactive.\n </div>\n <$tmap-config\n mode=\"manage-node-types\"\n inherited=\"$inheritedList$\"\n extension=\"$extensionField$\" />\n </fieldset>\n\\end\n"
},
"$:/plugins/felixhayashi/tiddlymap/misc/defaultViewHolder": {
"title": "$:/plugins/felixhayashi/tiddlymap/misc/defaultViewHolder",
"text": "Default"
},
"$:/plugins/felixhayashi/tiddlymap/graph/nodeTypes/tmap:central-topic": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/nodeTypes/tmap:central-topic",
"description": "The style is applied to the node that you marked as central topic in a map.",
"style": "{\"font\":{\"size\":22,\"color\":\"rgba(0,0,0,1)\"},\"shape\":\"star\"}"
},
"$:/plugins/felixhayashi/tiddlymap/graph/nodeTypes/tmap:neighbour": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/nodeTypes/tmap:neighbour",
"description": "Neighbours are all nodes that are not part of the original set of nodes (\"matches\") but are connected (either outgoing or incoming) to a node of the original set.",
"style": "{\"color\":\"#565656\"}"
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/Default/filter/edges": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/Default/filter/edges"
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/Default/filter/nodes": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/Default/filter/nodes"
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/Default": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/Default",
"config.physics_mode": "false",
"isview": "true"
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/Live View/filter/edges": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/Live View/filter/edges",
"filter": "[prefix[$:/plugins/felixhayashi/tiddlymap/graph/edgeTypes]]",
"text": "\n\n"
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/Live View/filter/nodes": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/Live View/filter/nodes",
"filter": "[field:title{$:/temp/tmap/currentTiddler}]"
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/Live View": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/Live View",
"config.neighbourhood_scope": "1",
"config.refresh-triggers": "$:/temp/tmap/currentTiddler",
"config.physics_mode": "true",
"config.vis": "{\"physics\":{\"forceAtlas2Based\":{\"springLength\":0,\"springConstant\":0.09}}}",
"isview": "true"
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/Graph search/filter/nodes": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/Graph search/filter/nodes",
"filter": "[!is[system]search{$:/temp/search}] [!is[system]search:tags{$:/temp/search}] [!is[system]search:text{$:/temp/search}limit[10]]"
},
"$:/plugins/felixhayashi/tiddlymap/graph/views/Graph search": {
"title": "$:/plugins/felixhayashi/tiddlymap/graph/views/Graph search",
"config.refresh-triggers": "$:/temp/search",
"config.neighbourhood_scope": "1",
"config.physics_mode": "true"
}
}
}
{
"field.nodeLabel": "caption",
"field.nodeIcon": "icon",
"field.nodeInfo": "description",
"field.viewMarker": "isview",
"liveTab.fallbackView": "Live View",
"edgeClickBehaviour": "manager",
"debug": "false",
"notifications": "true",
"popups.enabled": "true",
"popups.delay": "600",
"popups.width": "300px",
"popups.height": "340px",
"jsonIndentation": "1",
"alwaysAddNodeIdToViewFilter": "true",
"editNodeOnCreate": "false",
"singleClickMode": "false",
"nodeFilterNeighbours": "false",
"editorMenuBar.showNeighScopeButton": "true",
"editorMenuBar.showRasterMenuButton": "true",
"editorMenuBar.showScreenshotButton": "true",
"defaultView": "Default"
}
{"edges":{"dashes":false,"color":{"color":"rgba(4,0,175,1)","highlight":"rgba(165,23,20,1)","hover":"rgba(132,14,130,1)"}},"manipulation":{"initiallyActive":false}}
{
"1882b2a1-8fcf-4cb4-af05-350bca1507f8": {
"x": -102,
"y": 17
},
"5d341b2d-7f5c-4e18-9834-3df4a3baf422": {
"x": 101,
"y": -66
},
"021d9ec2-5d99-4b81-97a6-7a17145d4368": {
"x": 278,
"y": -142
},
"d975027e-33b4-48ed-a28e-6eb276ff254d": {
"x": 300,
"y": -72
},
"9f9c307a-978e-4a48-bae6-d992338d8f92": {
"x": 307,
"y": -15
},
"a2d135e3-08ce-4f27-9d25-189e62af7821": {
"x": 493,
"y": -153
},
"e554dc31-1343-4b0e-9c35-715abb1d7fa4": {
"x": 486,
"y": -198
},
"2ef6893c-f878-4961-a585-6d70110a7c8b": {
"x": 521,
"y": -113
},
"94345f7d-3e11-4c89-b602-b27c70b90e58": {
"x": 481,
"y": -249
},
"f2994100-a251-47cd-a64f-318c3d23ed8e": {
"x": 739,
"y": 285
},
"6a519b16-8514-4b75-a7f9-1aa1dd0ee696": {
"x": 235,
"y": 131
},
"a702b701-7732-4fa4-ae16-094d7b107e86": {
"x": -265,
"y": -87
},
"f07676fa-7cdf-43d5-80cb-971592cd79ec": {
"x": -541,
"y": -136
},
"bb40119a-95b7-4760-8bb1-61ddc851047c": {
"x": -500,
"y": -98
},
"8936feb0-6201-44a8-9ae1-18777a648bf8": {
"x": -294,
"y": 61
},
"036f67a5-926c-44f1-91a1-59bfed2f63bf": {
"x": -469,
"y": 18
},
"b6e8958c-e3ad-42cf-9590-24f308f23cf0": {
"x": -463,
"y": 100
},
"c126d04a-c552-4b44-ba6a-ec83cb1ad3bc": {
"x": -491,
"y": 138
},
"86d597cb-0d52-4b53-ba91-ec144677fcf1": {
"x": -490,
"y": 175
},
"79f6c4ea-d22a-414b-957d-130f66d28983": {
"x": 730,
"y": 251
},
"b8e74e23-a7b1-41a6-9d1a-01626f214133": {
"x": 706,
"y": 315
},
"494845a4-d236-4d63-a353-f4c550df6527": {
"x": 710,
"y": 219
},
"a99821f7-7d55-42bf-95b8-fe1057d72608": {
"x": 429,
"y": 76
},
"f15f1ece-672e-4cbb-871f-682c32a39148": {
"x": 416,
"y": 207
},
"da58e23b-002d-44a7-82ef-8078ca44362f": {
"x": 712,
"y": 8
},
"98cda0ec-a52d-4567-8e66-3a658fcafd56": {
"x": 721,
"y": 51
},
"ffafe161-07ff-4824-b1e0-df7b04764587": {
"x": 708,
"y": 95
},
"80f3c23c-5417-4ee2-a861-d549aaf2d2c3": {
"x": 700,
"y": 138
},
"2983758a-20d0-49b3-b3c1-5f5515858731": {
"x": 684,
"y": 351
}
}
{
"e5096f48-2dd8-4d70-96ed-f3499766e5ba": {
"x": -569,
"y": -125
},
"e487bf58-9fd0-485d-91ca-12daaeb0ee0e": {
"x": -204,
"y": 104
},
"b76b7be8-fdc3-49ce-a503-2388d6f9bd8c": {
"x": -172,
"y": -108
},
"056dc44f-a4c6-4d59-9b9f-1ce466e3d2bb": {
"x": -397,
"y": 44
},
"6c20cadc-2c01-41f5-876e-4b802da3c9e1": {
"x": 16,
"y": -115
},
"4b3277ca-1b12-46ac-8f24-065f5c8c594c": {
"x": 133,
"y": -118
},
"87fb0803-8e2d-42f6-8415-d062375f69e0": {
"x": -64,
"y": 148
},
"594c5b66-ef52-4488-bda8-ff69c0b84b3f": {
"x": -367,
"y": -237
},
"d67f8603-f2ee-4dc6-9e59-874f30faf744": {
"x": -155,
"y": -319
},
"dacc3a87-a100-4f69-992c-9314089b0f40": {
"x": 158,
"y": -369
},
"72c067a1-2c73-4440-908a-b44b06176f8f": {
"x": -514,
"y": -372
}
}
{
"66bf267d-56c4-49bf-884d-44309c36b06b": {
"x": -120,
"y": 7
},
"6282c143-542b-46d5-87f0-69206fa13202": {
"x": 310,
"y": -197
},
"efbfc025-c82c-4ce0-8bbb-f1bed6c31336": {
"x": 369,
"y": -118
},
"db66d7da-09ae-43ac-a235-3bbc7dec1edc": {
"x": 394,
"y": -47
},
"69c0f046-a658-4edf-979f-080ba904648f": {
"x": 326,
"y": -1
},
"5d341b2d-7f5c-4e18-9834-3df4a3baf422": {
"x": 111,
"y": -100
},
"ce09c77f-0c56-4ec8-8524-0b9811abc7e3": {
"x": 92,
"y": 105
},
"4b200559-cdc2-4659-bf53-d278dc821fc7": {
"x": 373,
"y": 165
},
"f5ee0d73-c925-4196-a928-1f133177eca4": {
"x": 369,
"y": 124
},
"2e515513-a555-4fca-9a8b-afc275961721": {
"x": 349,
"y": 87
},
"5cf2ae1c-83b1-4dc8-ae4a-6cfe4b8b35ce": {
"x": -301,
"y": -62
},
"ccd19b24-90fa-47cc-80c7-7e4ed0c34d48": {
"x": -559,
"y": -62
},
"ea5fb6f0-fc86-4266-bd28-e53276d1326b": {
"x": -551,
"y": -25
},
"d58d3ad7-cd0f-44b5-9c5b-0cd82b6e92fc": {
"x": -533,
"y": 10
},
"f4e4b40f-6051-46f7-8441-1de997f9c34f": {
"x": -519,
"y": 48
},
"d04d5123-d874-43cd-9f98-e2c1d5dd4cba": {
"x": -313,
"y": 73
},
"064c37b5-a920-4a8e-9f62-43317088de62": {
"x": -529,
"y": 117
},
"535199e4-1d75-4552-a905-404c9dc43f7b": {
"x": -556,
"y": 156
},
"4bb2b6f1-0433-4ac2-b509-9e95cc6f04b2": {
"x": -550,
"y": 198
},
"abd3e094-4b0a-45d7-9bd0-840f4f4bcbb2": {
"x": -569,
"y": -97
},
"09b52519-d554-4c8e-8377-3ff72c9fafda": {
"x": -556,
"y": -133
}
}
{
"356a9db0-45e4-4124-be76-1a353a184766": {
"x": -305,
"y": 43
},
"d2d0598e-570a-47fd-8c98-c7721527f705": {
"x": -274,
"y": -6
},
"6f623abf-5e20-4bc9-8231-a25ba80831bd": {
"x": -250,
"y": 55
},
"11d53ba5-2b81-4e9d-b0dc-8ed5932196e5": {
"x": -205,
"y": 39
},
"0c81ab97-69fb-493f-a593-458c84b4f164": {
"x": 113,
"y": -12
},
"5f7348b3-3e8c-421c-a30d-8be671270b87": {
"x": 122,
"y": 66
},
"37e94a89-c8c6-4a29-a907-ad08802eb1a7": {
"x": 65,
"y": 50
},
"a62d4fc8-c991-4f28-a54f-7839910f8405": {
"x": -65,
"y": -156
},
"77106fa4-a3a2-45c1-9b3b-8cd2c645abca": {
"x": -98,
"y": -104
},
"097bfbd5-2f82-4d75-8950-3b60357e0bd2": {
"x": -165,
"y": -153
}
}
{
"8297eed5-1a6a-4c09-b55b-7f1578d55373": {
"x": -220,
"y": 156
},
"d22a4937-8449-4aec-9827-db385ca1782a": {
"x": 46,
"y": 186
},
"912231d8-ca7a-4fe5-923a-a563a4ae7f95": {
"x": -378,
"y": 64
},
"d81ad83f-4b34-49b4-aa01-8ba4941921cc": {
"x": -457,
"y": 153
},
"454962ac-5d61-4001-9a4f-6704e52b1646": {
"x": -107,
"y": 473
},
"ed5909b3-c946-4281-8fa4-138cf9c1e3f5": {
"x": 48,
"y": 349
},
"fad2257d-cfc2-4b91-a679-3ae3d3c387ed": {
"x": -387,
"y": 395
},
"4b200559-cdc2-4659-bf53-d278dc821fc7": {
"x": -136,
"y": -14
}
}
{
"66bf267d-56c4-49bf-884d-44309c36b06b": {
"x": -50.59375,
"y": -0.21875
}
}
{
"fb53f1f8-560c-4f9f-ab77-08e4eb3e2717": {
"x": -381,
"y": -58
},
"c06ab32a-c896-4704-8ef9-b38726cdad9f": {
"x": -89,
"y": -362
},
"e8e76918-2252-497a-bf55-fcaa92c19db0": {
"x": -299,
"y": 56
},
"9da1a756-7949-430a-b055-94dc6b0672af": {
"x": 258,
"y": -394
},
"4b3277ca-1b12-46ac-8f24-065f5c8c594c": {
"x": 334,
"y": -327
},
"4b200559-cdc2-4659-bf53-d278dc821fc7": {
"x": -402,
"y": -204
},
"87fb0803-8e2d-42f6-8415-d062375f69e0": {
"x": -118,
"y": -157
},
"8fa7140a-b4a8-4687-a3f1-504188bf7723": {
"x": 243,
"y": -202
},
"dca474ff-db86-4e23-936b-055c47c24b17": {
"x": -640,
"y": -357
},
"ae5a006f-ad69-4c32-bccc-c66849c53e09": {
"x": 73,
"y": -43
},
"572745d1-1a11-433f-a88e-2b4b96ddf778": {
"x": 16,
"y": 20
},
"3109c4d0-30fa-498c-902d-dc5843a59bcd": {
"x": -87,
"y": -311
},
"441848a8-4ab5-4d20-84a1-f879804076ca": {
"x": 55,
"y": -430
},
"a0a3949e-ef8e-4d3b-8cdf-4585b0fcaed5": {
"x": -324,
"y": -336
},
"1d82bbad-3ab0-4746-a412-9aee14d37923": {
"x": -148,
"y": -546
},
"dacc3a87-a100-4f69-992c-9314089b0f40": {
"x": 137,
"y": -529
},
"1c9a358b-5844-4ded-b07d-9015329fc894": {
"x": -749,
"y": -66
}
}
{
"66bf267d-56c4-49bf-884d-44309c36b06b": {
"x": -120,
"y": 7
},
"6282c143-542b-46d5-87f0-69206fa13202": {
"x": 310,
"y": -197
},
"efbfc025-c82c-4ce0-8bbb-f1bed6c31336": {
"x": 369,
"y": -118
},
"db66d7da-09ae-43ac-a235-3bbc7dec1edc": {
"x": 394,
"y": -47
},
"69c0f046-a658-4edf-979f-080ba904648f": {
"x": 326,
"y": -1
},
"5d341b2d-7f5c-4e18-9834-3df4a3baf422": {
"x": 111,
"y": -100
},
"ce09c77f-0c56-4ec8-8524-0b9811abc7e3": {
"x": 92,
"y": 105
},
"4b200559-cdc2-4659-bf53-d278dc821fc7": {
"x": 373,
"y": 165
},
"f5ee0d73-c925-4196-a928-1f133177eca4": {
"x": 369,
"y": 124
},
"2e515513-a555-4fca-9a8b-afc275961721": {
"x": 349,
"y": 87
},
"5cf2ae1c-83b1-4dc8-ae4a-6cfe4b8b35ce": {
"x": -301,
"y": -62
},
"ccd19b24-90fa-47cc-80c7-7e4ed0c34d48": {
"x": -559,
"y": -62
},
"ea5fb6f0-fc86-4266-bd28-e53276d1326b": {
"x": -551,
"y": -25
},
"d58d3ad7-cd0f-44b5-9c5b-0cd82b6e92fc": {
"x": -533,
"y": 10
},
"f4e4b40f-6051-46f7-8441-1de997f9c34f": {
"x": -519,
"y": 48
},
"d04d5123-d874-43cd-9f98-e2c1d5dd4cba": {
"x": -313,
"y": 73
},
"064c37b5-a920-4a8e-9f62-43317088de62": {
"x": -529,
"y": 117
},
"535199e4-1d75-4552-a905-404c9dc43f7b": {
"x": -556,
"y": 156
},
"4bb2b6f1-0433-4ac2-b509-9e95cc6f04b2": {
"x": -550,
"y": 198
},
"abd3e094-4b0a-45d7-9bd0-840f4f4bcbb2": {
"x": -569,
"y": -97
},
"09b52519-d554-4c8e-8377-3ff72c9fafda": {
"x": -556,
"y": -133
}
}
{
"7c029a60-0bf6-431a-a166-9b0c4e148f02": {
"x": -179,
"y": -183
},
"831b07e6-15a5-4651-a22b-a0f6ab612731": {
"x": 16,
"y": -170
},
"105ac7cc-24d6-4f8e-86b2-525ddab2401a": {
"x": -118,
"y": 72
},
"a73d4294-9d13-4029-ba75-8e16e851369b": {
"x": -257,
"y": -337
},
"983894fa-9f28-4dd4-8003-3e6f257047cb": {
"x": -380,
"y": -226
},
"b6e8958c-e3ad-42cf-9590-24f308f23cf0": {
"x": -366,
"y": -130
},
"b7b145b2-c8f9-4bce-a40e-1adbd04bc6b4": {
"x": -387,
"y": -176
},
"e361d20a-18bd-46ac-b9e5-ed9a57de53ef": {
"x": -425,
"y": -287
},
"e26cf53d-dc4f-45c6-9a5b-99281e93f244": {
"x": -373,
"y": -97
},
"4f4198f7-b58a-42d3-bd38-48b4ca420c85": {
"x": -166,
"y": -355
},
"f3f0d468-a231-4c10-9d29-39eedeed8397": {
"x": -367,
"y": -61
},
"8297eed5-1a6a-4c09-b55b-7f1578d55373": {
"x": -34,
"y": -259
},
"e53f7c7b-5201-4fa1-b072-968614a19174": {
"x": 58,
"y": -87
},
"ef7e44ca-e0c7-4cf5-9c0c-d392092bcdb5": {
"x": 291,
"y": -237
},
"5dcda20f-67d6-44e6-9b5c-82d8335ff2cc": {
"x": -55,
"y": 228
},
"e9b062ed-47b3-498d-b990-d798ff17c9cb": {
"x": -310,
"y": 181
},
"a5ba3920-a083-4c7c-96d6-816a89d221cb": {
"x": -326,
"y": 59
},
"c7d014a1-c7f8-451f-9a57-272d46620a27": {
"x": -362,
"y": 114
},
"65b86f91-1884-4d58-8441-322cbb468236": {
"x": 25,
"y": 124
},
"9e2a64e3-91ac-4c3c-a542-936e41d09730": {
"x": -87,
"y": -327
},
"dacc3a87-a100-4f69-992c-9314089b0f40": {
"x": -292,
"y": 232
},
"f975f54e-7cc3-466a-9129-4a0cd787d960": {
"x": 427,
"y": -145
},
"0e11b8d9-e701-4115-a84a-cdf0210821b6": {
"x": 22,
"y": 164
},
"441848a8-4ab5-4d20-84a1-f879804076ca": {
"x": 84,
"y": 88
},
"643300b6-ac86-4411-bb7f-c0715008b4a5": {
"x": 115,
"y": -354
},
"3336cae2-3c43-4590-9718-cef4f881cb49": {
"x": 312,
"y": -300
},
"fb1373a6-8839-407e-8e43-93abc05dc896": {
"x": 233,
"y": -406
},
"107a015b-7abe-4741-a968-1c55c60cb2cd": {
"x": -319,
"y": -22
},
"7a3a8cea-5a00-49c3-995c-c707589a5139": {
"x": 298,
"y": -359
},
"66bf267d-56c4-49bf-884d-44309c36b06b": {
"x": -84,
"y": -94
},
"6f605ed6-65eb-47e8-8306-0ca3413c6da5": {
"x": 240,
"y": -61
},
"85682c4b-7562-4b21-a805-c3999ce607e0": {
"x": -405,
"y": -333
},
"094bc015-a476-4298-b603-b2b9fae450b8": {
"x": 331,
"y": -194
},
"07fdfe8d-bd32-4d87-b209-41ecc2c721ab": {
"x": -135,
"y": 267
},
"1f11f487-9490-4ab6-a476-180773e709ed": {
"x": -239,
"y": 273
},
"d1f964de-f82b-45d0-934e-ca0882faf3de": {
"x": 75,
"y": -396
}
}
\define width() calc(100% - 15px)
<div class="tmap-mobile-editor">
<div class="tmap-flash-message tmap-warning">
The editor is not displayed in mobile mode.
</div>
</div>
<div class="tmap-desktop-editor">
<$tiddlymap
class="tmap-sidebar-map-editor"
editor="advanced"
object-id="main_editor"
click-to-use="false">
</$tiddlymap>
</div>
{
"originalVersion": "0.15.4+9756",
"dataStructureState": "0.11.0",
"showWelcomeMessage": false
}
{
"tiddlers": {
"$:/plugins/felixhayashi/vis/img/network/acceptDeleteIcon.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/acceptDeleteIcon.png",
"type": "image/png",
"text": "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/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNVQxNjo0NTowOCswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDVUMTY6NDU6MDgrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjBmYzFjNjhhLTcwZTYtMGY0Ni05ZDk4LWFhNDVjNjYxYThjODwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpiYzZmYmUxNi1mOTBkLWI1NDQtODUzOC05MjFkNjBiZjU0ZWI8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDVUMTY6NDU6MDgrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjBmYzFjNjhhLTcwZTYtMGY0Ni05ZDk4LWFhNDVjNjYxYThjODwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNVQxNjo0NTowOCswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOmJjNmZiZTE2LWY5MGQtYjU0NC04NTM4LTkyMWQ2MGJmNTRlYjwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz450LuoAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAATUSURBVHjajJZtTJVlGMd/13U/z+F4sBQOCiovZiMt8YiKZrMtypdh09StbLOtzA1RUmuTkppzIilJOB0Oa21tbaV+6UP5Mlnm5heVkfhyQJ1ONITAkAMqcTDonNOHA6g9qF3b/eF5/vf18r/u676uWwoLC3G73QCoKiICgIhQeGejVw3LMOTIP0xGdRQAFi1E9DyGSkLsKxtWEmAQuXfvHrJlyxZiYmIQkQHjeac/jjfKBsJ8YlnRzQKIgBoIh8ByaRSICAilRCjdk1UeAIhEIogIPT09SFFRER6PZ4DByqr1+WpRoYAquKYuqCPz9SZeeCVA4vggAC2XPVw54eXi0WTOH8yIslIIs+bryTsq+hl0d3cjxcXFuN1uVJVVp9dvEigSwP3iYj9vfV7L6IldPE5uXvZwcKuPsz/7+qLc/I1vexFAMBjEzJ49G9u2WV1TsEaVUhOBmJxVVeR9X8NTI3t5kgxN6GXakia67/bSeC4ZkexprccCZxLnVodCIRRgdU1BgsBuBVzz8qt49yv/oMb2f5TJd7kzBsXeLPHzal4VaiAmZnfupY0JIoKqKqoUGAHX9MV+llf4HxmtMaDyaDZLtvqZushPWEHsAlVFP/3rswSNsEEt4O0v/E9MCebx8PxCP5YNlr3hg7+/TFBEl6mClflGHUl9VdIvGycuJdDgvm/bAtu6j3c0uSmZufQhnRHPBsnIqcOyQGSZAjlEgCkLGh3RDHk6yJWTCQCUZi+gav8Mzh3KpGzeQgCuV3sZEhd06D2f3QgCas9XIuozCjw3q92xMXF8O8218QDM/fAMGLAsmLO2Jnof6rwkpjv10rLaURtEJimWJomtMDLdGUlyRhuBei8AU5Y0M2ZCMyPSW8hc2AxAW4OXUeOdbcKbFsQ2YKwkizCg1uAH9kxWOzU/+ga+X8s/Q/iBKur4w8tL79c69ESiTFXFQvQmyhhu1XsYNeHhW5s2o4OuwDB6ug2uISF8fZED9HQbgh1PM3Zah8PB7UYPGBBalDB+MFB/Kt6x0e0JMSzpDr9XxzmwprNxDB95F9eQkANrrI3HssFQq4hWAnDxaMqgaUoYF6DJ73X8b74Qz/C0Qds016tSUANqVypG92EMnD+SwZ9XPc5KSg/QWu900HotgRHjnA5uN3m4diojmiKzV3cNL25DdTvGwJESn0NhzMR2Ohqc6etoiidpgrNET3zrix6yKf3Bld8WLZ8IZcAG6ip9/LQpyOIt91vG2BltHCwezbbpKzEKYoFodKVO+fUh48f3+Lh20oexIBQqExFk586dxMbGkntp41rELscozFpRxaLN/6Mv/cf4hcMzCYdAzboDKXm7Ozs7MTk5ObhcLs4lzqmeeus4GCublgvJtF61Sc1qxR0beqzh7g4Xx3ZN5/KxaagCsvlASl4pQG9vb5TB0KFDibZtZfmlonxcVgVhAcuGjJxa0l9uImVKO3GpXahA4EYsjbXx3PgtmYbTk1CiKYM1h1LzKvrncmdnJ1JeXo7b7cYYQ9+A4L2r21IJR9ZhXOuxXGAZBvKv/Uui8wELVHYgUn44bdWNfmKRSIRgMIiUlJQQGxs78Krof7oYY8jt2TUCy3oH0XmI+MAejW0gYpoxxg/mF4zu3a8rbvXrPuigq6uLfwcA6IKAIsDf9kIAAAAASUVORK5CYII="
},
"$:/plugins/felixhayashi/vis/img/network/addNodeIcon.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/addNodeIcon.png",
"type": "image/png",
"text": "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/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNFQxNDo0MDoyOSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6NDA6MjkrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjVkNWIwNmQwLTVmMjAtOGE0NC1hMzIwLWZmMTEzMzQwNDc0YjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo2OWVmYWE1NS01ZTI5LTIzNGUtYTUzMy0xNDkxYjM1NDNmYmE8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6NDA6MjkrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjVkNWIwNmQwLTVmMjAtOGE0NC1hMzIwLWZmMTEzMzQwNDc0Yjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNFQxNDo0MDoyOSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjY5ZWZhYTU1LTVlMjktMjM0ZS1hNTMzLTE0OTFiMzU0M2ZiYTwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz5WKqp9AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYXSURBVHjafFZtUFTXGX7e9z27sveuMCwYV8ElrA7YSFYHtJUPkaaI0aRqG8wP00zUzljDINNSA/2ROtpO24SxnahlxjYd7SSjmUkymcxYlDhQPzHGisEVp8HwYWCVVVgEsrsuLnL74+5uqTF9Z+7cO/d8PO95zvO851BlZSV0XQcAMDOYGQBARDhX3JRmMDYZwLPMWAzGHACYIgwS46oBNBNwtOL8CwE8EkSEUCgE2rJlC2w2G4go8Zwo/bMDgnoG6gxLfAAAYvPDMCCszKTAMIAGAhrWnf15AAAMwwARIRKJgDZv3gy73Q4iAjPjxIr9VVOMRhbAYKB8zvrO0llrfEsdKwLZek6YAPSFvtSu3GtLawu0ZJ6625SHGBQB1T88t6MxvopgMAjaunUrdF0HM+P4yv27DMYeJmB1RqW3Jnf3tQX2p0L4P9EXuqEd7PmDp+XuMU9sRbvXnnt1TxxACgoKYLVacbzsQDUJGkSATe6qi28uPtzusM6Kxie6NHLGUX3lxVUNX9StPHnn4wy3njuUYcu6n2pNi66avcEXnByP/nv8aiaIyrqz2gO5A9+9FI1GIfn5+WhZdTAdjFMkwMvZOy7uWnTAOz3L4Yk71m3t69fdfTDoUGTBeHTUfiHQ6lo7Z2OXJvpDAChKe+aOCdKRKWxZ2+1qb3yyd3GYmRkQ7GQBVs99wfv6on3eR2k4PdTkDEbH7IuS8/svld/561PJS/pDk1/bzwx94pze7xc5v/H+YPY6r5BAkdrJzODTK46lE6PeYEJt7u+8j+OZwCBiEAgAoNgKJoEQf6PvNvdrXgtZoNhSf7q0KZ3B2AQmVMze0Jmt54S/DcDCVig2NcvEUGxJAE4Pl+YOr0iv6BRSIPAmBeBZAmHlE2sH4p1uhrq1s0MnnEQMBsf8wRASAICQQCCITN1X7/sOuc0kgOVp3/fPs2WHv+coG7gQOJUnLGsUCTxEjPzUohEA+NfIWUdtx0+efzA1kSSkIGyBAQNCKgHAEBAJ3u79U7kiAcWoem/gb5Fd33nrH3kp+SMWtuAB+GllMJxMjCx9QRgA3uiqL5kwHiTlpxb3smlfMDGYGPP1hcMAkJvs8ScpfdJspdj+MK6Pf+5+u29vyb4lR4+BGEziVESAkEpw6Av1OhUpHCz4qOXbzFWz4Ncdj/v/o08Lt92ODDgZDCEFJYoUGH4mzugP92puPTf0pD3H7wvfdFZdqSxnMtWjoGAAmG9fOLxjwesdjT2/XzIQ7ks3sycYMSEwGHNtWf5bkX5NkYCJBxUBXiGV0XHvosOt54Zey33j/K+8P33++vjnbiGJbbLE+J9SANAb6nJ2B79wcUwETAwQQ7fMjPzMvfP8ja87HUIKMOiaAqMZhrGmLdAy78eZrwwsTS0eObTs+IdtgVanxBUExqGbb5VzrIISGIoUXsmqbgEhJldCQWqRf27SvPAn/o8XmgLhZsUkR4ll37mhk3n94Z4OlzY/7NLcYZfm7o1z2zT4vsvUNSXqprBCkmiTFbPX90/fh8GIT2sf+zTPdDMf4dVnNg4z+E0ixsGeBs9jd5ViSgLHjCb/peaR+MD3d4/ZJg2llyuG2Vwy7QWAs8PNnn1f7vkGSGxAzE6mk+kxkx/p/4unffSCR0hAoL1EBCYiPNdWNcwkNQTCR7feWX6g+7f/A7I8rcw/U6UEe0Ndrhc/W7mtL9ztmqlSgstSS/zTJ28dalpOpkRryrwbhwBACgsLMWPGDOT4ll3qyeqAkJTdCF7P/CrUY/GkLL1rE+2hTbSH8+0Lb/WEuhzhyaA905blf9Vd/895WnZwLHrPevir/cvOB1oLYpTtLrm6oYGIMDExAaqtrUVKSgqYGSKCk0WHq5ikkWEWtNL0imv5qUW+RclLRjJsrhBAuH1/QL8R7HR4xy5nescuP23E6hOA6mLv+sb4uTw6Ogqqq6uDpmkQkcStorX4XRcM1FjZ+kvFFjCJKU1WpkNJJUqIMtX1RyLeX3JtQ0JRhmGYZ/L27duRnJycuFGISOJ9pqh5lrB6iYgqGOxRrOaa54DcZmKvkJxk8JHC9rKh+KVhOsD4+Dj+MwADIf8n5m4xGwAAAABJRU5ErkJggg=="
},
"$:/plugins/felixhayashi/vis/img/network/backIcon.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/backIcon.png",
"type": "image/png",
"text": "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/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNFQxNTowMTowOSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTU6MDE6MDkrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOmI2YjQwMjVkLTAxNjQtMzU0OC1hOTdlLTQ4ZmYxMWM3NTYzMzwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpmOWQ3OGY4ZC1lNzY0LTc1NDgtODZiNy1iNmQ1OGMzZDg2OTc8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTU6MDE6MDkrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOmI2YjQwMjVkLTAxNjQtMzU0OC1hOTdlLTQ4ZmYxMWM3NTYzMzwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNFQxNTowMTowOSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOmY5ZDc4ZjhkLWU3NjQtNzU0OC04NmI3LWI2ZDU4YzNkODY5Nzwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4jq1U/AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAVTSURBVHjanFVfTFNnFP+d77ve8qeVFbBrpcVgRrCRFikFByLxwSAaE32oRCHD6JMxxhhn8G2RxxH3MsOTbyYsmCAxPMmMMYtkIUYmK60OO0qAK23BFlNob0uh3x7WS5jLZPpLbm6+k/P9zrm5v9855PF4UFhYCABgjIExBgAgIqRSqRIi6gDQRkQ1RGTB3wgR0e8AHgH4Sa/XR/EBiAiJRAJ04cIF5Ofng4g2n0gkUkxENwF0c843LzHGQEQQQkCLExEA9ALotVgsUQAQQmgNQhJCbF5kjCEUCl0moj4t5na7fTU1NUpVVVXUYrEkASAcDhe8efOmxOfzWScmJqoBdBNR99LS0hWz2dynNSSEAF28eBGFhYVgjCEcDn9HRD1EhIMHD3o9Hs9kWVlZAh9BKBQqGB4edr58+dKZ+6JbJpOpBwBWV1fB6+rqIMsyIpHIFcZYL2MMra2tY5cuXRrfuXNnBtvAYDBk3G63oqpqZm5uzgrgSDKZjBoMhueZTAbc5XIhFouVEtFTxhiOHTs2dv78eS8+Efv374+oqpqZnZ21cs5PJJPJPlmWkyynnBuMMTQ0NHi7uro+mVyDx+Pxulwu71ZOlkqlSonoJhGhvb39s8k1nDx50ss5hyRJN9PpdKlERB2aWjSVaEilUvzBgwcORVEs5eXloXPnzk1sV8BkMiUdDofP7/dXZ7PZDilnIhw4cGBeS1pbW2P37t1zBwKBikQiUUREWFhYsHHO0d7evm0Ru90+/+rVq2rO+XGJiJxEhMrKyhgAjI6OWoeHh5tWVla+4JzDZrO9bW5unhwcHGzz+/32np4e+xaDbfoHAMxmc6ijo2O0oqIiJkkSNjY2HBIRmRljMJvNyWfPnln7+/tPMMZQXl6+0NbW9qK2tjYcj8floaEhqKpq+HCkbD3PzMwYBgYG0NXV9UuusFna2kEgELAQEQ4dOvSis7PzN41Ar9dnrl27NqCNkv/C3bt3zy4tLVmICJxzEBFJRBQmorLFxcWCqqqq0Pj4eO3Y2JhbUZTdra2tL2pra8OJRGLHnTt3zkqS9K+huHU4EhHMZnMoGo0W5OIh7nK5jjLGKq1W69vDhw8rRqMxMjc3t2t5eXnX5ORklc/nM+fl5SWnpqa+0uv1K/n5+Ws6nW5NluXNd15e3ppOp1uz2WyzZ86cGQ0Gg6ZAIFCZzWZ/lYjokRDiuN/vt7W0tMw3NTUpbrd78P79++5gMFgRiUTKHj58WMYYQ3V19etTp05tq6Lp6Wkb5xxCiEfc7XZPM8a6FxcXTfX19a/1en2Gcy5qamreNjY2/qGq6joRZe12+9Tp06e3JY/FYgWPHz8+mhvr3/CWlpbk+vp6PmOseWVlBS6XS9GSJUkSdrs93NDQ8Oe+ffvC/8fJIyMjddFo9Esi6pVleVjT2m0A8Hq9zqGhIefnjoknT544A4GAM/eDbxMReFNTE0pKSpKqqsaI6Pj8/LxVVdWM3W6PfCr5xMTE1zllXS0uLn6aSqXAGxsbodPpoNfrn6uqCs75EUVRrJFIZMfevXsXdTrdxseIE4mEPDIyUu/3++tynd8yGo29RIR0Og26fv06ioqKwBgD5xzv3r27zBjrIyJIkgSHwzFZWVmp7NmzJ1ZaWpoAgGg0WqgoSvHMzIw1GAw6tvjhitFo7NPW5fv370Hd3d0oKCgA53zTQMvLy+VCiKuSJH0rSdLmztZytIWv5RPRD0T0Y3Fx8dzWfby6ugopHo//w4mcc8iyPMc5v5FOp7/PZrOdQohWInIC2C2EgBBigYi8Qoifs9lsv06nWyIiaFxagXg8jr8GAGxuIe7LBeWhAAAAAElFTkSuQmCC"
},
"$:/plugins/felixhayashi/vis/img/network/connectIcon.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/connectIcon.png",
"type": "image/png",
"text": "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/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNFQxNDozODo1NyswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6Mzg6NTcrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjlmYjUwMDU0LWE3ODEtMWQ0OC05ZTllLTU2ZWQ5YzhlYjdjNjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo3ZWRhMjI0MC0yYTQxLTNlNDQtYWM2My1iNzNiYTE5OWI3Y2E8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6Mzg6NTcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjlmYjUwMDU0LWE3ODEtMWQ0OC05ZTllLTU2ZWQ5YzhlYjdjNjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNFQxNDozODo1NyswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjdlZGEyMjQwLTJhNDEtM2U0NC1hYzYzLWI3M2JhMTk5YjdjYTwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4ubxs+AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAUtSURBVHjajJZ/bNT1Gcdfz/P53PV6B4W7VltLqdAaplIOiMOoyxxJCSs/Gv/yB4gzJroAosmmDklwkYWR0bQsdmkykoojTpcsWYLxD/lRZdMQkTHRtkLZRqG0tIVe7662vTu43n32x/VKZ/jh89cn38/zvN7P5/l88zwf2blzJz6fDwARQUSm1n8s31CM0/VAnbNmsUPuAsDpgEO+Bg4C7//iyv5hvmMiQiqVQpqamvB6vVNwEeG1JZtCBrYi/MrkAwDNgjhwAlbzICBLA0rDb0+/839C6XQaaWxspLCw8Dp86cbNmqVFJQddE6KzdjZ9D89g+B6fSyCOcyn1nxil+O9xKg5HqWFSHGXLjrP7W/ICqVQK2bNnDz6fDxFh65KNvxbHDhF4rJj2bXPo+IGfcW5h5xL4f99P+FCEMIAob75x9t0dAMlkElNXV4e1lteXbNqiQoMaeOFOjrdU868SD2luYyEP6dUh+sYmSHeOU6GO5Z8VLx5+NNZxIpPJ5AS2L3upROCoCvz8Lo7vnkf77cAHhpiz/zIL9vWz8L8p/NvupmM0Q7pjnAoLqz8tDrc8MnQqYVUVhVdF4LEg7b+rvDn8wDDlH0WoPpukLJImSBaMwjcJqmwWts2jPZLG/8kwYVFeVdXXZcFf4yVDc2cNKfBFmD9X+0ncCP58F48eG+Feo2CAUkvs4dl0V/uJvdXLiiV+ut++n7YLSfxPfMMG54ChzB3WIesVWB2i82bw1AR6fJR7C4VsfYiv6u/k3A9nEgP4zXke8DiYHyAOMK+QxPIgnZ9GqSHr1itQJ8DK2fTerDQ+S/bHRXQJaHSCwNIZ2Xh+7+S3VAmwNMBA/tuPZtErgKquUmdMWIFlRURvdamRNEXGwIWrlP47pTMzLiunxghGMwTLvcTWlHAp77s4QNSrYMQtss6ZMgWqCm5cHoDHO1nbk6K8zEN8+3zatv2Hn1b59EqJZdxmYUERg9P9KwpIiAOTdWUWBXuLzB/vZG3P1Un4PNp2d1MbmyD45TWCxuCsQm0x56bHGHFYEZwxok7toAA9Sfw3hCcoL/NOwi9QO5wmWO1j4JEgZxTkodmcWRGkf3pcX0r8xoAaBixKu4U5/xwndM+0tpAvS6mP+PZK2nb1UBvPEKwKMLDvPj4ESGc55lGy303sdJKQdZB2rkMdctAB/4gzN+/Q2ENNd4LyUi/xN+bTtquX2thk5nk4wI3gAF+OMNcA1nFQDfK+BY5GqbkwWabTY5QZhXWlnNx1ntrY1Rz87fuvw29m/Sn8J+PUGAFj5T19baA1IspuBZp7cx1x4SwG1cEf+lgRSROs8jGwb+Ht4QB/GSSsAhYano39LWIBxNEIbP14hPDuiyS2VtJuHXQlKKvxM/jiXDq/D/xPlwifGMkJZB2NIoKpr69nxeiZxLHicFSFVWfGqBidIP3LSjrWltD94CyufF/4kQgPuVz2Lz93+dDRa9eu5QQ8Hg8/iXee+Dy4CKMs7xqn4nwKz9IirhQqmVuB42m8ey+x7LMoD6iAON782eChhqmRuXfvXgKBAKqKqtI0/8nNKrQI4BVYXkzHgzPpC88gWuHL/caXrhLoGiN0apSKr0ZZRBZM7q2w5ZnLR1oAnHOMjY0hra2tFBQUYIyZmstvVT1Z6eDlAuEVq7merxmwueNPDXy9PvybjKP5mctHLk4/XTKZRJqbm/H7/VNw1VyEMYbW4FN3WNWnnchKoy5sHeVGBRX6VWi3ymFx7r11Ix8MTX/y5C2RSPC/AQB61erowbpqSwAAAABJRU5ErkJggg=="
},
"$:/plugins/felixhayashi/vis/img/network/cross.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/cross.png",
"type": "image/png",
"text": "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/GMzLdsAADvGaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTQtMDItMTRUMTE6NTU6MzUrMDE6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE0LTAyLTE0VDEyOjA1OjE3KzAxOjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNC0wMi0xNFQxMjowNToxNyswMTowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NjU0YmM5YmQtMWI2Yi1jYjRhLTllOWQtNWY2MzgxNDVjZjk0PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjk4MmM2MGIwLWUzZjMtMDk0MC04MjU0LTFiZTliNWE0ZTE4MzwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjk4MmM2MGIwLWUzZjMtMDk0MC04MjU0LTFiZTliNWE0ZTE4MzwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo5ODJjNjBiMC1lM2YzLTA5NDAtODI1NC0xYmU5YjVhNGUxODM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMTRUMTE6NTU6MzUrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjIxODYxNmM2LTM1MWMtNDI0OS04YWFkLWJkZDQ2ZTczNWE0NDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0xNFQxMTo1NTozNSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6NjU0YmM5YmQtMWI2Yi1jYjRhLTllOWQtNWY2MzgxNDVjZjk0PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAyLTE0VDEyOjA1OjE3KzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjc8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NzwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+cZUZMwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAA2ElEQVR42gDLADT/AS0tLUQFBQUVFxcXtPHx8fPl5eUNCAgITCkpKesEHx8fGgYGBjH+/v4a+Pj4qgQEBFU6OjodMTExzwQUFBSvEBAQEfX19SD19fVqNDQ0CElJSd/9/f2vAwEBAfrn5+fkBwcHLRYWFgsXFxfz29vbo9LS0uwDDQ0NDfPz81orKysXIyMj+ODg4Avh4eEa/f391gMkJCRYPz8/KUhISOMCAgKh8fHxHRsbGx4UFBQQBDk5OeY7Ozv7CAgItPb29vMEBASaJSUlTQ0NDesDAEwpT0Ko8Ri2AAAAAElFTkSuQmCC"
},
"$:/plugins/felixhayashi/vis/img/network/cross2.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/cross2.png",
"type": "image/png",
"text": "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/GMzLdsAADoRaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTQtMDItMTRUMTE6NTY6MTUrMDE6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE0LTAyLTE0VDExOjU2OjE1KzAxOjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNC0wMi0xNFQxMTo1NjoxNSswMTowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6OWIwNjRhODctYWNlZi1jMjQ5LTg5MWUtNDAxOTVmMWJjMTNkPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjlmYTI2M2QyLTljOWMtNWY0OC1iYjNiLThmYmQ5NmI5ZTBhMjwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjlmYTI2M2QyLTljOWMtNWY0OC1iYjNiLThmYmQ5NmI5ZTBhMjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo5ZmEyNjNkMi05YzljLTVmNDgtYmIzYi04ZmJkOTZiOWUwYTI8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMTRUMTE6NTY6MTUrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjliMDY0YTg3LWFjZWYtYzI0OS04OTFlLTQwMTk1ZjFiYzEzZDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0xNFQxMTo1NjoxNSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8cGhvdG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogICAgICAgICA8cGhvdG9zaG9wOklDQ1Byb2ZpbGU+c1JHQiBJRUM2MTk2Ni0yLjE8L3Bob3Rvc2hvcDpJQ0NQcm9maWxlPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj41PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjU8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PvQ0yV0AAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAHZJREFUeNoAaQCW/wE1NTWrERER3+3t7Xbp6emKOTk5IgQtLS3kBAQEdfLy8ipOTk5LQ0NDkAE0NDQAEhISxiEhITkTExPH9PT0OgMGBgaPMzMzVS8vL7XU1NRC7+/vEQNfX19lUFBQtfPz82EEBAQMNTU1HwMAMI4nIAoe9RQAAAAASUVORK5CYII="
},
"$:/plugins/felixhayashi/vis/img/network/deleteIcon.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/deleteIcon.png",
"type": "image/png",
"text": "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/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNFQxNDo0MTowNCswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6NDE6MDQrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjc3NDkzYmUxLTEyZGItOTg0NC1iNDYyLTg2NGVmNGIzMzM3MTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDowNmE3NWYwMy04MDdhLWUzNGYtYjk1Zi1jZGU2MjM0Mzg4OGY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6NDE6MDQrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjc3NDkzYmUxLTEyZGItOTg0NC1iNDYyLTg2NGVmNGIzMzM3MTwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNFQxNDo0MTowNCswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjA2YTc1ZjAzLTgwN2EtZTM0Zi1iOTVmLWNkZTYyMzQzODg4Zjwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4aYJzYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYGSURBVHjalJZ7UJTnFcZ/73m/72PdJY1RbhoQp6lkXRAvmIYxdCUadLVOozPNtGObap1JsKipjiShbdoRbeKEiQHpQK3xj0xa03aamTbaTGyAYV1QGeqFi+JyiZFLAlmESBkWRmS3fyzslGkmnZ5/v/M873Oe75zzvqqoqAibzQaAiKCUAkApRdHIK/NFsx2NR91nOSILADDoJyzNaM4xxbtvPHh0iC+JiYkJ1OHDh4mJiUEpFSXPv/ziPC28TIiXDCOSrAClQDSEpsCwJPIhrEBRQpiSytXlQwDhcBilFPfu3UMVFxdjt9ujFTzfcLBADCoEEAFr1ZbrrNjch2vtEImPBgHob7fTcWE+bVXJNJ/NiFQlEGLvieXHKmYqGB8fRx05cgSbzYaIsPvywV8pKFaA7fGtLTzz61YWpo/xVTHQbufsq5lcez9zWuWhk5mvFwMEg0H0+vXrMU2Tn1wp3CtCiQ5DjGd3A/m/v8IDCZP8r4iNmyRrWx/j/5qktykZpXKzAjVDVxPzGqemptDr1q1jX3NRnIJarcDKK2hgR2ULXRfncv7UYv7xpovhnhiW5Mz+kefeSKO6LJ1A1xzEuk/Ojm4mRibpuZaMZW3OCtRUND60NmiICCIUShisx7a2sLMiQn4s77uEQgIabnqdfHIlgT1/qQeg8vs5dHhdCNB1wYn3RIiC995j26stjAbsNH+YiZJCESnS1Y/XxIXu8r4YIPv/VkVs3CTnTy2ms34xro1+sp9po6sxlTu34ultmsPVvy6is86FCHgO+DDs49zpjufBpCG+seYOC9OHaTidieicb9ouVAhKtouAseI710ma7pLuqwmgYfHqAFt+6WdLoQ/LBl11Lm7VudAa8vb72PCin9TlAWIsGGhLACD+kSAZnusYBii1XQAPYWDllt6ov2lrBkDBR2+6Ofuak2//3M+G/T4wAAPW7fPhKfRTVeqk9qQbFKRmDUTxS3N7QYGYmwzCkqklBGlPDEcTNv+sg9tNCbTXuvBWujE0bHrZj9JE1B/wU1Pm5PwJN6YBS9a2kVvQEcWnrh5GTFD3lxkYkqRMgYQlwVldUvDnen73LHTUuqitdKM0eAr9AFQfd1J/yo2aJn+2sn4Wdn5qEFODJskgBIjx5T0uCrQA08pnIjS9PERDjPnfOKXAMEBECUoGEIHBj+2zkt76UQ6dXheGAev3+cg74Kf6uJPqcicbfuond7cPy4SOiy7+tD9nFvZurx00KOk3CNEC+mE+vjSPBc7IWqgqTaPT60IMcO/xsXGa3HfKjRgRdbl7/KDg0jtubje6aHj7c7J3dgLQ2zoPwwQ91SooOQdAW1VKVMHty0kA5Bb48BycJn/LjWFGbLv4thvvb53kFvjJ+XEdWkPfjQVR/CcNKYgGMc8JWt5Fa2j+MIPPuyI2pa4IoHSkt6vLIuRaQ9q32khzt4GCxtNu6k46GeiIR2lIfDQQsafPzq1LGRGL9Gk9d+vrwewvfHPQOoexQVjxdB/auk/zmaUMdsfz6bVUtIalT7bxveP1ZHh6GPDPYeSzeD69kcpIfxymFWLNrka+ljhBTWkWwz2JiJT84YHnz2iPx0P20PkmRF5i6HYiwZFJsn/YzdezbzE3cQibY5xV266z6RfXohakb+xB9CjanCD9qTbW7Grk4WV38VZm0l6dhQiEw9taHSuDqrS0FIfDwXM3X9mHMsvRAk/sauDpQy38P+GtzOTGB9mEpkD0C2dS8n8zOjqK9ng8WJZFU+JTjasGvaCNXPpvJBPoMlm0OoDNMfWVxONfWNSUPUZ7TUQ56tCZlPwSgMnJSVRpaSmxsbFE1raw82ZxAZZRQUiBYUKGp5UlOX2krBzmoUVjiIKhHge9rfPo+Wcy3ZeXIYASgL1/X5RfMXMvj46OosrLy7HZbGitUUohIuzoem0RofALaOsghgWGjky0MiJTL8b0lOvI8hN1DKXKP0jd3TNTWDgcJhgMoo4ePYrD4Yi+KmaeLlprnrtXFo9h/AAlG1AqE8yFmBrC+jO0bgH9EVpO/1F2Dc5g//OAsbEx/j0Af+USsQynL1UAAAAASUVORK5CYII="
},
"$:/plugins/felixhayashi/vis/img/network/downArrow.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/downArrow.png",
"type": "image/png",
"text": "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"
},
"$:/plugins/felixhayashi/vis/img/network/editIcon.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/editIcon.png",
"type": "image/png",
"text": "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/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNVQxNDoxMjoyNSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDVUMTQ6MTI6MjUrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjY5OTM3ZGZjLTJjNzQtYTU0YS05OTIzLTQyMmZhNDNkMjljNDwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDozOWNhNzE5ZC03YzNlLTUyNGEtYmY1NS03NGVmMmM1MzE0YTc8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDVUMTQ6MTI6MjUrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjY5OTM3ZGZjLTJjNzQtYTU0YS05OTIzLTQyMmZhNDNkMjljNDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNVQxNDoxMjoyNSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjM5Y2E3MTlkLTdjM2UtNTI0YS1iZjU1LTc0ZWYyYzUzMTRhNzwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4ykninAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYpSURBVHjafFZtTFvnFX7Oea+NudiY2Hwam4CBlgQwXdKREDKUoYg0jbRJ29RJ2VZ1mjRFUxSpA3VTfkzJfkQbS7spU6rtx5Z2UtppScjaHxvLuiatWi2jLEoMIUDCh23g2gbj7+tPuPvhOurawPl1dc99n+c55z33fV46ceIEZFkGADAziAgAQERoe/9ZK4GPM/AcgbsIXAcABCgMvkfAqAa89eDoJyF8LogIqqqChoaGYDAYHr8kItS8uc8iIH6iAa9IkAo5EAQX8pqmgUVBCBggYFgDhv0/GAsBgKZpICJkMhnQ4OAgZFkGEYGZUXmp+0cS+CKBwWA0DVRPOg5Zl2q6zaHyJlnVAMQXVTkwHrUqH0Xsvn+tdQAAMQDgpPLS2MViFY8rkGUZzIzaS/t/xqCzGggtz9e697zsnKhoLUtim4jOq/LE6x7X0nsh16dEZ5a/O3a2SCAOHjwInU6Hujd6ThJ4mCDQ+b2G232v7v6vwarPbQn8MGlMr+X0kpE3Wr5Zt5hL5HPhqYSdQIfKJ+yhxDPKWC6Xg+jt7UXD5b5KBt1kCHS85Ljd8/On3NupfnhFaZj4rWff1B98B1R/hnUmKd36bdtCNl4g0en4edNE/cXwLq8qMTMIPAQwmo/WuHvObA8+9c58k/dKtD0TyZWXN5YGA7ej7epKxspM//7SoNOdWc/Jyq2wiwhDzPxT8cP0jys3VMM7OmL0/77zn4Ydui3b8uiK0jD7RrA77c9Wd57cefPpF+2T6bWsFPWkaiPTCWvTsZpHFU+XrS+8G3AR08F6X+1FJvBxQQzHQOWk2SmrW4FPX/U2LVwPuDZj+fJKl2khPpeyAqA9rzR/YqwuiWXX8taN/CabGkrVuq9YJlkQQDjOAJ5jAhz9Vt9W4N5/rNp8I+vtMV/aZm4zLnUNNt0urdYnF68HWoJj4Wo1mLGUNRr8LEgDgNqeCh8xQIKOsgC7iAjVe83rT9zQa8uNM28u70kspessu8q8zq/V3NcZpVzb9+0zmVhOvvvrhaMVzrJg0zeq7xMVCCwdpnWSGBqjUyJwLTFgbvxie3w31uoWR1Y74r60rdxZqrR8q85t2W2MGCp12bm/KC3hyaSTiMhxuGrKcahqpbjOaDOoEhOEoFqJQCCJvqA85I6bfTdDjQlf2lbxVNlS6wt19yy7jRHZZlDnrinNj/6sHMhnNw2Ogco7O79e5fm/xQywRBBCEAuwn4gQ96bkYj4Vyuq9N1Z3Bj4Od5bs0MXt/dZZ21ctiqFan174q985P+Lfp+U1g7XDON/1ctP458WlVjLyJhOISZE0wM0S1QfuRC3lTjkJAKKEtNC9eIOhSh9xHLZOJRZTFuXDsEoStLkR/768ummsaJG9Pb9oe+9J+xaeSVokiQDSJphAo5uaBuWjiKP4QTqS1cUWU7ayesN66wu22frD1vmVW6GW6T8u9eVjGyZzs+w78Nqu0a2mbvVu1KEJQAgeZRL0liQYyx+GOmKeQpu0rMYsAJPNEFGD2dLodLIy6c9Ys7G8yeSUl3tf2/X3rcBVJSOv34l3sCBogi7z1LH/rBHjl4IJ93/ncQFAnjeImJD0Z8zuCwu9q3djDXqTlAKID5xv+9t2R8n8VcUFBljQ8Gyfe40BYBM4DwDLt8Kue79ZcFkbzfEdbUbv+oN4c9KTtsfm1MbYQqqh+2zrVZYKs/7Ef+byimt1POYiJhDhPBFBIiIEXhxfs7/dfYoIF+auBfYTE/pebx/V8hqBP2ODvD34yvuh/WCAmU75Bx6sIgaI/v5+6PV6JLqUsYr7dpDAoehs0h73pHTWrvKgThYbRSt9UmSjef3MpaUvBz4O72UmADgTOPJguGiZor+/HyUlJWBmJFz+D8xTtlUiOpbwpmrmrweeSXrT+g11k4SBN3RGKUcAVCVdFhyP1nreDbY//NPyEXUlU/Pp4XYycGT6V0Ux2WwWdO7cOZSWlkII8diX7SPPNgDaKdbxoNAxwATBAEkEEgSWCEQAqPAMwqvMdCEwMO0tVqZpWsGTT58+DaPR+PhGIYQAAAgh0P7B3ioW/B0iGiCGiwXbCuOHFSJys6AbYFye2T+xWhT3WYJEIoH/DQBMw3kes8OJPgAAAABJRU5ErkJggg=="
},
"$:/plugins/felixhayashi/vis/img/network/leftArrow.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/leftArrow.png",
"type": "image/png",
"text": "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"
},
"$:/plugins/felixhayashi/vis/img/network/minus.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/minus.png",
"type": "image/png",
"text": "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"
},
"$:/plugins/felixhayashi/vis/img/network/plus.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/plus.png",
"type": "image/png",
"text": "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"
},
"$:/plugins/felixhayashi/vis/img/network/rightArrow.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/rightArrow.png",
"type": "image/png",
"text": "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"
},
"$:/plugins/felixhayashi/vis/img/network/upArrow.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/upArrow.png",
"type": "image/png",
"text": "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"
},
"$:/plugins/felixhayashi/vis/img/network/zoomExtends.png": {
"title": "$:/plugins/felixhayashi/vis/img/network/zoomExtends.png",
"type": "image/png",
"text": "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"
},
"$:/plugins/felixhayashi/vis/img/timeline/delete.png": {
"title": "$:/plugins/felixhayashi/vis/img/timeline/delete.png",
"type": "image/png",
"text": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAl2cEFnAAAAEAAAABAAXMatwwAAAVRJREFUOMt108FKG1EUBuBvYtxbRGwxiGBXeYCW0mVpDSKVvIJ0F/syJsFdn6GCkaZ9gro3G1u0ILQgheJKRUwXPQNnxvTAcGf+c/7/nPvfO8UEKLCFJg5w31aNqGtgG3c4xLSZyP0QgI8Tpu0quQhyPwTgsBnkAVYD3MM9DibVId5GbiW+B+VIt7hJha1IdhPWDayVsBvcFtHlDYZ4mgou8D7e+zXyN/TwuUhjbkSXLHIZ61KNvItxaYyayBDrZsf36DyGdilQE+ngA57UyD+xg08luTSxHvP/wRuRewDm7uV9WJ4hsBy5rczJJm7G/tcS6VesjxN2Hj4c5S10Qj2Tz/AunrOEr0VtB+Z6vMJ+zfkfcVQjnMbRvcRC5B/hBU4auMbVjBFHCRsFdp6wK1yXHjz37xItRuejfFQ1nwb4HXVfs4nPYsQv0p+oKlLgNf7gGP4Cw4ZUK7kMJVEAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDExLTA1LTE2VDExOjM1OjIxKzAyOjAw9uVF5gAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMS0wNS0xNlQxMTozNToyMSswMjowMIe4/VoAAAAASUVORK5CYII="
},
"$:/plugins/felixhayashi/vis/readme": {
"title": "$:/plugins/felixhayashi/vis/readme",
"text": "! TW5-Vis.js\n\nA tiddlywiki plugin for the vis.js library.\n\n---\n\n! Notes on Copyright\n\n!! TiddlyWiki\n\nCreated by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright © Jeremy Ruston 2004-2007 Copyright © UnaMesa Association 2007-2014\n\nPublished under the following [licenses](https://github.com/Jermolene/TiddlyWiki5/tree/master/licenses):\n\n1. BSD 3-clause \"New\" or \"Revised\" License (including any right to adopt any future version of a license if permitted)\n2. Creative Commons Attribution 3.0 (including any right to adopt any future version of a license if permitted)\n\n!! The **vis.js** library\n\nCopyright (c) 2014 [Almende B.V.](https://github.com/almende/vis)\n\nPublished under the following licenses:\n\n1. Apache License Version 2.0, January 2004 http://www.apache.org/licenses/\n2. MIT License (MIT)\n"
},
"$:/plugins/felixhayashi/vis/vis.css": {
"title": "$:/plugins/felixhayashi/vis/vis.css",
"type": "text/vnd.tiddlywiki",
"tags": "$:/tags/Stylesheet",
"text": "\\rules except list\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}}/>\n\\end\n\n.vis .overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-active{box-shadow:0 0 10px #86d5f8}.vis [class*=\"span\"]{min-height:0;width:auto}div.vis-configuration{position:relative;display:block;float:left;font-size:12px}div.vis-configuration-wrapper{display:block;width:700px}div.vis-configuration-wrapper::after{clear:both;content:\"\";display:block}div.vis-configuration.vis-config-option-container{display:block;width:495px;background-color:#fff;border:2px solid #f7f8fa;border-radius:4px;margin-top:20px;left:10px;padding-left:5px}div.vis-configuration.vis-config-button{display:block;width:495px;height:25px;vertical-align:middle;line-height:25px;background-color:#f7f8fa;border:2px solid #ceced0;border-radius:4px;margin-top:20px;left:10px;padding-left:5px;cursor:pointer;margin-bottom:30px}div.vis-configuration.vis-config-button.hover{background-color:#4588e6;border:2px solid #214373;color:#fff}div.vis-configuration.vis-config-item{display:block;float:left;width:495px;height:25px;vertical-align:middle;line-height:25px}div.vis-configuration.vis-config-item.vis-config-s2{left:10px;background-color:#f7f8fa;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-item.vis-config-s3{left:20px;background-color:#e4e9f0;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-item.vis-config-s4{left:30px;background-color:#cfd8e6;padding-left:5px;border-radius:3px}div.vis-configuration.vis-config-header{font-size:18px;font-weight:bold}div.vis-configuration.vis-config-label{width:120px;height:25px;line-height:25px}div.vis-configuration.vis-config-label.vis-config-s3{width:110px}div.vis-configuration.vis-config-label.vis-config-s4{width:100px}div.vis-configuration.vis-config-colorBlock{top:1px;width:30px;height:19px;border:1px solid #444;border-radius:2px;padding:0;margin:0;cursor:pointer}input.vis-configuration.vis-config-checkbox{left:-5px}input.vis-configuration.vis-config-rangeinput{position:relative;top:-5px;width:60px;padding:1px;margin:0;pointer-events:none}input.vis-configuration.vis-config-range{-webkit-appearance:none;border:0 solid white;background-color:rgba(0,0,0,0);width:300px;height:20px}input.vis-configuration.vis-config-range::-webkit-slider-runnable-track{width:300px;height:5px;background:#dedede;background:-moz-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#dedede),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-o-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:linear-gradient(to bottom,#dedede 0,#c8c8c8 99%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dedede',endColorstr='#c8c8c8',GradientType=0);border:1px solid #999;box-shadow:#aaa 0 0 3px 0;border-radius:3px}input.vis-configuration.vis-config-range::-webkit-slider-thumb{-webkit-appearance:none;border:1px solid #14334b;height:17px;width:17px;border-radius:50%;background:#3876c2;background:-moz-linear-gradient(top,#3876c2 0,#385380 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#3876c2),color-stop(100%,#385380));background:-webkit-linear-gradient(top,#3876c2 0,#385380 100%);background:-o-linear-gradient(top,#3876c2 0,#385380 100%);background:-ms-linear-gradient(top,#3876c2 0,#385380 100%);background:linear-gradient(to bottom,#3876c2 0,#385380 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#3876c2',endColorstr='#385380',GradientType=0);box-shadow:#111927 0 0 1px 0;margin-top:-7px}input.vis-configuration.vis-config-range:focus{outline:0}input.vis-configuration.vis-config-range:focus::-webkit-slider-runnable-track{background:#9d9d9d;background:-moz-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#9d9d9d),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-o-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:linear-gradient(to bottom,#9d9d9d 0,#c8c8c8 99%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9d9d9d',endColorstr='#c8c8c8',GradientType=0)}input.vis-configuration.vis-config-range::-moz-range-track{width:300px;height:10px;background:#dedede;background:-moz-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#dedede),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-o-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:linear-gradient(to bottom,#dedede 0,#c8c8c8 99%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dedede',endColorstr='#c8c8c8',GradientType=0);border:1px solid #999;box-shadow:#aaa 0 0 3px 0;border-radius:3px}input.vis-configuration.vis-config-range::-moz-range-thumb{border:0;height:16px;width:16px;border-radius:50%;background:#385380}input.vis-configuration.vis-config-range:-moz-focusring{outline:1px solid white;outline-offset:-1px}input.vis-configuration.vis-config-range::-ms-track{width:300px;height:5px;background:transparent;border-color:transparent;border-width:6px 0;color:transparent}input.vis-configuration.vis-config-range::-ms-fill-lower{background:#777;border-radius:10px}input.vis-configuration.vis-config-range::-ms-fill-upper{background:#ddd;border-radius:10px}input.vis-configuration.vis-config-range::-ms-thumb{border:0;height:16px;width:16px;border-radius:50%;background:#385380}input.vis-configuration.vis-config-range:focus::-ms-fill-lower{background:#888}input.vis-configuration.vis-config-range:focus::-ms-fill-upper{background:#ccc}.vis-configuration-popup{position:absolute;background:rgba(57,76,89,0.85);border:2px solid #f2faff;line-height:30px;height:30px;width:150px;text-align:center;color:#fff;font-size:14px;border-radius:4px;-webkit-transition:opacity .3s ease-in-out;-moz-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out}.vis-configuration-popup:after,.vis-configuration-popup:before{left:100%;top:50%;border:solid transparent;content:\" \";height:0;width:0;position:absolute;pointer-events:none}.vis-configuration-popup:after{border-color:rgba(136,183,213,0);border-left-color:rgba(57,76,89,0.85);border-width:8px;margin-top:-8px}.vis-configuration-popup:before{border-color:rgba(194,225,245,0);border-left-color:#f2faff;border-width:12px;margin-top:-12px}div.vis-tooltip{position:absolute;visibility:hidden;padding:5px;white-space:nowrap;font-family:verdana;font-size:14px;color:#000;background-color:#f5f4ed;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;border:1px solid #808074;box-shadow:3px 3px 10px rgba(0,0,0,0.2);pointer-events:none;z-index:5}div.vis-color-picker{position:absolute;top:0;left:30px;margin-top:-140px;margin-left:30px;width:310px;height:444px;z-index:1;padding:10px;border-radius:15px;background-color:#fff;display:none;box-shadow:rgba(0,0,0,0.5) 0 0 10px 0}div.vis-color-picker div.vis-arrow{position:absolute;top:147px;left:5px}div.vis-color-picker div.vis-arrow::after,div.vis-color-picker div.vis-arrow::before{right:100%;top:50%;border:solid transparent;content:\" \";height:0;width:0;position:absolute;pointer-events:none}div.vis-color-picker div.vis-arrow:after{border-color:rgba(255,255,255,0);border-right-color:#fff;border-width:30px;margin-top:-30px}div.vis-color-picker div.vis-color{position:absolute;width:289px;height:289px;cursor:pointer}div.vis-color-picker div.vis-brightness{position:absolute;top:313px}div.vis-color-picker div.vis-opacity{position:absolute;top:350px}div.vis-color-picker div.vis-selector{position:absolute;top:137px;left:137px;width:15px;height:15px;border-radius:15px;border:1px solid #fff;background:#4c4c4c;background:-moz-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4c4c4c),color-stop(12%,#595959),color-stop(25%,#666),color-stop(39%,#474747),color-stop(50%,#2c2c2c),color-stop(51%,#000),color-stop(60%,#111),color-stop(76%,#2b2b2b),color-stop(91%,#1c1c1c),color-stop(100%,#131313));background:-webkit-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-o-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-ms-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:linear-gradient(to bottom,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c4c4c',endColorstr='#131313',GradientType=0)}div.vis-color-picker div.vis-new-color{position:absolute;width:140px;height:20px;border:1px solid rgba(0,0,0,0.1);border-radius:5px;top:380px;left:159px;text-align:right;padding-right:2px;font-size:10px;color:rgba(0,0,0,0.4);vertical-align:middle;line-height:20px}div.vis-color-picker div.vis-initial-color{position:absolute;width:140px;height:20px;border:1px solid rgba(0,0,0,0.1);border-radius:5px;top:380px;left:10px;text-align:left;padding-left:2px;font-size:10px;color:rgba(0,0,0,0.4);vertical-align:middle;line-height:20px}div.vis-color-picker div.vis-label{position:absolute;width:300px;left:10px}div.vis-color-picker div.vis-label.vis-brightness{top:300px}div.vis-color-picker div.vis-label.vis-opacity{top:338px}div.vis-color-picker div.vis-button{position:absolute;width:68px;height:25px;border-radius:10px;vertical-align:middle;text-align:center;line-height:25px;top:410px;border:2px solid #d9d9d9;background-color:#f7f7f7;cursor:pointer}div.vis-color-picker div.vis-button.vis-cancel{left:5px}div.vis-color-picker div.vis-button.vis-load{left:82px}div.vis-color-picker div.vis-button.vis-apply{left:159px}div.vis-color-picker div.vis-button.vis-save{left:236px}div.vis-color-picker input.vis-range{width:290px;height:20px}div.vis-network div.vis-manipulation{box-sizing:content-box;border-width:0;border-bottom:1px;border-style:solid;border-color:#d6d9d8;background:#fff;background:-moz-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(48%,#fcfcfc),color-stop(50%,#fafafa),color-stop(100%,#fcfcfc));background:-webkit-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-o-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-ms-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:linear-gradient(to bottom,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#fcfcfc',GradientType=0);padding-top:4px;position:absolute;left:0;top:0;width:100%;height:28px}div.vis-network div.vis-edit-mode{position:absolute;left:0;top:5px;height:30px}div.vis-network div.vis-close{position:absolute;right:0;top:0;width:30px;height:30px;background-position:20px 3px;background-repeat:no-repeat;background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/cross.png\">>);cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.vis-network div.vis-close:hover{opacity:.6}div.vis-network div.vis-manipulation div.vis-button,div.vis-network div.vis-edit-mode div.vis-button{float:left;font-family:verdana;font-size:12px;-moz-border-radius:15px;border-radius:15px;display:inline-block;background-position:0 0;background-repeat:no-repeat;height:24px;margin-left:10px;cursor:pointer;padding:0 8px 0 8px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.vis-network div.vis-manipulation div.vis-button:hover{box-shadow:1px 1px 8px rgba(0,0,0,0.20)}div.vis-network div.vis-manipulation div.vis-button:active{box-shadow:1px 1px 8px rgba(0,0,0,0.50)}div.vis-network div.vis-manipulation div.vis-button.vis-back{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/backIcon.png\">>)}div.vis-network div.vis-manipulation div.vis-button.vis-none:hover{box-shadow:1px 1px 8px rgba(0,0,0,0.0);cursor:default}div.vis-network div.vis-manipulation div.vis-button.vis-none:active{box-shadow:1px 1px 8px rgba(0,0,0,0.0)}div.vis-network div.vis-manipulation div.vis-button.vis-none{padding:0}div.vis-network div.vis-manipulation div.notification{margin:2px;font-weight:bold}div.vis-network div.vis-manipulation div.vis-button.vis-add{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/addNodeIcon.png\">>)}div.vis-network div.vis-manipulation div.vis-button.vis-edit,div.vis-network div.vis-edit-mode div.vis-button.vis-edit{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/editIcon.png\">>)}div.vis-network div.vis-edit-mode div.vis-button.vis-edit.vis-edit-mode{background-color:#fcfcfc;border:1px solid #ccc}div.vis-network div.vis-manipulation div.vis-button.vis-connect{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/connectIcon.png\">>)}div.vis-network div.vis-manipulation div.vis-button.vis-delete{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/deleteIcon.png\">>)}div.vis-network div.vis-manipulation div.vis-label,div.vis-network div.vis-edit-mode div.vis-label{margin:0 0 0 23px;line-height:25px}div.vis-network div.vis-manipulation div.vis-separator-line{float:left;display:inline-block;width:1px;height:21px;background-color:#bdbdbd;margin:0 7px 0 15px}div.vis-network div.vis-navigation div.vis-button{width:34px;height:34px;-moz-border-radius:17px;border-radius:17px;position:absolute;display:inline-block;background-position:2px 2px;background-repeat:no-repeat;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.vis-network div.vis-navigation div.vis-button:hover{box-shadow:0 0 3px 3px rgba(56,207,21,0.30)}div.vis-network div.vis-navigation div.vis-button:active{box-shadow:0 0 1px 3px rgba(56,207,21,0.95)}div.vis-network div.vis-navigation div.vis-button.vis-up{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/upArrow.png\">>);bottom:50px;left:55px}div.vis-network div.vis-navigation div.vis-button.vis-down{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/downArrow.png\">>);bottom:10px;left:55px}div.vis-network div.vis-navigation div.vis-button.vis-left{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/leftArrow.png\">>);bottom:10px;left:15px}div.vis-network div.vis-navigation div.vis-button.vis-right{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/rightArrow.png\">>);bottom:10px;left:95px}div.vis-network div.vis-navigation div.vis-button.vis-zoomIn{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/plus.png\">>);bottom:10px;right:15px}div.vis-network div.vis-navigation div.vis-button.vis-zoomOut{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/minus.png\">>);bottom:10px;right:55px}div.vis-network div.vis-navigation div.vis-button.vis-zoomExtends{background-image:url(<<datauri \"$:/plugins/felixhayashi/vis/img/network/zoomExtends.png\">>);bottom:50px;right:15px}.vis-current-time{background-color:#ff7f6e;width:2px;z-index:1;pointer-events:none}.vis-rolling-mode-btn{height:40px;width:40px;position:absolute;top:7px;right:20px;border-radius:50%;font-size:28px;cursor:pointer;opacity:.8;color:white;font-weight:bold;text-align:center;background:#3876c2}.vis-rolling-mode-btn:before{content:\"\\26F6\"}.vis-rolling-mode-btn:hover{opacity:1}.vis-custom-time{background-color:#6e94ff;width:2px;cursor:move;z-index:1}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-horizontal{position:absolute;width:100%;height:0;border-bottom:1px solid}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-minor{border-color:#e5e5e5}.vis-panel.vis-background.vis-horizontal .vis-grid.vis-major{border-color:#bfbfbf}.vis-data-axis .vis-y-axis.vis-major{width:100%;position:absolute;color:#4d4d4d;white-space:nowrap}.vis-data-axis .vis-y-axis.vis-major.vis-measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-minor{position:absolute;width:100%;color:#bebebe;white-space:nowrap}.vis-data-axis .vis-y-axis.vis-minor.vis-measure{padding:0;margin:0;border:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-title{position:absolute;color:#4d4d4d;white-space:nowrap;bottom:20px;text-align:center}.vis-data-axis .vis-y-axis.vis-title.vis-measure{padding:0;margin:0;visibility:hidden;width:auto}.vis-data-axis .vis-y-axis.vis-title.vis-left{bottom:0;-webkit-transform-origin:left top;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left bottom;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.vis-data-axis .vis-y-axis.vis-title.vis-right{bottom:0;-webkit-transform-origin:right bottom;-moz-transform-origin:right bottom;-ms-transform-origin:right bottom;-o-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.vis-legend{background-color:rgba(247,252,255,0.65);padding:5px;border:1px solid #b3b3b3;box-shadow:2px 2px 10px rgba(154,154,154,0.55)}.vis-legend-text{white-space:nowrap;display:inline-block}.vis-item{position:absolute;color:#1a1a1a;border-color:#97b0f8;border-width:1px;background-color:#d5ddf6;display:inline-block;z-index:1}.vis-item.vis-selected{border-color:#ffc200;background-color:#fff785;z-index:2}.vis-editable.vis-selected{cursor:move}.vis-item.vis-point.vis-selected{background-color:#fff785}.vis-item.vis-box{text-align:center;border-style:solid;border-radius:2px}.vis-item.vis-point{background:0}.vis-item.vis-dot{position:absolute;padding:0;border-width:4px;border-style:solid;border-radius:4px}.vis-item.vis-range{border-style:solid;border-radius:2px;box-sizing:border-box}.vis-item.vis-background{border:0;background-color:rgba(213,221,246,0.4);box-sizing:border-box;padding:0;margin:0}.vis-item .vis-item-overflow{position:relative;width:100%;height:100%;padding:0;margin:0;overflow:hidden}.vis-item-visible-frame{white-space:nowrap}.vis-item.vis-range .vis-item-content{position:relative;display:inline-block}.vis-item.vis-background .vis-item-content{position:absolute;display:inline-block}.vis-item.vis-line{padding:0;position:absolute;width:0;border-left-width:1px;border-left-style:solid}.vis-item .vis-item-content{white-space:nowrap;box-sizing:border-box;padding:5px}.vis-item .vis-onUpdateTime-tooltip{position:absolute;background:#4f81bd;color:white;width:200px;text-align:center;white-space:nowrap;padding:5px;border-radius:1px;transition:.4s;-o-transition:.4s;-moz-transition:.4s;-webkit-transition:.4s}.vis-item .vis-delete,.vis-item .vis-delete-rtl{position:absolute;top:0;width:24px;height:24px;box-sizing:border-box;padding:0 5px;cursor:pointer;-webkit-transition:background .2s linear;-moz-transition:background .2s linear;-ms-transition:background .2s linear;-o-transition:background .2s linear;transition:background .2s linear}.vis-item .vis-delete{right:-24px}.vis-item .vis-delete-rtl{left:-24px}.vis-item .vis-delete:after,.vis-item .vis-delete-rtl:after{content:\"\\00D7\";color:red;font-family:arial,sans-serif;font-size:22px;font-weight:bold;-webkit-transition:color .2s linear;-moz-transition:color .2s linear;-ms-transition:color .2s linear;-o-transition:color .2s linear;transition:color .2s linear}.vis-item .vis-delete:hover,.vis-item .vis-delete-rtl:hover{background:red}.vis-item .vis-delete:hover:after,.vis-item .vis-delete-rtl:hover:after{color:white}.vis-item .vis-drag-center{position:absolute;width:100%;height:100%;top:0;left:0;cursor:move}.vis-item.vis-range .vis-drag-left{position:absolute;width:24px;max-width:20%;min-width:2px;height:100%;top:0;left:-4px;cursor:w-resize}.vis-item.vis-range .vis-drag-right{position:absolute;width:24px;max-width:20%;min-width:2px;height:100%;top:0;right:-4px;cursor:e-resize}.vis-range.vis-item.vis-readonly .vis-drag-left,.vis-range.vis-item.vis-readonly .vis-drag-right{cursor:auto}.vis-itemset{position:relative;padding:0;margin:0;box-sizing:border-box}.vis-itemset .vis-background,.vis-itemset .vis-foreground{position:absolute;width:100%;height:100%;overflow:visible}.vis-axis{position:absolute;width:100%;height:0;left:0;z-index:1}.vis-foreground .vis-group{position:relative;box-sizing:border-box;border-bottom:1px solid #bfbfbf}.vis-foreground .vis-group:last-child{border-bottom:0}.vis-nesting-group{cursor:pointer}.vis-nested-group{background:#f5f5f5}.vis-label.vis-nesting-group.expanded:before{content:\"\\25BC\"}.vis-label.vis-nesting-group.collapsed-rtl:before{content:\"\\25C0\"}.vis-label.vis-nesting-group.collapsed:before{content:\"\\25B6\"}.vis-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10}.vis-labelset{position:relative;overflow:hidden;box-sizing:border-box}.vis-labelset .vis-label{position:relative;left:0;top:0;width:100%;color:#4d4d4d;box-sizing:border-box}.vis-labelset .vis-label{border-bottom:1px solid #bfbfbf}.vis-labelset .vis-label.draggable{cursor:pointer}.vis-labelset .vis-label:last-child{border-bottom:0}.vis-labelset .vis-label .vis-inner{display:inline-block;padding:5px}.vis-labelset .vis-label .vis-inner.vis-hidden{padding:0}.vis-panel{position:absolute;padding:0;margin:0;box-sizing:border-box}.vis-panel.vis-center,.vis-panel.vis-left,.vis-panel.vis-right,.vis-panel.vis-top,.vis-panel.vis-bottom{border:1px #bfbfbf}.vis-panel.vis-center,.vis-panel.vis-left,.vis-panel.vis-right{border-top-style:solid;border-bottom-style:solid;overflow:hidden}.vis-left.vis-panel.vis-vertical-scroll,.vis-right.vis-panel.vis-vertical-scroll{height:100%;overflow-x:hidden;overflow-y:scroll}.vis-left.vis-panel.vis-vertical-scroll{direction:rtl}.vis-left.vis-panel.vis-vertical-scroll .vis-content{direction:ltr}.vis-right.vis-panel.vis-vertical-scroll{direction:ltr}.vis-right.vis-panel.vis-vertical-scroll .vis-content{direction:rtl}.vis-panel.vis-center,.vis-panel.vis-top,.vis-panel.vis-bottom{border-left-style:solid;border-right-style:solid}.vis-background{overflow:hidden}.vis-panel>.vis-content{position:relative}.vis-panel .vis-shadow{position:absolute;width:100%;height:1px;box-shadow:0 0 10px rgba(0,0,0,0.8)}.vis-panel .vis-shadow.vis-top{top:-1px;left:0}.vis-panel .vis-shadow.vis-bottom{bottom:-1px;left:0}.vis-graph-group0{fill:#4f81bd;fill-opacity:0;stroke-width:2px;stroke:#4f81bd}.vis-graph-group1{fill:#f79646;fill-opacity:0;stroke-width:2px;stroke:#f79646}.vis-graph-group2{fill:#8c51cf;fill-opacity:0;stroke-width:2px;stroke:#8c51cf}.vis-graph-group3{fill:#75c841;fill-opacity:0;stroke-width:2px;stroke:#75c841}.vis-graph-group4{fill:#ff0100;fill-opacity:0;stroke-width:2px;stroke:#ff0100}.vis-graph-group5{fill:#37d8e6;fill-opacity:0;stroke-width:2px;stroke:#37d8e6}.vis-graph-group6{fill:#042662;fill-opacity:0;stroke-width:2px;stroke:#042662}.vis-graph-group7{fill:#00ff26;fill-opacity:0;stroke-width:2px;stroke:#00ff26}.vis-graph-group8{fill:#f0f;fill-opacity:0;stroke-width:2px;stroke:#f0f}.vis-graph-group9{fill:#8f3938;fill-opacity:0;stroke-width:2px;stroke:#8f3938}.vis-timeline .vis-fill{fill-opacity:.1;stroke:none}.vis-timeline .vis-bar{fill-opacity:.5;stroke-width:1px}.vis-timeline .vis-point{stroke-width:2px;fill-opacity:1.0}.vis-timeline .vis-legend-background{stroke-width:1px;fill-opacity:.9;fill:#fff;stroke:#c2c2c2}.vis-timeline .vis-outline{stroke-width:1px;fill-opacity:1;fill:#fff;stroke:#e5e5e5}.vis-timeline .vis-icon-fill{fill-opacity:.3;stroke:none}.vis-time-axis{position:relative;overflow:hidden}.vis-time-axis.vis-foreground{top:0;left:0;width:100%}.vis-time-axis.vis-background{position:absolute;top:0;left:0;width:100%;height:100%}.vis-time-axis .vis-text{position:absolute;color:#4d4d4d;padding:3px;overflow:hidden;box-sizing:border-box;white-space:nowrap}.vis-time-axis .vis-text.vis-measure{position:absolute;padding-left:0;padding-right:0;margin-left:0;margin-right:0;visibility:hidden}.vis-time-axis .vis-grid.vis-vertical{position:absolute;border-left:1px solid}.vis-time-axis .vis-grid.vis-vertical-rtl{position:absolute;border-right:1px solid}.vis-time-axis .vis-grid.vis-minor{border-color:#e5e5e5}.vis-time-axis .vis-grid.vis-major{border-color:#bfbfbf}.vis-timeline{position:relative;border:1px solid #bfbfbf;overflow:hidden;padding:0;margin:0;box-sizing:border-box}"
},
"$:/plugins/felixhayashi/vis/vis.js": {
"title": "$:/plugins/felixhayashi/vis/vis.js",
"text": "/*\\\ntitle: $:/plugins/felixhayashi/vis/vis.js\ntype: application/javascript\nmodule-type: library\n\n@preserve\n\\*/\n\n/*** TO AVOID STRANGE LIB ERRORS FROM BUBBLING UP *****************/\n\nif($tw.boot.tasks.trapErrors) {\n\n var defaultHandler = window.onerror;\n window.onerror = function(errorMsg, url, lineNumber) {\n \n if(errorMsg.indexOf(\"NS_ERROR_NOT_AVAILABLE\") !== -1\n && url == \"$:/plugins/felixhayashi/vis/vis.js\") {\n \n var text = \"Strange firefox related vis.js error (see #125)\";\n console.error(text, arguments);\n \n } else if(errorMsg.indexOf(\"Permission denied to access property\") !== -1) {\n \n var text = \"Strange firefox related vis.js error (see #163)\";\n console.error(text, arguments);\n \n } else if(defaultHandler) {\n \n defaultHandler.apply(this, arguments);\n \n }\n \n }\n \n}\n\n/******************************************************************/\n\n/**\n * vis.js\n * https://github.com/almende/vis\n *\n * A dynamic, browser-based visualization library.\n *\n * @version 4.21.0\n * @date 2017-10-12\n *\n * @license\n * Copyright (C) 2011-2017 Almende B.V, http://almende.com\n *\n * Vis.js is dual licensed under both\n *\n * * The Apache 2.0 License\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * and\n *\n * * The MIT License\n * http://opensource.org/licenses/MIT\n *\n * Vis.js may be distributed under either license.\n */\n\"use strict\";(function webpackUniversalModuleDefinition(root,factory){if(typeof exports===\"object\"&&typeof module===\"object\")module.exports=factory();else if(typeof define===\"function\"&&define.amd)define([],factory);else if(typeof exports===\"object\")exports[\"vis\"]=factory();else root[\"vis\"]=factory()})(this,function(){return function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId]){return installedModules[moduleId].exports}var module=installedModules[moduleId]={i:moduleId,l:false,exports:{}};modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);module.l=true;return module.exports}__webpack_require__.m=modules;__webpack_require__.c=installedModules;__webpack_require__.d=function(exports,name,getter){if(!__webpack_require__.o(exports,name)){Object.defineProperty(exports,name,{configurable:false,enumerable:true,get:getter})}};__webpack_require__.n=function(module){var getter=module&&module.__esModule?function getDefault(){return module[\"default\"]}:function getModuleExports(){return module};__webpack_require__.d(getter,\"a\",getter);return getter};__webpack_require__.o=function(object,property){return Object.prototype.hasOwnProperty.call(object,property)};__webpack_require__.p=\"\";return __webpack_require__(__webpack_require__.s=123)}([function(module,exports,__webpack_require__){\"use strict\";exports.__esModule=true;exports.default=function(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError(\"Cannot call a class as a function\")}}},function(module,exports,__webpack_require__){\"use strict\";exports.__esModule=true;var _defineProperty=__webpack_require__(169);var _defineProperty2=_interopRequireDefault(_defineProperty);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}exports.default=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if(\"value\"in descriptor)descriptor.writable=true;(0,_defineProperty2.default)(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor}}()},function(module,exports,__webpack_require__){\"use strict\";var _getIterator2=__webpack_require__(77);var _getIterator3=_interopRequireDefault(_getIterator2);var _create=__webpack_require__(29);var _create2=_interopRequireDefault(_create);var _keys=__webpack_require__(8);var _keys2=_interopRequireDefault(_keys);var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var moment=__webpack_require__(9);var uuid=__webpack_require__(157);exports.isNumber=function(object){return object instanceof Number||typeof object==\"number\"};exports.recursiveDOMDelete=function(DOMobject){if(DOMobject){while(DOMobject.hasChildNodes()===true){exports.recursiveDOMDelete(DOMobject.firstChild);DOMobject.removeChild(DOMobject.firstChild)}}};exports.giveRange=function(min,max,total,value){if(max==min){return.5}else{var scale=1/(max-min);return Math.max(0,(value-min)*scale)}};exports.isString=function(object){return object instanceof String||typeof object==\"string\"};exports.isDate=function(object){if(object instanceof Date){return true}else if(exports.isString(object)){var match=ASPDateRegex.exec(object);if(match){return true}else if(!isNaN(Date.parse(object))){return true}}return false};exports.randomUUID=function(){return uuid.v4()};exports.assignAllKeys=function(obj,value){for(var prop in obj){if(obj.hasOwnProperty(prop)){if((0,_typeof3[\"default\"])(obj[prop])!==\"object\"){obj[prop]=value}}}};function copyOrDelete(a,b,prop,allowDeletion){var doDeletion=false;if(allowDeletion===true){doDeletion=b[prop]===null&&a[prop]!==undefined}if(doDeletion){delete a[prop]}else{a[prop]=b[prop]}}exports.fillIfDefined=function(a,b){var allowDeletion=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;for(var prop in a){if(b[prop]!==undefined){if(b[prop]===null||(0,_typeof3[\"default\"])(b[prop])!==\"object\"){copyOrDelete(a,b,prop,allowDeletion)}else{if((0,_typeof3[\"default\"])(a[prop])===\"object\"){exports.fillIfDefined(a[prop],b[prop],allowDeletion)}}}}};exports.extend=function(a,b){for(var i=1;i<arguments.length;i++){var other=arguments[i];for(var prop in other){if(other.hasOwnProperty(prop)){a[prop]=other[prop]}}}return a};exports.selectiveExtend=function(props,a,b){if(!Array.isArray(props)){throw new Error(\"Array with property names expected as first argument\")}for(var i=2;i<arguments.length;i++){var other=arguments[i];for(var p=0;p<props.length;p++){var prop=props[p];if(other&&other.hasOwnProperty(prop)){a[prop]=other[prop]}}}return a};exports.selectiveDeepExtend=function(props,a,b){var allowDeletion=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;if(Array.isArray(b)){throw new TypeError(\"Arrays are not supported by deepExtend\")}for(var p=0;p<props.length;p++){var prop=props[p];if(b.hasOwnProperty(prop)){if(b[prop]&&b[prop].constructor===Object){if(a[prop]===undefined){a[prop]={}}if(a[prop].constructor===Object){exports.deepExtend(a[prop],b[prop],false,allowDeletion)}else{copyOrDelete(a,b,prop,allowDeletion)}}else if(Array.isArray(b[prop])){throw new TypeError(\"Arrays are not supported by deepExtend\")}else{copyOrDelete(a,b,prop,allowDeletion)}}}return a};exports.selectiveNotDeepExtend=function(propsToExclude,a,b){var allowDeletion=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;if(Array.isArray(b)){throw new TypeError(\"Arrays are not supported by deepExtend\")}for(var prop in b){if(!b.hasOwnProperty(prop))continue;if(propsToExclude.indexOf(prop)!==-1)continue;if(b[prop]&&b[prop].constructor===Object){if(a[prop]===undefined){a[prop]={}}if(a[prop].constructor===Object){exports.deepExtend(a[prop],b[prop])}else{copyOrDelete(a,b,prop,allowDeletion)}}else if(Array.isArray(b[prop])){a[prop]=[];for(var i=0;i<b[prop].length;i++){a[prop].push(b[prop][i])}}else{copyOrDelete(a,b,prop,allowDeletion)}}return a};exports.deepExtend=function(a,b){var protoExtend=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var allowDeletion=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;for(var prop in b){if(b.hasOwnProperty(prop)||protoExtend===true){if(b[prop]&&b[prop].constructor===Object){if(a[prop]===undefined){a[prop]={}}if(a[prop].constructor===Object){exports.deepExtend(a[prop],b[prop],protoExtend)}else{copyOrDelete(a,b,prop,allowDeletion)}}else if(Array.isArray(b[prop])){a[prop]=[];for(var i=0;i<b[prop].length;i++){a[prop].push(b[prop][i])}}else{copyOrDelete(a,b,prop,allowDeletion)}}}return a};exports.equalArray=function(a,b){if(a.length!=b.length)return false;for(var i=0,len=a.length;i<len;i++){if(a[i]!=b[i])return false}return true};exports.convert=function(object,type){var match;if(object===undefined){return undefined}if(object===null){return null}if(!type){return object}if(!(typeof type===\"string\")&&!(type instanceof String)){throw new Error(\"Type must be a string\")}switch(type){case\"boolean\":case\"Boolean\":return Boolean(object);case\"number\":case\"Number\":if(exports.isString(object)&&!isNaN(Date.parse(object))){return moment(object).valueOf()}else{return Number(object.valueOf())}case\"string\":case\"String\":return String(object);case\"Date\":if(exports.isNumber(object)){return new Date(object)}if(object instanceof Date){return new Date(object.valueOf())}else if(moment.isMoment(object)){return new Date(object.valueOf())}if(exports.isString(object)){match=ASPDateRegex.exec(object);if(match){return new Date(Number(match[1]))}else{return moment(new Date(object)).toDate()}}else{throw new Error(\"Cannot convert object of type \"+exports.getType(object)+\" to type Date\")}case\"Moment\":if(exports.isNumber(object)){return moment(object)}if(object instanceof Date){return moment(object.valueOf())}else if(moment.isMoment(object)){return moment(object)}if(exports.isString(object)){match=ASPDateRegex.exec(object);if(match){return moment(Number(match[1]))}else{return moment(object)}}else{throw new Error(\"Cannot convert object of type \"+exports.getType(object)+\" to type Date\")}case\"ISODate\":if(exports.isNumber(object)){return new Date(object)}else if(object instanceof Date){return object.toISOString()}else if(moment.isMoment(object)){return object.toDate().toISOString()}else if(exports.isString(object)){match=ASPDateRegex.exec(object);if(match){return new Date(Number(match[1])).toISOString()}else{return moment(object).format()}}else{throw new Error(\"Cannot convert object of type \"+exports.getType(object)+\" to type ISODate\")}case\"ASPDate\":if(exports.isNumber(object)){return\"/Date(\"+object+\")/\"}else if(object instanceof Date){return\"/Date(\"+object.valueOf()+\")/\"}else if(exports.isString(object)){match=ASPDateRegex.exec(object);var value;if(match){value=new Date(Number(match[1])).valueOf()}else{value=new Date(object).valueOf()}return\"/Date(\"+value+\")/\"}else{throw new Error(\"Cannot convert object of type \"+exports.getType(object)+\" to type ASPDate\")}default:throw new Error('Unknown type \"'+type+'\"')}};var ASPDateRegex=/^\\/?Date\\((\\-?\\d+)/i;exports.getType=function(object){var type=typeof object===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(object);if(type==\"object\"){if(object===null){return\"null\"}if(object instanceof Boolean){return\"Boolean\"}if(object instanceof Number){return\"Number\"}if(object instanceof String){return\"String\"}if(Array.isArray(object)){return\"Array\"}if(object instanceof Date){return\"Date\"}return\"Object\"}else if(type==\"number\"){return\"Number\"}else if(type==\"boolean\"){return\"Boolean\"}else if(type==\"string\"){return\"String\"}else if(type===undefined){return\"undefined\"}return type};exports.copyAndExtendArray=function(arr,newValue){var newArr=[];for(var i=0;i<arr.length;i++){newArr.push(arr[i])}newArr.push(newValue);return newArr};exports.copyArray=function(arr){var newArr=[];for(var i=0;i<arr.length;i++){newArr.push(arr[i])}return newArr};exports.getAbsoluteLeft=function(elem){return elem.getBoundingClientRect().left};exports.getAbsoluteRight=function(elem){return elem.getBoundingClientRect().right};exports.getAbsoluteTop=function(elem){return elem.getBoundingClientRect().top};exports.addClassName=function(elem,classNames){var classes=elem.className.split(\" \");var newClasses=classNames.split(\" \");classes=classes.concat(newClasses.filter(function(className){return classes.indexOf(className)<0}));elem.className=classes.join(\" \")};exports.removeClassName=function(elem,classNames){var classes=elem.className.split(\" \");var oldClasses=classNames.split(\" \");classes=classes.filter(function(className){return oldClasses.indexOf(className)<0});elem.className=classes.join(\" \")};exports.forEach=function(object,callback){var i,len;if(Array.isArray(object)){for(i=0,len=object.length;i<len;i++){callback(object[i],i,object)}}else{for(i in object){if(object.hasOwnProperty(i)){callback(object[i],i,object)}}}};exports.toArray=function(object){var array=[];for(var prop in object){if(object.hasOwnProperty(prop))array.push(object[prop])}return array};exports.updateProperty=function(object,key,value){if(object[key]!==value){object[key]=value;return true}else{return false}};exports.throttle=function(fn){var scheduled=false;return function throttled(){if(!scheduled){scheduled=true;requestAnimationFrame(function(){scheduled=false;fn()})}}};exports.addEventListener=function(element,action,listener,useCapture){if(element.addEventListener){if(useCapture===undefined)useCapture=false;if(action===\"mousewheel\"&&navigator.userAgent.indexOf(\"Firefox\")>=0){action=\"DOMMouseScroll\"}element.addEventListener(action,listener,useCapture)}else{element.attachEvent(\"on\"+action,listener)}};exports.removeEventListener=function(element,action,listener,useCapture){if(element.removeEventListener){if(useCapture===undefined)useCapture=false;if(action===\"mousewheel\"&&navigator.userAgent.indexOf(\"Firefox\")>=0){action=\"DOMMouseScroll\"}element.removeEventListener(action,listener,useCapture)}else{element.detachEvent(\"on\"+action,listener)}};exports.preventDefault=function(event){if(!event)event=window.event;if(event.preventDefault){event.preventDefault()}else{event.returnValue=false}};exports.getTarget=function(event){if(!event){event=window.event}var target;if(event.target){target=event.target}else if(event.srcElement){target=event.srcElement}if(target.nodeType!=undefined&&target.nodeType==3){target=target.parentNode}return target};exports.hasParent=function(element,parent){var e=element;while(e){if(e===parent){return true}e=e.parentNode}return false};exports.option={};exports.option.asBoolean=function(value,defaultValue){if(typeof value==\"function\"){value=value()}if(value!=null){return value!=false}return defaultValue||null};exports.option.asNumber=function(value,defaultValue){if(typeof value==\"function\"){value=value()}if(value!=null){return Number(value)||defaultValue||null}return defaultValue||null};exports.option.asString=function(value,defaultValue){if(typeof value==\"function\"){value=value()}if(value!=null){return String(value)}return defaultValue||null};exports.option.asSize=function(value,defaultValue){if(typeof value==\"function\"){value=value()}if(exports.isString(value)){return value}else if(exports.isNumber(value)){return value+\"px\"}else{return defaultValue||null}};exports.option.asElement=function(value,defaultValue){if(typeof value==\"function\"){value=value()}return value||defaultValue||null};exports.hexToRGB=function(hex){var shorthandRegex=/^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;hex=hex.replace(shorthandRegex,function(m,r,g,b){return r+r+g+g+b+b});var result=/^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);return result?{r:parseInt(result[1],16),g:parseInt(result[2],16),b:parseInt(result[3],16)}:null};exports.overrideOpacity=function(color,opacity){var rgb;if(color.indexOf(\"rgba\")!=-1){return color}else if(color.indexOf(\"rgb\")!=-1){rgb=color.substr(color.indexOf(\"(\")+1).replace(\")\",\"\").split(\",\");return\"rgba(\"+rgb[0]+\",\"+rgb[1]+\",\"+rgb[2]+\",\"+opacity+\")\"}else{rgb=exports.hexToRGB(color);if(rgb==null){return color}else{return\"rgba(\"+rgb.r+\",\"+rgb.g+\",\"+rgb.b+\",\"+opacity+\")\"}}};exports.RGBToHex=function(red,green,blue){return\"#\"+((1<<24)+(red<<16)+(green<<8)+blue).toString(16).slice(1)};exports.parseColor=function(color){var c;if(exports.isString(color)===true){if(exports.isValidRGB(color)===true){var rgb=color.substr(4).substr(0,color.length-5).split(\",\").map(function(value){return parseInt(value)});color=exports.RGBToHex(rgb[0],rgb[1],rgb[2])}if(exports.isValidHex(color)===true){var hsv=exports.hexToHSV(color);var lighterColorHSV={h:hsv.h,s:hsv.s*.8,v:Math.min(1,hsv.v*1.02)};var darkerColorHSV={h:hsv.h,s:Math.min(1,hsv.s*1.25),v:hsv.v*.8};var darkerColorHex=exports.HSVToHex(darkerColorHSV.h,darkerColorHSV.s,darkerColorHSV.v);var lighterColorHex=exports.HSVToHex(lighterColorHSV.h,lighterColorHSV.s,lighterColorHSV.v);c={background:color,border:darkerColorHex,highlight:{background:lighterColorHex,border:darkerColorHex},hover:{background:lighterColorHex,border:darkerColorHex}}}else{c={background:color,border:color,highlight:{background:color,border:color},hover:{background:color,border:color}}}}else{c={};c.background=color.background||undefined;c.border=color.border||undefined;if(exports.isString(color.highlight)){c.highlight={border:color.highlight,background:color.highlight}}else{c.highlight={};c.highlight.background=color.highlight&&color.highlight.background||undefined;c.highlight.border=color.highlight&&color.highlight.border||undefined}if(exports.isString(color.hover)){c.hover={border:color.hover,background:color.hover}}else{c.hover={};c.hover.background=color.hover&&color.hover.background||undefined;c.hover.border=color.hover&&color.hover.border||undefined}}return c};exports.RGBToHSV=function(red,green,blue){red=red/255;green=green/255;blue=blue/255;var minRGB=Math.min(red,Math.min(green,blue));var maxRGB=Math.max(red,Math.max(green,blue));if(minRGB==maxRGB){return{h:0,s:0,v:minRGB}}var d=red==minRGB?green-blue:blue==minRGB?red-green:blue-red;var h=red==minRGB?3:blue==minRGB?1:5;var hue=60*(h-d/(maxRGB-minRGB))/360;var saturation=(maxRGB-minRGB)/maxRGB;var value=maxRGB;return{h:hue,s:saturation,v:value}};var cssUtil={split:function split(cssText){var styles={};cssText.split(\";\").forEach(function(style){if(style.trim()!=\"\"){var parts=style.split(\":\");var key=parts[0].trim();var value=parts[1].trim();styles[key]=value}});return styles},join:function join(styles){return(0,_keys2[\"default\"])(styles).map(function(key){return key+\": \"+styles[key]}).join(\"; \")}};exports.addCssText=function(element,cssText){var currentStyles=cssUtil.split(element.style.cssText);var newStyles=cssUtil.split(cssText);var styles=exports.extend(currentStyles,newStyles);element.style.cssText=cssUtil.join(styles)};exports.removeCssText=function(element,cssText){var styles=cssUtil.split(element.style.cssText);var removeStyles=cssUtil.split(cssText);for(var key in removeStyles){if(removeStyles.hasOwnProperty(key)){delete styles[key]}}element.style.cssText=cssUtil.join(styles)};exports.HSVToRGB=function(h,s,v){var r,g,b;var i=Math.floor(h*6);var f=h*6-i;var p=v*(1-s);var q=v*(1-f*s);var t=v*(1-(1-f)*s);switch(i%6){case 0:r=v,g=t,b=p;break;case 1:r=q,g=v,b=p;break;case 2:r=p,g=v,b=t;break;case 3:r=p,g=q,b=v;break;case 4:r=t,g=p,b=v;break;case 5:r=v,g=p,b=q;break}return{r:Math.floor(r*255),g:Math.floor(g*255),b:Math.floor(b*255)}};exports.HSVToHex=function(h,s,v){var rgb=exports.HSVToRGB(h,s,v);return exports.RGBToHex(rgb.r,rgb.g,rgb.b)};exports.hexToHSV=function(hex){var rgb=exports.hexToRGB(hex);return exports.RGBToHSV(rgb.r,rgb.g,rgb.b)};exports.isValidHex=function(hex){var isOk=/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(hex);return isOk};exports.isValidRGB=function(rgb){rgb=rgb.replace(\" \",\"\");var isOk=/rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)/i.test(rgb);return isOk};exports.isValidRGBA=function(rgba){rgba=rgba.replace(\" \",\"\");var isOk=/rgba\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3}),(.{1,3})\\)/i.test(rgba);return isOk};exports.selectiveBridgeObject=function(fields,referenceObject){if(referenceObject!==null&&(typeof referenceObject===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(referenceObject))===\"object\"){var objectTo=(0,_create2[\"default\"])(referenceObject);for(var i=0;i<fields.length;i++){if(referenceObject.hasOwnProperty(fields[i])){if((0,_typeof3[\"default\"])(referenceObject[fields[i]])==\"object\"){objectTo[fields[i]]=exports.bridgeObject(referenceObject[fields[i]])}}}return objectTo}else{return null}};exports.bridgeObject=function(referenceObject){if(referenceObject!==null&&(typeof referenceObject===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(referenceObject))===\"object\"){var objectTo=(0,_create2[\"default\"])(referenceObject);if(referenceObject instanceof Element){objectTo=referenceObject}else{objectTo=(0,_create2[\"default\"])(referenceObject);for(var i in referenceObject){if(referenceObject.hasOwnProperty(i)){if((0,_typeof3[\"default\"])(referenceObject[i])==\"object\"){objectTo[i]=exports.bridgeObject(referenceObject[i])}}}}return objectTo}else{return null}};exports.insertSort=function(a,compare){for(var i=0;i<a.length;i++){var k=a[i];for(var j=i;j>0&&compare(k,a[j-1])<0;j--){a[j]=a[j-1]}a[j]=k}return a};exports.mergeOptions=function(mergeTarget,options,option){var globalOptions=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};var isPresent=function isPresent(obj){return obj!==null&&obj!==undefined};var isObject=function isObject(obj){return obj!==null&&(typeof obj===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(obj))===\"object\"};var isEmpty=function isEmpty(obj){for(var x in obj){if(obj.hasOwnProperty(x))return false}return true};if(!isObject(mergeTarget)){throw new Error(\"Parameter mergeTarget must be an object\")}if(!isObject(options)){throw new Error(\"Parameter options must be an object\")}if(!isPresent(option)){throw new Error(\"Parameter option must have a value\")}if(!isObject(globalOptions)){throw new Error(\"Parameter globalOptions must be an object\")}var doMerge=function doMerge(target,options,option){if(!isObject(target[option])){target[option]={}}var src=options[option];var dst=target[option];for(var prop in src){if(src.hasOwnProperty(prop)){dst[prop]=src[prop]}}};var srcOption=options[option];var globalPassed=isObject(globalOptions)&&!isEmpty(globalOptions);var globalOption=globalPassed?globalOptions[option]:undefined;var globalEnabled=globalOption?globalOption.enabled:undefined;if(srcOption===undefined){return}if(typeof srcOption===\"boolean\"){if(!isObject(mergeTarget[option])){mergeTarget[option]={}}mergeTarget[option].enabled=srcOption;return}if(srcOption===null&&!isObject(mergeTarget[option])){if(isPresent(globalOption)){mergeTarget[option]=(0,_create2[\"default\"])(globalOption)}else{return}}if(!isObject(srcOption)){return}var enabled=true;if(srcOption.enabled!==undefined){enabled=srcOption.enabled}else{if(globalEnabled!==undefined){enabled=globalOption.enabled}}doMerge(mergeTarget,options,option);mergeTarget[option].enabled=enabled};exports.binarySearchCustom=function(orderedItems,comparator,field,field2){var maxIterations=1e4;var iteration=0;var low=0;var high=orderedItems.length-1;while(low<=high&&iteration<maxIterations){var middle=Math.floor((low+high)/2);var item=orderedItems[middle];var value=field2===undefined?item[field]:item[field][field2];var searchResult=comparator(value);if(searchResult==0){return middle}else if(searchResult==-1){low=middle+1}else{high=middle-1}iteration++}return-1};exports.binarySearchValue=function(orderedItems,target,field,sidePreference,comparator){var maxIterations=1e4;var iteration=0;var low=0;var high=orderedItems.length-1;var prevValue,value,nextValue,middle;comparator=comparator!=undefined?comparator:function(a,b){return a==b?0:a<b?-1:1};while(low<=high&&iteration<maxIterations){middle=Math.floor(.5*(high+low));prevValue=orderedItems[Math.max(0,middle-1)][field];value=orderedItems[middle][field];nextValue=orderedItems[Math.min(orderedItems.length-1,middle+1)][field];if(comparator(value,target)==0){return middle}else if(comparator(prevValue,target)<0&&comparator(value,target)>0){return sidePreference==\"before\"?Math.max(0,middle-1):middle}else if(comparator(value,target)<0&&comparator(nextValue,target)>0){return sidePreference==\"before\"?middle:Math.min(orderedItems.length-1,middle+1)}else{if(comparator(value,target)<0){low=middle+1}else{high=middle-1}}iteration++}return-1};exports.easingFunctions={linear:function linear(t){return t},easeInQuad:function easeInQuad(t){return t*t},easeOutQuad:function easeOutQuad(t){return t*(2-t)},easeInOutQuad:function easeInOutQuad(t){return t<.5?2*t*t:-1+(4-2*t)*t},easeInCubic:function easeInCubic(t){return t*t*t},easeOutCubic:function easeOutCubic(t){return--t*t*t+1},easeInOutCubic:function easeInOutCubic(t){return t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1},easeInQuart:function easeInQuart(t){return t*t*t*t},easeOutQuart:function easeOutQuart(t){return 1- --t*t*t*t},easeInOutQuart:function easeInOutQuart(t){return t<.5?8*t*t*t*t:1-8*--t*t*t*t},easeInQuint:function easeInQuint(t){return t*t*t*t*t},easeOutQuint:function easeOutQuint(t){return 1+--t*t*t*t*t},easeInOutQuint:function easeInOutQuint(t){return t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t}};exports.getScrollBarWidth=function(){var inner=document.createElement(\"p\");inner.style.width=\"100%\";inner.style.height=\"200px\";var outer=document.createElement(\"div\");outer.style.position=\"absolute\";outer.style.top=\"0px\";outer.style.left=\"0px\";outer.style.visibility=\"hidden\";outer.style.width=\"200px\";outer.style.height=\"150px\";outer.style.overflow=\"hidden\";outer.appendChild(inner);document.body.appendChild(outer);var w1=inner.offsetWidth;outer.style.overflow=\"scroll\";var w2=inner.offsetWidth;if(w1==w2)w2=outer.clientWidth;document.body.removeChild(outer);return w1-w2};exports.topMost=function(pile,accessors){var candidate=void 0;if(!Array.isArray(accessors)){accessors=[accessors]}var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=(0,_getIterator3[\"default\"])(pile),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var member=_step.value;if(member){candidate=member[accessors[0]];for(var i=1;i<accessors.length;i++){if(candidate){candidate=candidate[accessors[i]]}else{continue}}if(typeof candidate!=\"undefined\"){break}}}}catch(err){_didIteratorError=true;_iteratorError=err}finally{try{if(!_iteratorNormalCompletion&&_iterator[\"return\"]){_iterator[\"return\"]()}}finally{if(_didIteratorError){throw _iteratorError}}}return candidate}},function(module,exports,__webpack_require__){module.exports={default:__webpack_require__(194),__esModule:true}},function(module,exports,__webpack_require__){\"use strict\";exports.__esModule=true;var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}exports.default=function(self,call){if(!self){throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\")}return call&&((typeof call===\"undefined\"?\"undefined\":(0,_typeof3.default)(call))===\"object\"||typeof call===\"function\")?call:self}},function(module,exports,__webpack_require__){\"use strict\";exports.__esModule=true;var _setPrototypeOf=__webpack_require__(196);var _setPrototypeOf2=_interopRequireDefault(_setPrototypeOf);var _create=__webpack_require__(29);var _create2=_interopRequireDefault(_create);var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}exports.default=function(subClass,superClass){if(typeof superClass!==\"function\"&&superClass!==null){throw new TypeError(\"Super expression must either be null or a function, not \"+(typeof superClass===\"undefined\"?\"undefined\":(0,_typeof3.default)(superClass)))}subClass.prototype=(0,_create2.default)(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)_setPrototypeOf2.default?(0,_setPrototypeOf2.default)(subClass,superClass):subClass.__proto__=superClass}},function(module,exports,__webpack_require__){\"use strict\";exports.__esModule=true;var _iterator=__webpack_require__(142);var _iterator2=_interopRequireDefault(_iterator);var _symbol=__webpack_require__(144);var _symbol2=_interopRequireDefault(_symbol);var _typeof=typeof _symbol2.default===\"function\"&&typeof _iterator2.default===\"symbol\"?function(obj){return typeof obj}:function(obj){return obj&&typeof _symbol2.default===\"function\"&&obj.constructor===_symbol2.default&&obj!==_symbol2.default.prototype?\"symbol\":typeof obj};function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}exports.default=typeof _symbol2.default===\"function\"&&_typeof(_iterator2.default)===\"symbol\"?function(obj){return typeof obj===\"undefined\"?\"undefined\":_typeof(obj)}:function(obj){return obj&&typeof _symbol2.default===\"function\"&&obj.constructor===_symbol2.default&&obj!==_symbol2.default.prototype?\"symbol\":typeof obj===\"undefined\"?\"undefined\":_typeof(obj)}},function(module,exports){var core=module.exports={version:\"2.5.1\"};if(typeof __e==\"number\")__e=core},function(module,exports,__webpack_require__){module.exports={default:__webpack_require__(140),__esModule:true}},function(module,exports,__webpack_require__){\"use strict\";module.exports=typeof window!==\"undefined\"&&window[\"moment\"]||__webpack_require__(154)},function(module,exports,__webpack_require__){\"use strict\";function hammerMock(){var noop=function noop(){};return{on:noop,off:noop,destroy:noop,emit:noop,get:function get(m){return{set:noop}}}}if(typeof window!==\"undefined\"){var propagating=__webpack_require__(175);var Hammer=window[\"Hammer\"]||__webpack_require__(176);module.exports=propagating(Hammer,{preventDefault:\"mouse\"})}else{module.exports=function(){return hammerMock()}}},function(module,exports,__webpack_require__){\"use strict\";var _stringify=__webpack_require__(19);var _stringify2=_interopRequireDefault(_stringify);var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);var _keys=__webpack_require__(8);var _keys2=_interopRequireDefault(_keys);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var Queue=__webpack_require__(43);function DataSet(data,options){if(data&&!Array.isArray(data)){options=data;data=null}this._options=options||{};this._data={};this.length=0;this._fieldId=this._options.fieldId||\"id\";this._type={};if(this._options.type){var fields=(0,_keys2[\"default\"])(this._options.type);for(var i=0,len=fields.length;i<len;i++){var field=fields[i];var value=this._options.type[field];if(value==\"Date\"||value==\"ISODate\"||value==\"ASPDate\"){this._type[field]=\"Date\"}else{this._type[field]=value}}}this._subscribers={};if(data){this.add(data)}this.setOptions(options)}DataSet.prototype.setOptions=function(options){if(options&&options.queue!==undefined){if(options.queue===false){if(this._queue){this._queue.destroy();delete this._queue}}else{if(!this._queue){this._queue=Queue.extend(this,{replace:[\"add\",\"update\",\"remove\"]})}if((0,_typeof3[\"default\"])(options.queue)===\"object\"){this._queue.setOptions(options.queue)}}}};DataSet.prototype.on=function(event,callback){var subscribers=this._subscribers[event];if(!subscribers){subscribers=[];this._subscribers[event]=subscribers}subscribers.push({callback:callback})};DataSet.prototype.off=function(event,callback){var subscribers=this._subscribers[event];if(subscribers){this._subscribers[event]=subscribers.filter(function(listener){return listener.callback!=callback})}};DataSet.prototype._trigger=function(event,params,senderId){if(event==\"*\"){throw new Error(\"Cannot trigger event *\")}var subscribers=[];if(event in this._subscribers){subscribers=subscribers.concat(this._subscribers[event])}if(\"*\"in this._subscribers){subscribers=subscribers.concat(this._subscribers[\"*\"])}for(var i=0,len=subscribers.length;i<len;i++){var subscriber=subscribers[i];if(subscriber.callback){subscriber.callback(event,params,senderId||null)}}};DataSet.prototype.add=function(data,senderId){var addedIds=[],id,me=this;if(Array.isArray(data)){for(var i=0,len=data.length;i<len;i++){id=me._addItem(data[i]);addedIds.push(id)}}else if(data&&(typeof data===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(data))===\"object\"){id=me._addItem(data);addedIds.push(id)}else{throw new Error(\"Unknown dataType\")}if(addedIds.length){this._trigger(\"add\",{items:addedIds},senderId)}return addedIds};DataSet.prototype.update=function(data,senderId){var addedIds=[];var updatedIds=[];var oldData=[];var updatedData=[];var me=this;var fieldId=me._fieldId;var addOrUpdate=function addOrUpdate(item){var id=item[fieldId];if(me._data[id]){var oldItem=util.extend({},me._data[id]);id=me._updateItem(item);updatedIds.push(id);updatedData.push(item);oldData.push(oldItem)}else{id=me._addItem(item);addedIds.push(id)}};if(Array.isArray(data)){for(var i=0,len=data.length;i<len;i++){if(data[i]&&(0,_typeof3[\"default\"])(data[i])===\"object\"){addOrUpdate(data[i])}else{console.warn(\"Ignoring input item, which is not an object at index \"+i)}}}else if(data&&(typeof data===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(data))===\"object\"){addOrUpdate(data)}else{throw new Error(\"Unknown dataType\")}if(addedIds.length){this._trigger(\"add\",{items:addedIds},senderId)}if(updatedIds.length){var props={items:updatedIds,oldData:oldData,data:updatedData};this._trigger(\"update\",props,senderId)}return addedIds.concat(updatedIds)};DataSet.prototype.get=function(args){var me=this;var id,ids,options;var firstType=util.getType(arguments[0]);if(firstType==\"String\"||firstType==\"Number\"){id=arguments[0];options=arguments[1]}else if(firstType==\"Array\"){\nids=arguments[0];options=arguments[1]}else{options=arguments[0]}var returnType;if(options&&options.returnType){var allowedValues=[\"Array\",\"Object\"];returnType=allowedValues.indexOf(options.returnType)==-1?\"Array\":options.returnType}else{returnType=\"Array\"}var type=options&&options.type||this._options.type;var filter=options&&options.filter;var items=[],item,itemIds,itemId,i,len;if(id!=undefined){item=me._getItem(id,type);if(item&&filter&&!filter(item)){item=null}}else if(ids!=undefined){for(i=0,len=ids.length;i<len;i++){item=me._getItem(ids[i],type);if(!filter||filter(item)){items.push(item)}}}else{itemIds=(0,_keys2[\"default\"])(this._data);for(i=0,len=itemIds.length;i<len;i++){itemId=itemIds[i];item=me._getItem(itemId,type);if(!filter||filter(item)){items.push(item)}}}if(options&&options.order&&id==undefined){this._sort(items,options.order)}if(options&&options.fields){var fields=options.fields;if(id!=undefined){item=this._filterFields(item,fields)}else{for(i=0,len=items.length;i<len;i++){items[i]=this._filterFields(items[i],fields)}}}if(returnType==\"Object\"){var result={},resultant;for(i=0,len=items.length;i<len;i++){resultant=items[i];result[resultant.id]=resultant}return result}else{if(id!=undefined){return item}else{return items}}};DataSet.prototype.getIds=function(options){var data=this._data,filter=options&&options.filter,order=options&&options.order,type=options&&options.type||this._options.type,itemIds=(0,_keys2[\"default\"])(data),i,len,id,item,items,ids=[];if(filter){if(order){items=[];for(i=0,len=itemIds.length;i<len;i++){id=itemIds[i];item=this._getItem(id,type);if(filter(item)){items.push(item)}}this._sort(items,order);for(i=0,len=items.length;i<len;i++){ids.push(items[i][this._fieldId])}}else{for(i=0,len=itemIds.length;i<len;i++){id=itemIds[i];item=this._getItem(id,type);if(filter(item)){ids.push(item[this._fieldId])}}}}else{if(order){items=[];for(i=0,len=itemIds.length;i<len;i++){id=itemIds[i];items.push(data[id])}this._sort(items,order);for(i=0,len=items.length;i<len;i++){ids.push(items[i][this._fieldId])}}else{for(i=0,len=itemIds.length;i<len;i++){id=itemIds[i];item=data[id];ids.push(item[this._fieldId])}}}return ids};DataSet.prototype.getDataSet=function(){return this};DataSet.prototype.forEach=function(callback,options){var filter=options&&options.filter,type=options&&options.type||this._options.type,data=this._data,itemIds=(0,_keys2[\"default\"])(data),i,len,item,id;if(options&&options.order){var items=this.get(options);for(i=0,len=items.length;i<len;i++){item=items[i];id=item[this._fieldId];callback(item,id)}}else{for(i=0,len=itemIds.length;i<len;i++){id=itemIds[i];item=this._getItem(id,type);if(!filter||filter(item)){callback(item,id)}}}};DataSet.prototype.map=function(callback,options){var filter=options&&options.filter,type=options&&options.type||this._options.type,mappedItems=[],data=this._data,itemIds=(0,_keys2[\"default\"])(data),i,len,id,item;for(i=0,len=itemIds.length;i<len;i++){id=itemIds[i];item=this._getItem(id,type);if(!filter||filter(item)){mappedItems.push(callback(item,id))}}if(options&&options.order){this._sort(mappedItems,options.order)}return mappedItems};DataSet.prototype._filterFields=function(item,fields){if(!item){return item}var filteredItem={},itemFields=(0,_keys2[\"default\"])(item),len=itemFields.length,i,field;if(Array.isArray(fields)){for(i=0;i<len;i++){field=itemFields[i];if(fields.indexOf(field)!=-1){filteredItem[field]=item[field]}}}else{for(i=0;i<len;i++){field=itemFields[i];if(fields.hasOwnProperty(field)){filteredItem[fields[field]]=item[field]}}}return filteredItem};DataSet.prototype._sort=function(items,order){if(util.isString(order)){var name=order;items.sort(function(a,b){var av=a[name];var bv=b[name];return av>bv?1:av<bv?-1:0})}else if(typeof order===\"function\"){items.sort(order)}else{throw new TypeError(\"Order must be a function or a string\")}};DataSet.prototype.remove=function(id,senderId){var removedIds=[],removedItems=[],ids=[],i,len,itemId,item;ids=Array.isArray(id)?id:[id];for(i=0,len=ids.length;i<len;i++){item=this._remove(ids[i]);if(item){itemId=item[this._fieldId];if(itemId!=undefined){removedIds.push(itemId);removedItems.push(item)}}}if(removedIds.length){this._trigger(\"remove\",{items:removedIds,oldData:removedItems},senderId)}return removedIds};DataSet.prototype._remove=function(id){var item,ident;if(util.isNumber(id)||util.isString(id)){ident=id}else if(id&&(typeof id===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(id))===\"object\"){ident=id[this._fieldId]}if(ident!==undefined&&this._data[ident]){item=this._data[ident];delete this._data[ident];this.length--;return item}return null};DataSet.prototype.clear=function(senderId){var i,len;var ids=(0,_keys2[\"default\"])(this._data);var items=[];for(i=0,len=ids.length;i<len;i++){items.push(this._data[ids[i]])}this._data={};this.length=0;this._trigger(\"remove\",{items:ids,oldData:items},senderId);return ids};DataSet.prototype.max=function(field){var data=this._data,itemIds=(0,_keys2[\"default\"])(data),max=null,maxField=null,i,len;for(i=0,len=itemIds.length;i<len;i++){var id=itemIds[i];var item=data[id];var itemField=item[field];if(itemField!=null&&(!max||itemField>maxField)){max=item;maxField=itemField}}return max};DataSet.prototype.min=function(field){var data=this._data,itemIds=(0,_keys2[\"default\"])(data),min=null,minField=null,i,len;for(i=0,len=itemIds.length;i<len;i++){var id=itemIds[i];var item=data[id];var itemField=item[field];if(itemField!=null&&(!min||itemField<minField)){min=item;minField=itemField}}return min};DataSet.prototype.distinct=function(field){var data=this._data;var itemIds=(0,_keys2[\"default\"])(data);var values=[];var fieldType=this._options.type&&this._options.type[field]||null;var count=0;var i,j,len;for(i=0,len=itemIds.length;i<len;i++){var id=itemIds[i];var item=data[id];var value=item[field];var exists=false;for(j=0;j<count;j++){if(values[j]==value){exists=true;break}}if(!exists&&value!==undefined){values[count]=value;count++}}if(fieldType){for(i=0,len=values.length;i<len;i++){values[i]=util.convert(values[i],fieldType)}}return values};DataSet.prototype._addItem=function(item){var id=item[this._fieldId];if(id!=undefined){if(this._data[id]){throw new Error(\"Cannot add item: item with id \"+id+\" already exists\")}}else{id=util.randomUUID();item[this._fieldId]=id}var d={},fields=(0,_keys2[\"default\"])(item),i,len;for(i=0,len=fields.length;i<len;i++){var field=fields[i];var fieldType=this._type[field];d[field]=util.convert(item[field],fieldType)}this._data[id]=d;this.length++;return id};DataSet.prototype._getItem=function(id,types){var field,value,i,len;var raw=this._data[id];if(!raw){return null}var converted={},fields=(0,_keys2[\"default\"])(raw);if(types){for(i=0,len=fields.length;i<len;i++){field=fields[i];value=raw[field];converted[field]=util.convert(value,types[field])}}else{for(i=0,len=fields.length;i<len;i++){field=fields[i];value=raw[field];converted[field]=value}}if(!converted[this._fieldId]){converted[this._fieldId]=raw.id}return converted};DataSet.prototype._updateItem=function(item){var id=item[this._fieldId];if(id==undefined){throw new Error(\"Cannot update item: item has no id (item: \"+(0,_stringify2[\"default\"])(item)+\")\")}var d=this._data[id];if(!d){throw new Error(\"Cannot update item: no item with id \"+id+\" found\")}var fields=(0,_keys2[\"default\"])(item);for(var i=0,len=fields.length;i<len;i++){var field=fields[i];var fieldType=this._type[field];d[field]=util.convert(item[field],fieldType)}return id};module.exports=DataSet},function(module,exports,__webpack_require__){\"use strict\";var _keys=__webpack_require__(8);var _keys2=_interopRequireDefault(_keys);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var DataSet=__webpack_require__(11);function DataView(data,options){this._data=null;this._ids={};this.length=0;this._options=options||{};this._fieldId=\"id\";this._subscribers={};var me=this;this.listener=function(){me._onEvent.apply(me,arguments)};this.setData(data)}DataView.prototype.setData=function(data){var ids,id,i,len,items;if(this._data){if(this._data.off){this._data.off(\"*\",this.listener)}ids=this._data.getIds({filter:this._options&&this._options.filter});items=[];for(i=0,len=ids.length;i<len;i++){items.push(this._data._data[ids[i]])}this._ids={};this.length=0;this._trigger(\"remove\",{items:ids,oldData:items})}this._data=data;if(this._data){this._fieldId=this._options.fieldId||this._data&&this._data.options&&this._data.options.fieldId||\"id\";ids=this._data.getIds({filter:this._options&&this._options.filter});for(i=0,len=ids.length;i<len;i++){id=ids[i];this._ids[id]=true}this.length=ids.length;this._trigger(\"add\",{items:ids});if(this._data.on){this._data.on(\"*\",this.listener)}}};DataView.prototype.refresh=function(){var id,i,len;var ids=this._data.getIds({filter:this._options&&this._options.filter}),oldIds=(0,_keys2[\"default\"])(this._ids),newIds={},addedIds=[],removedIds=[],removedItems=[];for(i=0,len=ids.length;i<len;i++){id=ids[i];newIds[id]=true;if(!this._ids[id]){addedIds.push(id);this._ids[id]=true}}for(i=0,len=oldIds.length;i<len;i++){id=oldIds[i];if(!newIds[id]){removedIds.push(id);removedItems.push(this._data._data[id]);delete this._ids[id]}}this.length+=addedIds.length-removedIds.length;if(addedIds.length){this._trigger(\"add\",{items:addedIds})}if(removedIds.length){this._trigger(\"remove\",{items:removedIds,oldData:removedItems})}};DataView.prototype.get=function(args){var me=this;var ids,options,data;var firstType=util.getType(arguments[0]);if(firstType==\"String\"||firstType==\"Number\"||firstType==\"Array\"){ids=arguments[0];options=arguments[1];data=arguments[2]}else{options=arguments[0];data=arguments[1]}var viewOptions=util.extend({},this._options,options);if(this._options.filter&&options&&options.filter){viewOptions.filter=function(item){return me._options.filter(item)&&options.filter(item)}}var getArguments=[];if(ids!=undefined){getArguments.push(ids)}getArguments.push(viewOptions);getArguments.push(data);return this._data&&this._data.get.apply(this._data,getArguments)};DataView.prototype.getIds=function(options){var ids;if(this._data){var defaultFilter=this._options.filter;var filter;if(options&&options.filter){if(defaultFilter){filter=function filter(item){return defaultFilter(item)&&options.filter(item)}}else{filter=options.filter}}else{filter=defaultFilter}ids=this._data.getIds({filter:filter,order:options&&options.order})}else{ids=[]}return ids};DataView.prototype.map=function(callback,options){var mappedItems=[];if(this._data){var defaultFilter=this._options.filter;var filter;if(options&&options.filter){if(defaultFilter){filter=function filter(item){return defaultFilter(item)&&options.filter(item)}}else{filter=options.filter}}else{filter=defaultFilter}mappedItems=this._data.map(callback,{filter:filter,order:options&&options.order})}else{mappedItems=[]}return mappedItems};DataView.prototype.getDataSet=function(){var dataSet=this;while(dataSet instanceof DataView){dataSet=dataSet._data}return dataSet||null};DataView.prototype._onEvent=function(event,params,senderId){var i,len,id,item;var ids=params&¶ms.items;var addedIds=[],updatedIds=[],removedIds=[],oldItems=[],updatedItems=[],removedItems=[];if(ids&&this._data){switch(event){case\"add\":for(i=0,len=ids.length;i<len;i++){id=ids[i];item=this.get(id);if(item){this._ids[id]=true;addedIds.push(id)}}break;case\"update\":for(i=0,len=ids.length;i<len;i++){id=ids[i];item=this.get(id);if(item){if(this._ids[id]){updatedIds.push(id);updatedItems.push(params.data[i]);oldItems.push(params.oldData[i])}else{this._ids[id]=true;addedIds.push(id)}}else{if(this._ids[id]){delete this._ids[id];removedIds.push(id);removedItems.push(params.oldData[i])}else{}}}break;case\"remove\":for(i=0,len=ids.length;i<len;i++){id=ids[i];if(this._ids[id]){delete this._ids[id];removedIds.push(id);removedItems.push(params.oldData[i])}}break}this.length+=addedIds.length-removedIds.length;if(addedIds.length){this._trigger(\"add\",{items:addedIds},senderId)}if(updatedIds.length){this._trigger(\"update\",{items:updatedIds,oldData:oldItems,data:updatedItems},senderId)}if(removedIds.length){this._trigger(\"remove\",{items:removedIds,oldData:removedItems},senderId)}}};DataView.prototype.on=DataSet.prototype.on;DataView.prototype.off=DataSet.prototype.off;DataView.prototype._trigger=DataSet.prototype._trigger;DataView.prototype.subscribe=DataView.prototype.on;DataView.prototype.unsubscribe=DataView.prototype.off;module.exports=DataView},function(module,exports,__webpack_require__){var store=__webpack_require__(57)(\"wks\");var uid=__webpack_require__(40);var Symbol=__webpack_require__(18).Symbol;var USE_SYMBOL=typeof Symbol==\"function\";var $exports=module.exports=function(name){return store[name]||(store[name]=USE_SYMBOL&&Symbol[name]||(USE_SYMBOL?Symbol:uid)(\"Symbol.\"+name))};$exports.store=store},function(module,exports,__webpack_require__){\"use strict\";exports.prepareElements=function(JSONcontainer){for(var elementType in JSONcontainer){if(JSONcontainer.hasOwnProperty(elementType)){JSONcontainer[elementType].redundant=JSONcontainer[elementType].used;JSONcontainer[elementType].used=[]}}};exports.cleanupElements=function(JSONcontainer){for(var elementType in JSONcontainer){if(JSONcontainer.hasOwnProperty(elementType)){if(JSONcontainer[elementType].redundant){for(var i=0;i<JSONcontainer[elementType].redundant.length;i++){JSONcontainer[elementType].redundant[i].parentNode.removeChild(JSONcontainer[elementType].redundant[i])}JSONcontainer[elementType].redundant=[]}}}};exports.resetElements=function(JSONcontainer){exports.prepareElements(JSONcontainer);exports.cleanupElements(JSONcontainer);exports.prepareElements(JSONcontainer)};exports.getSVGElement=function(elementType,JSONcontainer,svgContainer){var element;if(JSONcontainer.hasOwnProperty(elementType)){if(JSONcontainer[elementType].redundant.length>0){element=JSONcontainer[elementType].redundant[0];JSONcontainer[elementType].redundant.shift()}else{element=document.createElementNS(\"http://www.w3.org/2000/svg\",elementType);svgContainer.appendChild(element)}}else{element=document.createElementNS(\"http://www.w3.org/2000/svg\",elementType);JSONcontainer[elementType]={used:[],redundant:[]};svgContainer.appendChild(element)}JSONcontainer[elementType].used.push(element);return element};exports.getDOMElement=function(elementType,JSONcontainer,DOMContainer,insertBefore){var element;if(JSONcontainer.hasOwnProperty(elementType)){if(JSONcontainer[elementType].redundant.length>0){element=JSONcontainer[elementType].redundant[0];JSONcontainer[elementType].redundant.shift()}else{element=document.createElement(elementType);if(insertBefore!==undefined){DOMContainer.insertBefore(element,insertBefore)}else{DOMContainer.appendChild(element)}}}else{element=document.createElement(elementType);JSONcontainer[elementType]={used:[],redundant:[]};if(insertBefore!==undefined){DOMContainer.insertBefore(element,insertBefore)}else{DOMContainer.appendChild(element)}}JSONcontainer[elementType].used.push(element);return element};exports.drawPoint=function(x,y,groupTemplate,JSONcontainer,svgContainer,labelObj){var point;if(groupTemplate.style==\"circle\"){point=exports.getSVGElement(\"circle\",JSONcontainer,svgContainer);point.setAttributeNS(null,\"cx\",x);point.setAttributeNS(null,\"cy\",y);point.setAttributeNS(null,\"r\",.5*groupTemplate.size)}else{point=exports.getSVGElement(\"rect\",JSONcontainer,svgContainer);point.setAttributeNS(null,\"x\",x-.5*groupTemplate.size);point.setAttributeNS(null,\"y\",y-.5*groupTemplate.size);point.setAttributeNS(null,\"width\",groupTemplate.size);point.setAttributeNS(null,\"height\",groupTemplate.size)}if(groupTemplate.styles!==undefined){point.setAttributeNS(null,\"style\",groupTemplate.styles)}point.setAttributeNS(null,\"class\",groupTemplate.className+\" vis-point\");if(labelObj){var label=exports.getSVGElement(\"text\",JSONcontainer,svgContainer);if(labelObj.xOffset){x=x+labelObj.xOffset}if(labelObj.yOffset){y=y+labelObj.yOffset}if(labelObj.content){label.textContent=labelObj.content}if(labelObj.className){label.setAttributeNS(null,\"class\",labelObj.className+\" vis-label\")}label.setAttributeNS(null,\"x\",x);label.setAttributeNS(null,\"y\",y)}return point};exports.drawBar=function(x,y,width,height,className,JSONcontainer,svgContainer,style){if(height!=0){if(height<0){height*=-1;y-=height}var rect=exports.getSVGElement(\"rect\",JSONcontainer,svgContainer);rect.setAttributeNS(null,\"x\",x-.5*width);rect.setAttributeNS(null,\"y\",y);rect.setAttributeNS(null,\"width\",width);rect.setAttributeNS(null,\"height\",height);rect.setAttributeNS(null,\"class\",className);if(style){rect.setAttributeNS(null,\"style\",style)}}}},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});exports.printStyle=undefined;var _stringify=__webpack_require__(19);var _stringify2=_interopRequireDefault(_stringify);var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);var _keys=__webpack_require__(8);var _keys2=_interopRequireDefault(_keys);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var errorFound=false;var allOptions=void 0;var printStyle=\"background: #FFeeee; color: #dd0000\";var Validator=function(){function Validator(){(0,_classCallCheck3[\"default\"])(this,Validator)}(0,_createClass3[\"default\"])(Validator,null,[{key:\"validate\",value:function validate(options,referenceOptions,subObject){errorFound=false;allOptions=referenceOptions;var usedOptions=referenceOptions;if(subObject!==undefined){usedOptions=referenceOptions[subObject]}Validator.parse(options,usedOptions,[]);return errorFound}},{key:\"parse\",value:function parse(options,referenceOptions,path){for(var option in options){if(options.hasOwnProperty(option)){Validator.check(option,options,referenceOptions,path)}}}},{key:\"check\",value:function check(option,options,referenceOptions,path){if(referenceOptions[option]===undefined&&referenceOptions.__any__===undefined){Validator.getSuggestion(option,referenceOptions,path);return}var referenceOption=option;var is_object=true;if(referenceOptions[option]===undefined&&referenceOptions.__any__!==undefined){referenceOption=\"__any__\";is_object=Validator.getType(options[option])===\"object\"}else{}var refOptionObj=referenceOptions[referenceOption];if(is_object&&refOptionObj.__type__!==undefined){refOptionObj=refOptionObj.__type__}Validator.checkFields(option,options,referenceOptions,referenceOption,refOptionObj,path)}},{key:\"checkFields\",value:function checkFields(option,options,referenceOptions,referenceOption,refOptionObj,path){var log=function log(message){console.log(\"%c\"+message+Validator.printLocation(path,option),printStyle)};var optionType=Validator.getType(options[option]);var refOptionType=refOptionObj[optionType];if(refOptionType!==undefined){if(Validator.getType(refOptionType)===\"array\"&&refOptionType.indexOf(options[option])===-1){log('Invalid option detected in \"'+option+'\".'+\" Allowed values are:\"+Validator.print(refOptionType)+' not \"'+options[option]+'\". ');errorFound=true}else if(optionType===\"object\"&&referenceOption!==\"__any__\"){path=util.copyAndExtendArray(path,option);Validator.parse(options[option],referenceOptions[referenceOption],path)}}else if(refOptionObj[\"any\"]===undefined){log('Invalid type received for \"'+option+'\". Expected: '+Validator.print((0,_keys2[\"default\"])(refOptionObj))+\". Received [\"+optionType+'] \"'+options[option]+'\"');errorFound=true}}},{key:\"getType\",value:function getType(object){var type=typeof object===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(object);if(type===\"object\"){if(object===null){return\"null\"}if(object instanceof Boolean){return\"boolean\"}if(object instanceof Number){return\"number\"}if(object instanceof String){return\"string\"}if(Array.isArray(object)){return\"array\"}if(object instanceof Date){return\"date\"}if(object.nodeType!==undefined){return\"dom\"}if(object._isAMomentObject===true){return\"moment\"}return\"object\"}else if(type===\"number\"){return\"number\"}else if(type===\"boolean\"){return\"boolean\"}else if(type===\"string\"){return\"string\"}else if(type===undefined){return\"undefined\"}return type}},{key:\"getSuggestion\",value:function getSuggestion(option,options,path){var localSearch=Validator.findInOptions(option,options,path,false);var globalSearch=Validator.findInOptions(option,allOptions,[],true);var localSearchThreshold=8;var globalSearchThreshold=4;var msg=void 0;if(localSearch.indexMatch!==undefined){msg=\" in \"+Validator.printLocation(localSearch.path,option,\"\")+'Perhaps it was incomplete? Did you mean: \"'+localSearch.indexMatch+'\"?\\n\\n'}else if(globalSearch.distance<=globalSearchThreshold&&localSearch.distance>globalSearch.distance){msg=\" in \"+Validator.printLocation(localSearch.path,option,\"\")+\"Perhaps it was misplaced? Matching option found at: \"+Validator.printLocation(globalSearch.path,globalSearch.closestMatch,\"\")}else if(localSearch.distance<=localSearchThreshold){msg='. Did you mean \"'+localSearch.closestMatch+'\"?'+Validator.printLocation(localSearch.path,option)}else{msg=\". Did you mean one of these: \"+Validator.print((0,_keys2[\"default\"])(options))+Validator.printLocation(path,option)}console.log('%cUnknown option detected: \"'+option+'\"'+msg,printStyle);errorFound=true}},{key:\"findInOptions\",value:function findInOptions(option,options,path){var recursive=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;var min=1e9;var closestMatch=\"\";var closestMatchPath=[];var lowerCaseOption=option.toLowerCase();var indexMatch=undefined;for(var op in options){var distance=void 0;if(options[op].__type__!==undefined&&recursive===true){var result=Validator.findInOptions(option,options[op],util.copyAndExtendArray(path,op));if(min>result.distance){closestMatch=result.closestMatch;closestMatchPath=result.path;min=result.distance;indexMatch=result.indexMatch}}else{if(op.toLowerCase().indexOf(lowerCaseOption)!==-1){indexMatch=op}distance=Validator.levenshteinDistance(option,op);if(min>distance){closestMatch=op;closestMatchPath=util.copyArray(path);min=distance}}}return{closestMatch:closestMatch,path:closestMatchPath,distance:min,indexMatch:indexMatch}}},{key:\"printLocation\",value:function printLocation(path,option){var prefix=arguments.length>2&&arguments[2]!==undefined?arguments[2]:\"Problem value found at: \\n\";var str=\"\\n\\n\"+prefix+\"options = {\\n\";for(var i=0;i<path.length;i++){for(var j=0;j<i+1;j++){str+=\" \"}str+=path[i]+\": {\\n\"}for(var _j=0;_j<path.length+1;_j++){str+=\" \"}str+=option+\"\\n\";for(var _i=0;_i<path.length+1;_i++){for(var _j2=0;_j2<path.length-_i;_j2++){str+=\" \"}str+=\"}\\n\"}return str+\"\\n\\n\"}},{key:\"print\",value:function print(options){return(0,_stringify2[\"default\"])(options).replace(/(\\\")|(\\[)|(\\])|(,\"__type__\")/g,\"\").replace(/(\\,)/g,\", \")}},{key:\"levenshteinDistance\",value:function levenshteinDistance(a,b){if(a.length===0)return b.length;if(b.length===0)return a.length;var matrix=[];var i;for(i=0;i<=b.length;i++){matrix[i]=[i]}var j;for(j=0;j<=a.length;j++){matrix[0][j]=j}for(i=1;i<=b.length;i++){for(j=1;j<=a.length;j++){if(b.charAt(i-1)==a.charAt(j-1)){matrix[i][j]=matrix[i-1][j-1]}else{matrix[i][j]=Math.min(matrix[i-1][j-1]+1,Math.min(matrix[i][j-1]+1,matrix[i-1][j]+1))}}}return matrix[b.length][a.length]}}]);return Validator}();exports[\"default\"]=Validator;exports.printStyle=printStyle},function(module,exports,__webpack_require__){\"use strict\";var util=__webpack_require__(2);function Component(body,options){this.options=null;this.props=null}Component.prototype.setOptions=function(options){if(options){util.extend(this.options,options)}};Component.prototype.redraw=function(){return false};Component.prototype.destroy=function(){};Component.prototype._isResized=function(){var resized=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;this.props._previousWidth=this.props.width;this.props._previousHeight=this.props.height;return resized};module.exports=Component},function(module,exports,__webpack_require__){var global=__webpack_require__(18);var core=__webpack_require__(7);var ctx=__webpack_require__(80);var hide=__webpack_require__(26);var PROTOTYPE=\"prototype\";var $export=function(type,name,source){var IS_FORCED=type&$export.F;var IS_GLOBAL=type&$export.G;var IS_STATIC=type&$export.S;var IS_PROTO=type&$export.P;var IS_BIND=type&$export.B;var IS_WRAP=type&$export.W;var exports=IS_GLOBAL?core:core[name]||(core[name]={});var expProto=exports[PROTOTYPE];var target=IS_GLOBAL?global:IS_STATIC?global[name]:(global[name]||{})[PROTOTYPE];var key,own,out;if(IS_GLOBAL)source=name;for(key in source){own=!IS_FORCED&&target&&target[key]!==undefined;if(own&&key in exports)continue;out=own?target[key]:source[key];exports[key]=IS_GLOBAL&&typeof target[key]!=\"function\"?source[key]:IS_BIND&&own?ctx(out,global):IS_WRAP&&target[key]==out?function(C){var F=function(a,b,c){if(this instanceof C){switch(arguments.length){case 0:return new C;case 1:return new C(a);case 2:return new C(a,b)}return new C(a,b,c)}return C.apply(this,arguments)};F[PROTOTYPE]=C[PROTOTYPE];return F}(out):IS_PROTO&&typeof out==\"function\"?ctx(Function.call,out):out;if(IS_PROTO){(exports.virtual||(exports.virtual={}))[key]=out;if(type&$export.R&&expProto&&!expProto[key])hide(expProto,key,out)}}};$export.F=1;$export.G=2;$export.S=4;$export.P=8;$export.B=16;$export.W=32;$export.U=64;$export.R=128;module.exports=$export},function(module,exports){var global=module.exports=typeof window!=\"undefined\"&&window.Math==Math?window:typeof self!=\"undefined\"&&self.Math==Math?self:Function(\"return this\")();if(typeof __g==\"number\")__g=global},function(module,exports,__webpack_require__){module.exports={default:__webpack_require__(160),__esModule:true}},function(module,exports,__webpack_require__){var anObject=__webpack_require__(27);var IE8_DOM_DEFINE=__webpack_require__(81);var toPrimitive=__webpack_require__(53);var dP=Object.defineProperty;exports.f=__webpack_require__(21)?Object.defineProperty:function defineProperty(O,P,Attributes){anObject(O);P=toPrimitive(P,true);anObject(Attributes);if(IE8_DOM_DEFINE)try{return dP(O,P,Attributes)}catch(e){}if(\"get\"in Attributes||\"set\"in Attributes)throw TypeError(\"Accessors not supported!\");if(\"value\"in Attributes)O[P]=Attributes.value;return O}},function(module,exports,__webpack_require__){module.exports=!__webpack_require__(28)(function(){return Object.defineProperty({},\"a\",{get:function(){return 7}}).a!=7})},function(module,exports){var hasOwnProperty={}.hasOwnProperty;module.exports=function(it,key){return hasOwnProperty.call(it,key)}},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var NodeBase=function(){function NodeBase(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,NodeBase);this.body=body;this.labelModule=labelModule;this.setOptions(options);this.top=undefined;this.left=undefined;this.height=undefined;this.width=undefined;this.radius=undefined;this.margin=undefined;this.refreshNeeded=true;this.boundingBox={top:0,left:0,right:0,bottom:0}}(0,_createClass3[\"default\"])(NodeBase,[{key:\"setOptions\",value:function setOptions(options){this.options=options}},{key:\"_setMargins\",value:function _setMargins(labelModule){this.margin={};if(this.options.margin){if((0,_typeof3[\"default\"])(this.options.margin)==\"object\"){this.margin.top=this.options.margin.top;this.margin.right=this.options.margin.right;this.margin.bottom=this.options.margin.bottom;this.margin.left=this.options.margin.left}else{this.margin.top=this.options.margin;this.margin.right=this.options.margin;this.margin.bottom=this.options.margin;this.margin.left=this.options.margin}}labelModule.adjustSizes(this.margin)}},{key:\"_distanceToBorder\",value:function _distanceToBorder(ctx,angle){var borderWidth=this.options.borderWidth;this.resize(ctx);return Math.min(Math.abs(this.width/2/Math.cos(angle)),Math.abs(this.height/2/Math.sin(angle)))+borderWidth}},{key:\"enableShadow\",value:function enableShadow(ctx,values){if(values.shadow){ctx.shadowColor=values.shadowColor;ctx.shadowBlur=values.shadowSize;ctx.shadowOffsetX=values.shadowX;ctx.shadowOffsetY=values.shadowY}}},{key:\"disableShadow\",value:function disableShadow(ctx,values){if(values.shadow){ctx.shadowColor=\"rgba(0,0,0,0)\";ctx.shadowBlur=0;ctx.shadowOffsetX=0;ctx.shadowOffsetY=0}}},{key:\"enableBorderDashes\",value:function enableBorderDashes(ctx,values){if(values.borderDashes!==false){if(ctx.setLineDash!==undefined){var dashes=values.borderDashes;if(dashes===true){dashes=[5,15]}ctx.setLineDash(dashes)}else{console.warn(\"setLineDash is not supported in this browser. The dashed borders cannot be used.\");this.options.shapeProperties.borderDashes=false;values.borderDashes=false}}}},{key:\"disableBorderDashes\",value:function disableBorderDashes(ctx,values){if(values.borderDashes!==false){if(ctx.setLineDash!==undefined){ctx.setLineDash([0])}else{console.warn(\"setLineDash is not supported in this browser. The dashed borders cannot be used.\");this.options.shapeProperties.borderDashes=false;values.borderDashes=false}}}},{key:\"needsRefresh\",value:function needsRefresh(selected,hover){if(this.refreshNeeded===true){this.refreshNeeded=false;return true}return this.width===undefined||this.labelModule.differentState(selected,hover)}},{key:\"initContextForDraw\",value:function initContextForDraw(ctx,values){var borderWidth=values.borderWidth/this.body.view.scale;ctx.lineWidth=Math.min(this.width,borderWidth);ctx.strokeStyle=values.borderColor;ctx.fillStyle=values.color}},{key:\"performStroke\",value:function performStroke(ctx,values){var borderWidth=values.borderWidth/this.body.view.scale;ctx.save();if(borderWidth>0){this.enableBorderDashes(ctx,values);ctx.stroke();this.disableBorderDashes(ctx,values)}ctx.restore()}},{key:\"performFill\",value:function performFill(ctx,values){this.enableShadow(ctx,values);ctx.fill();this.disableShadow(ctx,values);this.performStroke(ctx,values)}},{key:\"_addBoundingBoxMargin\",value:function _addBoundingBoxMargin(margin){this.boundingBox.left-=margin;this.boundingBox.top-=margin;this.boundingBox.bottom+=margin;this.boundingBox.right+=margin}},{key:\"_updateBoundingBox\",value:function _updateBoundingBox(x,y,ctx,selected,hover){if(ctx!==undefined){this.resize(ctx,selected,hover)}this.left=x-this.width/2;this.top=y-this.height/2;this.boundingBox.left=this.left;this.boundingBox.top=this.top;this.boundingBox.bottom=this.top+this.height;this.boundingBox.right=this.left+this.width}},{key:\"updateBoundingBox\",value:function updateBoundingBox(x,y,ctx,selected,hover){this._updateBoundingBox(x,y,ctx,selected,hover)}},{key:\"getDimensionsFromLabel\",value:function getDimensionsFromLabel(ctx,selected,hover){this.textSize=this.labelModule.getTextSize(ctx,selected,hover);var width=this.textSize.width;var height=this.textSize.height;var DEFAULT_SIZE=14;if(width===0){width=DEFAULT_SIZE;height=DEFAULT_SIZE}return{width:width,height:height}}}]);return NodeBase}();exports[\"default\"]=NodeBase},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2)\n;var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _NodeBase2=__webpack_require__(23);var _NodeBase3=_interopRequireDefault(_NodeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var ShapeBase=function(_NodeBase){(0,_inherits3[\"default\"])(ShapeBase,_NodeBase);function ShapeBase(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,ShapeBase);return(0,_possibleConstructorReturn3[\"default\"])(this,(ShapeBase.__proto__||(0,_getPrototypeOf2[\"default\"])(ShapeBase)).call(this,options,body,labelModule))}(0,_createClass3[\"default\"])(ShapeBase,[{key:\"resize\",value:function resize(ctx){var selected=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this.selected;var hover=arguments.length>2&&arguments[2]!==undefined?arguments[2]:this.hover;var values=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{size:this.options.size};if(this.needsRefresh(selected,hover)){this.labelModule.getTextSize(ctx,selected,hover);var size=2*values.size;this.width=size;this.height=size;this.radius=.5*this.width}}},{key:\"_drawShape\",value:function _drawShape(ctx,shape,sizeMultiplier,x,y,selected,hover,values){this.resize(ctx,selected,hover,values);this.left=x-this.width/2;this.top=y-this.height/2;this.initContextForDraw(ctx,values);ctx[shape](x,y,values.size);this.performFill(ctx,values);if(this.options.label!==undefined){this.labelModule.calculateLabelSize(ctx,selected,hover,x,y,\"hanging\");var yLabel=y+.5*this.height+.5*this.labelModule.size.height;this.labelModule.draw(ctx,x,yLabel,selected,hover,\"hanging\")}this.updateBoundingBox(x,y)}},{key:\"updateBoundingBox\",value:function updateBoundingBox(x,y){this.boundingBox.top=y-this.options.size;this.boundingBox.left=x-this.options.size;this.boundingBox.right=x+this.options.size;this.boundingBox.bottom=y+this.options.size;if(this.options.label!==undefined&&this.labelModule.size.width>0){this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left);this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width);this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height)}}}]);return ShapeBase}(_NodeBase3[\"default\"]);exports[\"default\"]=ShapeBase},function(module,exports,__webpack_require__){var IObject=__webpack_require__(78);var defined=__webpack_require__(51);module.exports=function(it){return IObject(defined(it))}},function(module,exports,__webpack_require__){var dP=__webpack_require__(20);var createDesc=__webpack_require__(39);module.exports=__webpack_require__(21)?function(object,key,value){return dP.f(object,key,createDesc(1,value))}:function(object,key,value){object[key]=value;return object}},function(module,exports,__webpack_require__){var isObject=__webpack_require__(32);module.exports=function(it){if(!isObject(it))throw TypeError(it+\" is not an object!\");return it}},function(module,exports){module.exports=function(exec){try{return!!exec()}catch(e){return true}}},function(module,exports,__webpack_require__){module.exports={default:__webpack_require__(138),__esModule:true}},function(module,exports,__webpack_require__){\"use strict\";exports.__esModule=true;var _isIterable2=__webpack_require__(188);var _isIterable3=_interopRequireDefault(_isIterable2);var _getIterator2=__webpack_require__(77);var _getIterator3=_interopRequireDefault(_getIterator2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}exports.default=function(){function sliceIterator(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=(0,_getIterator3.default)(arr),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i[\"return\"])_i[\"return\"]()}finally{if(_d)throw _e}}return _arr}return function(arr,i){if(Array.isArray(arr)){return arr}else if((0,_isIterable3.default)(Object(arr))){return sliceIterator(arr,i)}else{throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}}()},function(module,exports){module.exports={}},function(module,exports){module.exports=function(it){return typeof it===\"object\"?it!==null:typeof it===\"function\"}},function(module,exports,__webpack_require__){var $keys=__webpack_require__(84);var enumBugKeys=__webpack_require__(58);module.exports=Object.keys||function keys(O){return $keys(O,enumBugKeys)}},function(module,exports,__webpack_require__){\"use strict\";function Point3d(x,y,z){this.x=x!==undefined?x:0;this.y=y!==undefined?y:0;this.z=z!==undefined?z:0}Point3d.subtract=function(a,b){var sub=new Point3d;sub.x=a.x-b.x;sub.y=a.y-b.y;sub.z=a.z-b.z;return sub};Point3d.add=function(a,b){var sum=new Point3d;sum.x=a.x+b.x;sum.y=a.y+b.y;sum.z=a.z+b.z;return sum};Point3d.avg=function(a,b){return new Point3d((a.x+b.x)/2,(a.y+b.y)/2,(a.z+b.z)/2)};Point3d.crossProduct=function(a,b){var crossproduct=new Point3d;crossproduct.x=a.y*b.z-a.z*b.y;crossproduct.y=a.z*b.x-a.x*b.z;crossproduct.z=a.x*b.y-a.y*b.x;return crossproduct};Point3d.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)};module.exports=Point3d},function(module,exports,__webpack_require__){\"use strict\";var __WEBPACK_AMD_DEFINE_FACTORY__,__WEBPACK_AMD_DEFINE_ARRAY__,__WEBPACK_AMD_DEFINE_RESULT__;(function(root,factory){if(true){!(__WEBPACK_AMD_DEFINE_ARRAY__=[],__WEBPACK_AMD_DEFINE_FACTORY__=factory,__WEBPACK_AMD_DEFINE_RESULT__=typeof __WEBPACK_AMD_DEFINE_FACTORY__===\"function\"?__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports,__WEBPACK_AMD_DEFINE_ARRAY__):__WEBPACK_AMD_DEFINE_FACTORY__,__WEBPACK_AMD_DEFINE_RESULT__!==undefined&&(module.exports=__WEBPACK_AMD_DEFINE_RESULT__))}else if(typeof exports===\"object\"){module.exports=factory()}else{root.keycharm=factory()}})(this,function(){function keycharm(options){var preventDefault=options&&options.preventDefault||false;var container=options&&options.container||window;var _exportFunctions={};var _bound={keydown:{},keyup:{}};var _keys={};var i;for(i=97;i<=122;i++){_keys[String.fromCharCode(i)]={code:65+(i-97),shift:false}}for(i=65;i<=90;i++){_keys[String.fromCharCode(i)]={code:i,shift:true}}for(i=0;i<=9;i++){_keys[\"\"+i]={code:48+i,shift:false}}for(i=1;i<=12;i++){_keys[\"F\"+i]={code:111+i,shift:false}}for(i=0;i<=9;i++){_keys[\"num\"+i]={code:96+i,shift:false}}_keys[\"num*\"]={code:106,shift:false};_keys[\"num+\"]={code:107,shift:false};_keys[\"num-\"]={code:109,shift:false};_keys[\"num/\"]={code:111,shift:false};_keys[\"num.\"]={code:110,shift:false};_keys[\"left\"]={code:37,shift:false};_keys[\"up\"]={code:38,shift:false};_keys[\"right\"]={code:39,shift:false};_keys[\"down\"]={code:40,shift:false};_keys[\"space\"]={code:32,shift:false};_keys[\"enter\"]={code:13,shift:false};_keys[\"shift\"]={code:16,shift:undefined};_keys[\"esc\"]={code:27,shift:false};_keys[\"backspace\"]={code:8,shift:false};_keys[\"tab\"]={code:9,shift:false};_keys[\"ctrl\"]={code:17,shift:false};_keys[\"alt\"]={code:18,shift:false};_keys[\"delete\"]={code:46,shift:false};_keys[\"pageup\"]={code:33,shift:false};_keys[\"pagedown\"]={code:34,shift:false};_keys[\"=\"]={code:187,shift:false};_keys[\"-\"]={code:189,shift:false};_keys[\"]\"]={code:221,shift:false};_keys[\"[\"]={code:219,shift:false};var down=function(event){handleEvent(event,\"keydown\")};var up=function(event){handleEvent(event,\"keyup\")};var handleEvent=function(event,type){if(_bound[type][event.keyCode]!==undefined){var bound=_bound[type][event.keyCode];for(var i=0;i<bound.length;i++){if(bound[i].shift===undefined){bound[i].fn(event)}else if(bound[i].shift==true&&event.shiftKey==true){bound[i].fn(event)}else if(bound[i].shift==false&&event.shiftKey==false){bound[i].fn(event)}}if(preventDefault==true){event.preventDefault()}}};_exportFunctions.bind=function(key,callback,type){if(type===undefined){type=\"keydown\"}if(_keys[key]===undefined){throw new Error(\"unsupported key: \"+key)}if(_bound[type][_keys[key].code]===undefined){_bound[type][_keys[key].code]=[]}_bound[type][_keys[key].code].push({fn:callback,shift:_keys[key].shift})};_exportFunctions.bindAll=function(callback,type){if(type===undefined){type=\"keydown\"}for(var key in _keys){if(_keys.hasOwnProperty(key)){_exportFunctions.bind(key,callback,type)}}};_exportFunctions.getKey=function(event){for(var key in _keys){if(_keys.hasOwnProperty(key)){if(event.shiftKey==true&&_keys[key].shift==true&&event.keyCode==_keys[key].code){return key}else if(event.shiftKey==false&&_keys[key].shift==false&&event.keyCode==_keys[key].code){return key}else if(event.keyCode==_keys[key].code&&key==\"shift\"){return key}}}return\"unknown key, currently not supported\"};_exportFunctions.unbind=function(key,callback,type){if(type===undefined){type=\"keydown\"}if(_keys[key]===undefined){throw new Error(\"unsupported key: \"+key)}if(callback!==undefined){var newBindings=[];var bound=_bound[type][_keys[key].code];if(bound!==undefined){for(var i=0;i<bound.length;i++){if(!(bound[i].fn==callback&&bound[i].shift==_keys[key].shift)){newBindings.push(_bound[type][_keys[key].code][i])}}}_bound[type][_keys[key].code]=newBindings}else{_bound[type][_keys[key].code]=[]}};_exportFunctions.reset=function(){_bound={keydown:{},keyup:{}}};_exportFunctions.destroy=function(){_bound={keydown:{},keyup:{}};container.removeEventListener(\"keydown\",down,true);container.removeEventListener(\"keyup\",up,true)};container.addEventListener(\"keydown\",down,true);container.addEventListener(\"keyup\",up,true);return _exportFunctions}return keycharm})},function(module,exports,__webpack_require__){\"use strict\";exports.convertHiddenOptions=function(moment,body,hiddenDates){if(hiddenDates&&!Array.isArray(hiddenDates)){return exports.convertHiddenOptions(moment,body,[hiddenDates])}body.hiddenDates=[];if(hiddenDates){if(Array.isArray(hiddenDates)==true){for(var i=0;i<hiddenDates.length;i++){if(hiddenDates[i].repeat===undefined){var dateItem={};dateItem.start=moment(hiddenDates[i].start).toDate().valueOf();dateItem.end=moment(hiddenDates[i].end).toDate().valueOf();body.hiddenDates.push(dateItem)}}body.hiddenDates.sort(function(a,b){return a.start-b.start})}}};exports.updateHiddenDates=function(moment,body,hiddenDates){if(hiddenDates&&!Array.isArray(hiddenDates)){return exports.updateHiddenDates(moment,body,[hiddenDates])}if(hiddenDates&&body.domProps.centerContainer.width!==undefined){exports.convertHiddenOptions(moment,body,hiddenDates);var start=moment(body.range.start);var end=moment(body.range.end);var totalRange=body.range.end-body.range.start;var pixelTime=totalRange/body.domProps.centerContainer.width;for(var i=0;i<hiddenDates.length;i++){if(hiddenDates[i].repeat!==undefined){var startDate=moment(hiddenDates[i].start);var endDate=moment(hiddenDates[i].end);if(startDate._d==\"Invalid Date\"){throw new Error(\"Supplied start date is not valid: \"+hiddenDates[i].start)}if(endDate._d==\"Invalid Date\"){throw new Error(\"Supplied end date is not valid: \"+hiddenDates[i].end)}var duration=endDate-startDate;if(duration>=4*pixelTime){var offset=0;var runUntil=end.clone();switch(hiddenDates[i].repeat){case\"daily\":if(startDate.day()!=endDate.day()){offset=1}startDate.dayOfYear(start.dayOfYear());startDate.year(start.year());startDate.subtract(7,\"days\");endDate.dayOfYear(start.dayOfYear());endDate.year(start.year());endDate.subtract(7-offset,\"days\");runUntil.add(1,\"weeks\");break;case\"weekly\":var dayOffset=endDate.diff(startDate,\"days\");var day=startDate.day();startDate.date(start.date());startDate.month(start.month());startDate.year(start.year());endDate=startDate.clone();startDate.day(day);endDate.day(day);endDate.add(dayOffset,\"days\");startDate.subtract(1,\"weeks\");endDate.subtract(1,\"weeks\");runUntil.add(1,\"weeks\");break;case\"monthly\":if(startDate.month()!=endDate.month()){offset=1}startDate.month(start.month());startDate.year(start.year());startDate.subtract(1,\"months\");endDate.month(start.month());endDate.year(start.year());endDate.subtract(1,\"months\");endDate.add(offset,\"months\");runUntil.add(1,\"months\");break;case\"yearly\":if(startDate.year()!=endDate.year()){offset=1}startDate.year(start.year());startDate.subtract(1,\"years\");endDate.year(start.year());endDate.subtract(1,\"years\");endDate.add(offset,\"years\");runUntil.add(1,\"years\");break;default:console.log(\"Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:\",hiddenDates[i].repeat);return}while(startDate<runUntil){body.hiddenDates.push({start:startDate.valueOf(),end:endDate.valueOf()});switch(hiddenDates[i].repeat){case\"daily\":startDate.add(1,\"days\");endDate.add(1,\"days\");break;case\"weekly\":startDate.add(1,\"weeks\");endDate.add(1,\"weeks\");break;case\"monthly\":startDate.add(1,\"months\");endDate.add(1,\"months\");break;case\"yearly\":startDate.add(1,\"y\");endDate.add(1,\"y\");break;default:console.log(\"Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:\",hiddenDates[i].repeat);return}}body.hiddenDates.push({start:startDate.valueOf(),end:endDate.valueOf()})}}}exports.removeDuplicates(body);var startHidden=exports.isHidden(body.range.start,body.hiddenDates);var endHidden=exports.isHidden(body.range.end,body.hiddenDates);var rangeStart=body.range.start;var rangeEnd=body.range.end;if(startHidden.hidden==true){rangeStart=body.range.startToFront==true?startHidden.startDate-1:startHidden.endDate+1}if(endHidden.hidden==true){rangeEnd=body.range.endToFront==true?endHidden.startDate-1:endHidden.endDate+1}if(startHidden.hidden==true||endHidden.hidden==true){body.range._applyRange(rangeStart,rangeEnd)}}};exports.removeDuplicates=function(body){var hiddenDates=body.hiddenDates;var safeDates=[];for(var i=0;i<hiddenDates.length;i++){for(var j=0;j<hiddenDates.length;j++){if(i!=j&&hiddenDates[j].remove!=true&&hiddenDates[i].remove!=true){if(hiddenDates[j].start>=hiddenDates[i].start&&hiddenDates[j].end<=hiddenDates[i].end){hiddenDates[j].remove=true}else if(hiddenDates[j].start>=hiddenDates[i].start&&hiddenDates[j].start<=hiddenDates[i].end){hiddenDates[i].end=hiddenDates[j].end;hiddenDates[j].remove=true}else if(hiddenDates[j].end>=hiddenDates[i].start&&hiddenDates[j].end<=hiddenDates[i].end){hiddenDates[i].start=hiddenDates[j].start;hiddenDates[j].remove=true}}}}for(i=0;i<hiddenDates.length;i++){if(hiddenDates[i].remove!==true){safeDates.push(hiddenDates[i])}}body.hiddenDates=safeDates;body.hiddenDates.sort(function(a,b){return a.start-b.start})};exports.printDates=function(dates){for(var i=0;i<dates.length;i++){console.log(i,new Date(dates[i].start),new Date(dates[i].end),dates[i].start,dates[i].end,dates[i].remove)}};exports.stepOverHiddenDates=function(moment,timeStep,previousTime){var stepInHidden=false;var currentValue=timeStep.current.valueOf();for(var i=0;i<timeStep.hiddenDates.length;i++){var startDate=timeStep.hiddenDates[i].start;var endDate=timeStep.hiddenDates[i].end;if(currentValue>=startDate&¤tValue<endDate){stepInHidden=true;break}}if(stepInHidden==true&¤tValue<timeStep._end.valueOf()&¤tValue!=previousTime){var prevValue=moment(previousTime);var newValue=moment(endDate);if(prevValue.year()!=newValue.year()){timeStep.switchedYear=true}else if(prevValue.month()!=newValue.month()){timeStep.switchedMonth=true}else if(prevValue.dayOfYear()!=newValue.dayOfYear()){timeStep.switchedDay=true}timeStep.current=newValue}};exports.toScreen=function(Core,time,width){var conversion;if(Core.body.hiddenDates.length==0){conversion=Core.range.conversion(width);return(time.valueOf()-conversion.offset)*conversion.scale}else{var hidden=exports.isHidden(time,Core.body.hiddenDates);if(hidden.hidden==true){time=hidden.startDate}var duration=exports.getHiddenDurationBetween(Core.body.hiddenDates,Core.range.start,Core.range.end);if(time<Core.range.start){conversion=Core.range.conversion(width,duration);var hiddenBeforeStart=exports.getHiddenDurationBeforeStart(Core.body.hiddenDates,time,conversion.offset);time=Core.options.moment(time).toDate().valueOf();time=time+hiddenBeforeStart;return-(conversion.offset-time.valueOf())*conversion.scale}else if(time>Core.range.end){var rangeAfterEnd={start:Core.range.start,end:time};time=exports.correctTimeForHidden(Core.options.moment,Core.body.hiddenDates,rangeAfterEnd,time);conversion=Core.range.conversion(width,duration);return(time.valueOf()-conversion.offset)*conversion.scale}else{time=exports.correctTimeForHidden(Core.options.moment,Core.body.hiddenDates,Core.range,time);conversion=Core.range.conversion(width,duration);return(time.valueOf()-conversion.offset)*conversion.scale}}};exports.toTime=function(Core,x,width){if(Core.body.hiddenDates.length==0){var conversion=Core.range.conversion(width);return new Date(x/conversion.scale+conversion.offset)}else{var hiddenDuration=exports.getHiddenDurationBetween(Core.body.hiddenDates,Core.range.start,Core.range.end);var totalDuration=Core.range.end-Core.range.start-hiddenDuration;var partialDuration=totalDuration*x/width;var accumulatedHiddenDuration=exports.getAccumulatedHiddenDuration(Core.body.hiddenDates,Core.range,partialDuration);return new Date(accumulatedHiddenDuration+partialDuration+Core.range.start)}};exports.getHiddenDurationBetween=function(hiddenDates,start,end){var duration=0;for(var i=0;i<hiddenDates.length;i++){var startDate=hiddenDates[i].start;var endDate=hiddenDates[i].end;if(startDate>=start&&endDate<end){duration+=endDate-startDate}}return duration};exports.getHiddenDurationBeforeStart=function(hiddenDates,start,end){var duration=0;for(var i=0;i<hiddenDates.length;i++){var startDate=hiddenDates[i].start;var endDate=hiddenDates[i].end;if(startDate>=start&&endDate<=end){duration+=endDate-startDate}}return duration};exports.correctTimeForHidden=function(moment,hiddenDates,range,time){time=moment(time).toDate().valueOf();time-=exports.getHiddenDurationBefore(moment,hiddenDates,range,time);return time};exports.getHiddenDurationBefore=function(moment,hiddenDates,range,time){var timeOffset=0;time=moment(time).toDate().valueOf();for(var i=0;i<hiddenDates.length;i++){var startDate=hiddenDates[i].start;var endDate=hiddenDates[i].end;if(startDate>=range.start&&endDate<range.end){if(time>=endDate){timeOffset+=endDate-startDate}}}return timeOffset};exports.getAccumulatedHiddenDuration=function(hiddenDates,range,requiredDuration){var hiddenDuration=0;var duration=0;var previousPoint=range.start;for(var i=0;i<hiddenDates.length;i++){var startDate=hiddenDates[i].start;var endDate=hiddenDates[i].end;if(startDate>=range.start&&endDate<range.end){duration+=startDate-previousPoint;previousPoint=endDate;if(duration>=requiredDuration){break}else{hiddenDuration+=endDate-startDate}}}return hiddenDuration};exports.snapAwayFromHidden=function(hiddenDates,time,direction,correctionEnabled){var isHidden=exports.isHidden(time,hiddenDates);if(isHidden.hidden==true){if(direction<0){if(correctionEnabled==true){return isHidden.startDate-(isHidden.endDate-time)-1}else{return isHidden.startDate-1}}else{if(correctionEnabled==true){return isHidden.endDate+(time-isHidden.startDate)+1}else{return isHidden.endDate+1}}}else{return time}};exports.isHidden=function(time,hiddenDates){for(var i=0;i<hiddenDates.length;i++){var startDate=hiddenDates[i].start;var endDate=hiddenDates[i].end;if(time>=startDate&&time<endDate){return{hidden:true,startDate:startDate,endDate:endDate}}}return{hidden:false,startDate:startDate,endDate:endDate}}},function(module,exports,__webpack_require__){\"use strict\";exports.onTouch=function(hammer,callback){callback.inputHandler=function(event){if(event.isFirst){callback(event)}};hammer.on(\"hammer.input\",callback.inputHandler)};exports.onRelease=function(hammer,callback){callback.inputHandler=function(event){if(event.isFinal){callback(event)}};return hammer.on(\"hammer.input\",callback.inputHandler)};exports.offTouch=function(hammer,callback){hammer.off(\"hammer.input\",callback.inputHandler)};exports.offRelease=exports.offTouch;exports.disablePreventDefaultVertically=function(pinchRecognizer){var TOUCH_ACTION_PAN_Y=\"pan-y\";pinchRecognizer.getTouchAction=function(){return[TOUCH_ACTION_PAN_Y]};return pinchRecognizer}},function(module,exports,__webpack_require__){\"use strict\";var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);var _keys=__webpack_require__(8);var _keys2=_interopRequireDefault(_keys);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Hammer=__webpack_require__(10);var util=__webpack_require__(2);var moment=__webpack_require__(9);function Item(data,conversion,options){this.id=null;this.parent=null;this.data=data;this.dom=null;this.conversion=conversion||{};this.options=options||{};this.selected=false;this.displayed=false;this.groupShowing=true;this.dirty=true;this.top=null;this.right=null;this.left=null;this.width=null;this.height=null;this.editable=null;this._updateEditStatus()}Item.prototype.stack=true;Item.prototype.select=function(){this.selected=true;this.dirty=true;if(this.displayed)this.redraw()};Item.prototype.unselect=function(){this.selected=false;this.dirty=true;if(this.displayed)this.redraw()};Item.prototype.setData=function(data){var groupChanged=data.group!=undefined&&this.data.group!=data.group;if(groupChanged&&this.parent!=null){this.parent.itemSet._moveToGroup(this,data.group)}if(this.parent){this.parent.stackDirty=true}var subGroupChanged=data.subgroup!=undefined&&this.data.subgroup!=data.subgroup;if(subGroupChanged&&this.parent!=null){this.parent.changeSubgroup(this,this.data.subgroup,data.subgroup)}this.data=data;this._updateEditStatus();this.dirty=true;if(this.displayed)this.redraw()};Item.prototype.setParent=function(parent){if(this.displayed){this.hide();this.parent=parent;if(this.parent){this.show()}}else{this.parent=parent}};Item.prototype.isVisible=function(range){return false};Item.prototype.show=function(){return false};Item.prototype.hide=function(){return false};Item.prototype.redraw=function(){};Item.prototype.repositionX=function(){};Item.prototype.repositionY=function(){};Item.prototype._repaintDragCenter=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragCenter){var me=this;var dragCenter=document.createElement(\"div\");dragCenter.className=\"vis-drag-center\";dragCenter.dragCenterItem=this;var hammer=new Hammer(dragCenter);hammer.on(\"tap\",function(event){me.parent.itemSet.body.emitter.emit(\"click\",{event:event,item:me.id})});hammer.on(\"doubletap\",function(event){event.stopPropagation();me.parent.itemSet._onUpdateItem(me);me.parent.itemSet.body.emitter.emit(\"doubleClick\",{event:event,item:me.id})});if(this.dom.box){if(this.dom.dragLeft){this.dom.box.insertBefore(dragCenter,this.dom.dragLeft)}else{this.dom.box.appendChild(dragCenter)}}else if(this.dom.point){this.dom.point.appendChild(dragCenter)}this.dom.dragCenter=dragCenter}else if(!this.selected&&this.dom.dragCenter){if(this.dom.dragCenter.parentNode){this.dom.dragCenter.parentNode.removeChild(this.dom.dragCenter)}this.dom.dragCenter=null}};Item.prototype._repaintDeleteButton=function(anchor){var editable=(this.options.editable.overrideItems||this.editable==null)&&this.options.editable.remove||!this.options.editable.overrideItems&&this.editable!=null&&this.editable.remove;if(this.selected&&editable&&!this.dom.deleteButton){var me=this;var deleteButton=document.createElement(\"div\");if(this.options.rtl){deleteButton.className=\"vis-delete-rtl\"}else{deleteButton.className=\"vis-delete\"}deleteButton.title=\"Delete this item\";new Hammer(deleteButton).on(\"tap\",function(event){event.stopPropagation();me.parent.removeFromDataSet(me)});anchor.appendChild(deleteButton);this.dom.deleteButton=deleteButton}else if(!this.selected&&this.dom.deleteButton){if(this.dom.deleteButton.parentNode){this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton)}this.dom.deleteButton=null}};Item.prototype._repaintOnItemUpdateTimeTooltip=function(anchor){if(!this.options.tooltipOnItemUpdateTime)return;var editable=(this.options.editable.updateTime||this.data.editable===true)&&this.data.editable!==false;if(this.selected&&editable&&!this.dom.onItemUpdateTimeTooltip){var onItemUpdateTimeTooltip=document.createElement(\"div\");onItemUpdateTimeTooltip.className=\"vis-onUpdateTime-tooltip\";anchor.appendChild(onItemUpdateTimeTooltip);this.dom.onItemUpdateTimeTooltip=onItemUpdateTimeTooltip}else if(!this.selected&&this.dom.onItemUpdateTimeTooltip){if(this.dom.onItemUpdateTimeTooltip.parentNode){this.dom.onItemUpdateTimeTooltip.parentNode.removeChild(this.dom.onItemUpdateTimeTooltip)}this.dom.onItemUpdateTimeTooltip=null}if(this.dom.onItemUpdateTimeTooltip){this.dom.onItemUpdateTimeTooltip.style.visibility=this.parent.itemSet.touchParams.itemIsDragging?\"visible\":\"hidden\";if(this.options.rtl){this.dom.onItemUpdateTimeTooltip.style.right=this.dom.content.style.right}else{this.dom.onItemUpdateTimeTooltip.style.left=this.dom.content.style.left}var tooltipOffset=50;var scrollTop=this.parent.itemSet.body.domProps.scrollTop;var itemDistanceFromTop;if(this.options.orientation.item==\"top\"){itemDistanceFromTop=this.top}else{itemDistanceFromTop=this.parent.height-this.top-this.height}var isCloseToTop=itemDistanceFromTop+this.parent.top-tooltipOffset<-scrollTop;if(isCloseToTop){this.dom.onItemUpdateTimeTooltip.style.bottom=\"\";this.dom.onItemUpdateTimeTooltip.style.top=this.height+2+\"px\"}else{this.dom.onItemUpdateTimeTooltip.style.top=\"\";this.dom.onItemUpdateTimeTooltip.style.bottom=this.height+2+\"px\"}var content;var templateFunction;if(this.options.tooltipOnItemUpdateTime&&this.options.tooltipOnItemUpdateTime.template){templateFunction=this.options.tooltipOnItemUpdateTime.template.bind(this);content=templateFunction(this.data)}else{content=\"start: \"+moment(this.data.start).format(\"MM/DD/YYYY hh:mm\");if(this.data.end){content+=\"<br> end: \"+moment(this.data.end).format(\"MM/DD/YYYY hh:mm\")}}this.dom.onItemUpdateTimeTooltip.innerHTML=content}};Item.prototype._updateContents=function(element){var content;var changed;var templateFunction;var itemVisibleFrameContent;var visibleFrameTemplateFunction;var itemData=this.parent.itemSet.itemsData.get(this.id);var frameElement=this.dom.box||this.dom.point;var itemVisibleFrameContentElement=frameElement.getElementsByClassName(\"vis-item-visible-frame\")[0];if(this.options.visibleFrameTemplate){visibleFrameTemplateFunction=this.options.visibleFrameTemplate.bind(this);itemVisibleFrameContent=visibleFrameTemplateFunction(itemData,frameElement)}else{itemVisibleFrameContent=\"\"}if(itemVisibleFrameContentElement){if(itemVisibleFrameContent instanceof Object&&!(itemVisibleFrameContent instanceof Element)){visibleFrameTemplateFunction(itemData,itemVisibleFrameContentElement)}else{changed=this._contentToString(this.itemVisibleFrameContent)!==this._contentToString(itemVisibleFrameContent);if(changed){if(itemVisibleFrameContent instanceof Element){itemVisibleFrameContentElement.innerHTML=\"\";itemVisibleFrameContentElement.appendChild(itemVisibleFrameContent)}else if(itemVisibleFrameContent!=undefined){itemVisibleFrameContentElement.innerHTML=itemVisibleFrameContent}else{if(!(this.data.type==\"background\"&&this.data.content===undefined)){throw new Error('Property \"content\" missing in item '+this.id)}}this.itemVisibleFrameContent=itemVisibleFrameContent}}}if(this.options.template){templateFunction=this.options.template.bind(this);content=templateFunction(itemData,element,this.data)}else{content=this.data.content}if(content instanceof Object&&!(content instanceof Element)){templateFunction(itemData,element)}else{changed=this._contentToString(this.content)!==this._contentToString(content);if(changed){if(content instanceof Element){element.innerHTML=\"\";element.appendChild(content)}else if(content!=undefined){element.innerHTML=content}else{if(!(this.data.type==\"background\"&&this.data.content===undefined)){throw new Error('Property \"content\" missing in item '+this.id)}}this.content=content}}};Item.prototype._updateDataAttributes=function(element){if(this.options.dataAttributes&&this.options.dataAttributes.length>0){var attributes=[];if(Array.isArray(this.options.dataAttributes)){attributes=this.options.dataAttributes}else if(this.options.dataAttributes==\"all\"){attributes=(0,_keys2[\"default\"])(this.data)}else{return}for(var i=0;i<attributes.length;i++){var name=attributes[i];var value=this.data[name];if(value!=null){element.setAttribute(\"data-\"+name,value)}else{element.removeAttribute(\"data-\"+name)}}}};Item.prototype._updateStyle=function(element){if(this.style){util.removeCssText(element,this.style);this.style=null}if(this.data.style){util.addCssText(element,this.data.style);this.style=this.data.style}};Item.prototype._contentToString=function(content){if(typeof content===\"string\")return content;if(content&&\"outerHTML\"in content)return content.outerHTML;return content};Item.prototype._updateEditStatus=function(){if(this.options){if(typeof this.options.editable===\"boolean\"){this.editable={updateTime:this.options.editable,updateGroup:this.options.editable,remove:this.options.editable}}else if((0,_typeof3[\"default\"])(this.options.editable)===\"object\"){this.editable={};util.selectiveExtend([\"updateTime\",\"updateGroup\",\"remove\"],this.editable,this.options.editable)}}if(!this.options||!this.options.editable||this.options.editable.overrideItems!==true){if(this.data){if(typeof this.data.editable===\"boolean\"){this.editable={updateTime:this.data.editable,updateGroup:this.data.editable,remove:this.data.editable}}else if((0,_typeof3[\"default\"])(this.data.editable)===\"object\"){this.editable={};util.selectiveExtend([\"updateTime\",\"updateGroup\",\"remove\"],this.editable,this.data.editable)}}}};Item.prototype.getWidthLeft=function(){return 0};Item.prototype.getWidthRight=function(){return 0};Item.prototype.getTitle=function(){return this.data.title};module.exports=Item},function(module,exports){module.exports=function(bitmap,value){return{enumerable:!(bitmap&1),configurable:!(bitmap&2),writable:!(bitmap&4),value:value}}},function(module,exports){var id=0;var px=Math.random();module.exports=function(key){return\"Symbol(\".concat(key===undefined?\"\":key,\")_\",(++id+px).toString(36))}},function(module,exports,__webpack_require__){var defined=__webpack_require__(51);module.exports=function(it){return Object(defined(it))}},function(module,exports){exports.f={}.propertyIsEnumerable},function(module,exports,__webpack_require__){\"use strict\";function Queue(options){this.delay=null;this.max=Infinity;this._queue=[];this._timeout=null;this._extended=null;this.setOptions(options)}Queue.prototype.setOptions=function(options){if(options&&typeof options.delay!==\"undefined\"){this.delay=options.delay}if(options&&typeof options.max!==\"undefined\"){this.max=options.max}this._flushIfNeeded()};Queue.extend=function(object,options){var queue=new Queue(options);if(object.flush!==undefined){throw new Error(\"Target object already has a property flush\")}object.flush=function(){queue.flush()};var methods=[{name:\"flush\",original:undefined}];if(options&&options.replace){for(var i=0;i<options.replace.length;i++){var name=options.replace[i];methods.push({name:name,original:object[name]});queue.replace(object,name)}}queue._extended={object:object,methods:methods};return queue};Queue.prototype.destroy=function(){this.flush();if(this._extended){var object=this._extended.object;var methods=this._extended.methods;for(var i=0;i<methods.length;i++){var method=methods[i];if(method.original){object[method.name]=method.original}else{delete object[method.name]}}this._extended=null}};Queue.prototype.replace=function(object,method){var me=this;var original=object[method];if(!original){throw new Error(\"Method \"+method+\" undefined\")}object[method]=function(){var args=[];for(var i=0;i<arguments.length;i++){args[i]=arguments[i]}me.queue({args:args,fn:original,context:this})}};Queue.prototype.queue=function(entry){if(typeof entry===\"function\"){this._queue.push({fn:entry})}else{this._queue.push(entry)}this._flushIfNeeded()};Queue.prototype._flushIfNeeded=function(){\nif(this._queue.length>this.max){this.flush()}clearTimeout(this._timeout);if(this.queue.length>0&&typeof this.delay===\"number\"){var me=this;this._timeout=setTimeout(function(){me.flush()},this.delay)}};Queue.prototype.flush=function(){while(this._queue.length>0){var entry=this._queue.shift();entry.fn.apply(entry.context||entry.fn,entry.args||[])}};module.exports=Queue},function(module,exports){module.exports=Emitter;function Emitter(obj){if(obj)return mixin(obj)}function mixin(obj){for(var key in Emitter.prototype){obj[key]=Emitter.prototype[key]}return obj}Emitter.prototype.on=Emitter.prototype.addEventListener=function(event,fn){this._callbacks=this._callbacks||{};(this._callbacks[event]=this._callbacks[event]||[]).push(fn);return this};Emitter.prototype.once=function(event,fn){var self=this;this._callbacks=this._callbacks||{};function on(){self.off(event,on);fn.apply(this,arguments)}on.fn=fn;this.on(event,on);return this};Emitter.prototype.off=Emitter.prototype.removeListener=Emitter.prototype.removeAllListeners=Emitter.prototype.removeEventListener=function(event,fn){this._callbacks=this._callbacks||{};if(0==arguments.length){this._callbacks={};return this}var callbacks=this._callbacks[event];if(!callbacks)return this;if(1==arguments.length){delete this._callbacks[event];return this}var cb;for(var i=0;i<callbacks.length;i++){cb=callbacks[i];if(cb===fn||cb.fn===fn){callbacks.splice(i,1);break}}return this};Emitter.prototype.emit=function(event){this._callbacks=this._callbacks||{};var args=[].slice.call(arguments,1),callbacks=this._callbacks[event];if(callbacks){callbacks=callbacks.slice(0);for(var i=0,len=callbacks.length;i<len;++i){callbacks[i].apply(this,args)}}return this};Emitter.prototype.listeners=function(event){this._callbacks=this._callbacks||{};return this._callbacks[event]||[]};Emitter.prototype.hasListeners=function(event){return!!this.listeners(event).length}},function(module,exports,__webpack_require__){\"use strict\";var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var Component=__webpack_require__(16);var TimeStep=__webpack_require__(66);var DateUtil=__webpack_require__(36);var moment=__webpack_require__(9);function TimeAxis(body,options){this.dom={foreground:null,lines:[],majorTexts:[],minorTexts:[],redundant:{lines:[],majorTexts:[],minorTexts:[]}};this.props={range:{start:0,end:0,minimumStep:0},lineTop:0};this.defaultOptions={orientation:{axis:\"bottom\"},showMinorLabels:true,showMajorLabels:true,maxMinorChars:7,format:TimeStep.FORMAT,moment:moment,timeAxis:null};this.options=util.extend({},this.defaultOptions);this.body=body;this._create();this.setOptions(options)}TimeAxis.prototype=new Component;TimeAxis.prototype.setOptions=function(options){if(options){util.selectiveExtend([\"showMinorLabels\",\"showMajorLabels\",\"maxMinorChars\",\"hiddenDates\",\"timeAxis\",\"moment\",\"rtl\"],this.options,options);util.selectiveDeepExtend([\"format\"],this.options,options);if(\"orientation\"in options){if(typeof options.orientation===\"string\"){this.options.orientation.axis=options.orientation}else if((0,_typeof3[\"default\"])(options.orientation)===\"object\"&&\"axis\"in options.orientation){this.options.orientation.axis=options.orientation.axis}}if(\"locale\"in options){if(typeof moment.locale===\"function\"){moment.locale(options.locale)}else{moment.lang(options.locale)}}}};TimeAxis.prototype._create=function(){this.dom.foreground=document.createElement(\"div\");this.dom.background=document.createElement(\"div\");this.dom.foreground.className=\"vis-time-axis vis-foreground\";this.dom.background.className=\"vis-time-axis vis-background\"};TimeAxis.prototype.destroy=function(){if(this.dom.foreground.parentNode){this.dom.foreground.parentNode.removeChild(this.dom.foreground)}if(this.dom.background.parentNode){this.dom.background.parentNode.removeChild(this.dom.background)}this.body=null};TimeAxis.prototype.redraw=function(){var props=this.props;var foreground=this.dom.foreground;var background=this.dom.background;var parent=this.options.orientation.axis==\"top\"?this.body.dom.top:this.body.dom.bottom;var parentChanged=foreground.parentNode!==parent;this._calculateCharSize();var showMinorLabels=this.options.showMinorLabels&&this.options.orientation.axis!==\"none\";var showMajorLabels=this.options.showMajorLabels&&this.options.orientation.axis!==\"none\";props.minorLabelHeight=showMinorLabels?props.minorCharHeight:0;props.majorLabelHeight=showMajorLabels?props.majorCharHeight:0;props.height=props.minorLabelHeight+props.majorLabelHeight;props.width=foreground.offsetWidth;props.minorLineHeight=this.body.domProps.root.height-props.majorLabelHeight-(this.options.orientation.axis==\"top\"?this.body.domProps.bottom.height:this.body.domProps.top.height);props.minorLineWidth=1;props.majorLineHeight=props.minorLineHeight+props.majorLabelHeight;props.majorLineWidth=1;var foregroundNextSibling=foreground.nextSibling;var backgroundNextSibling=background.nextSibling;foreground.parentNode&&foreground.parentNode.removeChild(foreground);background.parentNode&&background.parentNode.removeChild(background);foreground.style.height=this.props.height+\"px\";this._repaintLabels();if(foregroundNextSibling){parent.insertBefore(foreground,foregroundNextSibling)}else{parent.appendChild(foreground)}if(backgroundNextSibling){this.body.dom.backgroundVertical.insertBefore(background,backgroundNextSibling)}else{this.body.dom.backgroundVertical.appendChild(background)}return this._isResized()||parentChanged};TimeAxis.prototype._repaintLabels=function(){var orientation=this.options.orientation.axis;var start=util.convert(this.body.range.start,\"Number\");var end=util.convert(this.body.range.end,\"Number\");var timeLabelsize=this.body.util.toTime((this.props.minorCharWidth||10)*this.options.maxMinorChars).valueOf();var minimumStep=timeLabelsize-DateUtil.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this.body.range,timeLabelsize);minimumStep-=this.body.util.toTime(0).valueOf();var step=new TimeStep(new Date(start),new Date(end),minimumStep,this.body.hiddenDates,this.options);step.setMoment(this.options.moment);if(this.options.format){step.setFormat(this.options.format)}if(this.options.timeAxis){step.setScale(this.options.timeAxis)}this.step=step;var dom=this.dom;dom.redundant.lines=dom.lines;dom.redundant.majorTexts=dom.majorTexts;dom.redundant.minorTexts=dom.minorTexts;dom.lines=[];dom.majorTexts=[];dom.minorTexts=[];var current;var next;var x;var xNext;var isMajor;var nextIsMajor;var showMinorGrid;var width=0,prevWidth;var line;var labelMinor;var xFirstMajorLabel=undefined;var count=0;var MAX=1e3;var className;step.start();next=step.getCurrent();xNext=this.body.util.toScreen(next);while(step.hasNext()&&count<MAX){count++;isMajor=step.isMajor();className=step.getClassName();labelMinor=step.getLabelMinor();current=next;x=xNext;step.next();next=step.getCurrent();nextIsMajor=step.isMajor();xNext=this.body.util.toScreen(next);prevWidth=width;width=xNext-x;switch(step.scale){case\"week\":showMinorGrid=true;break;default:showMinorGrid=width>=prevWidth*.4;break}if(this.options.showMinorLabels&&showMinorGrid){var label=this._repaintMinorText(x,labelMinor,orientation,className);label.style.width=width+\"px\"}if(isMajor&&this.options.showMajorLabels){if(x>0){if(xFirstMajorLabel==undefined){xFirstMajorLabel=x}label=this._repaintMajorText(x,step.getLabelMajor(),orientation,className)}line=this._repaintMajorLine(x,width,orientation,className)}else{if(showMinorGrid){line=this._repaintMinorLine(x,width,orientation,className)}else{if(line){line.style.width=parseInt(line.style.width)+width+\"px\"}}}}if(count===MAX&&!warnedForOverflow){console.warn(\"Something is wrong with the Timeline scale. Limited drawing of grid lines to \"+MAX+\" lines.\");warnedForOverflow=true}if(this.options.showMajorLabels){var leftTime=this.body.util.toTime(0),leftText=step.getLabelMajor(leftTime),widthText=leftText.length*(this.props.majorCharWidth||10)+10;if(xFirstMajorLabel==undefined||widthText<xFirstMajorLabel){this._repaintMajorText(0,leftText,orientation,className)}}util.forEach(this.dom.redundant,function(arr){while(arr.length){var elem=arr.pop();if(elem&&elem.parentNode){elem.parentNode.removeChild(elem)}}})};TimeAxis.prototype._repaintMinorText=function(x,text,orientation,className){var label=this.dom.redundant.minorTexts.shift();if(!label){var content=document.createTextNode(\"\");label=document.createElement(\"div\");label.appendChild(content);this.dom.foreground.appendChild(label)}this.dom.minorTexts.push(label);label.innerHTML=text;label.style.top=orientation==\"top\"?this.props.majorLabelHeight+\"px\":\"0\";if(this.options.rtl){label.style.left=\"\";label.style.right=x+\"px\"}else{label.style.left=x+\"px\"}label.className=\"vis-text vis-minor \"+className;return label};TimeAxis.prototype._repaintMajorText=function(x,text,orientation,className){var label=this.dom.redundant.majorTexts.shift();if(!label){var content=document.createElement(\"div\");label=document.createElement(\"div\");label.appendChild(content);this.dom.foreground.appendChild(label)}label.childNodes[0].innerHTML=text;label.className=\"vis-text vis-major \"+className;label.style.top=orientation==\"top\"?\"0\":this.props.minorLabelHeight+\"px\";if(this.options.rtl){label.style.left=\"\";label.style.right=x+\"px\"}else{label.style.left=x+\"px\"}this.dom.majorTexts.push(label);return label};TimeAxis.prototype._repaintMinorLine=function(x,width,orientation,className){var line=this.dom.redundant.lines.shift();if(!line){line=document.createElement(\"div\");this.dom.background.appendChild(line)}this.dom.lines.push(line);var props=this.props;if(orientation==\"top\"){line.style.top=props.majorLabelHeight+\"px\"}else{line.style.top=this.body.domProps.top.height+\"px\"}line.style.height=props.minorLineHeight+\"px\";if(this.options.rtl){line.style.left=\"\";line.style.right=x-props.minorLineWidth/2+\"px\";line.className=\"vis-grid vis-vertical-rtl vis-minor \"+className}else{line.style.left=x-props.minorLineWidth/2+\"px\";line.className=\"vis-grid vis-vertical vis-minor \"+className}line.style.width=width+\"px\";return line};TimeAxis.prototype._repaintMajorLine=function(x,width,orientation,className){var line=this.dom.redundant.lines.shift();if(!line){line=document.createElement(\"div\");this.dom.background.appendChild(line)}this.dom.lines.push(line);var props=this.props;if(orientation==\"top\"){line.style.top=\"0\"}else{line.style.top=this.body.domProps.top.height+\"px\"}if(this.options.rtl){line.style.left=\"\";line.style.right=x-props.majorLineWidth/2+\"px\";line.className=\"vis-grid vis-vertical-rtl vis-major \"+className}else{line.style.left=x-props.majorLineWidth/2+\"px\";line.className=\"vis-grid vis-vertical vis-major \"+className}line.style.height=props.majorLineHeight+\"px\";line.style.width=width+\"px\";return line};TimeAxis.prototype._calculateCharSize=function(){if(!this.dom.measureCharMinor){this.dom.measureCharMinor=document.createElement(\"DIV\");this.dom.measureCharMinor.className=\"vis-text vis-minor vis-measure\";this.dom.measureCharMinor.style.position=\"absolute\";this.dom.measureCharMinor.appendChild(document.createTextNode(\"0\"));this.dom.foreground.appendChild(this.dom.measureCharMinor)}this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight;this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth;if(!this.dom.measureCharMajor){this.dom.measureCharMajor=document.createElement(\"DIV\");this.dom.measureCharMajor.className=\"vis-text vis-major vis-measure\";this.dom.measureCharMajor.style.position=\"absolute\";this.dom.measureCharMajor.appendChild(document.createTextNode(\"0\"));this.dom.foreground.appendChild(this.dom.measureCharMajor)}this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight;this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth};var warnedForOverflow=false;module.exports=TimeAxis},function(module,exports,__webpack_require__){\"use strict\";var Hammer=__webpack_require__(10);var util=__webpack_require__(2);var Component=__webpack_require__(16);var moment=__webpack_require__(9);var locales=__webpack_require__(98);function CustomTime(body,options){this.body=body;this.defaultOptions={moment:moment,locales:locales,locale:\"en\",id:undefined,title:undefined};this.options=util.extend({},this.defaultOptions);if(options&&options.time){this.customTime=options.time}else{this.customTime=new Date}this.eventParams={};this.setOptions(options);this._create()}CustomTime.prototype=new Component;CustomTime.prototype.setOptions=function(options){if(options){util.selectiveExtend([\"moment\",\"locale\",\"locales\",\"id\"],this.options,options)}};CustomTime.prototype._create=function(){var bar=document.createElement(\"div\");bar[\"custom-time\"]=this;bar.className=\"vis-custom-time \"+(this.options.id||\"\");bar.style.position=\"absolute\";bar.style.top=\"0px\";bar.style.height=\"100%\";this.bar=bar;var drag=document.createElement(\"div\");drag.style.position=\"relative\";drag.style.top=\"0px\";drag.style.left=\"-10px\";drag.style.height=\"100%\";drag.style.width=\"20px\";function onMouseWheel(e){this.body.range._onMouseWheel(e)}if(drag.addEventListener){drag.addEventListener(\"mousewheel\",onMouseWheel.bind(this),false);drag.addEventListener(\"DOMMouseScroll\",onMouseWheel.bind(this),false)}else{drag.attachEvent(\"onmousewheel\",onMouseWheel.bind(this))}bar.appendChild(drag);this.hammer=new Hammer(drag);this.hammer.on(\"panstart\",this._onDragStart.bind(this));this.hammer.on(\"panmove\",this._onDrag.bind(this));this.hammer.on(\"panend\",this._onDragEnd.bind(this));this.hammer.get(\"pan\").set({threshold:5,direction:Hammer.DIRECTION_HORIZONTAL})};CustomTime.prototype.destroy=function(){this.hide();this.hammer.destroy();this.hammer=null;this.body=null};CustomTime.prototype.redraw=function(){var parent=this.body.dom.backgroundVertical;if(this.bar.parentNode!=parent){if(this.bar.parentNode){this.bar.parentNode.removeChild(this.bar)}parent.appendChild(this.bar)}var x=this.body.util.toScreen(this.customTime);var locale=this.options.locales[this.options.locale];if(!locale){if(!this.warned){console.log(\"WARNING: options.locales['\"+this.options.locale+\"'] not found. See http://visjs.org/docs/timeline/#Localization\");this.warned=true}locale=this.options.locales[\"en\"]}var title=this.options.title;if(title===undefined){title=locale.time+\": \"+this.options.moment(this.customTime).format(\"dddd, MMMM Do YYYY, H:mm:ss\");title=title.charAt(0).toUpperCase()+title.substring(1)}else if(typeof title===\"function\"){title=title.call(this.customTime)}this.bar.style.left=x+\"px\";this.bar.title=title;return false};CustomTime.prototype.hide=function(){if(this.bar.parentNode){this.bar.parentNode.removeChild(this.bar)}};CustomTime.prototype.setCustomTime=function(time){this.customTime=util.convert(time,\"Date\");this.redraw()};CustomTime.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())};CustomTime.prototype.setCustomTitle=function(title){this.options.title=title};CustomTime.prototype._onDragStart=function(event){this.eventParams.dragging=true;this.eventParams.customTime=this.customTime;event.stopPropagation()};CustomTime.prototype._onDrag=function(event){if(!this.eventParams.dragging)return;var x=this.body.util.toScreen(this.eventParams.customTime)+event.deltaX;var time=this.body.util.toTime(x);this.setCustomTime(time);this.body.emitter.emit(\"timechange\",{id:this.options.id,time:new Date(this.customTime.valueOf()),event:event});event.stopPropagation()};CustomTime.prototype._onDragEnd=function(event){if(!this.eventParams.dragging)return;this.body.emitter.emit(\"timechanged\",{id:this.options.id,time:new Date(this.customTime.valueOf()),event:event});event.stopPropagation()};CustomTime.customTimeFromTarget=function(event){var target=event.target;while(target){if(target.hasOwnProperty(\"custom-time\")){return target[\"custom-time\"]}target=target.parentNode}return null};module.exports=CustomTime},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var Label=__webpack_require__(117)[\"default\"];var ComponentUtil=__webpack_require__(48)[\"default\"];var Box=__webpack_require__(193)[\"default\"];var Circle=__webpack_require__(200)[\"default\"];var CircularImage=__webpack_require__(201)[\"default\"];var Database=__webpack_require__(202)[\"default\"];var Diamond=__webpack_require__(203)[\"default\"];var Dot=__webpack_require__(204)[\"default\"];var Ellipse=__webpack_require__(205)[\"default\"];var Icon=__webpack_require__(206)[\"default\"];var Image=__webpack_require__(207)[\"default\"];var Square=__webpack_require__(208)[\"default\"];var Hexagon=__webpack_require__(209)[\"default\"];var Star=__webpack_require__(210)[\"default\"];var Text=__webpack_require__(211)[\"default\"];var Triangle=__webpack_require__(212)[\"default\"];var TriangleDown=__webpack_require__(213)[\"default\"];var _require=__webpack_require__(15),printStyle=_require.printStyle;var Node=function(){function Node(options,body,imagelist,grouplist,globalOptions,defaultOptions){(0,_classCallCheck3[\"default\"])(this,Node);this.options=util.bridgeObject(globalOptions);this.globalOptions=globalOptions;this.defaultOptions=defaultOptions;this.body=body;this.edges=[];this.id=undefined;this.imagelist=imagelist;this.grouplist=grouplist;this.x=undefined;this.y=undefined;this.baseSize=this.options.size;this.baseFontSize=this.options.font.size;this.predefinedPosition=false;this.selected=false;this.hover=false;this.labelModule=new Label(this.body,this.options,false);this.setOptions(options)}(0,_createClass3[\"default\"])(Node,[{key:\"attachEdge\",value:function attachEdge(edge){if(this.edges.indexOf(edge)===-1){this.edges.push(edge)}}},{key:\"detachEdge\",value:function detachEdge(edge){var index=this.edges.indexOf(edge);if(index!=-1){this.edges.splice(index,1)}}},{key:\"setOptions\",value:function setOptions(options){var currentShape=this.options.shape;if(!options){return}if(options.id!==undefined){this.id=options.id}if(this.id===undefined){throw new Error(\"Node must have an id\")}Node.checkMass(options,this.id);if(options.x!==undefined){if(options.x===null){this.x=undefined;this.predefinedPosition=false}else{this.x=parseInt(options.x);this.predefinedPosition=true}}if(options.y!==undefined){if(options.y===null){this.y=undefined;this.predefinedPosition=false}else{this.y=parseInt(options.y);this.predefinedPosition=true}}if(options.size!==undefined){this.baseSize=options.size}if(options.value!==undefined){options.value=parseFloat(options.value)}Node.parseOptions(this.options,options,true,this.globalOptions,this.grouplist);var pile=[options,this.options,this.defaultOptions];this.chooser=ComponentUtil.choosify(\"node\",pile);this._load_images();this.updateLabelModule(options);this.updateShape(currentShape);return options.hidden!==undefined||options.physics!==undefined}},{key:\"_load_images\",value:function _load_images(){if(this.options.shape!==\"circularImage\"&&this.options.shape!==\"image\"){return}if(this.options.image===undefined){throw new Error(\"Option image must be defined for node type '\"+this.options.shape+\"'\")}if(this.imagelist===undefined){throw new Error(\"Internal Error: No images provided\")}if(typeof this.options.image===\"string\"){this.imageObj=this.imagelist.load(this.options.image,this.options.brokenImage,this.id)}else{if(this.options.image.unselected===undefined){throw new Error(\"No unselected image provided\")}this.imageObj=this.imagelist.load(this.options.image.unselected,this.options.brokenImage,this.id);if(this.options.image.selected!==undefined){this.imageObjAlt=this.imagelist.load(this.options.image.selected,this.options.brokenImage,this.id)}else{this.imageObjAlt=undefined}}}},{key:\"getFormattingValues\",value:function getFormattingValues(){var values={color:this.options.color.background,borderWidth:this.options.borderWidth,borderColor:this.options.color.border,size:this.options.size,borderDashes:this.options.shapeProperties.borderDashes,borderRadius:this.options.shapeProperties.borderRadius,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y};if(this.selected||this.hover){if(this.chooser===true){if(this.selected){values.borderWidth*=2;values.color=this.options.color.highlight.background;values.borderColor=this.options.color.highlight.border;values.shadow=this.options.shadow.enabled}else if(this.hover){values.color=this.options.color.hover.background;values.borderColor=this.options.color.hover.border;values.shadow=this.options.shadow.enabled}}else if(typeof this.chooser===\"function\"){this.chooser(values,this.options.id,this.selected,this.hover);if(values.shadow===false){if(values.shadowColor!==this.options.shadow.color||values.shadowSize!==this.options.shadow.size||values.shadowX!==this.options.shadow.x||values.shadowY!==this.options.shadow.y){values.shadow=true}}}}else{values.shadow=this.options.shadow.enabled}return values}},{key:\"updateLabelModule\",value:function updateLabelModule(options){if(this.options.label===undefined||this.options.label===null){this.options.label=\"\"}Node.updateGroupOptions(this.options,options,this.grouplist);var currentGroup=this.grouplist.get(this.options.group,false);var pile=[options,this.options,currentGroup,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,pile);if(this.labelModule.baseSize!==undefined){this.baseFontSize=this.labelModule.baseSize}}},{key:\"updateShape\",value:function updateShape(currentShape){if(currentShape===this.options.shape&&this.shape){this.shape.setOptions(this.options,this.imageObj,this.imageObjAlt)}else{switch(this.options.shape){case\"box\":this.shape=new Box(this.options,this.body,this.labelModule);break;case\"circle\":this.shape=new Circle(this.options,this.body,this.labelModule);break;case\"circularImage\":this.shape=new CircularImage(this.options,this.body,this.labelModule,this.imageObj,this.imageObjAlt);break;case\"database\":this.shape=new Database(this.options,this.body,this.labelModule);break;case\"diamond\":this.shape=new Diamond(this.options,this.body,this.labelModule);break;case\"dot\":this.shape=new Dot(this.options,this.body,this.labelModule);break;case\"ellipse\":this.shape=new Ellipse(this.options,this.body,this.labelModule);break;case\"icon\":this.shape=new Icon(this.options,this.body,this.labelModule);break;case\"image\":this.shape=new Image(this.options,this.body,this.labelModule,this.imageObj,this.imageObjAlt);break;case\"square\":this.shape=new Square(this.options,this.body,this.labelModule);break;case\"hexagon\":this.shape=new Hexagon(this.options,this.body,this.labelModule);break;case\"star\":this.shape=new Star(this.options,this.body,this.labelModule);break;case\"text\":this.shape=new Text(this.options,this.body,this.labelModule);break;case\"triangle\":this.shape=new Triangle(this.options,this.body,this.labelModule);break;case\"triangleDown\":this.shape=new TriangleDown(this.options,this.body,this.labelModule);break;default:this.shape=new Ellipse(this.options,this.body,this.labelModule);break}}this.needsRefresh()}},{key:\"select\",value:function select(){this.selected=true;this.needsRefresh()}},{key:\"unselect\",value:function unselect(){this.selected=false;this.needsRefresh()}},{key:\"needsRefresh\",value:function needsRefresh(){this.shape.refreshNeeded=true}},{key:\"getTitle\",value:function getTitle(){return this.options.title}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){return this.shape.distanceToBorder(ctx,angle)}},{key:\"isFixed\",value:function isFixed(){return this.options.fixed.x&&this.options.fixed.y}},{key:\"isSelected\",value:function isSelected(){return this.selected}},{key:\"getValue\",value:function getValue(){return this.options.value}},{key:\"getLabelSize\",value:function getLabelSize(){return this.labelModule.size()}},{key:\"setValueRange\",value:function setValueRange(min,max,total){if(this.options.value!==undefined){var scale=this.options.scaling.customScalingFunction(min,max,total,this.options.value);var sizeDiff=this.options.scaling.max-this.options.scaling.min;if(this.options.scaling.label.enabled===true){var fontDiff=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+scale*fontDiff}this.options.size=this.options.scaling.min+scale*sizeDiff}else{this.options.size=this.baseSize;this.options.font.size=this.baseFontSize}this.updateLabelModule()}},{key:\"draw\",value:function draw(ctx){var values=this.getFormattingValues();this.shape.draw(ctx,this.x,this.y,this.selected,this.hover,values)}},{key:\"updateBoundingBox\",value:function updateBoundingBox(ctx){this.shape.updateBoundingBox(this.x,this.y,ctx)}},{key:\"resize\",value:function resize(ctx){var values=this.getFormattingValues();this.shape.resize(ctx,this.selected,this.hover,values)}},{key:\"getItemsOnPoint\",value:function getItemsOnPoint(point){var ret=[];if(this.labelModule.visible()){if(ComponentUtil.pointInRect(this.labelModule.getSize(),point)){ret.push({nodeId:this.id,labelId:0})}}if(ComponentUtil.pointInRect(this.shape.boundingBox,point)){ret.push({nodeId:this.id})}return ret}},{key:\"isOverlappingWith\",value:function isOverlappingWith(obj){return this.shape.left<obj.right&&this.shape.left+this.shape.width>obj.left&&this.shape.top<obj.bottom&&this.shape.top+this.shape.height>obj.top}},{key:\"isBoundingBoxOverlappingWith\",value:function isBoundingBoxOverlappingWith(obj){return this.shape.boundingBox.left<obj.right&&this.shape.boundingBox.right>obj.left&&this.shape.boundingBox.top<obj.bottom&&this.shape.boundingBox.bottom>obj.top}}],[{key:\"updateGroupOptions\",value:function updateGroupOptions(parentOptions,newOptions,groupList){if(groupList===undefined)return;var group=parentOptions.group;if(newOptions!==undefined&&newOptions.group!==undefined&&group!==newOptions.group){throw new Error(\"updateGroupOptions: group values in options don't match.\")}var hasGroup=typeof group===\"number\"||typeof group===\"string\"&&group!=\"\";if(!hasGroup)return;var groupObj=groupList.get(group);util.selectiveNotDeepExtend([\"font\"],parentOptions,groupObj);parentOptions.color=util.parseColor(parentOptions.color)}},{key:\"parseOptions\",value:function parseOptions(parentOptions,newOptions){var allowDeletion=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var globalOptions=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};var groupList=arguments[4];var fields=[\"color\",\"fixed\",\"shadow\"];util.selectiveNotDeepExtend(fields,parentOptions,newOptions,allowDeletion);Node.checkMass(newOptions);util.mergeOptions(parentOptions,newOptions,\"shadow\",globalOptions);if(newOptions.color!==undefined&&newOptions.color!==null){var parsedColor=util.parseColor(newOptions.color);util.fillIfDefined(parentOptions.color,parsedColor)}else if(allowDeletion===true&&newOptions.color===null){parentOptions.color=util.bridgeObject(globalOptions.color)}if(newOptions.fixed!==undefined&&newOptions.fixed!==null){if(typeof newOptions.fixed===\"boolean\"){parentOptions.fixed.x=newOptions.fixed;parentOptions.fixed.y=newOptions.fixed}else{if(newOptions.fixed.x!==undefined&&typeof newOptions.fixed.x===\"boolean\"){parentOptions.fixed.x=newOptions.fixed.x}if(newOptions.fixed.y!==undefined&&typeof newOptions.fixed.y===\"boolean\"){parentOptions.fixed.y=newOptions.fixed.y}}}if(allowDeletion===true&&newOptions.font===null){parentOptions.font=util.bridgeObject(globalOptions.font)}Node.updateGroupOptions(parentOptions,newOptions,groupList);if(newOptions.scaling!==undefined){util.mergeOptions(parentOptions.scaling,newOptions.scaling,\"label\",globalOptions.scaling)}}},{key:\"checkMass\",value:function checkMass(options,id){if(options.mass!==undefined&&options.mass<=0){var strId=\"\";if(id!==undefined){strId=\" in node id: \"+id}console.log(\"%cNegative or zero mass disallowed\"+strId+\", setting mass to 1.\",printStyle);options.mass=1}}}]);return Node}();exports[\"default\"]=Node},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var ComponentUtil=function(){function ComponentUtil(){(0,_classCallCheck3[\"default\"])(this,ComponentUtil)}(0,_createClass3[\"default\"])(ComponentUtil,null,[{key:\"choosify\",value:function choosify(subOption,pile){var allowed=[\"node\",\"edge\",\"label\"];var value=true;var chosen=util.topMost(pile,\"chosen\");if(typeof chosen===\"boolean\"){value=chosen}else if((typeof chosen===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(chosen))===\"object\"){if(allowed.indexOf(subOption)===-1){throw new Error(\"choosify: subOption '\"+subOption+\"' should be one of \"+\"'\"+allowed.join(\"', '\")+\"'\")}var chosenEdge=util.topMost(pile,[\"chosen\",subOption]);if(typeof chosenEdge===\"boolean\"||typeof chosenEdge===\"function\"){value=chosenEdge}}return value}},{key:\"pointInRect\",value:function pointInRect(rect,point,rotationPoint){if(rect.width<=0||rect.height<=0){return false}if(rotationPoint!==undefined){var tmp={x:point.x-rotationPoint.x,y:point.y-rotationPoint.y};if(rotationPoint.angle!==0){var angle=-rotationPoint.angle;var tmp2={x:Math.cos(angle)*tmp.x-Math.sin(angle)*tmp.y,y:Math.sin(angle)*tmp.x+Math.cos(angle)*tmp.y};point=tmp2}else{point=tmp}}var right=rect.x+rect.width;var bottom=rect.y+rect.width;return rect.left<point.x&&right>point.x&&rect.top<point.y&&bottom>point.y}},{key:\"isValidLabel\",value:function isValidLabel(text){return typeof text===\"string\"&&text!==\"\"}}]);return ComponentUtil}();exports[\"default\"]=ComponentUtil},function(module,exports,__webpack_require__){__webpack_require__(125);var global=__webpack_require__(18);var hide=__webpack_require__(26);var Iterators=__webpack_require__(31);var TO_STRING_TAG=__webpack_require__(13)(\"toStringTag\");var DOMIterables=(\"CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,\"+\"DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,\"+\"MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,\"+\"SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,\"+\"TextTrackList,TouchList\").split(\",\");for(var i=0;i<DOMIterables.length;i++){var NAME=DOMIterables[i];var Collection=global[NAME];var proto=Collection&&Collection.prototype;if(proto&&!proto[TO_STRING_TAG])hide(proto,TO_STRING_TAG,NAME);Iterators[NAME]=Iterators.Array}},function(module,exports){var toString={}.toString;module.exports=function(it){return toString.call(it).slice(8,-1)}},function(module,exports){module.exports=function(it){if(it==undefined)throw TypeError(\"Can't call method on \"+it);return it}},function(module,exports){module.exports=true},function(module,exports,__webpack_require__){var isObject=__webpack_require__(32);module.exports=function(it,S){if(!isObject(it))return it;var fn,val;if(S&&typeof(fn=it.toString)==\"function\"&&!isObject(val=fn.call(it)))return val;if(typeof(fn=it.valueOf)==\"function\"&&!isObject(val=fn.call(it)))return val;if(!S&&typeof(fn=it.toString)==\"function\"&&!isObject(val=fn.call(it)))return val;throw TypeError(\"Can't convert object to primitive value\")}},function(module,exports,__webpack_require__){var anObject=__webpack_require__(27);var dPs=__webpack_require__(130);var enumBugKeys=__webpack_require__(58);var IE_PROTO=__webpack_require__(56)(\"IE_PROTO\")\n;var Empty=function(){};var PROTOTYPE=\"prototype\";var createDict=function(){var iframe=__webpack_require__(82)(\"iframe\");var i=enumBugKeys.length;var lt=\"<\";var gt=\">\";var iframeDocument;iframe.style.display=\"none\";__webpack_require__(134).appendChild(iframe);iframe.src=\"javascript:\";iframeDocument=iframe.contentWindow.document;iframeDocument.open();iframeDocument.write(lt+\"script\"+gt+\"document.F=Object\"+lt+\"/script\"+gt);iframeDocument.close();createDict=iframeDocument.F;while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]];return createDict()};module.exports=Object.create||function create(O,Properties){var result;if(O!==null){Empty[PROTOTYPE]=anObject(O);result=new Empty;Empty[PROTOTYPE]=null;result[IE_PROTO]=O}else result=createDict();return Properties===undefined?result:dPs(result,Properties)}},function(module,exports){var ceil=Math.ceil;var floor=Math.floor;module.exports=function(it){return isNaN(it=+it)?0:(it>0?floor:ceil)(it)}},function(module,exports,__webpack_require__){var shared=__webpack_require__(57)(\"keys\");var uid=__webpack_require__(40);module.exports=function(key){return shared[key]||(shared[key]=uid(key))}},function(module,exports,__webpack_require__){var global=__webpack_require__(18);var SHARED=\"__core-js_shared__\";var store=global[SHARED]||(global[SHARED]={});module.exports=function(key){return store[key]||(store[key]={})}},function(module,exports){module.exports=\"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\")},function(module,exports,__webpack_require__){var def=__webpack_require__(20).f;var has=__webpack_require__(22);var TAG=__webpack_require__(13)(\"toStringTag\");module.exports=function(it,tag,stat){if(it&&!has(it=stat?it:it.prototype,TAG))def(it,TAG,{configurable:true,value:tag})}},function(module,exports,__webpack_require__){\"use strict\";var $at=__webpack_require__(135)(true);__webpack_require__(79)(String,\"String\",function(iterated){this._t=String(iterated);this._i=0},function(){var O=this._t;var index=this._i;var point;if(index>=O.length)return{value:undefined,done:true};point=$at(O,index);this._i+=point.length;return{value:point,done:false}})},function(module,exports,__webpack_require__){exports.f=__webpack_require__(13)},function(module,exports,__webpack_require__){var global=__webpack_require__(18);var core=__webpack_require__(7);var LIBRARY=__webpack_require__(52);var wksExt=__webpack_require__(61);var defineProperty=__webpack_require__(20).f;module.exports=function(name){var $Symbol=core.Symbol||(core.Symbol=LIBRARY?{}:global.Symbol||{});if(name.charAt(0)!=\"_\"&&!(name in $Symbol))defineProperty($Symbol,name,{value:wksExt.f(name)})}},function(module,exports){exports.f=Object.getOwnPropertySymbols},function(module,exports,__webpack_require__){\"use strict\";var _keys=__webpack_require__(8);var _keys2=_interopRequireDefault(_keys);var _stringify=__webpack_require__(19);var _stringify2=_interopRequireDefault(_stringify);var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var moment=__webpack_require__(9);var Component=__webpack_require__(16);var DateUtil=__webpack_require__(36);function Range(body,options){var now=moment().hours(0).minutes(0).seconds(0).milliseconds(0);var start=now.clone().add(-3,\"days\").valueOf();var end=now.clone().add(3,\"days\").valueOf();this.millisecondsPerPixelCache=undefined;if(options===undefined){this.start=start;this.end=end}else{this.start=options.start||start;this.end=options.end||end}this.rolling=false;this.body=body;this.deltaDifference=0;this.scaleOffset=0;this.startToFront=false;this.endToFront=true;this.defaultOptions={rtl:false,start:null,end:null,moment:moment,direction:\"horizontal\",moveable:true,zoomable:true,min:null,max:null,zoomMin:10,zoomMax:1e3*60*60*24*365*1e4,rollingMode:{follow:false,offset:.5}};this.options=util.extend({},this.defaultOptions);this.props={touch:{}};this.animationTimer=null;this.body.emitter.on(\"panstart\",this._onDragStart.bind(this));this.body.emitter.on(\"panmove\",this._onDrag.bind(this));this.body.emitter.on(\"panend\",this._onDragEnd.bind(this));this.body.emitter.on(\"mousewheel\",this._onMouseWheel.bind(this));this.body.emitter.on(\"touch\",this._onTouch.bind(this));this.body.emitter.on(\"pinch\",this._onPinch.bind(this));this.body.dom.rollingModeBtn.addEventListener(\"click\",this.startRolling.bind(this));this.setOptions(options)}Range.prototype=new Component;Range.prototype.setOptions=function(options){if(options){var fields=[\"animation\",\"direction\",\"min\",\"max\",\"zoomMin\",\"zoomMax\",\"moveable\",\"zoomable\",\"moment\",\"activate\",\"hiddenDates\",\"zoomKey\",\"rtl\",\"showCurrentTime\",\"rollingMode\",\"horizontalScroll\"];util.selectiveExtend(fields,this.options,options);if(options.rollingMode&&options.rollingMode.follow){this.startRolling()}if(\"start\"in options||\"end\"in options){this.setRange(options.start,options.end)}}};function validateDirection(direction){if(direction!=\"horizontal\"&&direction!=\"vertical\"){throw new TypeError('Unknown direction \"'+direction+'\". '+'Choose \"horizontal\" or \"vertical\".')}}Range.prototype.startRolling=function(){var me=this;function update(){me.stopRolling();me.rolling=true;var interval=me.end-me.start;var t=util.convert(new Date,\"Date\").valueOf();var start=t-interval*me.options.rollingMode.offset;var end=t+interval*(1-me.options.rollingMode.offset);var options={animation:false};me.setRange(start,end,options);var scale=me.conversion(me.body.domProps.center.width).scale;interval=1/scale/10;if(interval<30)interval=30;if(interval>1e3)interval=1e3;me.body.dom.rollingModeBtn.style.visibility=\"hidden\";me.currentTimeTimer=setTimeout(update,interval)}update()};Range.prototype.stopRolling=function(){if(this.currentTimeTimer!==undefined){clearTimeout(this.currentTimeTimer);this.rolling=false;this.body.dom.rollingModeBtn.style.visibility=\"visible\"}};Range.prototype.setRange=function(start,end,options,callback,frameCallback){if(!options){options={}}if(options.byUser!==true){options.byUser=false}var me=this;var finalStart=start!=undefined?util.convert(start,\"Date\").valueOf():null;var finalEnd=end!=undefined?util.convert(end,\"Date\").valueOf():null;this._cancelAnimation();this.millisecondsPerPixelCache=undefined;if(options.animation){var initStart=this.start;var initEnd=this.end;var duration=(0,_typeof3[\"default\"])(options.animation)===\"object\"&&\"duration\"in options.animation?options.animation.duration:500;var easingName=(0,_typeof3[\"default\"])(options.animation)===\"object\"&&\"easingFunction\"in options.animation?options.animation.easingFunction:\"easeInOutQuad\";var easingFunction=util.easingFunctions[easingName];if(!easingFunction){throw new Error(\"Unknown easing function \"+(0,_stringify2[\"default\"])(easingName)+\". \"+\"Choose from: \"+(0,_keys2[\"default\"])(util.easingFunctions).join(\", \"))}var initTime=(new Date).valueOf();var anyChanged=false;var next=function next(){if(!me.props.touch.dragging){var now=(new Date).valueOf();var time=now-initTime;var ease=easingFunction(time/duration);var done=time>duration;var s=done||finalStart===null?finalStart:initStart+(finalStart-initStart)*ease;var e=done||finalEnd===null?finalEnd:initEnd+(finalEnd-initEnd)*ease;changed=me._applyRange(s,e);DateUtil.updateHiddenDates(me.options.moment,me.body,me.options.hiddenDates);anyChanged=anyChanged||changed;var params={start:new Date(me.start),end:new Date(me.end),byUser:options.byUser,event:options.event};if(frameCallback){frameCallback(ease,changed,done)}if(changed){me.body.emitter.emit(\"rangechange\",params)}if(done){if(anyChanged){me.body.emitter.emit(\"rangechanged\",params);if(callback){return callback()}}}else{me.animationTimer=setTimeout(next,20)}}};return next()}else{var changed=this._applyRange(finalStart,finalEnd);DateUtil.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates);if(changed){var params={start:new Date(this.start),end:new Date(this.end),byUser:options.byUser,event:options.event};this.body.emitter.emit(\"rangechange\",params);clearTimeout(me.timeoutID);me.timeoutID=setTimeout(function(){me.body.emitter.emit(\"rangechanged\",params)},200);if(callback){return callback()}}}};Range.prototype.getMillisecondsPerPixel=function(){if(this.millisecondsPerPixelCache===undefined){this.millisecondsPerPixelCache=(this.end-this.start)/this.body.dom.center.clientWidth}return this.millisecondsPerPixelCache};Range.prototype._cancelAnimation=function(){if(this.animationTimer){clearTimeout(this.animationTimer);this.animationTimer=null}};Range.prototype._applyRange=function(start,end){var newStart=start!=null?util.convert(start,\"Date\").valueOf():this.start,newEnd=end!=null?util.convert(end,\"Date\").valueOf():this.end,max=this.options.max!=null?util.convert(this.options.max,\"Date\").valueOf():null,min=this.options.min!=null?util.convert(this.options.min,\"Date\").valueOf():null,diff;if(isNaN(newStart)||newStart===null){throw new Error('Invalid start \"'+start+'\"')}if(isNaN(newEnd)||newEnd===null){throw new Error('Invalid end \"'+end+'\"')}if(newEnd<newStart){newEnd=newStart}if(min!==null){if(newStart<min){diff=min-newStart;newStart+=diff;newEnd+=diff;if(max!=null){if(newEnd>max){newEnd=max}}}}if(max!==null){if(newEnd>max){diff=newEnd-max;newStart-=diff;newEnd-=diff;if(min!=null){if(newStart<min){newStart=min}}}}if(this.options.zoomMin!==null){var zoomMin=parseFloat(this.options.zoomMin);if(zoomMin<0){zoomMin=0}if(newEnd-newStart<zoomMin){var compensation=.5;if(this.end-this.start===zoomMin&&newStart>=this.start-compensation&&newEnd<=this.end){newStart=this.start;newEnd=this.end}else{diff=zoomMin-(newEnd-newStart);newStart-=diff/2;newEnd+=diff/2}}}if(this.options.zoomMax!==null){var zoomMax=parseFloat(this.options.zoomMax);if(zoomMax<0){zoomMax=0}if(newEnd-newStart>zoomMax){if(this.end-this.start===zoomMax&&newStart<this.start&&newEnd>this.end){newStart=this.start;newEnd=this.end}else{diff=newEnd-newStart-zoomMax;newStart+=diff/2;newEnd-=diff/2}}}var changed=this.start!=newStart||this.end!=newEnd;if(!(newStart>=this.start&&newStart<=this.end||newEnd>=this.start&&newEnd<=this.end)&&!(this.start>=newStart&&this.start<=newEnd||this.end>=newStart&&this.end<=newEnd)){this.body.emitter.emit(\"checkRangedItems\")}this.start=newStart;this.end=newEnd;return changed};Range.prototype.getRange=function(){return{start:this.start,end:this.end}};Range.prototype.conversion=function(width,totalHidden){return Range.conversion(this.start,this.end,width,totalHidden)};Range.conversion=function(start,end,width,totalHidden){if(totalHidden===undefined){totalHidden=0}if(width!=0&&end-start!=0){return{offset:start,scale:width/(end-start-totalHidden)}}else{return{offset:0,scale:1}}};Range.prototype._onDragStart=function(event){this.deltaDifference=0;this.previousDelta=0;if(!this.options.moveable)return;if(!this._isInsideRange(event))return;if(!this.props.touch.allowDragging)return;this.stopRolling();this.props.touch.start=this.start;this.props.touch.end=this.end;this.props.touch.dragging=true;if(this.body.dom.root){this.body.dom.root.style.cursor=\"move\"}};Range.prototype._onDrag=function(event){if(!event)return;if(!this.props.touch.dragging)return;if(!this.options.moveable)return;if(!this.props.touch.allowDragging)return;var direction=this.options.direction;validateDirection(direction);var delta=direction==\"horizontal\"?event.deltaX:event.deltaY;delta-=this.deltaDifference;var interval=this.props.touch.end-this.props.touch.start;var duration=DateUtil.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);interval-=duration;var width=direction==\"horizontal\"?this.body.domProps.center.width:this.body.domProps.center.height;var diffRange;if(this.options.rtl){diffRange=delta/width*interval}else{diffRange=-delta/width*interval}var newStart=this.props.touch.start+diffRange;var newEnd=this.props.touch.end+diffRange;var safeStart=DateUtil.snapAwayFromHidden(this.body.hiddenDates,newStart,this.previousDelta-delta,true);var safeEnd=DateUtil.snapAwayFromHidden(this.body.hiddenDates,newEnd,this.previousDelta-delta,true);if(safeStart!=newStart||safeEnd!=newEnd){this.deltaDifference+=delta;this.props.touch.start=safeStart;this.props.touch.end=safeEnd;this._onDrag(event);return}this.previousDelta=delta;this._applyRange(newStart,newEnd);var startDate=new Date(this.start);var endDate=new Date(this.end);this.body.emitter.emit(\"rangechange\",{start:startDate,end:endDate,byUser:true,event:event});this.body.emitter.emit(\"panmove\")};Range.prototype._onDragEnd=function(event){if(!this.props.touch.dragging)return;if(!this.options.moveable)return;if(!this.props.touch.allowDragging)return;this.props.touch.dragging=false;if(this.body.dom.root){this.body.dom.root.style.cursor=\"auto\"}this.body.emitter.emit(\"rangechanged\",{start:new Date(this.start),end:new Date(this.end),byUser:true,event:event})};Range.prototype._onMouseWheel=function(event){var delta=0;if(event.wheelDelta){delta=event.wheelDelta/120}else if(event.detail){delta=-event.detail/3}if(this.options.zoomKey&&!event[this.options.zoomKey]&&this.options.zoomable||!this.options.zoomable&&this.options.moveable){return}if(!(this.options.zoomable&&this.options.moveable))return;if(!this._isInsideRange(event))return;if(delta){var scale;if(delta<0){scale=1-delta/5}else{scale=1/(1+delta/5)}var pointerDate;if(this.rolling){pointerDate=this.start+(this.end-this.start)*this.options.rollingMode.offset}else{var pointer=this.getPointer({x:event.clientX,y:event.clientY},this.body.dom.center);pointerDate=this._pointerToDate(pointer)}this.zoom(scale,pointerDate,delta,event);event.preventDefault()}};Range.prototype._onTouch=function(event){this.props.touch.start=this.start;this.props.touch.end=this.end;this.props.touch.allowDragging=true;this.props.touch.center=null;this.scaleOffset=0;this.deltaDifference=0;util.preventDefault(event)};Range.prototype._onPinch=function(event){if(!(this.options.zoomable&&this.options.moveable))return;util.preventDefault(event);this.props.touch.allowDragging=false;if(!this.props.touch.center){this.props.touch.center=this.getPointer(event.center,this.body.dom.center)}this.stopRolling();var scale=1/(event.scale+this.scaleOffset);var centerDate=this._pointerToDate(this.props.touch.center);var hiddenDuration=DateUtil.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);var hiddenDurationBefore=DateUtil.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,centerDate);var hiddenDurationAfter=hiddenDuration-hiddenDurationBefore;var newStart=centerDate-hiddenDurationBefore+(this.props.touch.start-(centerDate-hiddenDurationBefore))*scale;var newEnd=centerDate+hiddenDurationAfter+(this.props.touch.end-(centerDate+hiddenDurationAfter))*scale;this.startToFront=1-scale<=0;this.endToFront=scale-1<=0;var safeStart=DateUtil.snapAwayFromHidden(this.body.hiddenDates,newStart,1-scale,true);var safeEnd=DateUtil.snapAwayFromHidden(this.body.hiddenDates,newEnd,scale-1,true);if(safeStart!=newStart||safeEnd!=newEnd){this.props.touch.start=safeStart;this.props.touch.end=safeEnd;this.scaleOffset=1-event.scale;newStart=safeStart;newEnd=safeEnd}var options={animation:false,byUser:true,event:event};this.setRange(newStart,newEnd,options);this.startToFront=false;this.endToFront=true};Range.prototype._isInsideRange=function(event){var clientX=event.center?event.center.x:event.clientX;var x;if(this.options.rtl){x=clientX-util.getAbsoluteLeft(this.body.dom.centerContainer)}else{x=util.getAbsoluteRight(this.body.dom.centerContainer)-clientX}var time=this.body.util.toTime(x);return time>=this.start&&time<=this.end};Range.prototype._pointerToDate=function(pointer){var conversion;var direction=this.options.direction;validateDirection(direction);if(direction==\"horizontal\"){return this.body.util.toTime(pointer.x).valueOf()}else{var height=this.body.domProps.center.height;conversion=this.conversion(height);return pointer.y/conversion.scale+conversion.offset}};Range.prototype.getPointer=function(touch,element){if(this.options.rtl){return{x:util.getAbsoluteRight(element)-touch.x,y:touch.y-util.getAbsoluteTop(element)}}else{return{x:touch.x-util.getAbsoluteLeft(element),y:touch.y-util.getAbsoluteTop(element)}}};Range.prototype.zoom=function(scale,center,delta,event){if(center==null){center=(this.start+this.end)/2}var hiddenDuration=DateUtil.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);var hiddenDurationBefore=DateUtil.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,center);var hiddenDurationAfter=hiddenDuration-hiddenDurationBefore;var newStart=center-hiddenDurationBefore+(this.start-(center-hiddenDurationBefore))*scale;var newEnd=center+hiddenDurationAfter+(this.end-(center+hiddenDurationAfter))*scale;this.startToFront=delta>0?false:true;this.endToFront=-delta>0?false:true;var safeStart=DateUtil.snapAwayFromHidden(this.body.hiddenDates,newStart,delta,true);var safeEnd=DateUtil.snapAwayFromHidden(this.body.hiddenDates,newEnd,-delta,true);if(safeStart!=newStart||safeEnd!=newEnd){newStart=safeStart;newEnd=safeEnd}var options={animation:false,byUser:true,event:event};this.setRange(newStart,newEnd,options);this.startToFront=false;this.endToFront=true};Range.prototype.move=function(delta){var diff=this.end-this.start;var newStart=this.start+diff*delta;var newEnd=this.end+diff*delta;this.start=newStart;this.end=newEnd};Range.prototype.moveTo=function(moveTo){var center=(this.start+this.end)/2;var diff=center-moveTo;var newStart=this.start-diff;var newEnd=this.end-diff;var options={animation:false,byUser:true,event:null};this.setRange(newStart,newEnd,options)};module.exports=Range},function(module,exports,__webpack_require__){\"use strict\";var _stringify=__webpack_require__(19);var _stringify2=_interopRequireDefault(_stringify);var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Emitter=__webpack_require__(44);var Hammer=__webpack_require__(10);var hammerUtil=__webpack_require__(37);var util=__webpack_require__(2);var TimeAxis=__webpack_require__(45);var Activator=__webpack_require__(97);var DateUtil=__webpack_require__(36);var CustomTime=__webpack_require__(46);function Core(){}Emitter(Core.prototype);Core.prototype._create=function(container){this.dom={};this.dom.container=container;this.dom.root=document.createElement(\"div\");this.dom.background=document.createElement(\"div\");this.dom.backgroundVertical=document.createElement(\"div\");this.dom.backgroundHorizontal=document.createElement(\"div\");this.dom.centerContainer=document.createElement(\"div\");this.dom.leftContainer=document.createElement(\"div\");this.dom.rightContainer=document.createElement(\"div\");this.dom.center=document.createElement(\"div\");this.dom.left=document.createElement(\"div\");this.dom.right=document.createElement(\"div\");this.dom.top=document.createElement(\"div\");this.dom.bottom=document.createElement(\"div\");this.dom.shadowTop=document.createElement(\"div\");this.dom.shadowBottom=document.createElement(\"div\");this.dom.shadowTopLeft=document.createElement(\"div\");this.dom.shadowBottomLeft=document.createElement(\"div\");this.dom.shadowTopRight=document.createElement(\"div\");this.dom.shadowBottomRight=document.createElement(\"div\");this.dom.rollingModeBtn=document.createElement(\"div\");this.dom.root.className=\"vis-timeline\";this.dom.background.className=\"vis-panel vis-background\";this.dom.backgroundVertical.className=\"vis-panel vis-background vis-vertical\";this.dom.backgroundHorizontal.className=\"vis-panel vis-background vis-horizontal\";this.dom.centerContainer.className=\"vis-panel vis-center\";this.dom.leftContainer.className=\"vis-panel vis-left\";this.dom.rightContainer.className=\"vis-panel vis-right\";this.dom.top.className=\"vis-panel vis-top\";this.dom.bottom.className=\"vis-panel vis-bottom\";this.dom.left.className=\"vis-content\";this.dom.center.className=\"vis-content\";this.dom.right.className=\"vis-content\";this.dom.shadowTop.className=\"vis-shadow vis-top\";this.dom.shadowBottom.className=\"vis-shadow vis-bottom\";this.dom.shadowTopLeft.className=\"vis-shadow vis-top\";this.dom.shadowBottomLeft.className=\"vis-shadow vis-bottom\";this.dom.shadowTopRight.className=\"vis-shadow vis-top\";this.dom.shadowBottomRight.className=\"vis-shadow vis-bottom\";this.dom.rollingModeBtn.className=\"vis-rolling-mode-btn\";this.dom.root.appendChild(this.dom.background);this.dom.root.appendChild(this.dom.backgroundVertical);this.dom.root.appendChild(this.dom.backgroundHorizontal);this.dom.root.appendChild(this.dom.centerContainer);this.dom.root.appendChild(this.dom.leftContainer);this.dom.root.appendChild(this.dom.rightContainer);this.dom.root.appendChild(this.dom.top);this.dom.root.appendChild(this.dom.bottom);this.dom.root.appendChild(this.dom.bottom);this.dom.root.appendChild(this.dom.rollingModeBtn);this.dom.centerContainer.appendChild(this.dom.center);this.dom.leftContainer.appendChild(this.dom.left);this.dom.rightContainer.appendChild(this.dom.right);this.dom.centerContainer.appendChild(this.dom.shadowTop);this.dom.centerContainer.appendChild(this.dom.shadowBottom);this.dom.leftContainer.appendChild(this.dom.shadowTopLeft);this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft);this.dom.rightContainer.appendChild(this.dom.shadowTopRight);this.dom.rightContainer.appendChild(this.dom.shadowBottomRight);this.props={root:{},background:{},centerContainer:{},leftContainer:{},rightContainer:{},center:{},left:{},right:{},top:{},bottom:{},border:{},scrollTop:0,scrollTopMin:0};this.on(\"rangechange\",function(){if(this.initialDrawDone===true){this._redraw()}}.bind(this));this.on(\"rangechanged\",function(){if(!this.initialRangeChangeDone){this.initialRangeChangeDone=true}}.bind(this));this.on(\"touch\",this._onTouch.bind(this));this.on(\"panmove\",this._onDrag.bind(this));var me=this;this._origRedraw=this._redraw.bind(this);this._redraw=util.throttle(this._origRedraw);this.on(\"_change\",function(properties){if(me.itemSet&&me.itemSet.initialItemSetDrawn&&properties&&properties.queue==true){me._redraw()}else{me._origRedraw()}});this.hammer=new Hammer(this.dom.root);var pinchRecognizer=this.hammer.get(\"pinch\").set({enable:true});hammerUtil.disablePreventDefaultVertically(pinchRecognizer);this.hammer.get(\"pan\").set({threshold:5,direction:Hammer.DIRECTION_HORIZONTAL});this.listeners={};var events=[\"tap\",\"doubletap\",\"press\",\"pinch\",\"pan\",\"panstart\",\"panmove\",\"panend\"];events.forEach(function(type){var listener=function listener(event){if(me.isActive()){me.emit(type,event)}};me.hammer.on(type,listener);me.listeners[type]=listener});hammerUtil.onTouch(this.hammer,function(event){me.emit(\"touch\",event)}.bind(this));hammerUtil.onRelease(this.hammer,function(event){me.emit(\"release\",event)}.bind(this));function onMouseWheel(event){if(this.isActive()){this.emit(\"mousewheel\",event)}var deltaX=0;var deltaY=0;if(\"detail\"in event){deltaY=event.detail*-1}if(\"wheelDelta\"in event){deltaY=event.wheelDelta}if(\"wheelDeltaY\"in event){deltaY=event.wheelDeltaY}if(\"wheelDeltaX\"in event){deltaX=event.wheelDeltaX*-1}if(\"axis\"in event&&event.axis===event.HORIZONTAL_AXIS){deltaX=deltaY*-1;deltaY=0}if(\"deltaY\"in event){deltaY=event.deltaY*-1}if(\"deltaX\"in event){deltaX=event.deltaX}if(!this.options.zoomKey||event[this.options.zoomKey])return;event.preventDefault();if(this.options.verticalScroll&&Math.abs(deltaY)>=Math.abs(deltaX)){var current=this.props.scrollTop;var adjusted=current+deltaY;if(this.isActive()){this._setScrollTop(adjusted);this._redraw();this.emit(\"scroll\",event)}}else if(this.options.horizontalScroll){var delta=Math.abs(deltaX)>=Math.abs(deltaY)?deltaX:deltaY;var diff=delta/120*(this.range.end-this.range.start)/20;var newStart=this.range.start+diff;var newEnd=this.range.end+diff;var options={animation:false,byUser:true,event:event};this.range.setRange(newStart,newEnd,options)}}if(this.dom.centerContainer.addEventListener){this.dom.centerContainer.addEventListener(\"mousewheel\",onMouseWheel.bind(this),false);this.dom.centerContainer.addEventListener(\"DOMMouseScroll\",onMouseWheel.bind(this),false)}else{this.dom.centerContainer.attachEvent(\"onmousewheel\",onMouseWheel.bind(this))}function onMouseScrollSide(event){if(!me.options.verticalScroll)return;event.preventDefault();if(me.isActive()){var adjusted=-event.target.scrollTop;me._setScrollTop(adjusted);me._redraw();me.emit(\"scrollSide\",event)}}this.dom.left.parentNode.addEventListener(\"scroll\",onMouseScrollSide.bind(this));this.dom.right.parentNode.addEventListener(\"scroll\",onMouseScrollSide.bind(this));var itemAddedToTimeline=false;function handleDragOver(event){if(event.preventDefault){event.preventDefault()}if(!event.target.className.indexOf(\"vis\")>-1)return;if(itemAddedToTimeline)return;event.dataTransfer.dropEffect=\"move\";itemAddedToTimeline=true;return false}function handleDrop(event){if(event.preventDefault){event.preventDefault()}if(event.stopPropagation){event.stopPropagation()}try{var itemData=JSON.parse(event.dataTransfer.getData(\"text\"));if(!itemData||!itemData.content)return}catch(err){return false}itemAddedToTimeline=false;event.center={x:event.clientX,y:event.clientY};if(itemData.target!==\"item\"){me.itemSet._onAddItem(event)}else{me.itemSet._onDropObjectOnItem(event)}me.emit(\"drop\",me.getEventProperties(event));return false}this.dom.center.addEventListener(\"dragover\",handleDragOver.bind(this),false);this.dom.center.addEventListener(\"drop\",handleDrop.bind(this),false);this.customTimes=[];this.touch={};this.redrawCount=0;this.initialDrawDone=false;this.initialRangeChangeDone=false;if(!container)throw new Error(\"No container provided\");container.appendChild(this.dom.root)};Core.prototype.setOptions=function(options){if(options){var fields=[\"width\",\"height\",\"minHeight\",\"maxHeight\",\"autoResize\",\"start\",\"end\",\"clickToUse\",\"dataAttributes\",\"hiddenDates\",\"locale\",\"locales\",\"moment\",\"rtl\",\"zoomKey\",\"horizontalScroll\",\"verticalScroll\"];util.selectiveExtend(fields,this.options,options);this.dom.rollingModeBtn.style.visibility=\"hidden\";if(this.options.rtl){this.dom.container.style.direction=\"rtl\";this.dom.backgroundVertical.className=\"vis-panel vis-background vis-vertical-rtl\"}if(this.options.verticalScroll){if(this.options.rtl){this.dom.rightContainer.className=\"vis-panel vis-right vis-vertical-scroll\"}else{this.dom.leftContainer.className=\"vis-panel vis-left vis-vertical-scroll\"}}if((0,_typeof3[\"default\"])(this.options.orientation)!==\"object\"){this.options.orientation={item:undefined,axis:undefined}}if(\"orientation\"in options){if(typeof options.orientation===\"string\"){this.options.orientation={item:options.orientation,axis:options.orientation}}else if((0,_typeof3[\"default\"])(options.orientation)===\"object\"){if(\"item\"in options.orientation){this.options.orientation.item=options.orientation.item}if(\"axis\"in options.orientation){this.options.orientation.axis=options.orientation.axis}}}if(this.options.orientation.axis===\"both\"){if(!this.timeAxis2){var timeAxis2=this.timeAxis2=new TimeAxis(this.body);timeAxis2.setOptions=function(options){var _options=options?util.extend({},options):{};_options.orientation=\"top\";TimeAxis.prototype.setOptions.call(timeAxis2,_options)};this.components.push(timeAxis2)}}else{if(this.timeAxis2){var index=this.components.indexOf(this.timeAxis2);if(index!==-1){this.components.splice(index,1)}this.timeAxis2.destroy();this.timeAxis2=null}}if(typeof options.drawPoints==\"function\"){options.drawPoints={onRender:options.drawPoints}}if(\"hiddenDates\"in this.options){DateUtil.convertHiddenOptions(this.options.moment,this.body,this.options.hiddenDates)}if(\"clickToUse\"in options){if(options.clickToUse){if(!this.activator){this.activator=new Activator(this.dom.root)}}else{if(this.activator){this.activator.destroy();delete this.activator}}}if(\"showCustomTime\"in options){throw new Error(\"Option `showCustomTime` is deprecated. Create a custom time bar via timeline.addCustomTime(time [, id])\")}this._initAutoResize()}this.components.forEach(function(component){return component.setOptions(options)});if(\"configure\"in options){if(!this.configurator){this.configurator=this._createConfigurator()}this.configurator.setOptions(options.configure);var appliedOptions=util.deepExtend({},this.options);this.components.forEach(function(component){util.deepExtend(appliedOptions,component.options)});this.configurator.setModuleOptions({global:appliedOptions})}this._redraw()};Core.prototype.isActive=function(){return!this.activator||this.activator.active};Core.prototype.destroy=function(){this.setItems(null);this.setGroups(null);this.off();this._stopAutoResize();if(this.dom.root.parentNode){this.dom.root.parentNode.removeChild(this.dom.root)}this.dom=null;if(this.activator){this.activator.destroy();delete this.activator}for(var event in this.listeners){if(this.listeners.hasOwnProperty(event)){delete this.listeners[event]}}this.listeners=null;this.hammer=null;this.components.forEach(function(component){return component.destroy()});this.body=null};Core.prototype.setCustomTime=function(time,id){var customTimes=this.customTimes.filter(function(component){return id===component.options.id});if(customTimes.length===0){throw new Error(\"No custom time bar found with id \"+(0,_stringify2[\"default\"])(id))}if(customTimes.length>0){customTimes[0].setCustomTime(time)}};Core.prototype.getCustomTime=function(id){var customTimes=this.customTimes.filter(function(component){return component.options.id===id});if(customTimes.length===0){throw new Error(\"No custom time bar found with id \"+(0,_stringify2[\"default\"])(id))}return customTimes[0].getCustomTime()};Core.prototype.setCustomTimeTitle=function(title,id){var customTimes=this.customTimes.filter(function(component){return component.options.id===id});if(customTimes.length===0){throw new Error(\"No custom time bar found with id \"+(0,_stringify2[\"default\"])(id))}if(customTimes.length>0){return customTimes[0].setCustomTitle(title)}};Core.prototype.getEventProperties=function(event){return{event:event}};Core.prototype.addCustomTime=function(time,id){var timestamp=time!==undefined?util.convert(time,\"Date\").valueOf():new Date;var exists=this.customTimes.some(function(customTime){return customTime.options.id===id});if(exists){throw new Error(\"A custom time with id \"+(0,_stringify2[\"default\"])(id)+\" already exists\")}var customTime=new CustomTime(this.body,util.extend({},this.options,{time:timestamp,id:id}));this.customTimes.push(customTime);this.components.push(customTime);this._redraw();return id};Core.prototype.removeCustomTime=function(id){var customTimes=this.customTimes.filter(function(bar){return bar.options.id===id});if(customTimes.length===0){throw new Error(\"No custom time bar found with id \"+(0,_stringify2[\"default\"])(id))}customTimes.forEach(function(customTime){this.customTimes.splice(this.customTimes.indexOf(customTime),1);this.components.splice(this.components.indexOf(customTime),1);customTime.destroy()}.bind(this))};Core.prototype.getVisibleItems=function(){return this.itemSet&&this.itemSet.getVisibleItems()||[]};Core.prototype.fit=function(options,callback){var range=this.getDataRange();if(range.min===null&&range.max===null){return}var interval=range.max-range.min;var min=new Date(range.min.valueOf()-interval*.01);var max=new Date(range.max.valueOf()+interval*.01);var animation=options&&options.animation!==undefined?options.animation:true;this.range.setRange(min,max,{animation:animation},callback)};Core.prototype.getDataRange=function(){throw new Error(\"Cannot invoke abstract method getDataRange\")};Core.prototype.setWindow=function(start,end,options,callback){if(typeof arguments[2]==\"function\"){callback=arguments[2];options={}}var animation;var range;if(arguments.length==1){range=arguments[0];animation=range.animation!==undefined?range.animation:true;this.range.setRange(range.start,range.end,{animation:animation})}else if(arguments.length==2&&typeof arguments[1]==\"function\"){range=arguments[0];callback=arguments[1];animation=range.animation!==undefined?range.animation:true\n;this.range.setRange(range.start,range.end,{animation:animation},callback)}else{animation=options&&options.animation!==undefined?options.animation:true;this.range.setRange(start,end,{animation:animation},callback)}};Core.prototype.moveTo=function(time,options,callback){if(typeof arguments[1]==\"function\"){callback=arguments[1];options={}}var interval=this.range.end-this.range.start;var t=util.convert(time,\"Date\").valueOf();var start=t-interval/2;var end=t+interval/2;var animation=options&&options.animation!==undefined?options.animation:true;this.range.setRange(start,end,{animation:animation},callback)};Core.prototype.getWindow=function(){var range=this.range.getRange();return{start:new Date(range.start),end:new Date(range.end)}};Core.prototype.zoomIn=function(percentage,options,callback){if(!percentage||percentage<0||percentage>1)return;if(typeof arguments[1]==\"function\"){callback=arguments[1];options={}}var range=this.getWindow();var start=range.start.valueOf();var end=range.end.valueOf();var interval=end-start;var newInterval=interval/(1+percentage);var distance=(interval-newInterval)/2;var newStart=start+distance;var newEnd=end-distance;this.setWindow(newStart,newEnd,options,callback)};Core.prototype.zoomOut=function(percentage,options,callback){if(!percentage||percentage<0||percentage>1)return;if(typeof arguments[1]==\"function\"){callback=arguments[1];options={}}var range=this.getWindow();var start=range.start.valueOf();var end=range.end.valueOf();var interval=end-start;var newStart=start-interval*percentage/2;var newEnd=end+interval*percentage/2;this.setWindow(newStart,newEnd,options,callback)};Core.prototype.redraw=function(){this._redraw()};Core.prototype._redraw=function(){this.redrawCount++;var resized=false;var options=this.options;var props=this.props;var dom=this.dom;if(!dom||!dom.container||dom.root.offsetWidth==0)return;DateUtil.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates);if(options.orientation==\"top\"){util.addClassName(dom.root,\"vis-top\");util.removeClassName(dom.root,\"vis-bottom\")}else{util.removeClassName(dom.root,\"vis-top\");util.addClassName(dom.root,\"vis-bottom\")}dom.root.style.maxHeight=util.option.asSize(options.maxHeight,\"\");dom.root.style.minHeight=util.option.asSize(options.minHeight,\"\");dom.root.style.width=util.option.asSize(options.width,\"\");props.border.left=(dom.centerContainer.offsetWidth-dom.centerContainer.clientWidth)/2;props.border.right=props.border.left;props.border.top=(dom.centerContainer.offsetHeight-dom.centerContainer.clientHeight)/2;props.border.bottom=props.border.top;props.borderRootHeight=dom.root.offsetHeight-dom.root.clientHeight;props.borderRootWidth=dom.root.offsetWidth-dom.root.clientWidth;if(dom.centerContainer.clientHeight===0){props.border.left=props.border.top;props.border.right=props.border.left}if(dom.root.clientHeight===0){props.borderRootWidth=props.borderRootHeight}props.center.height=dom.center.offsetHeight;props.left.height=dom.left.offsetHeight;props.right.height=dom.right.offsetHeight;props.top.height=dom.top.clientHeight||-props.border.top;props.bottom.height=dom.bottom.clientHeight||-props.border.bottom;var contentHeight=Math.max(props.left.height,props.center.height,props.right.height);var autoHeight=props.top.height+contentHeight+props.bottom.height+props.borderRootHeight+props.border.top+props.border.bottom;dom.root.style.height=util.option.asSize(options.height,autoHeight+\"px\");props.root.height=dom.root.offsetHeight;props.background.height=props.root.height-props.borderRootHeight;var containerHeight=props.root.height-props.top.height-props.bottom.height-props.borderRootHeight;props.centerContainer.height=containerHeight;props.leftContainer.height=containerHeight;props.rightContainer.height=props.leftContainer.height;props.root.width=dom.root.offsetWidth;props.background.width=props.root.width-props.borderRootWidth;if(!this.initialDrawDone){props.scrollbarWidth=util.getScrollBarWidth()}if(options.verticalScroll){if(options.rtl){props.left.width=dom.leftContainer.clientWidth||-props.border.left;props.right.width=dom.rightContainer.clientWidth+props.scrollbarWidth||-props.border.right}else{props.left.width=dom.leftContainer.clientWidth+props.scrollbarWidth||-props.border.left;props.right.width=dom.rightContainer.clientWidth||-props.border.right}}else{props.left.width=dom.leftContainer.clientWidth||-props.border.left;props.right.width=dom.rightContainer.clientWidth||-props.border.right}this._setDOM();var offset=this._updateScrollTop();if(options.orientation.item!=\"top\"){offset+=Math.max(props.centerContainer.height-props.center.height-props.border.top-props.border.bottom,0)}dom.center.style.top=offset+\"px\";var visibilityTop=props.scrollTop==0?\"hidden\":\"\";var visibilityBottom=props.scrollTop==props.scrollTopMin?\"hidden\":\"\";dom.shadowTop.style.visibility=visibilityTop;dom.shadowBottom.style.visibility=visibilityBottom;dom.shadowTopLeft.style.visibility=visibilityTop;dom.shadowBottomLeft.style.visibility=visibilityBottom;dom.shadowTopRight.style.visibility=visibilityTop;dom.shadowBottomRight.style.visibility=visibilityBottom;if(options.verticalScroll){dom.rightContainer.className=\"vis-panel vis-right vis-vertical-scroll\";dom.leftContainer.className=\"vis-panel vis-left vis-vertical-scroll\";dom.shadowTopRight.style.visibility=\"hidden\";dom.shadowBottomRight.style.visibility=\"hidden\";dom.shadowTopLeft.style.visibility=\"hidden\";dom.shadowBottomLeft.style.visibility=\"hidden\";dom.left.style.top=\"0px\";dom.right.style.top=\"0px\"}if(!options.verticalScroll||props.center.height<props.centerContainer.height){dom.left.style.top=offset+\"px\";dom.right.style.top=offset+\"px\";dom.rightContainer.className=dom.rightContainer.className.replace(new RegExp(\"(?:^|\\\\s)\"+\"vis-vertical-scroll\"+\"(?:\\\\s|$)\"),\" \");dom.leftContainer.className=dom.leftContainer.className.replace(new RegExp(\"(?:^|\\\\s)\"+\"vis-vertical-scroll\"+\"(?:\\\\s|$)\"),\" \");props.left.width=dom.leftContainer.clientWidth||-props.border.left;props.right.width=dom.rightContainer.clientWidth||-props.border.right;this._setDOM()}var contentsOverflow=props.center.height>props.centerContainer.height;this.hammer.get(\"pan\").set({direction:contentsOverflow?Hammer.DIRECTION_ALL:Hammer.DIRECTION_HORIZONTAL});this.components.forEach(function(component){resized=component.redraw()||resized});var MAX_REDRAW=5;if(resized){if(this.redrawCount<MAX_REDRAW){this.body.emitter.emit(\"_change\");return}else{console.log(\"WARNING: infinite loop in redraw?\")}}else{this.redrawCount=0}this.body.emitter.emit(\"changed\")};Core.prototype._setDOM=function(){var props=this.props;var dom=this.dom;props.leftContainer.width=props.left.width;props.rightContainer.width=props.right.width;var centerWidth=props.root.width-props.left.width-props.right.width-props.borderRootWidth;props.center.width=centerWidth;props.centerContainer.width=centerWidth;props.top.width=centerWidth;props.bottom.width=centerWidth;dom.background.style.height=props.background.height+\"px\";dom.backgroundVertical.style.height=props.background.height+\"px\";dom.backgroundHorizontal.style.height=props.centerContainer.height+\"px\";dom.centerContainer.style.height=props.centerContainer.height+\"px\";dom.leftContainer.style.height=props.leftContainer.height+\"px\";dom.rightContainer.style.height=props.rightContainer.height+\"px\";dom.background.style.width=props.background.width+\"px\";dom.backgroundVertical.style.width=props.centerContainer.width+\"px\";dom.backgroundHorizontal.style.width=props.background.width+\"px\";dom.centerContainer.style.width=props.center.width+\"px\";dom.top.style.width=props.top.width+\"px\";dom.bottom.style.width=props.bottom.width+\"px\";dom.background.style.left=\"0\";dom.background.style.top=\"0\";dom.backgroundVertical.style.left=props.left.width+props.border.left+\"px\";dom.backgroundVertical.style.top=\"0\";dom.backgroundHorizontal.style.left=\"0\";dom.backgroundHorizontal.style.top=props.top.height+\"px\";dom.centerContainer.style.left=props.left.width+\"px\";dom.centerContainer.style.top=props.top.height+\"px\";dom.leftContainer.style.left=\"0\";dom.leftContainer.style.top=props.top.height+\"px\";dom.rightContainer.style.left=props.left.width+props.center.width+\"px\";dom.rightContainer.style.top=props.top.height+\"px\";dom.top.style.left=props.left.width+\"px\";dom.top.style.top=\"0\";dom.bottom.style.left=props.left.width+\"px\";dom.bottom.style.top=props.top.height+props.centerContainer.height+\"px\";dom.center.style.left=\"0\";dom.left.style.left=\"0\";dom.right.style.left=\"0\"};Core.prototype.repaint=function(){throw new Error(\"Function repaint is deprecated. Use redraw instead.\")};Core.prototype.setCurrentTime=function(time){if(!this.currentTime){throw new Error(\"Option showCurrentTime must be true\")}this.currentTime.setCurrentTime(time)};Core.prototype.getCurrentTime=function(){if(!this.currentTime){throw new Error(\"Option showCurrentTime must be true\")}return this.currentTime.getCurrentTime()};Core.prototype._toTime=function(x){return DateUtil.toTime(this,x,this.props.center.width)};Core.prototype._toGlobalTime=function(x){return DateUtil.toTime(this,x,this.props.root.width)};Core.prototype._toScreen=function(time){return DateUtil.toScreen(this,time,this.props.center.width)};Core.prototype._toGlobalScreen=function(time){return DateUtil.toScreen(this,time,this.props.root.width)};Core.prototype._initAutoResize=function(){if(this.options.autoResize==true){this._startAutoResize()}else{this._stopAutoResize()}};Core.prototype._startAutoResize=function(){var me=this;this._stopAutoResize();this._onResize=function(){if(me.options.autoResize!=true){me._stopAutoResize();return}if(me.dom.root){if(me.dom.root.offsetWidth!=me.props.lastWidth||me.dom.root.offsetHeight!=me.props.lastHeight){me.props.lastWidth=me.dom.root.offsetWidth;me.props.lastHeight=me.dom.root.offsetHeight;me.props.scrollbarWidth=util.getScrollBarWidth();me.body.emitter.emit(\"_change\")}}};util.addEventListener(window,\"resize\",this._onResize);if(me.dom.root){me.props.lastWidth=me.dom.root.offsetWidth;me.props.lastHeight=me.dom.root.offsetHeight}this.watchTimer=setInterval(this._onResize,1e3)};Core.prototype._stopAutoResize=function(){if(this.watchTimer){clearInterval(this.watchTimer);this.watchTimer=undefined}if(this._onResize){util.removeEventListener(window,\"resize\",this._onResize);this._onResize=null}};Core.prototype._onTouch=function(event){this.touch.allowDragging=true;this.touch.initialScrollTop=this.props.scrollTop};Core.prototype._onPinch=function(event){this.touch.allowDragging=false};Core.prototype._onDrag=function(event){if(!event)return;if(!this.touch.allowDragging)return;var delta=event.deltaY;var oldScrollTop=this._getScrollTop();var newScrollTop=this._setScrollTop(this.touch.initialScrollTop+delta);if(this.options.verticalScroll){this.dom.left.parentNode.scrollTop=-this.props.scrollTop;this.dom.right.parentNode.scrollTop=-this.props.scrollTop}if(newScrollTop!=oldScrollTop){this.emit(\"verticalDrag\")}};Core.prototype._setScrollTop=function(scrollTop){this.props.scrollTop=scrollTop;this._updateScrollTop();return this.props.scrollTop};Core.prototype._updateScrollTop=function(){var scrollTopMin=Math.min(this.props.centerContainer.height-this.props.center.height,0);if(scrollTopMin!=this.props.scrollTopMin){if(this.options.orientation.item!=\"top\"){this.props.scrollTop+=scrollTopMin-this.props.scrollTopMin}this.props.scrollTopMin=scrollTopMin}if(this.props.scrollTop>0)this.props.scrollTop=0;if(this.props.scrollTop<scrollTopMin)this.props.scrollTop=scrollTopMin;if(this.options.verticalScroll){this.dom.left.parentNode.scrollTop=-this.props.scrollTop;this.dom.right.parentNode.scrollTop=-this.props.scrollTop}return this.props.scrollTop};Core.prototype._getScrollTop=function(){return this.props.scrollTop};Core.prototype._createConfigurator=function(){throw new Error(\"Cannot invoke abstract method _createConfigurator\")};module.exports=Core},function(module,exports,__webpack_require__){\"use strict\";var moment=__webpack_require__(9);var DateUtil=__webpack_require__(36);var util=__webpack_require__(2);function TimeStep(start,end,minimumStep,hiddenDates,options){this.moment=moment;this.current=this.moment();this._start=this.moment();this._end=this.moment();this.autoScale=true;this.scale=\"day\";this.step=1;this.setRange(start,end,minimumStep);this.switchedDay=false;this.switchedMonth=false;this.switchedYear=false;if(Array.isArray(hiddenDates)){this.hiddenDates=hiddenDates}else if(hiddenDates!=undefined){this.hiddenDates=[hiddenDates]}else{this.hiddenDates=[]}this.format=TimeStep.FORMAT;this.options=options?options:{}}TimeStep.FORMAT={minorLabels:{millisecond:\"SSS\",second:\"s\",minute:\"HH:mm\",hour:\"HH:mm\",weekday:\"ddd D\",day:\"D\",week:\"w\",month:\"MMM\",year:\"YYYY\"},majorLabels:{millisecond:\"HH:mm:ss\",second:\"D MMMM HH:mm\",minute:\"ddd D MMMM\",hour:\"ddd D MMMM\",weekday:\"MMMM YYYY\",day:\"MMMM YYYY\",week:\"MMMM YYYY\",month:\"YYYY\",year:\"\"}};TimeStep.prototype.setMoment=function(moment){this.moment=moment;this.current=this.moment(this.current.valueOf());this._start=this.moment(this._start.valueOf());this._end=this.moment(this._end.valueOf())};TimeStep.prototype.setFormat=function(format){var defaultFormat=util.deepExtend({},TimeStep.FORMAT);this.format=util.deepExtend(defaultFormat,format)};TimeStep.prototype.setRange=function(start,end,minimumStep){if(!(start instanceof Date)||!(end instanceof Date)){throw\"No legal start or end date in method setRange\"}this._start=start!=undefined?this.moment(start.valueOf()):new Date;this._end=end!=undefined?this.moment(end.valueOf()):new Date;if(this.autoScale){this.setMinimumStep(minimumStep)}};TimeStep.prototype.start=function(){this.current=this._start.clone();this.roundToMinor()};TimeStep.prototype.roundToMinor=function(){if(this.scale==\"week\"){this.current.weekday(0)}switch(this.scale){case\"year\":this.current.year(this.step*Math.floor(this.current.year()/this.step));this.current.month(0);case\"month\":this.current.date(1);case\"week\":case\"day\":case\"weekday\":this.current.hours(0);case\"hour\":this.current.minutes(0);case\"minute\":this.current.seconds(0);case\"second\":this.current.milliseconds(0)}if(this.step!=1){switch(this.scale){case\"millisecond\":this.current.subtract(this.current.milliseconds()%this.step,\"milliseconds\");break;case\"second\":this.current.subtract(this.current.seconds()%this.step,\"seconds\");break;case\"minute\":this.current.subtract(this.current.minutes()%this.step,\"minutes\");break;case\"hour\":this.current.subtract(this.current.hours()%this.step,\"hours\");break;case\"weekday\":case\"day\":this.current.subtract((this.current.date()-1)%this.step,\"day\");break;case\"week\":this.current.subtract(this.current.week()%this.step,\"week\");break;case\"month\":this.current.subtract(this.current.month()%this.step,\"month\");break;case\"year\":this.current.subtract(this.current.year()%this.step,\"year\");break;default:break}}};TimeStep.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()};TimeStep.prototype.next=function(){var prev=this.current.valueOf();switch(this.scale){case\"millisecond\":this.current.add(this.step,\"millisecond\");break;case\"second\":this.current.add(this.step,\"second\");break;case\"minute\":this.current.add(this.step,\"minute\");break;case\"hour\":this.current.add(this.step,\"hour\");if(this.current.month()<6){this.current.subtract(this.current.hours()%this.step,\"hour\")}else{if(this.current.hours()%this.step!==0){this.current.add(this.step-this.current.hours()%this.step,\"hour\")}}break;case\"weekday\":case\"day\":this.current.add(this.step,\"day\");break;case\"week\":if(this.current.weekday()!==0){this.current.weekday(0);this.current.add(this.step,\"week\")}else if(this.options.showMajorLabels===false){this.current.add(this.step,\"week\")}else{var nextWeek=this.current.clone();nextWeek.add(1,\"week\");if(nextWeek.isSame(this.current,\"month\")){this.current.add(this.step,\"week\")}else{this.current.add(this.step,\"week\");this.current.date(1)}}break;case\"month\":this.current.add(this.step,\"month\");break;case\"year\":this.current.add(this.step,\"year\");break;default:break}if(this.step!=1){switch(this.scale){case\"millisecond\":if(this.current.milliseconds()>0&&this.current.milliseconds()<this.step)this.current.milliseconds(0);break;case\"second\":if(this.current.seconds()>0&&this.current.seconds()<this.step)this.current.seconds(0);break;case\"minute\":if(this.current.minutes()>0&&this.current.minutes()<this.step)this.current.minutes(0);break;case\"hour\":if(this.current.hours()>0&&this.current.hours()<this.step)this.current.hours(0);break;case\"weekday\":case\"day\":if(this.current.date()<this.step+1)this.current.date(1);break;case\"week\":if(this.current.week()<this.step)this.current.week(1);break;case\"month\":if(this.current.month()<this.step)this.current.month(0);break;case\"year\":break;default:break}}if(this.current.valueOf()==prev){this.current=this._end.clone()}this.switchedDay=false;this.switchedMonth=false;this.switchedYear=false;DateUtil.stepOverHiddenDates(this.moment,this,prev)};TimeStep.prototype.getCurrent=function(){return this.current};TimeStep.prototype.setScale=function(params){if(params&&typeof params.scale==\"string\"){this.scale=params.scale;this.step=params.step>0?params.step:1;this.autoScale=false}};TimeStep.prototype.setAutoScale=function(enable){this.autoScale=enable};TimeStep.prototype.setMinimumStep=function(minimumStep){if(minimumStep==undefined){return}var stepYear=1e3*60*60*24*30*12;var stepMonth=1e3*60*60*24*30;var stepDay=1e3*60*60*24;var stepHour=1e3*60*60;var stepMinute=1e3*60;var stepSecond=1e3;var stepMillisecond=1;if(stepYear*1e3>minimumStep){this.scale=\"year\";this.step=1e3}if(stepYear*500>minimumStep){this.scale=\"year\";this.step=500}if(stepYear*100>minimumStep){this.scale=\"year\";this.step=100}if(stepYear*50>minimumStep){this.scale=\"year\";this.step=50}if(stepYear*10>minimumStep){this.scale=\"year\";this.step=10}if(stepYear*5>minimumStep){this.scale=\"year\";this.step=5}if(stepYear>minimumStep){this.scale=\"year\";this.step=1}if(stepMonth*3>minimumStep){this.scale=\"month\";this.step=3}if(stepMonth>minimumStep){this.scale=\"month\";this.step=1}if(stepDay*5>minimumStep){this.scale=\"day\";this.step=5}if(stepDay*2>minimumStep){this.scale=\"day\";this.step=2}if(stepDay>minimumStep){this.scale=\"day\";this.step=1}if(stepDay/2>minimumStep){this.scale=\"weekday\";this.step=1}if(stepHour*4>minimumStep){this.scale=\"hour\";this.step=4}if(stepHour>minimumStep){this.scale=\"hour\";this.step=1}if(stepMinute*15>minimumStep){this.scale=\"minute\";this.step=15}if(stepMinute*10>minimumStep){this.scale=\"minute\";this.step=10}if(stepMinute*5>minimumStep){this.scale=\"minute\";this.step=5}if(stepMinute>minimumStep){this.scale=\"minute\";this.step=1}if(stepSecond*15>minimumStep){this.scale=\"second\";this.step=15}if(stepSecond*10>minimumStep){this.scale=\"second\";this.step=10}if(stepSecond*5>minimumStep){this.scale=\"second\";this.step=5}if(stepSecond>minimumStep){this.scale=\"second\";this.step=1}if(stepMillisecond*200>minimumStep){this.scale=\"millisecond\";this.step=200}if(stepMillisecond*100>minimumStep){this.scale=\"millisecond\";this.step=100}if(stepMillisecond*50>minimumStep){this.scale=\"millisecond\";this.step=50}if(stepMillisecond*10>minimumStep){this.scale=\"millisecond\";this.step=10}if(stepMillisecond*5>minimumStep){this.scale=\"millisecond\";this.step=5}if(stepMillisecond>minimumStep){this.scale=\"millisecond\";this.step=1}};TimeStep.snap=function(date,scale,step){var clone=moment(date);if(scale==\"year\"){var year=clone.year()+Math.round(clone.month()/12);clone.year(Math.round(year/step)*step);clone.month(0);clone.date(0);clone.hours(0);clone.minutes(0);clone.seconds(0);clone.milliseconds(0)}else if(scale==\"month\"){if(clone.date()>15){clone.date(1);clone.add(1,\"month\")}else{clone.date(1)}clone.hours(0);clone.minutes(0);clone.seconds(0);clone.milliseconds(0)}else if(scale==\"week\"){if(clone.weekday()>2){clone.weekday(0);clone.add(1,\"week\")}else{clone.weekday(0)}clone.hours(0);clone.minutes(0);clone.seconds(0);clone.milliseconds(0)}else if(scale==\"day\"){switch(step){case 5:case 2:clone.hours(Math.round(clone.hours()/24)*24);break;default:clone.hours(Math.round(clone.hours()/12)*12);break}clone.minutes(0);clone.seconds(0);clone.milliseconds(0)}else if(scale==\"weekday\"){switch(step){case 5:case 2:clone.hours(Math.round(clone.hours()/12)*12);break;default:clone.hours(Math.round(clone.hours()/6)*6);break}clone.minutes(0);clone.seconds(0);clone.milliseconds(0)}else if(scale==\"hour\"){switch(step){case 4:clone.minutes(Math.round(clone.minutes()/60)*60);break;default:clone.minutes(Math.round(clone.minutes()/30)*30);break}clone.seconds(0);clone.milliseconds(0)}else if(scale==\"minute\"){switch(step){case 15:case 10:clone.minutes(Math.round(clone.minutes()/5)*5);clone.seconds(0);break;case 5:clone.seconds(Math.round(clone.seconds()/60)*60);break;default:clone.seconds(Math.round(clone.seconds()/30)*30);break}clone.milliseconds(0)}else if(scale==\"second\"){switch(step){case 15:case 10:clone.seconds(Math.round(clone.seconds()/5)*5);clone.milliseconds(0);break;case 5:clone.milliseconds(Math.round(clone.milliseconds()/1e3)*1e3);break;default:clone.milliseconds(Math.round(clone.milliseconds()/500)*500);break}}else if(scale==\"millisecond\"){var _step=step>5?step/2:1;clone.milliseconds(Math.round(clone.milliseconds()/_step)*_step)}return clone};TimeStep.prototype.isMajor=function(){if(this.switchedYear==true){switch(this.scale){case\"year\":case\"month\":case\"week\":case\"weekday\":case\"day\":case\"hour\":case\"minute\":case\"second\":case\"millisecond\":return true;default:return false}}else if(this.switchedMonth==true){switch(this.scale){case\"week\":case\"weekday\":case\"day\":case\"hour\":case\"minute\":case\"second\":case\"millisecond\":return true;default:return false}}else if(this.switchedDay==true){switch(this.scale){case\"millisecond\":case\"second\":case\"minute\":case\"hour\":return true;default:return false}}var date=this.moment(this.current);switch(this.scale){case\"millisecond\":return date.milliseconds()==0;case\"second\":return date.seconds()==0;case\"minute\":return date.hours()==0&&date.minutes()==0;case\"hour\":return date.hours()==0;case\"weekday\":case\"day\":return date.date()==1;case\"week\":return date.date()==1;case\"month\":return date.month()==0;case\"year\":return false;default:return false}};TimeStep.prototype.getLabelMinor=function(date){if(date==undefined){date=this.current}if(date instanceof Date){date=this.moment(date)}if(typeof this.format.minorLabels===\"function\"){return this.format.minorLabels(date,this.scale,this.step)}var format=this.format.minorLabels[this.scale];switch(this.scale){case\"week\":if(this.isMajor()&&date.weekday()!==0){return\"\"}default:return format&&format.length>0?this.moment(date).format(format):\"\"}};TimeStep.prototype.getLabelMajor=function(date){if(date==undefined){date=this.current}if(date instanceof Date){date=this.moment(date)}if(typeof this.format.majorLabels===\"function\"){return this.format.majorLabels(date,this.scale,this.step)}var format=this.format.majorLabels[this.scale];return format&&format.length>0?this.moment(date).format(format):\"\"};TimeStep.prototype.getClassName=function(){var _moment=this.moment;var m=this.moment(this.current);var current=m.locale?m.locale(\"en\"):m.lang(\"en\");var step=this.step;var classNames=[];function even(value){return value/step%2==0?\" vis-even\":\" vis-odd\"}function today(date){if(date.isSame(new Date,\"day\")){return\" vis-today\"}if(date.isSame(_moment().add(1,\"day\"),\"day\")){return\" vis-tomorrow\"}if(date.isSame(_moment().add(-1,\"day\"),\"day\")){return\" vis-yesterday\"}return\"\"}function currentWeek(date){return date.isSame(new Date,\"week\")?\" vis-current-week\":\"\"}function currentMonth(date){return date.isSame(new Date,\"month\")?\" vis-current-month\":\"\"}function currentYear(date){return date.isSame(new Date,\"year\")?\" vis-current-year\":\"\"}switch(this.scale){case\"millisecond\":classNames.push(today(current));classNames.push(even(current.milliseconds()));break;case\"second\":classNames.push(today(current));classNames.push(even(current.seconds()));break;case\"minute\":classNames.push(today(current));classNames.push(even(current.minutes()));break;case\"hour\":classNames.push(\"vis-h\"+current.hours()+(this.step==4?\"-h\"+(current.hours()+4):\"\"));classNames.push(today(current));classNames.push(even(current.hours()));break;case\"weekday\":classNames.push(\"vis-\"+current.format(\"dddd\").toLowerCase());classNames.push(today(current));classNames.push(currentWeek(current));classNames.push(even(current.date()));break;case\"day\":classNames.push(\"vis-day\"+current.date());classNames.push(\"vis-\"+current.format(\"MMMM\").toLowerCase());classNames.push(today(current));classNames.push(currentMonth(current));classNames.push(this.step<=2?today(current):\"\");classNames.push(this.step<=2?\"vis-\"+current.format(\"dddd\").toLowerCase():\"\");classNames.push(even(current.date()-1));break;case\"week\":classNames.push(\"vis-week\"+current.format(\"w\"));classNames.push(currentWeek(current));classNames.push(even(current.week()));break;case\"month\":classNames.push(\"vis-\"+current.format(\"MMMM\").toLowerCase());classNames.push(currentMonth(current));classNames.push(even(current.month()));break;case\"year\":classNames.push(\"vis-year\"+current.year());classNames.push(currentYear(current));classNames.push(even(current.year()));break}return classNames.filter(String).join(\" \")};module.exports=TimeStep},function(module,exports,__webpack_require__){\"use strict\";var util=__webpack_require__(2);var Component=__webpack_require__(16);var moment=__webpack_require__(9);var locales=__webpack_require__(98);function CurrentTime(body,options){this.body=body;this.defaultOptions={rtl:false,showCurrentTime:true,moment:moment,locales:locales,locale:\"en\"};this.options=util.extend({},this.defaultOptions);this.offset=0;this._create();this.setOptions(options)}CurrentTime.prototype=new Component;CurrentTime.prototype._create=function(){var bar=document.createElement(\"div\");bar.className=\"vis-current-time\";bar.style.position=\"absolute\";bar.style.top=\"0px\";bar.style.height=\"100%\";this.bar=bar};CurrentTime.prototype.destroy=function(){this.options.showCurrentTime=false;this.redraw();this.body=null};CurrentTime.prototype.setOptions=function(options){if(options){util.selectiveExtend([\"rtl\",\"showCurrentTime\",\"moment\",\"locale\",\"locales\"],this.options,options)}};CurrentTime.prototype.redraw=function(){if(this.options.showCurrentTime){var parent=this.body.dom.backgroundVertical;if(this.bar.parentNode!=parent){if(this.bar.parentNode){this.bar.parentNode.removeChild(this.bar)}parent.appendChild(this.bar);this.start()}var now=this.options.moment((new Date).valueOf()+this.offset);var x=this.body.util.toScreen(now);var locale=this.options.locales[this.options.locale];if(!locale){if(!this.warned){console.log(\"WARNING: options.locales['\"+this.options.locale+\"'] not found. See http://visjs.org/docs/timeline/#Localization\");this.warned=true}locale=this.options.locales[\"en\"]}var title=locale.current+\" \"+locale.time+\": \"+now.format(\"dddd, MMMM Do YYYY, H:mm:ss\");title=title.charAt(0).toUpperCase()+title.substring(1);if(this.options.rtl){this.bar.style.right=x+\"px\"}else{this.bar.style.left=x+\"px\"}this.bar.title=title}else{if(this.bar.parentNode){this.bar.parentNode.removeChild(this.bar)}this.stop()}return false};CurrentTime.prototype.start=function(){var me=this;function update(){me.stop();var scale=me.body.range.conversion(me.body.domProps.center.width).scale;var interval=1/scale/10;if(interval<30)interval=30;if(interval>1e3)interval=1e3;me.redraw();me.body.emitter.emit(\"currentTimeTick\");me.currentTimeTimer=setTimeout(update,interval)}update()};CurrentTime.prototype.stop=function(){if(this.currentTimeTimer!==undefined){clearTimeout(this.currentTimeTimer);delete this.currentTimeTimer}};CurrentTime.prototype.setCurrentTime=function(time){var t=util.convert(time,\"Date\").valueOf();var now=(new Date).valueOf();this.offset=t-now;this.redraw()};CurrentTime.prototype.getCurrentTime=function(){return new Date((new Date).valueOf()+this.offset)};module.exports=CurrentTime},function(module,exports,__webpack_require__){\"use strict\";var _keys=__webpack_require__(8);var _keys2=_interopRequireDefault(_keys);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var stack=__webpack_require__(100);function Group(groupId,data,itemSet){this.groupId=groupId;this.subgroups={};this.subgroupStack={};this.subgroupStackAll=false;this.doInnerStack=false;this.subgroupIndex=0;this.subgroupOrderer=data&&data.subgroupOrder;this.itemSet=itemSet;this.isVisible=null;this.stackDirty=true;if(data&&data.nestedGroups){this.nestedGroups=data.nestedGroups;if(data.showNested==false){this.showNested=false}else{this.showNested=true}}if(data&&data.subgroupStack){if(typeof data.subgroupStack===\"boolean\"){this.doInnerStack=data.subgroupStack;this.subgroupStackAll=data.subgroupStack}else{for(var key in data.subgroupStack){this.subgroupStack[key]=data.subgroupStack[key];this.doInnerStack=this.doInnerStack||data.subgroupStack[key]}}}this.nestedInGroup=null;this.dom={};this.props={label:{width:0,height:0}};this.className=null;this.items={};this.visibleItems=[];this.itemsInRange=[];this.orderedItems={byStart:[],byEnd:[]};this.checkRangedItems=false;var me=this;this.itemSet.body.emitter.on(\"checkRangedItems\",function(){me.checkRangedItems=true});this._create();this.setData(data)}Group.prototype._create=function(){var label=document.createElement(\"div\");if(this.itemSet.options.groupEditable.order){label.className=\"vis-label draggable\"}else{label.className=\"vis-label\"}this.dom.label=label;var inner=document.createElement(\"div\");inner.className=\"vis-inner\";label.appendChild(inner);this.dom.inner=inner;var foreground=document.createElement(\"div\");foreground.className=\"vis-group\";foreground[\"timeline-group\"]=this;this.dom.foreground=foreground;this.dom.background=document.createElement(\"div\");this.dom.background.className=\"vis-group\";this.dom.axis=document.createElement(\"div\");this.dom.axis.className=\"vis-group\";this.dom.marker=document.createElement(\"div\");this.dom.marker.style.visibility=\"hidden\";this.dom.marker.style.position=\"absolute\";this.dom.marker.innerHTML=\"\";this.dom.background.appendChild(this.dom.marker)};Group.prototype.setData=function(data){var content;var templateFunction;if(this.itemSet.options&&this.itemSet.options.groupTemplate){templateFunction=this.itemSet.options.groupTemplate.bind(this);content=templateFunction(data,this.dom.inner)}else{content=data&&data.content}if(content instanceof Element){this.dom.inner.appendChild(content);while(this.dom.inner.firstChild){this.dom.inner.removeChild(this.dom.inner.firstChild)}this.dom.inner.appendChild(content)}else if(content instanceof Object){templateFunction(data,this.dom.inner)}else if(content!==undefined&&content!==null){this.dom.inner.innerHTML=content}else{this.dom.inner.innerHTML=this.groupId||\"\"}this.dom.label.title=data&&data.title||\"\";if(!this.dom.inner.firstChild){util.addClassName(this.dom.inner,\"vis-hidden\")}else{util.removeClassName(this.dom.inner,\"vis-hidden\")}if(data&&data.nestedGroups){if(!this.nestedGroups||this.nestedGroups!=data.nestedGroups){this.nestedGroups=data.nestedGroups}if(data.showNested!==undefined||this.showNested===undefined){if(data.showNested==false){this.showNested=false}else{this.showNested=true}}util.addClassName(this.dom.label,\"vis-nesting-group\");var collapsedDirClassName=this.itemSet.options.rtl?\"collapsed-rtl\":\"collapsed\";if(this.showNested){util.removeClassName(this.dom.label,collapsedDirClassName);util.addClassName(this.dom.label,\"expanded\")}else{util.removeClassName(this.dom.label,\"expanded\");util.addClassName(this.dom.label,collapsedDirClassName)}}else if(this.nestedGroups){this.nestedGroups=null;collapsedDirClassName=this.itemSet.options.rtl?\"collapsed-rtl\":\"collapsed\";util.removeClassName(this.dom.label,collapsedDirClassName);util.removeClassName(this.dom.label,\"expanded\");util.removeClassName(this.dom.label,\"vis-nesting-group\")}if(data&&data.nestedInGroup){util.addClassName(this.dom.label,\"vis-nested-group\");if(this.itemSet.options&&this.itemSet.options.rtl){this.dom.inner.style.paddingRight=\"30px\"}else{\nthis.dom.inner.style.paddingLeft=\"30px\"}}var className=data&&data.className||null;if(className!=this.className){if(this.className){util.removeClassName(this.dom.label,this.className);util.removeClassName(this.dom.foreground,this.className);util.removeClassName(this.dom.background,this.className);util.removeClassName(this.dom.axis,this.className)}util.addClassName(this.dom.label,className);util.addClassName(this.dom.foreground,className);util.addClassName(this.dom.background,className);util.addClassName(this.dom.axis,className);this.className=className}if(this.style){util.removeCssText(this.dom.label,this.style);this.style=null}if(data&&data.style){util.addCssText(this.dom.label,data.style);this.style=data.style}};Group.prototype.getLabelWidth=function(){return this.props.label.width};Group.prototype._didMarkerHeightChange=function(){var markerHeight=this.dom.marker.clientHeight;if(markerHeight!=this.lastMarkerHeight){this.lastMarkerHeight=markerHeight;var redrawQueue={};var redrawQueueLength=0;util.forEach(this.items,function(item,key){item.dirty=true;if(item.displayed){var returnQueue=true;redrawQueue[key]=item.redraw(returnQueue);redrawQueueLength=redrawQueue[key].length}});var needRedraw=redrawQueueLength>0;if(needRedraw){for(var i=0;i<redrawQueueLength;i++){util.forEach(redrawQueue,function(fns){fns[i]()})}}return true}};Group.prototype._calculateGroupSizeAndPosition=function(){var offsetTop=this.dom.foreground.offsetTop;var offsetLeft=this.dom.foreground.offsetLeft;var offsetWidth=this.dom.foreground.offsetWidth;this.top=offsetTop;this.right=offsetLeft;this.width=offsetWidth};Group.prototype._redrawItems=function(forceRestack,lastIsVisible,margin,range){var restack=forceRestack||this.stackDirty||this.isVisible&&!lastIsVisible;if(restack){var visibleSubgroups={};var subgroup=null;if(typeof this.itemSet.options.order===\"function\"){var me=this;var limitSize=false;var redrawQueue={};var redrawQueueLength=0;util.forEach(this.items,function(item,key){if(!item.displayed){var returnQueue=true;redrawQueue[key]=item.redraw(returnQueue);redrawQueueLength=redrawQueue[key].length;me.visibleItems.push(item)}});var needRedraw=redrawQueueLength>0;if(needRedraw){for(var i=0;i<redrawQueueLength;i++){util.forEach(redrawQueue,function(fns){fns[i]()})}}util.forEach(this.items,function(item){item.repositionX(limitSize)});if(this.doInnerStack&&this.itemSet.options.stackSubgroups){for(subgroup in this.subgroups){visibleSubgroups[subgroup]=this.subgroups[subgroup].items.slice().sort(function(a,b){return me.itemSet.options.order(a.data,b.data)})}stack.stackSubgroupsWithInnerStack(visibleSubgroups,margin,this.subgroups)}else{var customOrderedItems=this.orderedItems.byStart.slice().sort(function(a,b){return me.itemSet.options.order(a.data,b.data)});stack.stack(customOrderedItems,margin,true)}this.visibleItems=this._updateItemsInRange(this.orderedItems,this.visibleItems,range)}else{this.visibleItems=this._updateItemsInRange(this.orderedItems,this.visibleItems,range);if(this.itemSet.options.stack){if(this.doInnerStack&&this.itemSet.options.stackSubgroups){for(subgroup in this.subgroups){visibleSubgroups[subgroup]=this.subgroups[subgroup].items}stack.stackSubgroupsWithInnerStack(visibleSubgroups,margin,this.subgroups)}else{stack.stack(this.visibleItems,margin,true)}}else{stack.nostack(this.visibleItems,margin,this.subgroups,this.itemSet.options.stackSubgroups)}}this.stackDirty=false}};Group.prototype._didResize=function(resized,height){resized=util.updateProperty(this,\"height\",height)||resized;var labelWidth=this.dom.inner.clientWidth;var labelHeight=this.dom.inner.clientHeight;resized=util.updateProperty(this.props.label,\"width\",labelWidth)||resized;resized=util.updateProperty(this.props.label,\"height\",labelHeight)||resized;return resized};Group.prototype._applyGroupHeight=function(height){this.dom.background.style.height=height+\"px\";this.dom.foreground.style.height=height+\"px\";this.dom.label.style.height=height+\"px\"};Group.prototype._updateItemsVerticalPosition=function(margin){for(var i=0,ii=this.visibleItems.length;i<ii;i++){var item=this.visibleItems[i];item.repositionY(margin);if(!this.isVisible&&this.groupId!=\"__background__\"){if(item.displayed)item.hide()}}};Group.prototype.redraw=function(range,margin,forceRestack,returnQueue){var resized=false;var lastIsVisible=this.isVisible;var height;var queue=[function(){forceRestack=this._didMarkerHeightChange.bind(this)}.bind(this),this._updateSubGroupHeights.bind(this,margin),this._calculateGroupSizeAndPosition.bind(this),function(){this.isVisible=this._isGroupVisible.bind(this)(range,margin)}.bind(this),function(){this._redrawItems.bind(this)(forceRestack,lastIsVisible,margin,range)}.bind(this),this._updateSubgroupsSizes.bind(this),function(){height=this._calculateHeight.bind(this)(margin)}.bind(this),this._calculateGroupSizeAndPosition.bind(this),function(){resized=this._didResize.bind(this)(resized,height)}.bind(this),function(){this._applyGroupHeight.bind(this)(height)}.bind(this),function(){this._updateItemsVerticalPosition.bind(this)(margin)}.bind(this),function(){if(!this.isVisible&&this.height){resized=false}return resized}];if(returnQueue){return queue}else{var result;queue.forEach(function(fn){result=fn()});return result}};Group.prototype._updateSubGroupHeights=function(margin){if((0,_keys2[\"default\"])(this.subgroups).length>0){var me=this;this.resetSubgroups();util.forEach(this.visibleItems,function(item){if(item.data.subgroup!==undefined){me.subgroups[item.data.subgroup].height=Math.max(me.subgroups[item.data.subgroup].height,item.height+margin.item.vertical);me.subgroups[item.data.subgroup].visible=true}})}};Group.prototype._isGroupVisible=function(range,margin){return this.top<=range.body.domProps.centerContainer.height-range.body.domProps.scrollTop+margin.axis&&this.top+this.height+margin.axis>=-range.body.domProps.scrollTop};Group.prototype._calculateHeight=function(margin){var height;var itemsInRange=this.visibleItems;if(itemsInRange.length>0){var min=itemsInRange[0].top;var max=itemsInRange[0].top+itemsInRange[0].height;util.forEach(itemsInRange,function(item){min=Math.min(min,item.top);max=Math.max(max,item.top+item.height)});if(min>margin.axis){var offset=min-margin.axis;max-=offset;util.forEach(itemsInRange,function(item){item.top-=offset})}height=max+margin.item.vertical/2}else{height=0}height=Math.max(height,this.props.label.height);return height};Group.prototype.show=function(){if(!this.dom.label.parentNode){this.itemSet.dom.labelSet.appendChild(this.dom.label)}if(!this.dom.foreground.parentNode){this.itemSet.dom.foreground.appendChild(this.dom.foreground)}if(!this.dom.background.parentNode){this.itemSet.dom.background.appendChild(this.dom.background)}if(!this.dom.axis.parentNode){this.itemSet.dom.axis.appendChild(this.dom.axis)}};Group.prototype.hide=function(){var label=this.dom.label;if(label.parentNode){label.parentNode.removeChild(label)}var foreground=this.dom.foreground;if(foreground.parentNode){foreground.parentNode.removeChild(foreground)}var background=this.dom.background;if(background.parentNode){background.parentNode.removeChild(background)}var axis=this.dom.axis;if(axis.parentNode){axis.parentNode.removeChild(axis)}};Group.prototype.add=function(item){this.items[item.id]=item;item.setParent(this);this.stackDirty=true;if(item.data.subgroup!==undefined){this._addToSubgroup(item);this.orderSubgroups()}if(this.visibleItems.indexOf(item)==-1){var range=this.itemSet.body.range;this._checkIfVisible(item,this.visibleItems,range)}};Group.prototype._addToSubgroup=function(item,subgroupId){subgroupId=subgroupId||item.data.subgroup;if(subgroupId!=undefined&&this.subgroups[subgroupId]===undefined){this.subgroups[subgroupId]={height:0,top:0,start:item.data.start,end:item.data.end||item.data.start,visible:false,index:this.subgroupIndex,items:[],stack:this.subgroupStackAll||this.subgroupStack[subgroupId]||false};this.subgroupIndex++}if(new Date(item.data.start)<new Date(this.subgroups[subgroupId].start)){this.subgroups[subgroupId].start=item.data.start}var itemEnd=item.data.end||item.data.start;if(new Date(itemEnd)>new Date(this.subgroups[subgroupId].end)){this.subgroups[subgroupId].end=itemEnd}this.subgroups[subgroupId].items.push(item)};Group.prototype._updateSubgroupsSizes=function(){var me=this;if(me.subgroups){for(var subgroup in me.subgroups){var initialEnd=me.subgroups[subgroup].items[0].data.end||me.subgroups[subgroup].items[0].data.start;var newStart=me.subgroups[subgroup].items[0].data.start;var newEnd=initialEnd-1;me.subgroups[subgroup].items.forEach(function(item){if(new Date(item.data.start)<new Date(newStart)){newStart=item.data.start}var itemEnd=item.data.end||item.data.start;if(new Date(itemEnd)>new Date(newEnd)){newEnd=itemEnd}});me.subgroups[subgroup].start=newStart;me.subgroups[subgroup].end=new Date(newEnd-1)}}};Group.prototype.orderSubgroups=function(){if(this.subgroupOrderer!==undefined){var sortArray=[];var subgroup;if(typeof this.subgroupOrderer==\"string\"){for(subgroup in this.subgroups){sortArray.push({subgroup:subgroup,sortField:this.subgroups[subgroup].items[0].data[this.subgroupOrderer]})}sortArray.sort(function(a,b){return a.sortField-b.sortField})}else if(typeof this.subgroupOrderer==\"function\"){for(subgroup in this.subgroups){sortArray.push(this.subgroups[subgroup].items[0].data)}sortArray.sort(this.subgroupOrderer)}if(sortArray.length>0){for(var i=0;i<sortArray.length;i++){this.subgroups[sortArray[i].subgroup].index=i}}}};Group.prototype.resetSubgroups=function(){for(var subgroup in this.subgroups){if(this.subgroups.hasOwnProperty(subgroup)){this.subgroups[subgroup].visible=false;this.subgroups[subgroup].height=0}}};Group.prototype.remove=function(item){delete this.items[item.id];item.setParent(null);this.stackDirty=true;var index=this.visibleItems.indexOf(item);if(index!=-1)this.visibleItems.splice(index,1);if(item.data.subgroup!==undefined){this._removeFromSubgroup(item);this.orderSubgroups()}};Group.prototype._removeFromSubgroup=function(item,subgroupId){subgroupId=subgroupId||item.data.subgroup;if(subgroupId!=undefined){var subgroup=this.subgroups[subgroupId];if(subgroup){var itemIndex=subgroup.items.indexOf(item);if(itemIndex>=0){subgroup.items.splice(itemIndex,1);if(!subgroup.items.length){delete this.subgroups[subgroupId]}else{this._updateSubgroupsSizes()}}}}};Group.prototype.removeFromDataSet=function(item){this.itemSet.removeItem(item.id)};Group.prototype.order=function(){var array=util.toArray(this.items);var startArray=[];var endArray=[];for(var i=0;i<array.length;i++){if(array[i].data.end!==undefined){endArray.push(array[i])}startArray.push(array[i])}this.orderedItems={byStart:startArray,byEnd:endArray};stack.orderByStart(this.orderedItems.byStart);stack.orderByEnd(this.orderedItems.byEnd)};Group.prototype._updateItemsInRange=function(orderedItems,oldVisibleItems,range){var visibleItems=[];var visibleItemsLookup={};var interval=(range.end-range.start)/4;var lowerBound=range.start-interval;var upperBound=range.end+interval;var searchFunction=function searchFunction(value){if(value<lowerBound){return-1}else if(value<=upperBound){return 0}else{return 1}};if(oldVisibleItems.length>0){for(var i=0;i<oldVisibleItems.length;i++){this._checkIfVisibleWithReference(oldVisibleItems[i],visibleItems,visibleItemsLookup,range)}}var initialPosByStart=util.binarySearchCustom(orderedItems.byStart,searchFunction,\"data\",\"start\");this._traceVisible(initialPosByStart,orderedItems.byStart,visibleItems,visibleItemsLookup,function(item){return item.data.start<lowerBound||item.data.start>upperBound});if(this.checkRangedItems==true){this.checkRangedItems=false;for(i=0;i<orderedItems.byEnd.length;i++){this._checkIfVisibleWithReference(orderedItems.byEnd[i],visibleItems,visibleItemsLookup,range)}}else{var initialPosByEnd=util.binarySearchCustom(orderedItems.byEnd,searchFunction,\"data\",\"end\");this._traceVisible(initialPosByEnd,orderedItems.byEnd,visibleItems,visibleItemsLookup,function(item){return item.data.end<lowerBound||item.data.end>upperBound})}var redrawQueue={};var redrawQueueLength=0;for(i=0;i<visibleItems.length;i++){var item=visibleItems[i];if(!item.displayed){var returnQueue=true;redrawQueue[i]=item.redraw(returnQueue);redrawQueueLength=redrawQueue[i].length}}var needRedraw=redrawQueueLength>0;if(needRedraw){for(var j=0;j<redrawQueueLength;j++){util.forEach(redrawQueue,function(fns){fns[j]()})}}for(i=0;i<visibleItems.length;i++){visibleItems[i].repositionX()}return visibleItems};Group.prototype._traceVisible=function(initialPos,items,visibleItems,visibleItemsLookup,breakCondition){if(initialPos!=-1){var i,item;for(i=initialPos;i>=0;i--){item=items[i];if(breakCondition(item)){break}else{if(visibleItemsLookup[item.id]===undefined){visibleItemsLookup[item.id]=true;visibleItems.push(item)}}}for(i=initialPos+1;i<items.length;i++){item=items[i];if(breakCondition(item)){break}else{if(visibleItemsLookup[item.id]===undefined){visibleItemsLookup[item.id]=true;visibleItems.push(item)}}}}};Group.prototype._checkIfVisible=function(item,visibleItems,range){if(item.isVisible(range)){if(!item.displayed)item.show();item.repositionX();visibleItems.push(item)}else{if(item.displayed)item.hide()}};Group.prototype._checkIfVisibleWithReference=function(item,visibleItems,visibleItemsLookup,range){if(item.isVisible(range)){if(visibleItemsLookup[item.id]===undefined){visibleItemsLookup[item.id]=true;visibleItems.push(item)}}else{if(item.displayed)item.hide()}};Group.prototype.changeSubgroup=function(item,oldSubgroup,newSubgroup){this._removeFromSubgroup(item,oldSubgroup);this._addToSubgroup(item,newSubgroup);this.orderSubgroups()};module.exports=Group},function(module,exports,__webpack_require__){\"use strict\";var _create=__webpack_require__(29);var _create2=_interopRequireDefault(_create);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Group=__webpack_require__(68);function BackgroundGroup(groupId,data,itemSet){Group.call(this,groupId,data,itemSet);this.width=0;this.height=0;this.top=0;this.left=0}BackgroundGroup.prototype=(0,_create2[\"default\"])(Group.prototype);BackgroundGroup.prototype.redraw=function(range,margin,forceRestack){var resized=false;this.visibleItems=this._updateItemsInRange(this.orderedItems,this.visibleItems,range);this.width=this.dom.background.offsetWidth;this.dom.background.style.height=\"0\";for(var i=0,ii=this.visibleItems.length;i<ii;i++){var item=this.visibleItems[i];item.repositionY(margin)}return resized};BackgroundGroup.prototype.show=function(){if(!this.dom.background.parentNode){this.itemSet.dom.background.appendChild(this.dom.background)}};module.exports=BackgroundGroup},function(module,exports,__webpack_require__){\"use strict\";var Item=__webpack_require__(38);function RangeItem(data,conversion,options){this.props={content:{width:0}};this.overflow=false;this.options=options;if(data){if(data.start==undefined){throw new Error('Property \"start\" missing in item '+data.id)}if(data.end==undefined){throw new Error('Property \"end\" missing in item '+data.id)}}Item.call(this,data,conversion,options)}RangeItem.prototype=new Item(null,null,null);RangeItem.prototype.baseClassName=\"vis-item vis-range\";RangeItem.prototype.isVisible=function(range){return this.data.start<range.end&&this.data.end>range.start};RangeItem.prototype._createDomElement=function(){if(!this.dom){this.dom={};this.dom.box=document.createElement(\"div\");this.dom.frame=document.createElement(\"div\");this.dom.frame.className=\"vis-item-overflow\";this.dom.box.appendChild(this.dom.frame);this.dom.visibleFrame=document.createElement(\"div\");this.dom.visibleFrame.className=\"vis-item-visible-frame\";this.dom.box.appendChild(this.dom.visibleFrame);this.dom.content=document.createElement(\"div\");this.dom.content.className=\"vis-item-content\";this.dom.frame.appendChild(this.dom.content);this.dom.box[\"timeline-item\"]=this;this.dirty=true}};RangeItem.prototype._appendDomElement=function(){if(!this.parent){throw new Error(\"Cannot redraw item: no parent attached\")}if(!this.dom.box.parentNode){var foreground=this.parent.dom.foreground;if(!foreground){throw new Error(\"Cannot redraw item: parent has no foreground container element\")}foreground.appendChild(this.dom.box)}this.displayed=true};RangeItem.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content);this._updateDataAttributes(this.dom.box);this._updateStyle(this.dom.box);var editable=this.editable.updateTime||this.editable.updateGroup;var className=(this.data.className?\" \"+this.data.className:\"\")+(this.selected?\" vis-selected\":\"\")+(editable?\" vis-editable\":\" vis-readonly\");this.dom.box.className=this.baseClassName+className;this.dom.content.style.maxWidth=\"none\"}};RangeItem.prototype._getDomComponentsSizes=function(){this.overflow=window.getComputedStyle(this.dom.frame).overflow!==\"hidden\";return{content:{width:this.dom.content.offsetWidth},box:{height:this.dom.box.offsetHeight}}};RangeItem.prototype._updateDomComponentsSizes=function(sizes){this.props.content.width=sizes.content.width;this.height=sizes.box.height;this.dom.content.style.maxWidth=\"\";this.dirty=false};RangeItem.prototype._repaintDomAdditionals=function(){this._repaintOnItemUpdateTimeTooltip(this.dom.box);this._repaintDeleteButton(this.dom.box);this._repaintDragCenter();this._repaintDragLeft();this._repaintDragRight()};RangeItem.prototype.redraw=function(returnQueue){var sizes;var queue=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){if(this.dirty){sizes=this._getDomComponentsSizes.bind(this)()}}.bind(this),function(){if(this.dirty){this._updateDomComponentsSizes.bind(this)(sizes)}}.bind(this),this._repaintDomAdditionals.bind(this)];if(returnQueue){return queue}else{var result;queue.forEach(function(fn){result=fn()});return result}};RangeItem.prototype.show=function(){if(!this.displayed){this.redraw()}};RangeItem.prototype.hide=function(){if(this.displayed){var box=this.dom.box;if(box.parentNode){box.parentNode.removeChild(box)}this.displayed=false}};RangeItem.prototype.repositionX=function(limitSize){var parentWidth=this.parent.width;var start=this.conversion.toScreen(this.data.start);var end=this.conversion.toScreen(this.data.end);var align=this.data.align===undefined?this.options.align:this.data.align;var contentStartPosition;var contentWidth;if(this.data.limitSize!==false&&(limitSize===undefined||limitSize===true)){if(start<-parentWidth){start=-parentWidth}if(end>2*parentWidth){end=2*parentWidth}}var boxWidth=Math.max(end-start+.5,1);if(this.overflow){if(this.options.rtl){this.right=start}else{this.left=start}this.width=boxWidth+this.props.content.width;contentWidth=this.props.content.width}else{if(this.options.rtl){this.right=start}else{this.left=start}this.width=boxWidth;contentWidth=Math.min(end-start,this.props.content.width)}if(this.options.rtl){this.dom.box.style.right=this.right+\"px\"}else{this.dom.box.style.left=this.left+\"px\"}this.dom.box.style.width=boxWidth+\"px\";switch(align){case\"left\":if(this.options.rtl){this.dom.content.style.right=\"0\"}else{this.dom.content.style.left=\"0\"}break;case\"right\":if(this.options.rtl){this.dom.content.style.right=Math.max(boxWidth-contentWidth,0)+\"px\"}else{this.dom.content.style.left=Math.max(boxWidth-contentWidth,0)+\"px\"}break;case\"center\":if(this.options.rtl){this.dom.content.style.right=Math.max((boxWidth-contentWidth)/2,0)+\"px\"}else{this.dom.content.style.left=Math.max((boxWidth-contentWidth)/2,0)+\"px\"}break;default:if(this.overflow){if(end>0){contentStartPosition=Math.max(-start,0)}else{contentStartPosition=-contentWidth}}else{if(start<0){contentStartPosition=-start}else{contentStartPosition=0}}if(this.options.rtl){this.dom.content.style.right=contentStartPosition+\"px\"}else{this.dom.content.style.left=contentStartPosition+\"px\";this.dom.content.style.width=\"calc(100% - \"+contentStartPosition+\"px)\"}}};RangeItem.prototype.repositionY=function(){var orientation=this.options.orientation.item;var box=this.dom.box;if(orientation==\"top\"){box.style.top=this.top+\"px\"}else{box.style.top=this.parent.height-this.top-this.height+\"px\"}};RangeItem.prototype._repaintDragLeft=function(){if((this.selected||this.options.itemsAlwaysDraggable.range)&&this.options.editable.updateTime&&!this.dom.dragLeft){var dragLeft=document.createElement(\"div\");dragLeft.className=\"vis-drag-left\";dragLeft.dragLeftItem=this;this.dom.box.appendChild(dragLeft);this.dom.dragLeft=dragLeft}else if(!this.selected&&!this.options.itemsAlwaysDraggable.range&&this.dom.dragLeft){if(this.dom.dragLeft.parentNode){this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft)}this.dom.dragLeft=null}};RangeItem.prototype._repaintDragRight=function(){if((this.selected||this.options.itemsAlwaysDraggable.range)&&this.options.editable.updateTime&&!this.dom.dragRight){var dragRight=document.createElement(\"div\");dragRight.className=\"vis-drag-right\";dragRight.dragRightItem=this;this.dom.box.appendChild(dragRight);this.dom.dragRight=dragRight}else if(!this.selected&&!this.options.itemsAlwaysDraggable.range&&this.dom.dragRight){if(this.dom.dragRight.parentNode){this.dom.dragRight.parentNode.removeChild(this.dom.dragRight)}this.dom.dragRight=null}};module.exports=RangeItem},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _stringify=__webpack_require__(19);var _stringify2=_interopRequireDefault(_stringify);var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var ColorPicker=__webpack_require__(179)[\"default\"];var Configurator=function(){function Configurator(parentModule,defaultContainer,configureOptions){var pixelRatio=arguments.length>3&&arguments[3]!==undefined?arguments[3]:1;(0,_classCallCheck3[\"default\"])(this,Configurator);this.parent=parentModule;this.changedOptions=[];this.container=defaultContainer;this.allowCreation=false;this.options={};this.initialized=false;this.popupCounter=0;this.defaultOptions={enabled:false,filter:true,container:undefined,showButton:true};util.extend(this.options,this.defaultOptions);this.configureOptions=configureOptions;this.moduleOptions={};this.domElements=[];this.popupDiv={};this.popupLimit=5;this.popupHistory={};this.colorPicker=new ColorPicker(pixelRatio);this.wrapper=undefined}(0,_createClass3[\"default\"])(Configurator,[{key:\"setOptions\",value:function setOptions(options){if(options!==undefined){this.popupHistory={};this._removePopup();var enabled=true;if(typeof options===\"string\"){this.options.filter=options}else if(options instanceof Array){this.options.filter=options.join()}else if((typeof options===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(options))===\"object\"){if(options.container!==undefined){this.options.container=options.container}if(options.filter!==undefined){this.options.filter=options.filter}if(options.showButton!==undefined){this.options.showButton=options.showButton}if(options.enabled!==undefined){enabled=options.enabled}}else if(typeof options===\"boolean\"){this.options.filter=true;enabled=options}else if(typeof options===\"function\"){this.options.filter=options;enabled=true}if(this.options.filter===false){enabled=false}this.options.enabled=enabled}this._clean()}},{key:\"setModuleOptions\",value:function setModuleOptions(moduleOptions){this.moduleOptions=moduleOptions;if(this.options.enabled===true){this._clean();if(this.options.container!==undefined){this.container=this.options.container}this._create()}}},{key:\"_create\",value:function _create(){var _this=this;this._clean();this.changedOptions=[];var filter=this.options.filter;var counter=0;var show=false;for(var option in this.configureOptions){if(this.configureOptions.hasOwnProperty(option)){this.allowCreation=false;show=false;if(typeof filter===\"function\"){show=filter(option,[]);show=show||this._handleObject(this.configureOptions[option],[option],true)}else if(filter===true||filter.indexOf(option)!==-1){show=true}if(show!==false){this.allowCreation=true;if(counter>0){this._makeItem([])}this._makeHeader(option);this._handleObject(this.configureOptions[option],[option])}counter++}}if(this.options.showButton===true){var generateButton=document.createElement(\"div\");generateButton.className=\"vis-configuration vis-config-button\";generateButton.innerHTML=\"generate options\";generateButton.onclick=function(){_this._printOptions()};generateButton.onmouseover=function(){generateButton.className=\"vis-configuration vis-config-button hover\"};generateButton.onmouseout=function(){generateButton.className=\"vis-configuration vis-config-button\"};this.optionsContainer=document.createElement(\"div\");this.optionsContainer.className=\"vis-configuration vis-config-option-container\";this.domElements.push(this.optionsContainer);this.domElements.push(generateButton)}this._push()}},{key:\"_push\",value:function _push(){this.wrapper=document.createElement(\"div\");this.wrapper.className=\"vis-configuration-wrapper\";this.container.appendChild(this.wrapper);for(var i=0;i<this.domElements.length;i++){this.wrapper.appendChild(this.domElements[i])}this._showPopupIfNeeded()}},{key:\"_clean\",value:function _clean(){for(var i=0;i<this.domElements.length;i++){this.wrapper.removeChild(this.domElements[i])}if(this.wrapper!==undefined){this.container.removeChild(this.wrapper);this.wrapper=undefined}this.domElements=[];this._removePopup()}},{key:\"_getValue\",value:function _getValue(path){var base=this.moduleOptions;for(var i=0;i<path.length;i++){if(base[path[i]]!==undefined){base=base[path[i]]}else{base=undefined;break}}return base}},{key:\"_makeItem\",value:function _makeItem(path){if(this.allowCreation===true){var item=document.createElement(\"div\");item.className=\"vis-configuration vis-config-item vis-config-s\"+path.length;for(var _len=arguments.length,domElements=Array(_len>1?_len-1:0),_key=1;_key<_len;_key++){domElements[_key-1]=arguments[_key]}domElements.forEach(function(element){item.appendChild(element)});this.domElements.push(item);return this.domElements.length}return 0}},{key:\"_makeHeader\",value:function _makeHeader(name){var div=document.createElement(\"div\");div.className=\"vis-configuration vis-config-header\";div.innerHTML=name;this._makeItem([],div)}},{key:\"_makeLabel\",value:function _makeLabel(name,path){var objectLabel=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var div=document.createElement(\"div\");div.className=\"vis-configuration vis-config-label vis-config-s\"+path.length;if(objectLabel===true){div.innerHTML=\"<i><b>\"+name+\":</b></i>\"}else{div.innerHTML=name+\":\"}return div}},{key:\"_makeDropdown\",value:function _makeDropdown(arr,value,path){var select=document.createElement(\"select\");select.className=\"vis-configuration vis-config-select\";var selectedValue=0;if(value!==undefined){if(arr.indexOf(value)!==-1){selectedValue=arr.indexOf(value)}}for(var i=0;i<arr.length;i++){var option=document.createElement(\"option\");option.value=arr[i];if(i===selectedValue){option.selected=\"selected\"}option.innerHTML=arr[i];select.appendChild(option)}var me=this;select.onchange=function(){me._update(this.value,path)};var label=this._makeLabel(path[path.length-1],path);this._makeItem(path,label,select)}},{key:\"_makeRange\",value:function _makeRange(arr,value,path){var defaultValue=arr[0];var min=arr[1];var max=arr[2];var step=arr[3];var range=document.createElement(\"input\");range.className=\"vis-configuration vis-config-range\";try{range.type=\"range\";range.min=min;range.max=max}catch(err){}range.step=step;var popupString=\"\";var popupValue=0;if(value!==undefined){var factor=1.2;if(value<0&&value*factor<min){range.min=Math.ceil(value*factor);popupValue=range.min;popupString=\"range increased\"}else if(value/factor<min){range.min=Math.ceil(value/factor);popupValue=range.min;popupString=\"range increased\"}if(value*factor>max&&max!==1){range.max=Math.ceil(value*factor);popupValue=range.max;popupString=\"range increased\"}range.value=value}else{range.value=defaultValue}var input=document.createElement(\"input\");input.className=\"vis-configuration vis-config-rangeinput\";input.value=range.value;var me=this;range.onchange=function(){input.value=this.value;me._update(Number(this.value),path)};range.oninput=function(){input.value=this.value};var label=this._makeLabel(path[path.length-1],path);var itemIndex=this._makeItem(path,label,range,input);if(popupString!==\"\"&&this.popupHistory[itemIndex]!==popupValue){this.popupHistory[itemIndex]=popupValue;this._setupPopup(popupString,itemIndex)}}},{key:\"_setupPopup\",value:function _setupPopup(string,index){var _this2=this;if(this.initialized===true&&this.allowCreation===true&&this.popupCounter<this.popupLimit){var div=document.createElement(\"div\");div.id=\"vis-configuration-popup\";div.className=\"vis-configuration-popup\";div.innerHTML=string;div.onclick=function(){_this2._removePopup()};this.popupCounter+=1;this.popupDiv={html:div,index:index}}}},{key:\"_removePopup\",value:function _removePopup(){if(this.popupDiv.html!==undefined){this.popupDiv.html.parentNode.removeChild(this.popupDiv.html);clearTimeout(this.popupDiv.hideTimeout);clearTimeout(this.popupDiv.deleteTimeout);this.popupDiv={}}}},{key:\"_showPopupIfNeeded\",value:function _showPopupIfNeeded(){var _this3=this;if(this.popupDiv.html!==undefined){var correspondingElement=this.domElements[this.popupDiv.index];var rect=correspondingElement.getBoundingClientRect();this.popupDiv.html.style.left=rect.left+\"px\";this.popupDiv.html.style.top=rect.top-30+\"px\";document.body.appendChild(this.popupDiv.html);this.popupDiv.hideTimeout=setTimeout(function(){_this3.popupDiv.html.style.opacity=0},1500);this.popupDiv.deleteTimeout=setTimeout(function(){_this3._removePopup()},1800)}}},{key:\"_makeCheckbox\",value:function _makeCheckbox(defaultValue,value,path){var checkbox=document.createElement(\"input\");checkbox.type=\"checkbox\";checkbox.className=\"vis-configuration vis-config-checkbox\";checkbox.checked=defaultValue;if(value!==undefined){checkbox.checked=value;if(value!==defaultValue){if((typeof defaultValue===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(defaultValue))===\"object\"){if(value!==defaultValue.enabled){this.changedOptions.push({path:path,value:value})}}else{this.changedOptions.push({path:path,value:value})}}}var me=this;checkbox.onchange=function(){me._update(this.checked,path)};var label=this._makeLabel(path[path.length-1],path);this._makeItem(path,label,checkbox)}},{key:\"_makeTextInput\",value:function _makeTextInput(defaultValue,value,path){var checkbox=document.createElement(\"input\");checkbox.type=\"text\";checkbox.className=\"vis-configuration vis-config-text\";checkbox.value=value;if(value!==defaultValue){this.changedOptions.push({path:path,value:value})}var me=this;checkbox.onchange=function(){me._update(this.value,path)};var label=this._makeLabel(path[path.length-1],path);this._makeItem(path,label,checkbox)}},{key:\"_makeColorField\",value:function _makeColorField(arr,value,path){var _this4=this;var defaultColor=arr[1];var div=document.createElement(\"div\");value=value===undefined?defaultColor:value;if(value!==\"none\"){div.className=\"vis-configuration vis-config-colorBlock\";div.style.backgroundColor=value}else{div.className=\"vis-configuration vis-config-colorBlock none\"}value=value===undefined?defaultColor:value;div.onclick=function(){_this4._showColorPicker(value,div,path)};var label=this._makeLabel(path[path.length-1],path);this._makeItem(path,label,div)}},{key:\"_showColorPicker\",value:function _showColorPicker(value,div,path){var _this5=this;div.onclick=function(){};this.colorPicker.insertTo(div);this.colorPicker.show();this.colorPicker.setColor(value);this.colorPicker.setUpdateCallback(function(color){\nvar colorString=\"rgba(\"+color.r+\",\"+color.g+\",\"+color.b+\",\"+color.a+\")\";div.style.backgroundColor=colorString;_this5._update(colorString,path)});this.colorPicker.setCloseCallback(function(){div.onclick=function(){_this5._showColorPicker(value,div,path)}})}},{key:\"_handleObject\",value:function _handleObject(obj){var path=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];var checkOnly=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var show=false;var filter=this.options.filter;var visibleInSet=false;for(var subObj in obj){if(obj.hasOwnProperty(subObj)){show=true;var item=obj[subObj];var newPath=util.copyAndExtendArray(path,subObj);if(typeof filter===\"function\"){show=filter(subObj,path);if(show===false){if(!(item instanceof Array)&&typeof item!==\"string\"&&typeof item!==\"boolean\"&&item instanceof Object){this.allowCreation=false;show=this._handleObject(item,newPath,true);this.allowCreation=checkOnly===false}}}if(show!==false){visibleInSet=true;var value=this._getValue(newPath);if(item instanceof Array){this._handleArray(item,value,newPath)}else if(typeof item===\"string\"){this._makeTextInput(item,value,newPath)}else if(typeof item===\"boolean\"){this._makeCheckbox(item,value,newPath)}else if(item instanceof Object){var draw=true;if(path.indexOf(\"physics\")!==-1){if(this.moduleOptions.physics.solver!==subObj){draw=false}}if(draw===true){if(item.enabled!==undefined){var enabledPath=util.copyAndExtendArray(newPath,\"enabled\");var enabledValue=this._getValue(enabledPath);if(enabledValue===true){var label=this._makeLabel(subObj,newPath,true);this._makeItem(newPath,label);visibleInSet=this._handleObject(item,newPath)||visibleInSet}else{this._makeCheckbox(item,enabledValue,newPath)}}else{var _label=this._makeLabel(subObj,newPath,true);this._makeItem(newPath,_label);visibleInSet=this._handleObject(item,newPath)||visibleInSet}}}else{console.error(\"dont know how to handle\",item,subObj,newPath)}}}}return visibleInSet}},{key:\"_handleArray\",value:function _handleArray(arr,value,path){if(typeof arr[0]===\"string\"&&arr[0]===\"color\"){this._makeColorField(arr,value,path);if(arr[1]!==value){this.changedOptions.push({path:path,value:value})}}else if(typeof arr[0]===\"string\"){this._makeDropdown(arr,value,path);if(arr[0]!==value){this.changedOptions.push({path:path,value:value})}}else if(typeof arr[0]===\"number\"){this._makeRange(arr,value,path);if(arr[0]!==value){this.changedOptions.push({path:path,value:Number(value)})}}}},{key:\"_update\",value:function _update(value,path){var options=this._constructOptions(value,path);if(this.parent.body&&this.parent.body.emitter&&this.parent.body.emitter.emit){this.parent.body.emitter.emit(\"configChange\",options)}this.initialized=true;this.parent.setOptions(options)}},{key:\"_constructOptions\",value:function _constructOptions(value,path){var optionsObj=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};var pointer=optionsObj;value=value===\"true\"?true:value;value=value===\"false\"?false:value;for(var i=0;i<path.length;i++){if(path[i]!==\"global\"){if(pointer[path[i]]===undefined){pointer[path[i]]={}}if(i!==path.length-1){pointer=pointer[path[i]]}else{pointer[path[i]]=value}}}return optionsObj}},{key:\"_printOptions\",value:function _printOptions(){var options=this.getOptions();this.optionsContainer.innerHTML=\"<pre>var options = \"+(0,_stringify2[\"default\"])(options,null,2)+\"</pre>\"}},{key:\"getOptions\",value:function getOptions(){var options={};for(var i=0;i<this.changedOptions.length;i++){this._constructOptions(this.changedOptions[i].value,this.changedOptions[i].path,options)}return options}}]);return Configurator}();exports[\"default\"]=Configurator},function(module,exports,__webpack_require__){\"use strict\";var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var DOMutil=__webpack_require__(14);function Points(groupId,options){}Points.draw=function(dataset,group,framework,offset){offset=offset||0;var callback=getCallback(framework,group);for(var i=0;i<dataset.length;i++){if(!callback){DOMutil.drawPoint(dataset[i].screen_x+offset,dataset[i].screen_y,getGroupTemplate(group),framework.svgElements,framework.svg,dataset[i].label)}else{var callbackResult=callback(dataset[i],group);if(callbackResult===true||(typeof callbackResult===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(callbackResult))===\"object\"){DOMutil.drawPoint(dataset[i].screen_x+offset,dataset[i].screen_y,getGroupTemplate(group,callbackResult),framework.svgElements,framework.svg,dataset[i].label)}}}};Points.drawIcon=function(group,x,y,iconWidth,iconHeight,framework){var fillHeight=iconHeight*.5;var outline=DOMutil.getSVGElement(\"rect\",framework.svgElements,framework.svg);outline.setAttributeNS(null,\"x\",x);outline.setAttributeNS(null,\"y\",y-fillHeight);outline.setAttributeNS(null,\"width\",iconWidth);outline.setAttributeNS(null,\"height\",2*fillHeight);outline.setAttributeNS(null,\"class\",\"vis-outline\");DOMutil.drawPoint(x+.5*iconWidth,y,getGroupTemplate(group),framework.svgElements,framework.svg)};function getGroupTemplate(group,callbackResult){callbackResult=typeof callbackResult===\"undefined\"?{}:callbackResult;return{style:callbackResult.style||group.options.drawPoints.style,styles:callbackResult.styles||group.options.drawPoints.styles,size:callbackResult.size||group.options.drawPoints.size,className:callbackResult.className||group.className}}function getCallback(framework,group){var callback=undefined;if(framework.options&&framework.options.drawPoints&&framework.options.drawPoints.onRender&&typeof framework.options.drawPoints.onRender==\"function\"){callback=framework.options.drawPoints.onRender}if(group.group.options&&group.group.options.drawPoints&&group.group.options.drawPoints.onRender&&typeof group.group.options.drawPoints.onRender==\"function\"){callback=group.group.options.drawPoints.onRender}return callback}module.exports=Points},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _NodeBase2=__webpack_require__(23);var _NodeBase3=_interopRequireDefault(_NodeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var CircleImageBase=function(_NodeBase){(0,_inherits3[\"default\"])(CircleImageBase,_NodeBase);function CircleImageBase(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,CircleImageBase);var _this=(0,_possibleConstructorReturn3[\"default\"])(this,(CircleImageBase.__proto__||(0,_getPrototypeOf2[\"default\"])(CircleImageBase)).call(this,options,body,labelModule));_this.labelOffset=0;_this.selected=false;return _this}(0,_createClass3[\"default\"])(CircleImageBase,[{key:\"setOptions\",value:function setOptions(options,imageObj,imageObjAlt){this.options=options;if(!(imageObj===undefined&&imageObjAlt===undefined)){this.setImages(imageObj,imageObjAlt)}}},{key:\"setImages\",value:function setImages(imageObj,imageObjAlt){if(imageObjAlt&&this.selected){this.imageObj=imageObjAlt;this.imageObjAlt=imageObj}else{this.imageObj=imageObj;this.imageObjAlt=imageObjAlt}}},{key:\"switchImages\",value:function switchImages(selected){var selection_changed=selected&&!this.selected||!selected&&this.selected;this.selected=selected;if(this.imageObjAlt!==undefined&&selection_changed){var imageTmp=this.imageObj;this.imageObj=this.imageObjAlt;this.imageObjAlt=imageTmp}}},{key:\"_resizeImage\",value:function _resizeImage(){var width,height;if(this.options.shapeProperties.useImageSize===false){var ratio_width=1;var ratio_height=1;if(this.imageObj.width&&this.imageObj.height){if(this.imageObj.width>this.imageObj.height){ratio_width=this.imageObj.width/this.imageObj.height}else{ratio_height=this.imageObj.height/this.imageObj.width}}width=this.options.size*2*ratio_width;height=this.options.size*2*ratio_height}else{width=this.imageObj.width;height=this.imageObj.height}this.width=width;this.height=height;this.radius=.5*this.width}},{key:\"_drawRawCircle\",value:function _drawRawCircle(ctx,x,y,values){this.initContextForDraw(ctx,values);ctx.circle(x,y,values.size);this.performFill(ctx,values)}},{key:\"_drawImageAtPosition\",value:function _drawImageAtPosition(ctx,values){if(this.imageObj.width!=0){ctx.globalAlpha=1;this.enableShadow(ctx,values);var factor=1;if(this.options.shapeProperties.interpolation===true){factor=this.imageObj.width/this.width/this.body.view.scale}this.imageObj.drawImageAtPosition(ctx,factor,this.left,this.top,this.width,this.height);this.disableShadow(ctx,values)}}},{key:\"_drawImageLabel\",value:function _drawImageLabel(ctx,x,y,selected,hover){var yLabel;var offset=0;if(this.height!==undefined){offset=this.height*.5;var labelDimensions=this.labelModule.getTextSize(ctx,selected,hover);if(labelDimensions.lineCount>=1){offset+=labelDimensions.height/2}}yLabel=y+offset;if(this.options.label){this.labelOffset=offset}this.labelModule.draw(ctx,x,yLabel,selected,hover,\"hanging\")}}]);return CircleImageBase}(_NodeBase3[\"default\"]);exports[\"default\"]=CircleImageBase},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _stringify=__webpack_require__(19);var _stringify2=_interopRequireDefault(_stringify);var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);var _create=__webpack_require__(29);var _create2=_interopRequireDefault(_create);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var Label=__webpack_require__(117)[\"default\"];var ComponentUtil=__webpack_require__(48)[\"default\"];var CubicBezierEdge=__webpack_require__(215)[\"default\"];var BezierEdgeDynamic=__webpack_require__(217)[\"default\"];var BezierEdgeStatic=__webpack_require__(218)[\"default\"];var StraightEdge=__webpack_require__(219)[\"default\"];var Edge=function(){function Edge(options,body,globalOptions,defaultOptions){(0,_classCallCheck3[\"default\"])(this,Edge);if(body===undefined){throw new Error(\"No body provided\")}this.options=util.bridgeObject(globalOptions);this.globalOptions=globalOptions;this.defaultOptions=defaultOptions;this.body=body;this.id=undefined;this.fromId=undefined;this.toId=undefined;this.selected=false;this.hover=false;this.labelDirty=true;this.baseWidth=this.options.width;this.baseFontSize=this.options.font.size;this.from=undefined;this.to=undefined;this.edgeType=undefined;this.connected=false;this.labelModule=new Label(this.body,this.options,true);this.setOptions(options)}(0,_createClass3[\"default\"])(Edge,[{key:\"setOptions\",value:function setOptions(options){if(!options){return}Edge.parseOptions(this.options,options,true,this.globalOptions);if(options.id!==undefined){this.id=options.id}if(options.from!==undefined){this.fromId=options.from}if(options.to!==undefined){this.toId=options.to}if(options.title!==undefined){this.title=options.title}if(options.value!==undefined){options.value=parseFloat(options.value)}var pile=[options,this.options,this.defaultOptions];this.chooser=ComponentUtil.choosify(\"edge\",pile);this.updateLabelModule(options);var dataChanged=this.updateEdgeType();this._setInteractionWidths();this.connect();if(options.hidden!==undefined||options.physics!==undefined){dataChanged=true}return dataChanged}},{key:\"getFormattingValues\",value:function getFormattingValues(){var toArrow=this.options.arrows.to===true||this.options.arrows.to.enabled===true;var fromArrow=this.options.arrows.from===true||this.options.arrows.from.enabled===true;var middleArrow=this.options.arrows.middle===true||this.options.arrows.middle.enabled===true;var inheritsColor=this.options.color.inherit;var values={toArrow:toArrow,toArrowScale:this.options.arrows.to.scaleFactor,toArrowType:this.options.arrows.to.type,middleArrow:middleArrow,middleArrowScale:this.options.arrows.middle.scaleFactor,middleArrowType:this.options.arrows.middle.type,fromArrow:fromArrow,fromArrowScale:this.options.arrows.from.scaleFactor,fromArrowType:this.options.arrows.from.type,arrowStrikethrough:this.options.arrowStrikethrough,color:inheritsColor?undefined:this.options.color.color,inheritsColor:inheritsColor,opacity:this.options.color.opacity,hidden:this.options.hidden,length:this.options.length,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y,dashes:this.options.dashes,width:this.options.width};if(this.selected||this.hover){if(this.chooser===true){if(this.selected){var selectedWidth=this.options.selectionWidth;if(typeof selectedWidth===\"function\"){values.width=selectedWidth(values.width)}else if(typeof selectedWidth===\"number\"){values.width+=selectedWidth}values.width=Math.max(values.width,.3/this.body.view.scale);values.color=this.options.color.highlight;values.shadow=this.options.shadow.enabled}else if(this.hover){var hoverWidth=this.options.hoverWidth;if(typeof hoverWidth===\"function\"){values.width=hoverWidth(values.width)}else if(typeof hoverWidth===\"number\"){values.width+=hoverWidth}values.width=Math.max(values.width,.3/this.body.view.scale);values.color=this.options.color.hover;values.shadow=this.options.shadow.enabled}}else if(typeof this.chooser===\"function\"){this.chooser(values,this.options.id,this.selected,this.hover);if(values.color!==undefined){values.inheritsColor=false}if(values.shadow===false){if(values.shadowColor!==this.options.shadow.color||values.shadowSize!==this.options.shadow.size||values.shadowX!==this.options.shadow.x||values.shadowY!==this.options.shadow.y){values.shadow=true}}}}else{values.shadow=this.options.shadow.enabled;values.width=Math.max(values.width,.3/this.body.view.scale)}return values}},{key:\"updateLabelModule\",value:function updateLabelModule(options){var pile=[options,this.options,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,pile);if(this.labelModule.baseSize!==undefined){this.baseFontSize=this.labelModule.baseSize}}},{key:\"updateEdgeType\",value:function updateEdgeType(){var smooth=this.options.smooth;var dataChanged=false;var changeInType=true;if(this.edgeType!==undefined){if(this.edgeType instanceof BezierEdgeDynamic&&smooth.enabled===true&&smooth.type===\"dynamic\"||this.edgeType instanceof CubicBezierEdge&&smooth.enabled===true&&smooth.type===\"cubicBezier\"||this.edgeType instanceof BezierEdgeStatic&&smooth.enabled===true&&smooth.type!==\"dynamic\"&&smooth.type!==\"cubicBezier\"||this.edgeType instanceof StraightEdge&&smooth.type.enabled===false){changeInType=false}if(changeInType===true){dataChanged=this.cleanup()}}if(changeInType===true){if(smooth.enabled===true){if(smooth.type===\"dynamic\"){dataChanged=true;this.edgeType=new BezierEdgeDynamic(this.options,this.body,this.labelModule)}else if(smooth.type===\"cubicBezier\"){this.edgeType=new CubicBezierEdge(this.options,this.body,this.labelModule)}else{this.edgeType=new BezierEdgeStatic(this.options,this.body,this.labelModule)}}else{this.edgeType=new StraightEdge(this.options,this.body,this.labelModule)}}else{this.edgeType.setOptions(this.options)}return dataChanged}},{key:\"connect\",value:function connect(){this.disconnect();this.from=this.body.nodes[this.fromId]||undefined;this.to=this.body.nodes[this.toId]||undefined;this.connected=this.from!==undefined&&this.to!==undefined;if(this.connected===true){this.from.attachEdge(this);this.to.attachEdge(this)}else{if(this.from){this.from.detachEdge(this)}if(this.to){this.to.detachEdge(this)}}this.edgeType.connect()}},{key:\"disconnect\",value:function disconnect(){if(this.from){this.from.detachEdge(this);this.from=undefined}if(this.to){this.to.detachEdge(this);this.to=undefined}this.connected=false}},{key:\"getTitle\",value:function getTitle(){return this.title}},{key:\"isSelected\",value:function isSelected(){return this.selected}},{key:\"getValue\",value:function getValue(){return this.options.value}},{key:\"setValueRange\",value:function setValueRange(min,max,total){if(this.options.value!==undefined){var scale=this.options.scaling.customScalingFunction(min,max,total,this.options.value);var widthDiff=this.options.scaling.max-this.options.scaling.min;if(this.options.scaling.label.enabled===true){var fontDiff=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+scale*fontDiff}this.options.width=this.options.scaling.min+scale*widthDiff}else{this.options.width=this.baseWidth;this.options.font.size=this.baseFontSize}this._setInteractionWidths();this.updateLabelModule()}},{key:\"_setInteractionWidths\",value:function _setInteractionWidths(){if(typeof this.options.hoverWidth===\"function\"){this.edgeType.hoverWidth=this.options.hoverWidth(this.options.width)}else{this.edgeType.hoverWidth=this.options.hoverWidth+this.options.width}if(typeof this.options.selectionWidth===\"function\"){this.edgeType.selectionWidth=this.options.selectionWidth(this.options.width)}else{this.edgeType.selectionWidth=this.options.selectionWidth+this.options.width}}},{key:\"draw\",value:function draw(ctx){var values=this.getFormattingValues();if(values.hidden){return}var viaNode=this.edgeType.getViaNode();var arrowData={};this.edgeType.fromPoint=this.edgeType.from;this.edgeType.toPoint=this.edgeType.to;if(values.fromArrow){arrowData.from=this.edgeType.getArrowData(ctx,\"from\",viaNode,this.selected,this.hover,values);if(values.arrowStrikethrough===false)this.edgeType.fromPoint=arrowData.from.core}if(values.toArrow){arrowData.to=this.edgeType.getArrowData(ctx,\"to\",viaNode,this.selected,this.hover,values);if(values.arrowStrikethrough===false)this.edgeType.toPoint=arrowData.to.core}if(values.middleArrow){arrowData.middle=this.edgeType.getArrowData(ctx,\"middle\",viaNode,this.selected,this.hover,values)}this.edgeType.drawLine(ctx,values,this.selected,this.hover,viaNode);this.drawArrows(ctx,arrowData,values);this.drawLabel(ctx,viaNode)}},{key:\"drawArrows\",value:function drawArrows(ctx,arrowData,values){if(values.fromArrow){this.edgeType.drawArrowHead(ctx,values,this.selected,this.hover,arrowData.from)}if(values.middleArrow){this.edgeType.drawArrowHead(ctx,values,this.selected,this.hover,arrowData.middle)}if(values.toArrow){this.edgeType.drawArrowHead(ctx,values,this.selected,this.hover,arrowData.to)}}},{key:\"drawLabel\",value:function drawLabel(ctx,viaNode){if(this.options.label!==undefined){var node1=this.from;var node2=this.to;if(this.labelModule.differentState(this.selected,this.hover)){this.labelModule.getTextSize(ctx,this.selected,this.hover)}if(node1.id!=node2.id){this.labelModule.pointToSelf=false;var point=this.edgeType.getPoint(.5,viaNode);ctx.save();var rotationPoint=this._getRotation(ctx);if(rotationPoint.angle!=0){ctx.translate(rotationPoint.x,rotationPoint.y);ctx.rotate(rotationPoint.angle)}this.labelModule.draw(ctx,point.x,point.y,this.selected,this.hover);ctx.restore()}else{this.labelModule.pointToSelf=true;var x,y;var radius=this.options.selfReferenceSize;if(node1.shape.width>node1.shape.height){x=node1.x+node1.shape.width*.5;y=node1.y-radius}else{x=node1.x+radius;y=node1.y-node1.shape.height*.5}point=this._pointOnCircle(x,y,radius,.125);this.labelModule.draw(ctx,point.x,point.y,this.selected,this.hover)}}}},{key:\"getItemsOnPoint\",value:function getItemsOnPoint(point){var ret=[];if(this.labelModule.visible()){var rotationPoint=this._getRotation();if(ComponentUtil.pointInRect(this.labelModule.getSize(),point,rotationPoint)){ret.push({edgeId:this.id,labelId:0})}}var obj={left:point.x,top:point.y};if(this.isOverlappingWith(obj)){ret.push({edgeId:this.id})}return ret}},{key:\"isOverlappingWith\",value:function isOverlappingWith(obj){if(this.connected){var distMax=10;var xFrom=this.from.x;var yFrom=this.from.y;var xTo=this.to.x;var yTo=this.to.y;var xObj=obj.left;var yObj=obj.top;var dist=this.edgeType.getDistanceToEdge(xFrom,yFrom,xTo,yTo,xObj,yObj);return dist<distMax}else{return false}}},{key:\"_getRotation\",value:function _getRotation(ctx){var viaNode=this.edgeType.getViaNode();var point=this.edgeType.getPoint(.5,viaNode);if(ctx!==undefined){this.labelModule.calculateLabelSize(ctx,this.selected,this.hover,point.x,point.y)}var ret={x:point.x,y:this.labelModule.size.yLine,angle:0};if(!this.labelModule.visible()){return ret}if(this.options.font.align===\"horizontal\"){return ret}var dy=this.from.y-this.to.y;var dx=this.from.x-this.to.x;var angle=Math.atan2(dy,dx);if(angle<-1&&dx<0||angle>0&&dx<0){angle+=Math.PI}ret.angle=angle;return ret}},{key:\"_pointOnCircle\",value:function _pointOnCircle(x,y,radius,percentage){var angle=percentage*2*Math.PI;return{x:x+radius*Math.cos(angle),y:y-radius*Math.sin(angle)}}},{key:\"select\",value:function select(){this.selected=true}},{key:\"unselect\",value:function unselect(){this.selected=false}},{key:\"cleanup\",value:function cleanup(){return this.edgeType.cleanup()}},{key:\"remove\",value:function remove(){this.cleanup();this.disconnect();delete this.body.edges[this.id]}},{key:\"endPointsValid\",value:function endPointsValid(){return this.body.nodes[this.fromId]!==undefined&&this.body.nodes[this.toId]!==undefined}}],[{key:\"parseOptions\",value:function parseOptions(parentOptions,newOptions){var allowDeletion=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var globalOptions=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};var copyFromGlobals=arguments.length>4&&arguments[4]!==undefined?arguments[4]:false;var fields=[\"arrowStrikethrough\",\"id\",\"from\",\"hidden\",\"hoverWidth\",\"labelHighlightBold\",\"length\",\"line\",\"opacity\",\"physics\",\"scaling\",\"selectionWidth\",\"selfReferenceSize\",\"to\",\"title\",\"value\",\"width\",\"font\",\"chosen\",\"widthConstraint\"];util.selectiveDeepExtend(fields,parentOptions,newOptions,allowDeletion);if(ComponentUtil.isValidLabel(newOptions.label)){parentOptions.label=newOptions.label}else{parentOptions.label=undefined}util.mergeOptions(parentOptions,newOptions,\"smooth\",globalOptions);util.mergeOptions(parentOptions,newOptions,\"shadow\",globalOptions);if(newOptions.dashes!==undefined&&newOptions.dashes!==null){parentOptions.dashes=newOptions.dashes}else if(allowDeletion===true&&newOptions.dashes===null){parentOptions.dashes=(0,_create2[\"default\"])(globalOptions.dashes)}if(newOptions.scaling!==undefined&&newOptions.scaling!==null){if(newOptions.scaling.min!==undefined){parentOptions.scaling.min=newOptions.scaling.min}if(newOptions.scaling.max!==undefined){parentOptions.scaling.max=newOptions.scaling.max}util.mergeOptions(parentOptions.scaling,newOptions.scaling,\"label\",globalOptions.scaling)}else if(allowDeletion===true&&newOptions.scaling===null){parentOptions.scaling=(0,_create2[\"default\"])(globalOptions.scaling)}if(newOptions.arrows!==undefined&&newOptions.arrows!==null){if(typeof newOptions.arrows===\"string\"){var arrows=newOptions.arrows.toLowerCase();parentOptions.arrows.to.enabled=arrows.indexOf(\"to\")!=-1;parentOptions.arrows.middle.enabled=arrows.indexOf(\"middle\")!=-1;parentOptions.arrows.from.enabled=arrows.indexOf(\"from\")!=-1}else if((0,_typeof3[\"default\"])(newOptions.arrows)===\"object\"){util.mergeOptions(parentOptions.arrows,newOptions.arrows,\"to\",globalOptions.arrows);util.mergeOptions(parentOptions.arrows,newOptions.arrows,\"middle\",globalOptions.arrows);util.mergeOptions(parentOptions.arrows,newOptions.arrows,\"from\",globalOptions.arrows)}else{throw new Error(\"The arrow newOptions can only be an object or a string. Refer to the documentation. You used:\"+(0,_stringify2[\"default\"])(newOptions.arrows))}}else if(allowDeletion===true&&newOptions.arrows===null){parentOptions.arrows=(0,_create2[\"default\"])(globalOptions.arrows)}if(newOptions.color!==undefined&&newOptions.color!==null){var fromColor=newOptions.color;var toColor=parentOptions.color;if(copyFromGlobals){util.deepExtend(toColor,globalOptions.color,false,allowDeletion)}else{for(var i in toColor){if(toColor.hasOwnProperty(i)){delete toColor[i]}}}if(util.isString(toColor)){toColor.color=toColor;toColor.highlight=toColor;toColor.hover=toColor;toColor.inherit=false;if(fromColor.opacity===undefined){toColor.opacity=1}}else{var colorsDefined=false;if(fromColor.color!==undefined){toColor.color=fromColor.color;colorsDefined=true}if(fromColor.highlight!==undefined){toColor.highlight=fromColor.highlight;colorsDefined=true}if(fromColor.hover!==undefined){toColor.hover=fromColor.hover;colorsDefined=true}if(fromColor.inherit!==undefined){toColor.inherit=fromColor.inherit}if(fromColor.opacity!==undefined){toColor.opacity=Math.min(1,Math.max(0,fromColor.opacity))}if(colorsDefined===true){toColor.inherit=false}else{if(toColor.inherit===undefined){toColor.inherit=\"from\"}}}}else if(allowDeletion===true&&newOptions.color===null){parentOptions.color=util.bridgeObject(globalOptions.color)}if(allowDeletion===true&&newOptions.font===null){parentOptions.font=util.bridgeObject(globalOptions.font)}}}]);return Edge}();exports[\"default\"]=Edge},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _EdgeBase2=__webpack_require__(118);var _EdgeBase3=_interopRequireDefault(_EdgeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var BezierEdgeBase=function(_EdgeBase){(0,_inherits3[\"default\"])(BezierEdgeBase,_EdgeBase);function BezierEdgeBase(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,BezierEdgeBase);return(0,_possibleConstructorReturn3[\"default\"])(this,(BezierEdgeBase.__proto__||(0,_getPrototypeOf2[\"default\"])(BezierEdgeBase)).call(this,options,body,labelModule))}(0,_createClass3[\"default\"])(BezierEdgeBase,[{key:\"_findBorderPositionBezier\",value:function _findBorderPositionBezier(nearNode,ctx){var viaNode=arguments.length>2&&arguments[2]!==undefined?arguments[2]:this._getViaCoordinates();var maxIterations=10;var iteration=0;var low=0;var high=1;var pos,angle,distanceToBorder,distanceToPoint,difference;var threshold=.2;var node=this.to;var from=false;if(nearNode.id===this.from.id){node=this.from;from=true}while(low<=high&&iteration<maxIterations){var middle=(low+high)*.5;pos=this.getPoint(middle,viaNode);angle=Math.atan2(node.y-pos.y,node.x-pos.x);distanceToBorder=node.distanceToBorder(ctx,angle);distanceToPoint=Math.sqrt(Math.pow(pos.x-node.x,2)+Math.pow(pos.y-node.y,2));difference=distanceToBorder-distanceToPoint;if(Math.abs(difference)<threshold){break}else if(difference<0){if(from===false){low=middle}else{high=middle}}else{if(from===false){high=middle}else{low=middle}}iteration++}pos.t=middle;return pos}},{key:\"_getDistanceToBezierEdge\",value:function _getDistanceToBezierEdge(x1,y1,x2,y2,x3,y3,via){var minDistance=1e9;var distance=void 0;var i=void 0,t=void 0,x=void 0,y=void 0;var lastX=x1;var lastY=y1;for(i=1;i<10;i++){t=.1*i;x=Math.pow(1-t,2)*x1+2*t*(1-t)*via.x+Math.pow(t,2)*x2;y=Math.pow(1-t,2)*y1+2*t*(1-t)*via.y+Math.pow(t,2)*y2;if(i>0){distance=this._getDistanceToLine(lastX,lastY,x,y,x3,y3);minDistance=distance<minDistance?distance:minDistance}lastX=x;lastY=y}return minDistance}},{key:\"_bezierCurve\",value:function _bezierCurve(ctx,values,viaNode1,viaNode2){var hasNode1=viaNode1!==undefined&&viaNode1.x!==undefined;var hasNode2=viaNode2!==undefined&&viaNode2.x!==undefined;ctx.beginPath();ctx.moveTo(this.fromPoint.x,this.fromPoint.y);if(hasNode1&&hasNode2){ctx.bezierCurveTo(viaNode1.x,viaNode1.y,viaNode2.x,viaNode2.y,this.toPoint.x,this.toPoint.y)}else if(hasNode1){ctx.quadraticCurveTo(viaNode1.x,viaNode1.y,this.toPoint.x,this.toPoint.y)}else{ctx.lineTo(this.toPoint.x,this.toPoint.y)}this.enableShadow(ctx,values);ctx.stroke();this.disableShadow(ctx,values)}},{key:\"getViaNode\",value:function getViaNode(){return this._getViaCoordinates()}}]);return BezierEdgeBase}(_EdgeBase3[\"default\"]);exports[\"default\"]=BezierEdgeBase},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var NetworkUtil=function(){function NetworkUtil(){(0,_classCallCheck3[\"default\"])(this,NetworkUtil)}(0,_createClass3[\"default\"])(NetworkUtil,null,[{key:\"getRange\",value:function getRange(allNodes){var specificNodes=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];var minY=1e9,maxY=-1e9,minX=1e9,maxX=-1e9,node;if(specificNodes.length>0){for(var i=0;i<specificNodes.length;i++){node=allNodes[specificNodes[i]];if(minX>node.shape.boundingBox.left){minX=node.shape.boundingBox.left}if(maxX<node.shape.boundingBox.right){maxX=node.shape.boundingBox.right}if(minY>node.shape.boundingBox.top){minY=node.shape.boundingBox.top}if(maxY<node.shape.boundingBox.bottom){maxY=node.shape.boundingBox.bottom}}}if(minX===1e9&&maxX===-1e9&&minY===1e9&&maxY===-1e9){minY=0,maxY=0,minX=0,maxX=0}return{minX:minX,maxX:maxX,minY:minY,maxY:maxY}}},{key:\"getRangeCore\",value:function getRangeCore(allNodes){var specificNodes=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];var minY=1e9,maxY=-1e9,minX=1e9,maxX=-1e9,node;if(specificNodes.length>0){for(var i=0;i<specificNodes.length;i++){node=allNodes[specificNodes[i]];if(minX>node.x){minX=node.x}if(maxX<node.x){maxX=node.x}if(minY>node.y){minY=node.y}if(maxY<node.y){maxY=node.y}}}if(minX===1e9&&maxX===-1e9&&minY===1e9&&maxY===-1e9){minY=0,maxY=0,minX=0,maxX=0}return{minX:minX,maxX:maxX,minY:minY,maxY:maxY}}},{key:\"findCenter\",value:function findCenter(range){return{x:.5*(range.maxX+range.minX),y:.5*(range.maxY+range.minY)}}},{key:\"cloneOptions\",value:function cloneOptions(item,type){var clonedOptions={};if(type===undefined||type===\"node\"){util.deepExtend(clonedOptions,item.options,true);clonedOptions.x=item.x;clonedOptions.y=item.y;clonedOptions.amountOfConnections=item.edges.length}else{util.deepExtend(clonedOptions,item.options,true)}return clonedOptions}}]);return NetworkUtil}();exports[\"default\"]=NetworkUtil},function(module,exports,__webpack_require__){module.exports={default:__webpack_require__(124),__esModule:true}},function(module,exports,__webpack_require__){var cof=__webpack_require__(50);module.exports=Object(\"z\").propertyIsEnumerable(0)?Object:function(it){return cof(it)==\"String\"?it.split(\"\"):Object(it)}},function(module,exports,__webpack_require__){\"use strict\";var LIBRARY=__webpack_require__(52);var $export=__webpack_require__(17);var redefine=__webpack_require__(83);var hide=__webpack_require__(26);var has=__webpack_require__(22);var Iterators=__webpack_require__(31);var $iterCreate=__webpack_require__(129);var setToStringTag=__webpack_require__(59);var getPrototypeOf=__webpack_require__(85);var ITERATOR=__webpack_require__(13)(\"iterator\");var BUGGY=!([].keys&&\"next\"in[].keys())\n;var FF_ITERATOR=\"@@iterator\";var KEYS=\"keys\";var VALUES=\"values\";var returnThis=function(){return this};module.exports=function(Base,NAME,Constructor,next,DEFAULT,IS_SET,FORCED){$iterCreate(Constructor,NAME,next);var getMethod=function(kind){if(!BUGGY&&kind in proto)return proto[kind];switch(kind){case KEYS:return function keys(){return new Constructor(this,kind)};case VALUES:return function values(){return new Constructor(this,kind)}}return function entries(){return new Constructor(this,kind)}};var TAG=NAME+\" Iterator\";var DEF_VALUES=DEFAULT==VALUES;var VALUES_BUG=false;var proto=Base.prototype;var $native=proto[ITERATOR]||proto[FF_ITERATOR]||DEFAULT&&proto[DEFAULT];var $default=$native||getMethod(DEFAULT);var $entries=DEFAULT?!DEF_VALUES?$default:getMethod(\"entries\"):undefined;var $anyNative=NAME==\"Array\"?proto.entries||$native:$native;var methods,key,IteratorPrototype;if($anyNative){IteratorPrototype=getPrototypeOf($anyNative.call(new Base));if(IteratorPrototype!==Object.prototype&&IteratorPrototype.next){setToStringTag(IteratorPrototype,TAG,true);if(!LIBRARY&&!has(IteratorPrototype,ITERATOR))hide(IteratorPrototype,ITERATOR,returnThis)}}if(DEF_VALUES&&$native&&$native.name!==VALUES){VALUES_BUG=true;$default=function values(){return $native.call(this)}}if((!LIBRARY||FORCED)&&(BUGGY||VALUES_BUG||!proto[ITERATOR])){hide(proto,ITERATOR,$default)}Iterators[NAME]=$default;Iterators[TAG]=returnThis;if(DEFAULT){methods={values:DEF_VALUES?$default:getMethod(VALUES),keys:IS_SET?$default:getMethod(KEYS),entries:$entries};if(FORCED)for(key in methods){if(!(key in proto))redefine(proto,key,methods[key])}else $export($export.P+$export.F*(BUGGY||VALUES_BUG),NAME,methods)}return methods}},function(module,exports,__webpack_require__){var aFunction=__webpack_require__(128);module.exports=function(fn,that,length){aFunction(fn);if(that===undefined)return fn;switch(length){case 1:return function(a){return fn.call(that,a)};case 2:return function(a,b){return fn.call(that,a,b)};case 3:return function(a,b,c){return fn.call(that,a,b,c)}}return function(){return fn.apply(that,arguments)}}},function(module,exports,__webpack_require__){module.exports=!__webpack_require__(21)&&!__webpack_require__(28)(function(){return Object.defineProperty(__webpack_require__(82)(\"div\"),\"a\",{get:function(){return 7}}).a!=7})},function(module,exports,__webpack_require__){var isObject=__webpack_require__(32);var document=__webpack_require__(18).document;var is=isObject(document)&&isObject(document.createElement);module.exports=function(it){return is?document.createElement(it):{}}},function(module,exports,__webpack_require__){module.exports=__webpack_require__(26)},function(module,exports,__webpack_require__){var has=__webpack_require__(22);var toIObject=__webpack_require__(25);var arrayIndexOf=__webpack_require__(131)(false);var IE_PROTO=__webpack_require__(56)(\"IE_PROTO\");module.exports=function(object,names){var O=toIObject(object);var i=0;var result=[];var key;for(key in O)if(key!=IE_PROTO)has(O,key)&&result.push(key);while(names.length>i)if(has(O,key=names[i++])){~arrayIndexOf(result,key)||result.push(key)}return result}},function(module,exports,__webpack_require__){var has=__webpack_require__(22);var toObject=__webpack_require__(41);var IE_PROTO=__webpack_require__(56)(\"IE_PROTO\");var ObjectProto=Object.prototype;module.exports=Object.getPrototypeOf||function(O){O=toObject(O);if(has(O,IE_PROTO))return O[IE_PROTO];if(typeof O.constructor==\"function\"&&O instanceof O.constructor){return O.constructor.prototype}return O instanceof Object?ObjectProto:null}},function(module,exports,__webpack_require__){var cof=__webpack_require__(50);var TAG=__webpack_require__(13)(\"toStringTag\");var ARG=cof(function(){return arguments}())==\"Arguments\";var tryGet=function(it,key){try{return it[key]}catch(e){}};module.exports=function(it){var O,T,B;return it===undefined?\"Undefined\":it===null?\"Null\":typeof(T=tryGet(O=Object(it),TAG))==\"string\"?T:ARG?cof(O):(B=cof(O))==\"Object\"&&typeof O.callee==\"function\"?\"Arguments\":B}},function(module,exports,__webpack_require__){var $export=__webpack_require__(17);var core=__webpack_require__(7);var fails=__webpack_require__(28);module.exports=function(KEY,exec){var fn=(core.Object||{})[KEY]||Object[KEY];var exp={};exp[KEY]=exec(fn);$export($export.S+$export.F*fails(function(){fn(1)}),\"Object\",exp)}},function(module,exports,__webpack_require__){var $keys=__webpack_require__(84);var hiddenKeys=__webpack_require__(58).concat(\"length\",\"prototype\");exports.f=Object.getOwnPropertyNames||function getOwnPropertyNames(O){return $keys(O,hiddenKeys)}},function(module,exports,__webpack_require__){var pIE=__webpack_require__(42);var createDesc=__webpack_require__(39);var toIObject=__webpack_require__(25);var toPrimitive=__webpack_require__(53);var has=__webpack_require__(22);var IE8_DOM_DEFINE=__webpack_require__(81);var gOPD=Object.getOwnPropertyDescriptor;exports.f=__webpack_require__(21)?gOPD:function getOwnPropertyDescriptor(O,P){O=toIObject(O);P=toPrimitive(P,true);if(IE8_DOM_DEFINE)try{return gOPD(O,P)}catch(e){}if(has(O,P))return createDesc(!pIE.f.call(O,P),O[P])}},function(module,exports,__webpack_require__){module.exports={default:__webpack_require__(162),__esModule:true}},function(module,exports,__webpack_require__){\"use strict\";function Point2d(x,y){this.x=x!==undefined?x:0;this.y=y!==undefined?y:0}module.exports=Point2d},function(module,exports,__webpack_require__){\"use strict\";var util=__webpack_require__(2);function Slider(container,options){if(container===undefined){throw new Error(\"No container element defined\")}this.container=container;this.visible=options&&options.visible!=undefined?options.visible:true;if(this.visible){this.frame=document.createElement(\"DIV\");this.frame.style.width=\"100%\";this.frame.style.position=\"relative\";this.container.appendChild(this.frame);this.frame.prev=document.createElement(\"INPUT\");this.frame.prev.type=\"BUTTON\";this.frame.prev.value=\"Prev\";this.frame.appendChild(this.frame.prev);this.frame.play=document.createElement(\"INPUT\");this.frame.play.type=\"BUTTON\";this.frame.play.value=\"Play\";this.frame.appendChild(this.frame.play);this.frame.next=document.createElement(\"INPUT\");this.frame.next.type=\"BUTTON\";this.frame.next.value=\"Next\";this.frame.appendChild(this.frame.next);this.frame.bar=document.createElement(\"INPUT\");this.frame.bar.type=\"BUTTON\";this.frame.bar.style.position=\"absolute\";this.frame.bar.style.border=\"1px solid red\";this.frame.bar.style.width=\"100px\";this.frame.bar.style.height=\"6px\";this.frame.bar.style.borderRadius=\"2px\";this.frame.bar.style.MozBorderRadius=\"2px\";this.frame.bar.style.border=\"1px solid #7F7F7F\";this.frame.bar.style.backgroundColor=\"#E5E5E5\";this.frame.appendChild(this.frame.bar);this.frame.slide=document.createElement(\"INPUT\");this.frame.slide.type=\"BUTTON\";this.frame.slide.style.margin=\"0px\";this.frame.slide.value=\" \";this.frame.slide.style.position=\"relative\";this.frame.slide.style.left=\"-100px\";this.frame.appendChild(this.frame.slide);var me=this;this.frame.slide.onmousedown=function(event){me._onMouseDown(event)};this.frame.prev.onclick=function(event){me.prev(event)};this.frame.play.onclick=function(event){me.togglePlay(event)};this.frame.next.onclick=function(event){me.next(event)}}this.onChangeCallback=undefined;this.values=[];this.index=undefined;this.playTimeout=undefined;this.playInterval=1e3;this.playLoop=true}Slider.prototype.prev=function(){var index=this.getIndex();if(index>0){index--;this.setIndex(index)}};Slider.prototype.next=function(){var index=this.getIndex();if(index<this.values.length-1){index++;this.setIndex(index)}};Slider.prototype.playNext=function(){var start=new Date;var index=this.getIndex();if(index<this.values.length-1){index++;this.setIndex(index)}else if(this.playLoop){index=0;this.setIndex(index)}var end=new Date;var diff=end-start;var interval=Math.max(this.playInterval-diff,0);var me=this;this.playTimeout=setTimeout(function(){me.playNext()},interval)};Slider.prototype.togglePlay=function(){if(this.playTimeout===undefined){this.play()}else{this.stop()}};Slider.prototype.play=function(){if(this.playTimeout)return;this.playNext();if(this.frame){this.frame.play.value=\"Stop\"}};Slider.prototype.stop=function(){clearInterval(this.playTimeout);this.playTimeout=undefined;if(this.frame){this.frame.play.value=\"Play\"}};Slider.prototype.setOnChangeCallback=function(callback){this.onChangeCallback=callback};Slider.prototype.setPlayInterval=function(interval){this.playInterval=interval};Slider.prototype.getPlayInterval=function(){return this.playInterval};Slider.prototype.setPlayLoop=function(doLoop){this.playLoop=doLoop};Slider.prototype.onChange=function(){if(this.onChangeCallback!==undefined){this.onChangeCallback()}};Slider.prototype.redraw=function(){if(this.frame){this.frame.bar.style.top=this.frame.clientHeight/2-this.frame.bar.offsetHeight/2+\"px\";this.frame.bar.style.width=this.frame.clientWidth-this.frame.prev.clientWidth-this.frame.play.clientWidth-this.frame.next.clientWidth-30+\"px\";var left=this.indexToLeft(this.index);this.frame.slide.style.left=left+\"px\"}};Slider.prototype.setValues=function(values){this.values=values;if(this.values.length>0)this.setIndex(0);else this.index=undefined};Slider.prototype.setIndex=function(index){if(index<this.values.length){this.index=index;this.redraw();this.onChange()}else{throw new Error(\"Index out of range\")}};Slider.prototype.getIndex=function(){return this.index};Slider.prototype.get=function(){return this.values[this.index]};Slider.prototype._onMouseDown=function(event){var leftButtonDown=event.which?event.which===1:event.button===1;if(!leftButtonDown)return;this.startClientX=event.clientX;this.startSlideX=parseFloat(this.frame.slide.style.left);this.frame.style.cursor=\"move\";var me=this;this.onmousemove=function(event){me._onMouseMove(event)};this.onmouseup=function(event){me._onMouseUp(event)};util.addEventListener(document,\"mousemove\",this.onmousemove);util.addEventListener(document,\"mouseup\",this.onmouseup);util.preventDefault(event)};Slider.prototype.leftToIndex=function(left){var width=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10;var x=left-3;var index=Math.round(x/width*(this.values.length-1));if(index<0)index=0;if(index>this.values.length-1)index=this.values.length-1;return index};Slider.prototype.indexToLeft=function(index){var width=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10;var x=index/(this.values.length-1)*width;var left=x+3;return left};Slider.prototype._onMouseMove=function(event){var diff=event.clientX-this.startClientX;var x=this.startSlideX+diff;var index=this.leftToIndex(x);this.setIndex(index);util.preventDefault()};Slider.prototype._onMouseUp=function(event){this.frame.style.cursor=\"auto\";util.removeEventListener(document,\"mousemove\",this.onmousemove);util.removeEventListener(document,\"mouseup\",this.onmouseup);util.preventDefault()};module.exports=Slider},function(module,exports,__webpack_require__){\"use strict\";function StepNumber(start,end,step,prettyStep){this._start=0;this._end=0;this._step=1;this.prettyStep=true;this.precision=5;this._current=0;this.setRange(start,end,step,prettyStep)}StepNumber.prototype.isNumeric=function(n){return!isNaN(parseFloat(n))&&isFinite(n)};StepNumber.prototype.setRange=function(start,end,step,prettyStep){if(!this.isNumeric(start)){throw new Error(\"Parameter 'start' is not numeric; value: \"+start)}if(!this.isNumeric(end)){throw new Error(\"Parameter 'end' is not numeric; value: \"+start)}if(!this.isNumeric(step)){throw new Error(\"Parameter 'step' is not numeric; value: \"+start)}this._start=start?start:0;this._end=end?end:0;this.setStep(step,prettyStep)};StepNumber.prototype.setStep=function(step,prettyStep){if(step===undefined||step<=0)return;if(prettyStep!==undefined)this.prettyStep=prettyStep;if(this.prettyStep===true)this._step=StepNumber.calculatePrettyStep(step);else this._step=step};StepNumber.calculatePrettyStep=function(step){var log10=function log10(x){return Math.log(x)/Math.LN10};var step1=Math.pow(10,Math.round(log10(step))),step2=2*Math.pow(10,Math.round(log10(step/2))),step5=5*Math.pow(10,Math.round(log10(step/5)));var prettyStep=step1;if(Math.abs(step2-step)<=Math.abs(prettyStep-step))prettyStep=step2;if(Math.abs(step5-step)<=Math.abs(prettyStep-step))prettyStep=step5;if(prettyStep<=0){prettyStep=1}return prettyStep};StepNumber.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))};StepNumber.prototype.getStep=function(){return this._step};StepNumber.prototype.start=function(checkFirst){if(checkFirst===undefined){checkFirst=false}this._current=this._start-this._start%this._step;if(checkFirst){if(this.getCurrent()<this._start){this.next()}}};StepNumber.prototype.next=function(){this._current+=this._step};StepNumber.prototype.end=function(){return this._current>this._end};module.exports=StepNumber},function(module,exports,__webpack_require__){\"use strict\";var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var Camera=__webpack_require__(95);var Point3d=__webpack_require__(34);var STYLE={BAR:0,BARCOLOR:1,BARSIZE:2,DOT:3,DOTLINE:4,DOTCOLOR:5,DOTSIZE:6,GRID:7,LINE:8,SURFACE:9};var STYLENAME={dot:STYLE.DOT,\"dot-line\":STYLE.DOTLINE,\"dot-color\":STYLE.DOTCOLOR,\"dot-size\":STYLE.DOTSIZE,line:STYLE.LINE,grid:STYLE.GRID,surface:STYLE.SURFACE,bar:STYLE.BAR,\"bar-color\":STYLE.BARCOLOR,\"bar-size\":STYLE.BARSIZE};var OPTIONKEYS=[\"width\",\"height\",\"filterLabel\",\"legendLabel\",\"xLabel\",\"yLabel\",\"zLabel\",\"xValueLabel\",\"yValueLabel\",\"zValueLabel\",\"showXAxis\",\"showYAxis\",\"showZAxis\",\"showGrid\",\"showPerspective\",\"showShadow\",\"keepAspectRatio\",\"verticalRatio\",\"dotSizeRatio\",\"dotSizeMinFraction\",\"dotSizeMaxFraction\",\"showAnimationControls\",\"animationInterval\",\"animationPreload\",\"animationAutoStart\",\"axisColor\",\"gridColor\",\"xCenter\",\"yCenter\"];var PREFIXEDOPTIONKEYS=[\"xBarWidth\",\"yBarWidth\",\"valueMin\",\"valueMax\",\"xMin\",\"xMax\",\"xStep\",\"yMin\",\"yMax\",\"yStep\",\"zMin\",\"zMax\",\"zStep\"];var DEFAULTS=undefined;function isEmpty(obj){for(var prop in obj){if(obj.hasOwnProperty(prop))return false}return true}function capitalize(str){if(str===undefined||str===\"\"||typeof str!=\"string\"){return str}return str.charAt(0).toUpperCase()+str.slice(1)}function prefixFieldName(prefix,fieldName){if(prefix===undefined||prefix===\"\"){return fieldName}return prefix+capitalize(fieldName)}function forceCopy(src,dst,fields,prefix){var srcKey;var dstKey;for(var i=0;i<fields.length;++i){srcKey=fields[i];dstKey=prefixFieldName(prefix,srcKey);dst[dstKey]=src[srcKey]}}function safeCopy(src,dst,fields,prefix){var srcKey;var dstKey;for(var i=0;i<fields.length;++i){srcKey=fields[i];if(src[srcKey]===undefined)continue;dstKey=prefixFieldName(prefix,srcKey);dst[dstKey]=src[srcKey]}}function setDefaults(src,dst){if(src===undefined||isEmpty(src)){throw new Error(\"No DEFAULTS passed\")}if(dst===undefined){throw new Error(\"No dst passed\")}DEFAULTS=src;forceCopy(src,dst,OPTIONKEYS);forceCopy(src,dst,PREFIXEDOPTIONKEYS,\"default\");setSpecialSettings(src,dst);dst.margin=10;dst.showGrayBottom=false;dst.showTooltip=false;dst.onclick_callback=null;dst.eye=new Point3d(0,0,-1)}function setOptions(options,dst){if(options===undefined){return}if(dst===undefined){throw new Error(\"No dst passed\")}if(DEFAULTS===undefined||isEmpty(DEFAULTS)){throw new Error(\"DEFAULTS not set for module Settings\")}safeCopy(options,dst,OPTIONKEYS);safeCopy(options,dst,PREFIXEDOPTIONKEYS,\"default\");setSpecialSettings(options,dst)}function setSpecialSettings(src,dst){if(src.backgroundColor!==undefined){setBackgroundColor(src.backgroundColor,dst)}setDataColor(src.dataColor,dst);setStyle(src.style,dst);setShowLegend(src.showLegend,dst);setCameraPosition(src.cameraPosition,dst);if(src.tooltip!==undefined){dst.showTooltip=src.tooltip}if(src.onclick!=undefined){dst.onclick_callback=src.onclick}if(src.tooltipStyle!==undefined){util.selectiveDeepExtend([\"tooltipStyle\"],dst,src)}}function setShowLegend(showLegend,dst){if(showLegend===undefined){var isAutoByDefault=DEFAULTS.showLegend===undefined;if(isAutoByDefault){var isLegendGraphStyle=dst.style===STYLE.DOTCOLOR||dst.style===STYLE.DOTSIZE;dst.showLegend=isLegendGraphStyle}else{}}else{dst.showLegend=showLegend}}function getStyleNumberByName(styleName){var number=STYLENAME[styleName];if(number===undefined){return-1}return number}function checkStyleNumber(style){var valid=false;for(var n in STYLE){if(STYLE[n]===style){valid=true;break}}return valid}function setStyle(style,dst){if(style===undefined){return}var styleNumber;if(typeof style===\"string\"){styleNumber=getStyleNumberByName(style);if(styleNumber===-1){throw new Error(\"Style '\"+style+\"' is invalid\")}}else{if(!checkStyleNumber(style)){throw new Error(\"Style '\"+style+\"' is invalid\")}styleNumber=style}dst.style=styleNumber}function setBackgroundColor(backgroundColor,dst){var fill=\"white\";var stroke=\"gray\";var strokeWidth=1;if(typeof backgroundColor===\"string\"){fill=backgroundColor;stroke=\"none\";strokeWidth=0}else if((typeof backgroundColor===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(backgroundColor))===\"object\"){if(backgroundColor.fill!==undefined)fill=backgroundColor.fill;if(backgroundColor.stroke!==undefined)stroke=backgroundColor.stroke;if(backgroundColor.strokeWidth!==undefined)strokeWidth=backgroundColor.strokeWidth}else{throw new Error(\"Unsupported type of backgroundColor\")}dst.frame.style.backgroundColor=fill;dst.frame.style.borderColor=stroke;dst.frame.style.borderWidth=strokeWidth+\"px\";dst.frame.style.borderStyle=\"solid\"}function setDataColor(dataColor,dst){if(dataColor===undefined){return}if(dst.dataColor===undefined){dst.dataColor={}}if(typeof dataColor===\"string\"){dst.dataColor.fill=dataColor;dst.dataColor.stroke=dataColor}else{if(dataColor.fill){dst.dataColor.fill=dataColor.fill}if(dataColor.stroke){dst.dataColor.stroke=dataColor.stroke}if(dataColor.strokeWidth!==undefined){dst.dataColor.strokeWidth=dataColor.strokeWidth}}}function setCameraPosition(cameraPosition,dst){var camPos=cameraPosition;if(camPos===undefined){return}if(dst.camera===undefined){dst.camera=new Camera}dst.camera.setArmRotation(camPos.horizontal,camPos.vertical);dst.camera.setArmLength(camPos.distance)}module.exports.STYLE=STYLE;module.exports.setDefaults=setDefaults;module.exports.setOptions=setOptions;module.exports.setCameraPosition=setCameraPosition},function(module,exports,__webpack_require__){\"use strict\";var _sign=__webpack_require__(165);var _sign2=_interopRequireDefault(_sign);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Point3d=__webpack_require__(34);function Camera(){this.armLocation=new Point3d;this.armRotation={};this.armRotation.horizontal=0;this.armRotation.vertical=0;this.armLength=1.7;this.cameraOffset=new Point3d;this.offsetMultiplier=.6;this.cameraLocation=new Point3d;this.cameraRotation=new Point3d(.5*Math.PI,0,0);this.calculateCameraOrientation()}Camera.prototype.setOffset=function(x,y){var abs=Math.abs,sign=_sign2[\"default\"],mul=this.offsetMultiplier,border=this.armLength*mul;if(abs(x)>border){x=sign(x)*border}if(abs(y)>border){y=sign(y)*border}this.cameraOffset.x=x;this.cameraOffset.y=y;this.calculateCameraOrientation()};Camera.prototype.getOffset=function(){return this.cameraOffset};Camera.prototype.setArmLocation=function(x,y,z){this.armLocation.x=x;this.armLocation.y=y;this.armLocation.z=z;this.calculateCameraOrientation()};Camera.prototype.setArmRotation=function(horizontal,vertical){if(horizontal!==undefined){this.armRotation.horizontal=horizontal}if(vertical!==undefined){this.armRotation.vertical=vertical;if(this.armRotation.vertical<0)this.armRotation.vertical=0;if(this.armRotation.vertical>.5*Math.PI)this.armRotation.vertical=.5*Math.PI}if(horizontal!==undefined||vertical!==undefined){this.calculateCameraOrientation()}};Camera.prototype.getArmRotation=function(){var rot={};rot.horizontal=this.armRotation.horizontal;rot.vertical=this.armRotation.vertical;return rot};Camera.prototype.setArmLength=function(length){if(length===undefined)return;this.armLength=length;if(this.armLength<.71)this.armLength=.71;if(this.armLength>5)this.armLength=5;this.setOffset(this.cameraOffset.x,this.cameraOffset.y);this.calculateCameraOrientation()};Camera.prototype.getArmLength=function(){return this.armLength};Camera.prototype.getCameraLocation=function(){return this.cameraLocation};Camera.prototype.getCameraRotation=function(){return this.cameraRotation};Camera.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical);this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical);this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical);this.cameraRotation.x=Math.PI/2-this.armRotation.vertical;this.cameraRotation.y=0;this.cameraRotation.z=-this.armRotation.horizontal;var xa=this.cameraRotation.x;var za=this.cameraRotation.z;var dx=this.cameraOffset.x;var dy=this.cameraOffset.y;var sin=Math.sin,cos=Math.cos;this.cameraLocation.x=this.cameraLocation.x+dx*cos(za)+dy*-sin(za)*cos(xa);this.cameraLocation.y=this.cameraLocation.y+dx*sin(za)+dy*cos(za)*cos(xa);this.cameraLocation.z=this.cameraLocation.z+dy*sin(xa)};module.exports=Camera},function(module,exports,__webpack_require__){\"use strict\";var DataView=__webpack_require__(12);function Filter(dataGroup,column,graph){this.dataGroup=dataGroup;this.column=column;this.graph=graph;this.index=undefined;this.value=undefined;this.values=dataGroup.getDistinctValues(this.column);if(this.values.length>0){this.selectValue(0)}this.dataPoints=[];this.loaded=false;this.onLoadCallback=undefined;if(graph.animationPreload){this.loaded=false;this.loadInBackground()}else{this.loaded=true}}Filter.prototype.isLoaded=function(){return this.loaded};Filter.prototype.getLoadedProgress=function(){var len=this.values.length;var i=0;while(this.dataPoints[i]){i++}return Math.round(i/len*100)};Filter.prototype.getLabel=function(){return this.graph.filterLabel};Filter.prototype.getColumn=function(){return this.column};Filter.prototype.getSelectedValue=function(){if(this.index===undefined)return undefined;return this.values[this.index]};Filter.prototype.getValues=function(){return this.values};Filter.prototype.getValue=function(index){if(index>=this.values.length)throw new Error(\"Index out of range\");return this.values[index]};Filter.prototype._getDataPoints=function(index){if(index===undefined)index=this.index;if(index===undefined)return[];var dataPoints;if(this.dataPoints[index]){dataPoints=this.dataPoints[index]}else{var f={};f.column=this.column;f.value=this.values[index];var dataView=new DataView(this.dataGroup.getDataSet(),{filter:function filter(item){return item[f.column]==f.value}}).get();dataPoints=this.dataGroup._getDataPoints(dataView);this.dataPoints[index]=dataPoints}return dataPoints};Filter.prototype.setOnLoadCallback=function(callback){this.onLoadCallback=callback};Filter.prototype.selectValue=function(index){if(index>=this.values.length)throw new Error(\"Index out of range\");this.index=index;this.value=this.values[index]};Filter.prototype.loadInBackground=function(index){if(index===undefined)index=0;var frame=this.graph.frame;if(index<this.values.length){if(frame.progress===undefined){frame.progress=document.createElement(\"DIV\");frame.progress.style.position=\"absolute\";frame.progress.style.color=\"gray\";frame.appendChild(frame.progress)}var progress=this.getLoadedProgress();frame.progress.innerHTML=\"Loading animation... \"+progress+\"%\";frame.progress.style.bottom=60+\"px\";frame.progress.style.left=10+\"px\";var me=this;setTimeout(function(){me.loadInBackground(index+1)},10);this.loaded=false}else{this.loaded=true;if(frame.progress!==undefined){frame.removeChild(frame.progress);frame.progress=undefined}if(this.onLoadCallback)this.onLoadCallback()}};module.exports=Filter},function(module,exports,__webpack_require__){\"use strict\";var keycharm=__webpack_require__(35);var Emitter=__webpack_require__(44);var Hammer=__webpack_require__(10);var util=__webpack_require__(2);function Activator(container){this.active=false;this.dom={container:container};this.dom.overlay=document.createElement(\"div\");this.dom.overlay.className=\"vis-overlay\";this.dom.container.appendChild(this.dom.overlay);this.hammer=Hammer(this.dom.overlay);this.hammer.on(\"tap\",this._onTapOverlay.bind(this));var me=this;var events=[\"tap\",\"doubletap\",\"press\",\"pinch\",\"pan\",\"panstart\",\"panmove\",\"panend\"];events.forEach(function(event){me.hammer.on(event,function(event){event.stopPropagation()})});if(document&&document.body){this.onClick=function(event){if(!_hasParent(event.target,container)){me.deactivate()}};document.body.addEventListener(\"click\",this.onClick)}if(this.keycharm!==undefined){this.keycharm.destroy()}this.keycharm=keycharm();this.escListener=this.deactivate.bind(this)}Emitter(Activator.prototype);Activator.current=null;Activator.prototype.destroy=function(){this.deactivate();this.dom.overlay.parentNode.removeChild(this.dom.overlay);if(this.onClick){document.body.removeEventListener(\"click\",this.onClick)}this.hammer.destroy();this.hammer=null};Activator.prototype.activate=function(){if(Activator.current){Activator.current.deactivate()}Activator.current=this;this.active=true;this.dom.overlay.style.display=\"none\";util.addClassName(this.dom.container,\"vis-active\");this.emit(\"change\");this.emit(\"activate\");this.keycharm.bind(\"esc\",this.escListener)};Activator.prototype.deactivate=function(){this.active=false;this.dom.overlay.style.display=\"\";util.removeClassName(this.dom.container,\"vis-active\");this.keycharm.unbind(\"esc\",this.escListener);this.emit(\"change\");this.emit(\"deactivate\")};Activator.prototype._onTapOverlay=function(event){this.activate();event.stopPropagation()};function _hasParent(element,parent){while(element){if(element===parent){return true}element=element.parentNode}return false}module.exports=Activator},function(module,exports,__webpack_require__){\"use strict\";exports[\"en\"]={current:\"current\",time:\"time\"};exports[\"en_EN\"]=exports[\"en\"];exports[\"en_US\"]=exports[\"en\"];exports[\"it\"]={current:\"attuale\",time:\"tempo\"};exports[\"it_IT\"]=exports[\"it\"];exports[\"it_CH\"]=exports[\"it\"];exports[\"nl\"]={current:\"huidige\",time:\"tijd\"};exports[\"nl_NL\"]=exports[\"nl\"];exports[\"nl_BE\"]=exports[\"nl\"];exports[\"de\"]={current:\"Aktuelle\",time:\"Zeit\"};exports[\"de_DE\"]=exports[\"de\"];exports[\"fr\"]={current:\"actuel\",time:\"heure\"};exports[\"fr_FR\"]=exports[\"fr\"];exports[\"fr_CA\"]=exports[\"fr\"];exports[\"fr_BE\"]=exports[\"fr\"];exports[\"es\"]={current:\"corriente\",time:\"hora\"};exports[\"es_ES\"]=exports[\"es\"]},function(module,exports,__webpack_require__){\"use strict\";var _create=__webpack_require__(29);var _create2=_interopRequireDefault(_create);var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Hammer=__webpack_require__(10);var util=__webpack_require__(2);var DataSet=__webpack_require__(11);var DataView=__webpack_require__(12);var TimeStep=__webpack_require__(66);var Component=__webpack_require__(16);var Group=__webpack_require__(68);var BackgroundGroup=__webpack_require__(69);var BoxItem=__webpack_require__(101);var PointItem=__webpack_require__(102);var RangeItem=__webpack_require__(70);var BackgroundItem=__webpack_require__(103);var Popup=__webpack_require__(104)[\"default\"];var UNGROUPED=\"__ungrouped__\";var BACKGROUND=\"__background__\";function ItemSet(body,options){this.body=body;this.defaultOptions={type:null,orientation:{item:\"bottom\"},align:\"auto\",stack:true,stackSubgroups:true,groupOrderSwap:function groupOrderSwap(fromGroup,toGroup,groups){var targetOrder=toGroup.order;toGroup.order=fromGroup.order;fromGroup.order=targetOrder},groupOrder:\"order\",selectable:true,multiselect:false,itemsAlwaysDraggable:{item:false,range:false},editable:{updateTime:false,updateGroup:false,add:false,remove:false,overrideItems:false},groupEditable:{order:false,add:false,remove:false},snap:TimeStep.snap,onDropObjectOnItem:function onDropObjectOnItem(objectData,item,callback){callback(item)},onAdd:function onAdd(item,callback){callback(item)},onUpdate:function onUpdate(item,callback){callback(item)},onMove:function onMove(item,callback){callback(item)},onRemove:function onRemove(item,callback){callback(item)},onMoving:function onMoving(item,callback){callback(item)},onAddGroup:function onAddGroup(item,callback){callback(item)},onMoveGroup:function onMoveGroup(item,callback){callback(item)},onRemoveGroup:function onRemoveGroup(item,callback){callback(item)},margin:{item:{horizontal:10,vertical:10},axis:20},showTooltips:true,tooltip:{followMouse:false,overflowMethod:\"flip\"},tooltipOnItemUpdateTime:false};this.options=util.extend({},this.defaultOptions);this.options.rtl=options.rtl;this.itemOptions={type:{start:\"Date\",end:\"Date\"}};this.conversion={toScreen:body.util.toScreen,toTime:body.util.toTime};this.dom={};this.props={};this.hammer=null;var me=this;this.itemsData=null;this.groupsData=null;this.itemListeners={add:function add(event,params,senderId){me._onAdd(params.items)},update:function update(event,params,senderId){me._onUpdate(params.items)},remove:function remove(event,params,senderId){me._onRemove(params.items)}};this.groupListeners={add:function add(event,params,senderId){me._onAddGroups(params.items);if(me.groupsData&&me.groupsData.length>0){var groupsData=me.groupsData.getDataSet();groupsData.get().forEach(function(groupData){if(groupData.nestedGroups){if(groupData.showNested!=false){groupData.showNested=true}var updatedGroups=[];groupData.nestedGroups.forEach(function(nestedGroupId){var updatedNestedGroup=groupsData.get(nestedGroupId);if(!updatedNestedGroup){return}updatedNestedGroup.nestedInGroup=groupData.id;if(groupData.showNested==false){updatedNestedGroup.visible=false}updatedGroups=updatedGroups.concat(updatedNestedGroup)});groupsData.update(updatedGroups,senderId)}})}},update:function update(event,params,senderId){me._onUpdateGroups(params.items)},remove:function remove(event,params,senderId){me._onRemoveGroups(params.items)}};this.items={};this.groups={};this.groupIds=[];this.selection=[];this.popup=null;this.touchParams={};this.groupTouchParams={};this._create();this.setOptions(options)}ItemSet.prototype=new Component;ItemSet.types={background:BackgroundItem,box:BoxItem,range:RangeItem,point:PointItem};ItemSet.prototype._create=function(){var frame=document.createElement(\"div\");frame.className=\"vis-itemset\";frame[\"timeline-itemset\"]=this;this.dom.frame=frame;var background=document.createElement(\"div\");background.className=\"vis-background\";frame.appendChild(background);this.dom.background=background;var foreground=document.createElement(\"div\");foreground.className=\"vis-foreground\";frame.appendChild(foreground);this.dom.foreground=foreground;var axis=document.createElement(\"div\");axis.className=\"vis-axis\";this.dom.axis=axis;var labelSet=document.createElement(\"div\");labelSet.className=\"vis-labelset\";this.dom.labelSet=labelSet;this._updateUngrouped();var backgroundGroup=new BackgroundGroup(BACKGROUND,null,this);backgroundGroup.show();this.groups[BACKGROUND]=backgroundGroup;this.hammer=new Hammer(this.body.dom.centerContainer);this.hammer.on(\"hammer.input\",function(event){if(event.isFirst){this._onTouch(event)}}.bind(this));this.hammer.on(\"panstart\",this._onDragStart.bind(this));this.hammer.on(\"panmove\",this._onDrag.bind(this));this.hammer.on(\"panend\",this._onDragEnd.bind(this));this.hammer.get(\"pan\").set({threshold:5,direction:Hammer.DIRECTION_HORIZONTAL});this.hammer.on(\"tap\",this._onSelectItem.bind(this));this.hammer.on(\"press\",this._onMultiSelectItem.bind(this));this.hammer.on(\"doubletap\",this._onAddItem.bind(this));if(this.options.rtl){\nthis.groupHammer=new Hammer(this.body.dom.rightContainer)}else{this.groupHammer=new Hammer(this.body.dom.leftContainer)}this.groupHammer.on(\"tap\",this._onGroupClick.bind(this));this.groupHammer.on(\"panstart\",this._onGroupDragStart.bind(this));this.groupHammer.on(\"panmove\",this._onGroupDrag.bind(this));this.groupHammer.on(\"panend\",this._onGroupDragEnd.bind(this));this.groupHammer.get(\"pan\").set({threshold:5,direction:Hammer.DIRECTION_VERTICAL});this.body.dom.centerContainer.addEventListener(\"mouseover\",this._onMouseOver.bind(this));this.body.dom.centerContainer.addEventListener(\"mouseout\",this._onMouseOut.bind(this));this.body.dom.centerContainer.addEventListener(\"mousemove\",this._onMouseMove.bind(this));this.body.dom.centerContainer.addEventListener(\"contextmenu\",this._onDragEnd.bind(this));this.body.dom.centerContainer.addEventListener(\"mousewheel\",this._onMouseWheel.bind(this));this.show()};ItemSet.prototype.setOptions=function(options){if(options){var fields=[\"type\",\"rtl\",\"align\",\"order\",\"stack\",\"stackSubgroups\",\"selectable\",\"multiselect\",\"multiselectPerGroup\",\"groupOrder\",\"dataAttributes\",\"template\",\"groupTemplate\",\"visibleFrameTemplate\",\"hide\",\"snap\",\"groupOrderSwap\",\"showTooltips\",\"tooltip\",\"tooltipOnItemUpdateTime\"];util.selectiveExtend(fields,this.options,options);if(\"itemsAlwaysDraggable\"in options){if(typeof options.itemsAlwaysDraggable===\"boolean\"){this.options.itemsAlwaysDraggable.item=options.itemsAlwaysDraggable;this.options.itemsAlwaysDraggable.range=false}else if((0,_typeof3[\"default\"])(options.itemsAlwaysDraggable)===\"object\"){util.selectiveExtend([\"item\",\"range\"],this.options.itemsAlwaysDraggable,options.itemsAlwaysDraggable);if(!this.options.itemsAlwaysDraggable.item){this.options.itemsAlwaysDraggable.range=false}}}if(\"orientation\"in options){if(typeof options.orientation===\"string\"){this.options.orientation.item=options.orientation===\"top\"?\"top\":\"bottom\"}else if((0,_typeof3[\"default\"])(options.orientation)===\"object\"&&\"item\"in options.orientation){this.options.orientation.item=options.orientation.item}}if(\"margin\"in options){if(typeof options.margin===\"number\"){this.options.margin.axis=options.margin;this.options.margin.item.horizontal=options.margin;this.options.margin.item.vertical=options.margin}else if((0,_typeof3[\"default\"])(options.margin)===\"object\"){util.selectiveExtend([\"axis\"],this.options.margin,options.margin);if(\"item\"in options.margin){if(typeof options.margin.item===\"number\"){this.options.margin.item.horizontal=options.margin.item;this.options.margin.item.vertical=options.margin.item}else if((0,_typeof3[\"default\"])(options.margin.item)===\"object\"){util.selectiveExtend([\"horizontal\",\"vertical\"],this.options.margin.item,options.margin.item)}}}}if(\"editable\"in options){if(typeof options.editable===\"boolean\"){this.options.editable.updateTime=options.editable;this.options.editable.updateGroup=options.editable;this.options.editable.add=options.editable;this.options.editable.remove=options.editable;this.options.editable.overrideItems=false}else if((0,_typeof3[\"default\"])(options.editable)===\"object\"){util.selectiveExtend([\"updateTime\",\"updateGroup\",\"add\",\"remove\",\"overrideItems\"],this.options.editable,options.editable)}}if(\"groupEditable\"in options){if(typeof options.groupEditable===\"boolean\"){this.options.groupEditable.order=options.groupEditable;this.options.groupEditable.add=options.groupEditable;this.options.groupEditable.remove=options.groupEditable}else if((0,_typeof3[\"default\"])(options.groupEditable)===\"object\"){util.selectiveExtend([\"order\",\"add\",\"remove\"],this.options.groupEditable,options.groupEditable)}}var addCallback=function(name){var fn=options[name];if(fn){if(!(fn instanceof Function)){throw new Error(\"option \"+name+\" must be a function \"+name+\"(item, callback)\")}this.options[name]=fn}}.bind(this);[\"onDropObjectOnItem\",\"onAdd\",\"onUpdate\",\"onRemove\",\"onMove\",\"onMoving\",\"onAddGroup\",\"onMoveGroup\",\"onRemoveGroup\"].forEach(addCallback);this.markDirty()}};ItemSet.prototype.markDirty=function(options){this.groupIds=[];if(options&&options.refreshItems){util.forEach(this.items,function(item){item.dirty=true;if(item.displayed)item.redraw()})}};ItemSet.prototype.destroy=function(){this.hide();this.setItems(null);this.setGroups(null);this.hammer=null;this.body=null;this.conversion=null};ItemSet.prototype.hide=function(){if(this.dom.frame.parentNode){this.dom.frame.parentNode.removeChild(this.dom.frame)}if(this.dom.axis.parentNode){this.dom.axis.parentNode.removeChild(this.dom.axis)}if(this.dom.labelSet.parentNode){this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)}};ItemSet.prototype.show=function(){if(!this.dom.frame.parentNode){this.body.dom.center.appendChild(this.dom.frame)}if(!this.dom.axis.parentNode){this.body.dom.backgroundVertical.appendChild(this.dom.axis)}if(!this.dom.labelSet.parentNode){if(this.options.rtl){this.body.dom.right.appendChild(this.dom.labelSet)}else{this.body.dom.left.appendChild(this.dom.labelSet)}}};ItemSet.prototype.setSelection=function(ids){var i,ii,id,item;if(ids==undefined)ids=[];if(!Array.isArray(ids))ids=[ids];for(i=0,ii=this.selection.length;i<ii;i++){id=this.selection[i];item=this.items[id];if(item)item.unselect()}this.selection=[];for(i=0,ii=ids.length;i<ii;i++){id=ids[i];item=this.items[id];if(item){this.selection.push(id);item.select()}}};ItemSet.prototype.getSelection=function(){return this.selection.concat([])};ItemSet.prototype.getVisibleItems=function(){var range=this.body.range.getRange();var right,left;if(this.options.rtl){right=this.body.util.toScreen(range.start);left=this.body.util.toScreen(range.end)}else{left=this.body.util.toScreen(range.start);right=this.body.util.toScreen(range.end)}var ids=[];for(var groupId in this.groups){if(this.groups.hasOwnProperty(groupId)){var group=this.groups[groupId];var rawVisibleItems=group.isVisible?group.visibleItems:[];for(var i=0;i<rawVisibleItems.length;i++){var item=rawVisibleItems[i];if(this.options.rtl){if(item.right<left&&item.right+item.width>right){ids.push(item.id)}}else{if(item.left<right&&item.left+item.width>left){ids.push(item.id)}}}}}return ids};ItemSet.prototype._deselect=function(id){var selection=this.selection;for(var i=0,ii=selection.length;i<ii;i++){if(selection[i]==id){selection.splice(i,1);break}}};ItemSet.prototype.redraw=function(){var margin=this.options.margin,range=this.body.range,asSize=util.option.asSize,options=this.options,orientation=options.orientation.item,resized=false,frame=this.dom.frame;this.props.top=this.body.domProps.top.height+this.body.domProps.border.top;if(this.options.rtl){this.props.right=this.body.domProps.right.width+this.body.domProps.border.right}else{this.props.left=this.body.domProps.left.width+this.body.domProps.border.left}frame.className=\"vis-itemset\";resized=this._orderGroups()||resized;var visibleInterval=range.end-range.start;var zoomed=visibleInterval!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth;var scrolled=range.start!=this.lastRangeStart;var changedStackOption=options.stack!=this.lastStack;var changedStackSubgroupsOption=options.stackSubgroups!=this.lastStackSubgroups;var forceRestack=zoomed||scrolled||changedStackOption||changedStackSubgroupsOption;this.lastVisibleInterval=visibleInterval;this.lastRangeStart=range.start;this.lastStack=options.stack;this.lastStackSubgroups=options.stackSubgroups;this.props.lastWidth=this.props.width;var firstGroup=this._firstGroup();var firstMargin={item:margin.item,axis:margin.axis};var nonFirstMargin={item:margin.item,axis:margin.item.vertical/2};var height=0;var minHeight=margin.axis+margin.item.vertical;this.groups[BACKGROUND].redraw(range,nonFirstMargin,forceRestack);var redrawQueue={};var redrawQueueLength=0;util.forEach(this.groups,function(group,key){if(key===BACKGROUND)return;var groupMargin=group==firstGroup?firstMargin:nonFirstMargin;var returnQueue=true;redrawQueue[key]=group.redraw(range,groupMargin,forceRestack,returnQueue);redrawQueueLength=redrawQueue[key].length});var needRedraw=redrawQueueLength>0;if(needRedraw){var redrawResults={};for(var i=0;i<redrawQueueLength;i++){util.forEach(redrawQueue,function(fns,key){redrawResults[key]=fns[i]()})}util.forEach(this.groups,function(group,key){if(key===BACKGROUND)return;var groupResized=redrawResults[key];resized=groupResized||resized;height+=group.height});height=Math.max(height,minHeight)}height=Math.max(height,minHeight);frame.style.height=asSize(height);this.props.width=frame.offsetWidth;this.props.height=height;this.dom.axis.style.top=asSize(orientation==\"top\"?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height);if(this.options.rtl){this.dom.axis.style.right=\"0\"}else{this.dom.axis.style.left=\"0\"}this.initialItemSetDrawn=true;resized=this._isResized()||resized;return resized};ItemSet.prototype._firstGroup=function(){var firstGroupIndex=this.options.orientation.item==\"top\"?0:this.groupIds.length-1;var firstGroupId=this.groupIds[firstGroupIndex];var firstGroup=this.groups[firstGroupId]||this.groups[UNGROUPED];return firstGroup||null};ItemSet.prototype._updateUngrouped=function(){var ungrouped=this.groups[UNGROUPED];var item,itemId;if(this.groupsData){if(ungrouped){ungrouped.hide();delete this.groups[UNGROUPED];for(itemId in this.items){if(this.items.hasOwnProperty(itemId)){item=this.items[itemId];item.parent&&item.parent.remove(item);var groupId=this._getGroupId(item.data);var group=this.groups[groupId];group&&group.add(item)||item.hide()}}}}else{if(!ungrouped){var id=null;var data=null;ungrouped=new Group(id,data,this);this.groups[UNGROUPED]=ungrouped;for(itemId in this.items){if(this.items.hasOwnProperty(itemId)){item=this.items[itemId];ungrouped.add(item)}}ungrouped.show()}}};ItemSet.prototype.getLabelSet=function(){return this.dom.labelSet};ItemSet.prototype.setItems=function(items){var me=this,ids,oldItemsData=this.itemsData;if(!items){this.itemsData=null}else if(items instanceof DataSet||items instanceof DataView){this.itemsData=items}else{throw new TypeError(\"Data must be an instance of DataSet or DataView\")}if(oldItemsData){util.forEach(this.itemListeners,function(callback,event){oldItemsData.off(event,callback)});ids=oldItemsData.getIds();this._onRemove(ids)}if(this.itemsData){var id=this.id;util.forEach(this.itemListeners,function(callback,event){me.itemsData.on(event,callback,id)});ids=this.itemsData.getIds();this._onAdd(ids);this._updateUngrouped()}this.body.emitter.emit(\"_change\",{queue:true})};ItemSet.prototype.getItems=function(){return this.itemsData};ItemSet.prototype.setGroups=function(groups){var me=this,ids;if(this.groupsData){util.forEach(this.groupListeners,function(callback,event){me.groupsData.off(event,callback)});ids=this.groupsData.getIds();this.groupsData=null;this._onRemoveGroups(ids)}if(!groups){this.groupsData=null}else if(groups instanceof DataSet||groups instanceof DataView){this.groupsData=groups}else{throw new TypeError(\"Data must be an instance of DataSet or DataView\")}if(this.groupsData){var groupsData=this.groupsData;if(this.groupsData instanceof DataView){groupsData=this.groupsData.getDataSet()}groupsData.get().forEach(function(group){if(group.nestedGroups){group.nestedGroups.forEach(function(nestedGroupId){var updatedNestedGroup=groupsData.get(nestedGroupId);updatedNestedGroup.nestedInGroup=group.id;if(group.showNested==false){updatedNestedGroup.visible=false}groupsData.update(updatedNestedGroup)})}});var id=this.id;util.forEach(this.groupListeners,function(callback,event){me.groupsData.on(event,callback,id)});ids=this.groupsData.getIds();this._onAddGroups(ids)}this._updateUngrouped();this._order();this.body.emitter.emit(\"_change\",{queue:true})};ItemSet.prototype.getGroups=function(){return this.groupsData};ItemSet.prototype.removeItem=function(id){var item=this.itemsData.get(id),dataset=this.itemsData.getDataSet();if(item){this.options.onRemove(item,function(item){if(item){dataset.remove(id)}})}};ItemSet.prototype._getType=function(itemData){return itemData.type||this.options.type||(itemData.end?\"range\":\"box\")};ItemSet.prototype._getGroupId=function(itemData){var type=this._getType(itemData);if(type==\"background\"&&itemData.group==undefined){return BACKGROUND}else{return this.groupsData?itemData.group:UNGROUPED}};ItemSet.prototype._onUpdate=function(ids){var me=this;ids.forEach(function(id){var itemData=me.itemsData.get(id,me.itemOptions);var item=me.items[id];var type=itemData?me._getType(itemData):null;var constructor=ItemSet.types[type];var selected;if(item){if(!constructor||!(item instanceof constructor)){selected=item.selected;me._removeItem(item);item=null}else{me._updateItem(item,itemData)}}if(!item&&itemData){if(constructor){item=new constructor(itemData,me.conversion,me.options);item.id=id;me._addItem(item);if(selected){this.selection.push(id);item.select()}}else if(type==\"rangeoverflow\"){throw new TypeError('Item type \"rangeoverflow\" is deprecated. Use css styling instead: '+\".vis-item.vis-range .vis-item-content {overflow: visible;}\")}else{throw new TypeError('Unknown item type \"'+type+'\"')}}}.bind(this));this._order();this.body.emitter.emit(\"_change\",{queue:true})};ItemSet.prototype._onAdd=ItemSet.prototype._onUpdate;ItemSet.prototype._onRemove=function(ids){var count=0;var me=this;ids.forEach(function(id){var item=me.items[id];if(item){count++;me._removeItem(item)}});if(count){this._order();this.body.emitter.emit(\"_change\",{queue:true})}};ItemSet.prototype._order=function(){util.forEach(this.groups,function(group){group.order()})};ItemSet.prototype._onUpdateGroups=function(ids){this._onAddGroups(ids)};ItemSet.prototype._onAddGroups=function(ids){var me=this;ids.forEach(function(id){var groupData=me.groupsData.get(id);var group=me.groups[id];if(!group){if(id==UNGROUPED||id==BACKGROUND){throw new Error(\"Illegal group id. \"+id+\" is a reserved id.\")}var groupOptions=(0,_create2[\"default\"])(me.options);util.extend(groupOptions,{height:null});group=new Group(id,groupData,me);me.groups[id]=group;for(var itemId in me.items){if(me.items.hasOwnProperty(itemId)){var item=me.items[itemId];if(item.data.group==id){group.add(item)}}}group.order();group.show()}else{group.setData(groupData)}});this.body.emitter.emit(\"_change\",{queue:true})};ItemSet.prototype._onRemoveGroups=function(ids){var groups=this.groups;ids.forEach(function(id){var group=groups[id];if(group){group.hide();delete groups[id]}});this.markDirty();this.body.emitter.emit(\"_change\",{queue:true})};ItemSet.prototype._orderGroups=function(){if(this.groupsData){var groupIds=this.groupsData.getIds({order:this.options.groupOrder});groupIds=this._orderNestedGroups(groupIds);var changed=!util.equalArray(groupIds,this.groupIds);if(changed){var groups=this.groups;groupIds.forEach(function(groupId){groups[groupId].hide()});groupIds.forEach(function(groupId){groups[groupId].show()});this.groupIds=groupIds}return changed}else{return false}};ItemSet.prototype._orderNestedGroups=function(groupIds){var newGroupIdsOrder=[];groupIds.forEach(function(groupId){var groupData=this.groupsData.get(groupId);if(!groupData.nestedInGroup){newGroupIdsOrder.push(groupId)}if(groupData.nestedGroups){var nestedGroups=this.groupsData.get({filter:function filter(nestedGroup){return nestedGroup.nestedInGroup==groupId},order:this.options.groupOrder});var nestedGroupIds=nestedGroups.map(function(nestedGroup){return nestedGroup.id});newGroupIdsOrder=newGroupIdsOrder.concat(nestedGroupIds)}},this);return newGroupIdsOrder};ItemSet.prototype._addItem=function(item){this.items[item.id]=item;var groupId=this._getGroupId(item.data);var group=this.groups[groupId];if(!group){item.groupShowing=false}else if(group&&group.data&&group.data.showNested){item.groupShowing=true}if(group)group.add(item)};ItemSet.prototype._updateItem=function(item,itemData){item.setData(itemData);var groupId=this._getGroupId(item.data);var group=this.groups[groupId];if(!group){item.groupShowing=false}else if(group&&group.data&&group.data.showNested){item.groupShowing=true}};ItemSet.prototype._removeItem=function(item){item.hide();delete this.items[item.id];var index=this.selection.indexOf(item.id);if(index!=-1)this.selection.splice(index,1);item.parent&&item.parent.remove(item)};ItemSet.prototype._constructByEndArray=function(array){var endArray=[];for(var i=0;i<array.length;i++){if(array[i]instanceof RangeItem){endArray.push(array[i])}}return endArray};ItemSet.prototype._onTouch=function(event){this.touchParams.item=this.itemFromTarget(event);this.touchParams.dragLeftItem=event.target.dragLeftItem||false;this.touchParams.dragRightItem=event.target.dragRightItem||false;this.touchParams.itemProps=null};ItemSet.prototype._getGroupIndex=function(groupId){for(var i=0;i<this.groupIds.length;i++){if(groupId==this.groupIds[i])return i}};ItemSet.prototype._onDragStart=function(event){if(this.touchParams.itemIsDragging){return}var item=this.touchParams.item||null;var me=this;var props;if(item&&(item.selected||this.options.itemsAlwaysDraggable.item)){if(this.options.editable.overrideItems&&!this.options.editable.updateTime&&!this.options.editable.updateGroup){return}if(item.editable!=null&&!item.editable.updateTime&&!item.editable.updateGroup&&!this.options.editable.overrideItems){return}var dragLeftItem=this.touchParams.dragLeftItem;var dragRightItem=this.touchParams.dragRightItem;this.touchParams.itemIsDragging=true;this.touchParams.selectedItem=item;if(dragLeftItem){props={item:dragLeftItem,initialX:event.center.x,dragLeft:true,data:this._cloneItemData(item.data)};this.touchParams.itemProps=[props]}else if(dragRightItem){props={item:dragRightItem,initialX:event.center.x,dragRight:true,data:this._cloneItemData(item.data)};this.touchParams.itemProps=[props]}else if(this.options.editable.add&&(event.srcEvent.ctrlKey||event.srcEvent.metaKey)){this._onDragStartAddItem(event)}else{if(this.groupIds.length<1){this.redraw()}var baseGroupIndex=this._getGroupIndex(item.data.group);var itemsToDrag=this.options.itemsAlwaysDraggable.item&&!item.selected?[item.id]:this.getSelection();this.touchParams.itemProps=itemsToDrag.map(function(id){var item=me.items[id];var groupIndex=me._getGroupIndex(item.data.group);return{item:item,initialX:event.center.x,groupOffset:baseGroupIndex-groupIndex,data:this._cloneItemData(item.data)}}.bind(this))}event.stopPropagation()}else if(this.options.editable.add&&(event.srcEvent.ctrlKey||event.srcEvent.metaKey)){this._onDragStartAddItem(event)}};ItemSet.prototype._onDragStartAddItem=function(event){var xAbs;var x;var snap=this.options.snap||null;if(this.options.rtl){xAbs=util.getAbsoluteRight(this.dom.frame);x=xAbs-event.center.x+10}else{xAbs=util.getAbsoluteLeft(this.dom.frame);x=event.center.x-xAbs-10}var time=this.body.util.toTime(x);var scale=this.body.util.getScale();var step=this.body.util.getStep();var start=snap?snap(time,scale,step):time;var end=start;var itemData={type:\"range\",start:start,end:end,content:\"new item\"};var id=util.randomUUID();itemData[this.itemsData._fieldId]=id;var group=this.groupFromTarget(event);if(group){itemData.group=group.groupId}var newItem=new RangeItem(itemData,this.conversion,this.options);newItem.id=id;newItem.data=this._cloneItemData(itemData);this._addItem(newItem);this.touchParams.selectedItem=newItem;var props={item:newItem,initialX:event.center.x,data:newItem.data};if(this.options.rtl){props.dragLeft=true}else{props.dragRight=true}this.touchParams.itemProps=[props];event.stopPropagation()};ItemSet.prototype._onDrag=function(event){if(this.touchParams.itemProps){event.stopPropagation();var me=this;var snap=this.options.snap||null;var xOffset;if(this.options.rtl){xOffset=this.body.dom.root.offsetLeft+this.body.domProps.right.width}else{xOffset=this.body.dom.root.offsetLeft+this.body.domProps.left.width}var scale=this.body.util.getScale();var step=this.body.util.getStep();var selectedItem=this.touchParams.selectedItem;var updateGroupAllowed=(this.options.editable.overrideItems||selectedItem.editable==null)&&this.options.editable.updateGroup||!this.options.editable.overrideItems&&selectedItem.editable!=null&&selectedItem.editable.updateGroup;var newGroupBase=null;if(updateGroupAllowed&&selectedItem){if(selectedItem.data.group!=undefined){var group=me.groupFromTarget(event);if(group){newGroupBase=this._getGroupIndex(group.groupId)}}}this.touchParams.itemProps.forEach(function(props){var current=me.body.util.toTime(event.center.x-xOffset);var initial=me.body.util.toTime(props.initialX-xOffset);var offset;var initialStart;var initialEnd;var start;var end;if(this.options.rtl){offset=-(current-initial)}else{offset=current-initial}var itemData=this._cloneItemData(props.item.data);if(props.item.editable!=null&&!props.item.editable.updateTime&&!props.item.editable.updateGroup&&!me.options.editable.overrideItems){return}var updateTimeAllowed=(this.options.editable.overrideItems||selectedItem.editable==null)&&this.options.editable.updateTime||!this.options.editable.overrideItems&&selectedItem.editable!=null&&selectedItem.editable.updateTime;if(updateTimeAllowed){if(props.dragLeft){if(this.options.rtl){if(itemData.end!=undefined){initialEnd=util.convert(props.data.end,\"Date\");end=new Date(initialEnd.valueOf()+offset);itemData.end=snap?snap(end,scale,step):end}}else{if(itemData.start!=undefined){initialStart=util.convert(props.data.start,\"Date\");start=new Date(initialStart.valueOf()+offset);itemData.start=snap?snap(start,scale,step):start}}}else if(props.dragRight){if(this.options.rtl){if(itemData.start!=undefined){initialStart=util.convert(props.data.start,\"Date\");start=new Date(initialStart.valueOf()+offset);itemData.start=snap?snap(start,scale,step):start}}else{if(itemData.end!=undefined){initialEnd=util.convert(props.data.end,\"Date\");end=new Date(initialEnd.valueOf()+offset);itemData.end=snap?snap(end,scale,step):end}}}else{if(itemData.start!=undefined){initialStart=util.convert(props.data.start,\"Date\").valueOf();start=new Date(initialStart+offset);if(itemData.end!=undefined){initialEnd=util.convert(props.data.end,\"Date\");var duration=initialEnd.valueOf()-initialStart.valueOf();itemData.start=snap?snap(start,scale,step):start;itemData.end=new Date(itemData.start.valueOf()+duration)}else{itemData.start=snap?snap(start,scale,step):start}}}}if(updateGroupAllowed&&!props.dragLeft&&!props.dragRight&&newGroupBase!=null){if(itemData.group!=undefined){var newOffset=newGroupBase-props.groupOffset;newOffset=Math.max(0,newOffset);newOffset=Math.min(me.groupIds.length-1,newOffset);itemData.group=me.groupIds[newOffset]}}itemData=this._cloneItemData(itemData);me.options.onMoving(itemData,function(itemData){if(itemData){props.item.setData(this._cloneItemData(itemData,\"Date\"))}}.bind(this))}.bind(this));this.body.emitter.emit(\"_change\")}};ItemSet.prototype._moveToGroup=function(item,groupId){var group=this.groups[groupId];if(group&&group.groupId!=item.data.group){var oldGroup=item.parent;oldGroup.remove(item);oldGroup.order();item.data.group=group.groupId;group.add(item);group.order()}};ItemSet.prototype._onDragEnd=function(event){this.touchParams.itemIsDragging=false;if(this.touchParams.itemProps){event.stopPropagation();var me=this;var dataset=this.itemsData.getDataSet();var itemProps=this.touchParams.itemProps;this.touchParams.itemProps=null;itemProps.forEach(function(props){var id=props.item.id;var exists=me.itemsData.get(id,me.itemOptions)!=null;if(!exists){me.options.onAdd(props.item.data,function(itemData){me._removeItem(props.item);if(itemData){me.itemsData.getDataSet().add(itemData)}me.body.emitter.emit(\"_change\")})}else{var itemData=this._cloneItemData(props.item.data);me.options.onMove(itemData,function(itemData){if(itemData){itemData[dataset._fieldId]=id;dataset.update(itemData)}else{props.item.setData(props.data);me.body.emitter.emit(\"_change\")}})}}.bind(this))}};ItemSet.prototype._onGroupClick=function(event){var group=this.groupFromTarget(event);if(!group||!group.nestedGroups)return;var groupsData=this.groupsData.getDataSet();var nestingGroup=groupsData.get(group.groupId);if(nestingGroup.showNested==undefined){nestingGroup.showNested=true}nestingGroup.showNested=!nestingGroup.showNested;var nestedGroups=groupsData.get(group.nestedGroups).map(function(nestedGroup){nestedGroup.visible=nestingGroup.showNested;return nestedGroup});groupsData.update(nestedGroups.concat(nestingGroup));if(nestingGroup.showNested){util.removeClassName(group.dom.label,\"collapsed\");util.addClassName(group.dom.label,\"expanded\")}else{util.removeClassName(group.dom.label,\"expanded\");var collapsedDirClassName=this.options.rtl?\"collapsed-rtl\":\"collapsed\";util.addClassName(group.dom.label,collapsedDirClassName)}};ItemSet.prototype._onGroupDragStart=function(event){if(this.options.groupEditable.order){this.groupTouchParams.group=this.groupFromTarget(event);if(this.groupTouchParams.group){event.stopPropagation();this.groupTouchParams.originalOrder=this.groupsData.getIds({order:this.options.groupOrder})}}};ItemSet.prototype._onGroupDrag=function(event){if(this.options.groupEditable.order&&this.groupTouchParams.group){event.stopPropagation();var groupsData=this.groupsData;if(this.groupsData instanceof DataView){groupsData=this.groupsData.getDataSet()}var group=this.groupFromTarget(event);if(group&&group.height!=this.groupTouchParams.group.height){var movingUp=group.top<this.groupTouchParams.group.top;var clientY=event.center?event.center.y:event.clientY;var targetGroupTop=util.getAbsoluteTop(group.dom.foreground);var draggedGroupHeight=this.groupTouchParams.group.height;if(movingUp){if(targetGroupTop+draggedGroupHeight<clientY){return}}else{var targetGroupHeight=group.height;if(targetGroupTop+targetGroupHeight-draggedGroupHeight>clientY){return}}}if(group&&group!=this.groupTouchParams.group){var targetGroup=groupsData.get(group.groupId);var draggedGroup=groupsData.get(this.groupTouchParams.group.groupId);if(draggedGroup&&targetGroup){this.options.groupOrderSwap(draggedGroup,targetGroup,groupsData);groupsData.update(draggedGroup);groupsData.update(targetGroup)}var newOrder=groupsData.getIds({order:this.options.groupOrder});if(!util.equalArray(newOrder,this.groupTouchParams.originalOrder)){var origOrder=this.groupTouchParams.originalOrder;var draggedId=this.groupTouchParams.group.groupId;var numGroups=Math.min(origOrder.length,newOrder.length);var curPos=0;var newOffset=0;var orgOffset=0;while(curPos<numGroups){while(curPos+newOffset<numGroups&&curPos+orgOffset<numGroups&&newOrder[curPos+newOffset]==origOrder[curPos+orgOffset]){curPos++}if(curPos+newOffset>=numGroups){break}if(newOrder[curPos+newOffset]==draggedId){newOffset=1}else if(origOrder[curPos+orgOffset]==draggedId){orgOffset=1}else{var slippedPosition=newOrder.indexOf(origOrder[curPos+orgOffset]);var switchGroup=groupsData.get(newOrder[curPos+newOffset]);var shouldBeGroup=groupsData.get(origOrder[curPos+orgOffset]);this.options.groupOrderSwap(switchGroup,shouldBeGroup,groupsData);groupsData.update(switchGroup);groupsData.update(shouldBeGroup);var switchGroupId=newOrder[curPos+newOffset];newOrder[curPos+newOffset]=origOrder[curPos+orgOffset];newOrder[slippedPosition]=switchGroupId;curPos++}}}}}};ItemSet.prototype._onGroupDragEnd=function(event){if(this.options.groupEditable.order&&this.groupTouchParams.group){event.stopPropagation();var me=this;var id=me.groupTouchParams.group.groupId;var dataset=me.groupsData.getDataSet();var groupData=util.extend({},dataset.get(id));me.options.onMoveGroup(groupData,function(groupData){if(groupData){groupData[dataset._fieldId]=id;dataset.update(groupData)}else{var newOrder=dataset.getIds({order:me.options.groupOrder});if(!util.equalArray(newOrder,me.groupTouchParams.originalOrder)){var origOrder=me.groupTouchParams.originalOrder;var numGroups=Math.min(origOrder.length,newOrder.length);var curPos=0;while(curPos<numGroups){while(curPos<numGroups&&newOrder[curPos]==origOrder[curPos]){curPos++}if(curPos>=numGroups){break}var slippedPosition=newOrder.indexOf(origOrder[curPos]);var switchGroup=dataset.get(newOrder[curPos]);var shouldBeGroup=dataset.get(origOrder[curPos]);me.options.groupOrderSwap(switchGroup,shouldBeGroup,dataset);dataset.update(switchGroup);dataset.update(shouldBeGroup);var switchGroupId=newOrder[curPos];newOrder[curPos]=origOrder[curPos];newOrder[slippedPosition]=switchGroupId;curPos++}}}});me.body.emitter.emit(\"groupDragged\",{groupId:id})}};ItemSet.prototype._onSelectItem=function(event){if(!this.options.selectable)return;var ctrlKey=event.srcEvent&&(event.srcEvent.ctrlKey||event.srcEvent.metaKey);var shiftKey=event.srcEvent&&event.srcEvent.shiftKey;if(ctrlKey||shiftKey){this._onMultiSelectItem(event);return}var oldSelection=this.getSelection();var item=this.itemFromTarget(event);var selection=item?[item.id]:[];this.setSelection(selection);var newSelection=this.getSelection();if(newSelection.length>0||oldSelection.length>0){this.body.emitter.emit(\"select\",{items:newSelection,event:event})}};ItemSet.prototype._onMouseOver=function(event){var item=this.itemFromTarget(event);if(!item)return;var related=this.itemFromRelatedTarget(event);if(item===related){return}var title=item.getTitle();if(this.options.showTooltips&&title){if(this.popup==null){this.popup=new Popup(this.body.dom.root,this.options.tooltip.overflowMethod||\"flip\")}this.popup.setText(title);var container=this.body.dom.centerContainer;this.popup.setPosition(event.clientX-util.getAbsoluteLeft(container)+container.offsetLeft,event.clientY-util.getAbsoluteTop(container)+container.offsetTop);this.popup.show()}else{if(this.popup!=null){this.popup.hide()}}this.body.emitter.emit(\"itemover\",{item:item.id,event:event})};ItemSet.prototype._onMouseOut=function(event){var item=this.itemFromTarget(event);if(!item)return;var related=this.itemFromRelatedTarget(event);if(item===related){return}if(this.popup!=null){this.popup.hide()}this.body.emitter.emit(\"itemout\",{item:item.id,event:event})};ItemSet.prototype._onMouseMove=function(event){var item=this.itemFromTarget(event);if(!item)return;if(this.options.showTooltips&&this.options.tooltip.followMouse){if(this.popup){if(!this.popup.hidden){var container=this.body.dom.centerContainer;this.popup.setPosition(event.clientX-util.getAbsoluteLeft(container)+container.offsetLeft,event.clientY-util.getAbsoluteTop(container)+container.offsetTop);this.popup.show()}}}};ItemSet.prototype._onMouseWheel=function(event){if(this.touchParams.itemIsDragging){this._onDragEnd(event)}};ItemSet.prototype._onUpdateItem=function(item){if(!this.options.selectable)return;if(!this.options.editable.add)return;var me=this;if(item){var itemData=me.itemsData.get(item.id);this.options.onUpdate(itemData,function(itemData){if(itemData){me.itemsData.getDataSet().update(itemData)}})}};ItemSet.prototype._onDropObjectOnItem=function(event){var item=this.itemFromTarget(event);var objectData=JSON.parse(event.dataTransfer.getData(\"text\"));this.options.onDropObjectOnItem(objectData,item)};ItemSet.prototype._onAddItem=function(event){if(!this.options.selectable)return;if(!this.options.editable.add)return;var me=this;var snap=this.options.snap||null;var xAbs;var x;if(this.options.rtl){xAbs=util.getAbsoluteRight(this.dom.frame);x=xAbs-event.center.x}else{xAbs=util.getAbsoluteLeft(this.dom.frame);x=event.center.x-xAbs}var start=this.body.util.toTime(x);var scale=this.body.util.getScale();var step=this.body.util.getStep();var end;var newItemData;if(event.type==\"drop\"){newItemData=JSON.parse(event.dataTransfer.getData(\"text\"));newItemData.content=newItemData.content?newItemData.content:\"new item\";newItemData.start=newItemData.start?newItemData.start:snap?snap(start,scale,step):start;newItemData.type=newItemData.type||\"box\";newItemData[this.itemsData._fieldId]=newItemData.id||util.randomUUID();if(newItemData.type==\"range\"&&!newItemData.end){end=this.body.util.toTime(x+this.props.width/5);newItemData.end=snap?snap(end,scale,step):end}}else{newItemData={start:snap?snap(start,scale,step):start,content:\"new item\"};newItemData[this.itemsData._fieldId]=util.randomUUID();if(this.options.type===\"range\"){\nend=this.body.util.toTime(x+this.props.width/5);newItemData.end=snap?snap(end,scale,step):end}}var group=this.groupFromTarget(event);if(group){newItemData.group=group.groupId}newItemData=this._cloneItemData(newItemData);this.options.onAdd(newItemData,function(item){if(item){me.itemsData.getDataSet().add(item);if(event.type==\"drop\"){me.setSelection([item.id])}}})};ItemSet.prototype._onMultiSelectItem=function(event){if(!this.options.selectable)return;var item=this.itemFromTarget(event);if(item){var selection=this.options.multiselect?this.getSelection():[];var shiftKey=event.srcEvent&&event.srcEvent.shiftKey||false;if(shiftKey&&this.options.multiselect){var itemGroup=this.itemsData.get(item.id).group;var lastSelectedGroup=undefined;if(this.options.multiselectPerGroup){if(selection.length>0){lastSelectedGroup=this.itemsData.get(selection[0]).group}}if(!this.options.multiselectPerGroup||lastSelectedGroup==undefined||lastSelectedGroup==itemGroup){selection.push(item.id)}var range=ItemSet._getItemRange(this.itemsData.get(selection,this.itemOptions));if(!this.options.multiselectPerGroup||lastSelectedGroup==itemGroup){selection=[];for(var id in this.items){if(this.items.hasOwnProperty(id)){var _item=this.items[id];var start=_item.data.start;var end=_item.data.end!==undefined?_item.data.end:start;if(start>=range.min&&end<=range.max&&(!this.options.multiselectPerGroup||lastSelectedGroup==this.itemsData.get(_item.id).group)&&!(_item instanceof BackgroundItem)){selection.push(_item.id)}}}}}else{var index=selection.indexOf(item.id);if(index==-1){selection.push(item.id)}else{selection.splice(index,1)}}this.setSelection(selection);this.body.emitter.emit(\"select\",{items:this.getSelection(),event:event})}};ItemSet._getItemRange=function(itemsData){var max=null;var min=null;itemsData.forEach(function(data){if(min==null||data.start<min){min=data.start}if(data.end!=undefined){if(max==null||data.end>max){max=data.end}}else{if(max==null||data.start>max){max=data.start}}});return{min:min,max:max}};ItemSet.prototype.itemFromElement=function(element){var cur=element;while(cur){if(cur.hasOwnProperty(\"timeline-item\")){return cur[\"timeline-item\"]}cur=cur.parentNode}return null};ItemSet.prototype.itemFromTarget=function(event){return this.itemFromElement(event.target)};ItemSet.prototype.itemFromRelatedTarget=function(event){return this.itemFromElement(event.relatedTarget)};ItemSet.prototype.groupFromTarget=function(event){var clientY=event.center?event.center.y:event.clientY;var groupIds=this.groupIds;if(groupIds.length<=0&&this.groupsData){groupIds=this.groupsData.getIds({order:this.options.groupOrder})}for(var i=0;i<groupIds.length;i++){var groupId=groupIds[i];var group=this.groups[groupId];var foreground=group.dom.foreground;var top=util.getAbsoluteTop(foreground);if(clientY>top&&clientY<top+foreground.offsetHeight){return group}if(this.options.orientation.item===\"top\"){if(i===this.groupIds.length-1&&clientY>top){return group}}else{if(i===0&&clientY<top+foreground.offset){return group}}}return null};ItemSet.itemSetFromTarget=function(event){var target=event.target;while(target){if(target.hasOwnProperty(\"timeline-itemset\")){return target[\"timeline-itemset\"]}target=target.parentNode}return null};ItemSet.prototype._cloneItemData=function(itemData,type){var clone=util.extend({},itemData);if(!type){type=this.itemsData.getDataSet()._options.type}if(clone.start!=undefined){clone.start=util.convert(clone.start,type&&type.start||\"Date\")}if(clone.end!=undefined){clone.end=util.convert(clone.end,type&&type.end||\"Date\")}return clone};module.exports=ItemSet},function(module,exports,__webpack_require__){\"use strict\";var EPSILON=.001;exports.orderByStart=function(items){items.sort(function(a,b){return a.data.start-b.data.start})};exports.orderByEnd=function(items){items.sort(function(a,b){var aTime=\"end\"in a.data?a.data.end:a.data.start,bTime=\"end\"in b.data?b.data.end:b.data.start;return aTime-bTime})};exports.stack=function(items,margin,force){if(force){for(var i=0;i<items.length;i++){items[i].top=null}}for(var i=0;i<items.length;i++){var item=items[i];if(item.stack&&item.top===null){item.top=margin.axis;do{var collidingItem=null;for(var j=0,jj=items.length;j<jj;j++){var other=items[j];if(other.top!==null&&other!==item&&other.stack&&exports.collision(item,other,margin.item,other.options.rtl)){collidingItem=other;break}}if(collidingItem!=null){item.top=collidingItem.top+collidingItem.height+margin.item.vertical}}while(collidingItem)}}};exports.substack=function(items,margin,subgroup){for(var i=0;i<items.length;i++){items[i].top=null}var subgroupHeight=subgroup.height;for(i=0;i<items.length;i++){var item=items[i];if(item.stack&&item.top===null){item.top=item.baseTop;do{var collidingItem=null;for(var j=0,jj=items.length;j<jj;j++){var other=items[j];if(other.top!==null&&other!==item&&exports.collision(item,other,margin.item,other.options.rtl)){collidingItem=other;break}}if(collidingItem!=null){item.top=collidingItem.top+collidingItem.height+margin.item.vertical}if(item.top+item.height>subgroupHeight){subgroupHeight=item.top+item.height}}while(collidingItem)}}subgroup.height=subgroupHeight-subgroup.top+.5*margin.item.vertical};exports.nostack=function(items,margin,subgroups,stackSubgroups){for(var i=0;i<items.length;i++){if(items[i].data.subgroup==undefined){items[i].top=margin.item.vertical}else if(items[i].data.subgroup!==undefined&&stackSubgroups){var newTop=0;for(var subgroup in subgroups){if(subgroups.hasOwnProperty(subgroup)){if(subgroups[subgroup].visible==true&&subgroups[subgroup].index<subgroups[items[i].data.subgroup].index){newTop+=subgroups[subgroup].height;subgroups[items[i].data.subgroup].top=newTop}}}items[i].top=newTop+.5*margin.item.vertical}}if(!stackSubgroups){exports.stackSubgroups(items,margin,subgroups)}};exports.stackSubgroups=function(items,margin,subgroups){for(var subgroup in subgroups){if(subgroups.hasOwnProperty(subgroup)){subgroups[subgroup].top=0;do{var collidingItem=null;for(var otherSubgroup in subgroups){if(subgroups[otherSubgroup].top!==null&&otherSubgroup!==subgroup&&subgroups[subgroup].index>subgroups[otherSubgroup].index&&exports.collisionByTimes(subgroups[subgroup],subgroups[otherSubgroup])){collidingItem=subgroups[otherSubgroup];break}}if(collidingItem!=null){subgroups[subgroup].top=collidingItem.top+collidingItem.height}}while(collidingItem)}}for(var i=0;i<items.length;i++){if(items[i].data.subgroup!==undefined){items[i].top=subgroups[items[i].data.subgroup].top+.5*margin.item.vertical}}};exports.stackSubgroupsWithInnerStack=function(subgroupItems,margin,subgroups){var doSubStack=false;var subgroupOrder=[];for(var subgroup in subgroups){if(subgroups[subgroup].hasOwnProperty(\"index\")){subgroupOrder[subgroups[subgroup].index]=subgroup}else{subgroupOrder.push(subgroup)}}for(var j=0;j<subgroupOrder.length;j++){subgroup=subgroupOrder[j];if(subgroups.hasOwnProperty(subgroup)){doSubStack=doSubStack||subgroups[subgroup].stack;subgroups[subgroup].top=0;for(var otherSubgroup in subgroups){if(subgroups[otherSubgroup].visible&&subgroups[subgroup].index>subgroups[otherSubgroup].index){subgroups[subgroup].top+=subgroups[otherSubgroup].height}}var items=subgroupItems[subgroup];for(var i=0;i<items.length;i++){if(items[i].data.subgroup!==undefined){items[i].top=subgroups[items[i].data.subgroup].top+.5*margin.item.vertical;if(subgroups[subgroup].stack){items[i].baseTop=items[i].top}}}if(doSubStack&&subgroups[subgroup].stack){exports.substack(subgroupItems[subgroup],margin,subgroups[subgroup])}}}};exports.collision=function(a,b,margin,rtl){if(rtl){return a.right-margin.horizontal+EPSILON<b.right+b.width&&a.right+a.width+margin.horizontal-EPSILON>b.right&&a.top-margin.vertical+EPSILON<b.top+b.height&&a.top+a.height+margin.vertical-EPSILON>b.top}else{return a.left-margin.horizontal+EPSILON<b.left+b.width&&a.left+a.width+margin.horizontal-EPSILON>b.left&&a.top-margin.vertical+EPSILON<b.top+b.height&&a.top+a.height+margin.vertical-EPSILON>b.top}};exports.collisionByTimes=function(a,b){return a.start<=b.start&&a.end>=b.start&&a.top<b.top+b.height&&a.top+a.height>b.top||b.start<=a.start&&b.end>=a.start&&b.top<a.top+a.height&&b.top+b.height>a.top}},function(module,exports,__webpack_require__){\"use strict\";var Item=__webpack_require__(38);function BoxItem(data,conversion,options){this.props={dot:{width:0,height:0},line:{width:0,height:0}};this.options=options;if(data){if(data.start==undefined){throw new Error('Property \"start\" missing in item '+data)}}Item.call(this,data,conversion,options)}BoxItem.prototype=new Item(null,null,null);BoxItem.prototype.isVisible=function(range){var isVisible;var align=this.options.align;var widthInMs=this.width*range.getMillisecondsPerPixel();if(align==\"right\"){isVisible=this.data.start.getTime()>range.start&&this.data.start.getTime()-widthInMs<range.end}else if(align==\"left\"){isVisible=this.data.start.getTime()+widthInMs>range.start&&this.data.start.getTime()<range.end}else{isVisible=this.data.start.getTime()+widthInMs/2>range.start&&this.data.start.getTime()-widthInMs/2<range.end}return isVisible};BoxItem.prototype._createDomElement=function(){if(!this.dom){this.dom={};this.dom.box=document.createElement(\"DIV\");this.dom.content=document.createElement(\"DIV\");this.dom.content.className=\"vis-item-content\";this.dom.box.appendChild(this.dom.content);this.dom.line=document.createElement(\"DIV\");this.dom.line.className=\"vis-line\";this.dom.dot=document.createElement(\"DIV\");this.dom.dot.className=\"vis-dot\";this.dom.box[\"timeline-item\"]=this;this.dirty=true}};BoxItem.prototype._appendDomElement=function(){if(!this.parent){throw new Error(\"Cannot redraw item: no parent attached\")}if(!this.dom.box.parentNode){var foreground=this.parent.dom.foreground;if(!foreground)throw new Error(\"Cannot redraw item: parent has no foreground container element\");foreground.appendChild(this.dom.box)}if(!this.dom.line.parentNode){var background=this.parent.dom.background;if(!background)throw new Error(\"Cannot redraw item: parent has no background container element\");background.appendChild(this.dom.line)}if(!this.dom.dot.parentNode){var axis=this.parent.dom.axis;if(!background)throw new Error(\"Cannot redraw item: parent has no axis container element\");axis.appendChild(this.dom.dot)}this.displayed=true};BoxItem.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content);this._updateDataAttributes(this.dom.box);this._updateStyle(this.dom.box);var editable=this.editable.updateTime||this.editable.updateGroup;var className=(this.data.className?\" \"+this.data.className:\"\")+(this.selected?\" vis-selected\":\"\")+(editable?\" vis-editable\":\" vis-readonly\");this.dom.box.className=\"vis-item vis-box\"+className;this.dom.line.className=\"vis-item vis-line\"+className;this.dom.dot.className=\"vis-item vis-dot\"+className}};BoxItem.prototype._getDomComponentsSizes=function(){return{previous:{right:this.dom.box.style.right,left:this.dom.box.style.left},dot:{height:this.dom.dot.offsetHeight,width:this.dom.dot.offsetWidth},line:{width:this.dom.line.offsetWidth},box:{width:this.dom.box.offsetWidth,height:this.dom.box.offsetHeight}}};BoxItem.prototype._updateDomComponentsSizes=function(sizes){if(this.options.rtl){this.dom.box.style.right=\"0px\"}else{this.dom.box.style.left=\"0px\"}this.props.dot.height=sizes.dot.height;this.props.dot.width=sizes.dot.width;this.props.line.width=sizes.line.width;this.width=sizes.box.width;this.height=sizes.box.height;if(this.options.rtl){this.dom.box.style.right=sizes.previous.right}else{this.dom.box.style.left=sizes.previous.left}this.dirty=false};BoxItem.prototype._repaintDomAdditionals=function(){this._repaintOnItemUpdateTimeTooltip(this.dom.box);this._repaintDragCenter();this._repaintDeleteButton(this.dom.box)};BoxItem.prototype.redraw=function(returnQueue){var sizes;var queue=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){if(this.dirty){sizes=this._getDomComponentsSizes()}}.bind(this),function(){if(this.dirty){this._updateDomComponentsSizes.bind(this)(sizes)}}.bind(this),this._repaintDomAdditionals.bind(this)];if(returnQueue){return queue}else{var result;queue.forEach(function(fn){result=fn()});return result}};BoxItem.prototype.show=function(){if(!this.displayed){this.redraw()}};BoxItem.prototype.hide=function(){if(this.displayed){var dom=this.dom;if(dom.box.parentNode)dom.box.parentNode.removeChild(dom.box);if(dom.line.parentNode)dom.line.parentNode.removeChild(dom.line);if(dom.dot.parentNode)dom.dot.parentNode.removeChild(dom.dot);this.displayed=false}};BoxItem.prototype.repositionX=function(){var start=this.conversion.toScreen(this.data.start);var align=this.options.align;if(align==\"right\"){if(this.options.rtl){this.right=start-this.width;this.dom.box.style.right=this.right+\"px\";this.dom.line.style.right=start-this.props.line.width+\"px\";this.dom.dot.style.right=start-this.props.line.width/2-this.props.dot.width/2+\"px\"}else{this.left=start-this.width;this.dom.box.style.left=this.left+\"px\";this.dom.line.style.left=start-this.props.line.width+\"px\";this.dom.dot.style.left=start-this.props.line.width/2-this.props.dot.width/2+\"px\"}}else if(align==\"left\"){if(this.options.rtl){this.right=start;this.dom.box.style.right=this.right+\"px\";this.dom.line.style.right=start+\"px\";this.dom.dot.style.right=start+this.props.line.width/2-this.props.dot.width/2+\"px\"}else{this.left=start;this.dom.box.style.left=this.left+\"px\";this.dom.line.style.left=start+\"px\";this.dom.dot.style.left=start+this.props.line.width/2-this.props.dot.width/2+\"px\"}}else{if(this.options.rtl){this.right=start-this.width/2;this.dom.box.style.right=this.right+\"px\";this.dom.line.style.right=start-this.props.line.width+\"px\";this.dom.dot.style.right=start-this.props.dot.width/2+\"px\"}else{this.left=start-this.width/2;this.dom.box.style.left=this.left+\"px\";this.dom.line.style.left=start-this.props.line.width/2+\"px\";this.dom.dot.style.left=start-this.props.dot.width/2+\"px\"}}};BoxItem.prototype.repositionY=function(){var orientation=this.options.orientation.item;var box=this.dom.box;var line=this.dom.line;var dot=this.dom.dot;if(orientation==\"top\"){box.style.top=(this.top||0)+\"px\";line.style.top=\"0\";line.style.height=this.parent.top+this.top+1+\"px\";line.style.bottom=\"\"}else{var itemSetHeight=this.parent.itemSet.props.height;var lineHeight=itemSetHeight-this.parent.top-this.parent.height+this.top;box.style.top=(this.parent.height-this.top-this.height||0)+\"px\";line.style.top=itemSetHeight-lineHeight+\"px\";line.style.bottom=\"0\"}dot.style.top=-this.props.dot.height/2+\"px\"};BoxItem.prototype.getWidthLeft=function(){return this.width/2};BoxItem.prototype.getWidthRight=function(){return this.width/2};module.exports=BoxItem},function(module,exports,__webpack_require__){\"use strict\";var Item=__webpack_require__(38);function PointItem(data,conversion,options){this.props={dot:{top:0,width:0,height:0},content:{height:0,marginLeft:0,marginRight:0}};this.options=options;if(data){if(data.start==undefined){throw new Error('Property \"start\" missing in item '+data)}}Item.call(this,data,conversion,options)}PointItem.prototype=new Item(null,null,null);PointItem.prototype.isVisible=function(range){var widthInMs=this.width*range.getMillisecondsPerPixel();return this.data.start.getTime()+widthInMs>range.start&&this.data.start<range.end};PointItem.prototype._createDomElement=function(){if(!this.dom){this.dom={};this.dom.point=document.createElement(\"div\");this.dom.content=document.createElement(\"div\");this.dom.content.className=\"vis-item-content\";this.dom.point.appendChild(this.dom.content);this.dom.dot=document.createElement(\"div\");this.dom.point.appendChild(this.dom.dot);this.dom.point[\"timeline-item\"]=this;this.dirty=true}};PointItem.prototype._appendDomElement=function(){if(!this.parent){throw new Error(\"Cannot redraw item: no parent attached\")}if(!this.dom.point.parentNode){var foreground=this.parent.dom.foreground;if(!foreground){throw new Error(\"Cannot redraw item: parent has no foreground container element\")}foreground.appendChild(this.dom.point)}this.displayed=true};PointItem.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content);this._updateDataAttributes(this.dom.point);this._updateStyle(this.dom.point);var editable=this.editable.updateTime||this.editable.updateGroup;var className=(this.data.className?\" \"+this.data.className:\"\")+(this.selected?\" vis-selected\":\"\")+(editable?\" vis-editable\":\" vis-readonly\");this.dom.point.className=\"vis-item vis-point\"+className;this.dom.dot.className=\"vis-item vis-dot\"+className}};PointItem.prototype._getDomComponentsSizes=function(){return{dot:{width:this.dom.dot.offsetWidth,height:this.dom.dot.offsetHeight},content:{width:this.dom.content.offsetWidth,height:this.dom.content.offsetHeight},point:{width:this.dom.point.offsetWidth,height:this.dom.point.offsetHeight}}};PointItem.prototype._updateDomComponentsSizes=function(sizes){this.props.dot.width=sizes.dot.width;this.props.dot.height=sizes.dot.height;this.props.content.height=sizes.content.height;if(this.options.rtl){this.dom.content.style.marginRight=2*this.props.dot.width+\"px\"}else{this.dom.content.style.marginLeft=2*this.props.dot.width+\"px\"}this.width=sizes.point.width;this.height=sizes.point.height;this.dom.dot.style.top=(this.height-this.props.dot.height)/2+\"px\";if(this.options.rtl){this.dom.dot.style.right=this.props.dot.width/2+\"px\"}else{this.dom.dot.style.left=this.props.dot.width/2+\"px\"}this.dirty=false};PointItem.prototype._repaintDomAdditionals=function(){this._repaintOnItemUpdateTimeTooltip(this.dom.point);this._repaintDragCenter();this._repaintDeleteButton(this.dom.point)};PointItem.prototype.redraw=function(returnQueue){var sizes;var queue=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){if(this.dirty){sizes=this._getDomComponentsSizes()}}.bind(this),function(){if(this.dirty){this._updateDomComponentsSizes.bind(this)(sizes)}}.bind(this),this._repaintDomAdditionals.bind(this)];if(returnQueue){return queue}else{var result;queue.forEach(function(fn){result=fn()});return result}};PointItem.prototype.show=function(){if(!this.displayed){this.redraw()}};PointItem.prototype.hide=function(){if(this.displayed){if(this.dom.point.parentNode){this.dom.point.parentNode.removeChild(this.dom.point)}this.displayed=false}};PointItem.prototype.repositionX=function(){var start=this.conversion.toScreen(this.data.start);if(this.options.rtl){this.right=start-this.props.dot.width;this.dom.point.style.right=this.right+\"px\"}else{this.left=start-this.props.dot.width;this.dom.point.style.left=this.left+\"px\"}};PointItem.prototype.repositionY=function(){var orientation=this.options.orientation.item;var point=this.dom.point;if(orientation==\"top\"){point.style.top=this.top+\"px\"}else{point.style.top=this.parent.height-this.top-this.height+\"px\"}};PointItem.prototype.getWidthLeft=function(){return this.props.dot.width};PointItem.prototype.getWidthRight=function(){return this.props.dot.width};module.exports=PointItem},function(module,exports,__webpack_require__){\"use strict\";var Item=__webpack_require__(38);var BackgroundGroup=__webpack_require__(69);var RangeItem=__webpack_require__(70);function BackgroundItem(data,conversion,options){this.props={content:{width:0}};this.overflow=false;if(data){if(data.start==undefined){throw new Error('Property \"start\" missing in item '+data.id)}if(data.end==undefined){throw new Error('Property \"end\" missing in item '+data.id)}}Item.call(this,data,conversion,options)}BackgroundItem.prototype=new Item(null,null,null);BackgroundItem.prototype.baseClassName=\"vis-item vis-background\";BackgroundItem.prototype.stack=false;BackgroundItem.prototype.isVisible=function(range){return this.data.start<range.end&&this.data.end>range.start};BackgroundItem.prototype._createDomElement=function(){if(!this.dom){this.dom={};this.dom.box=document.createElement(\"div\");this.dom.frame=document.createElement(\"div\");this.dom.frame.className=\"vis-item-overflow\";this.dom.box.appendChild(this.dom.frame);this.dom.content=document.createElement(\"div\");this.dom.content.className=\"vis-item-content\";this.dom.frame.appendChild(this.dom.content);this.dirty=true}};BackgroundItem.prototype._appendDomElement=function(){if(!this.parent){throw new Error(\"Cannot redraw item: no parent attached\")}if(!this.dom.box.parentNode){var background=this.parent.dom.background;if(!background){throw new Error(\"Cannot redraw item: parent has no background container element\")}background.appendChild(this.dom.box)}this.displayed=true};BackgroundItem.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content);this._updateDataAttributes(this.dom.content);this._updateStyle(this.dom.box);var className=(this.data.className?\" \"+this.data.className:\"\")+(this.selected?\" vis-selected\":\"\");this.dom.box.className=this.baseClassName+className}};BackgroundItem.prototype._getDomComponentsSizes=function(){this.overflow=window.getComputedStyle(this.dom.content).overflow!==\"hidden\";return{content:{width:this.dom.content.offsetWidth}}};BackgroundItem.prototype._updateDomComponentsSizes=function(sizes){this.props.content.width=sizes.content.width;this.height=0;this.dirty=false};BackgroundItem.prototype._repaintDomAdditionals=function(){};BackgroundItem.prototype.redraw=function(returnQueue){var sizes;var queue=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){if(this.dirty){sizes=this._getDomComponentsSizes.bind(this)()}}.bind(this),function(){if(this.dirty){this._updateDomComponentsSizes.bind(this)(sizes)}}.bind(this),this._repaintDomAdditionals.bind(this)];if(returnQueue){return queue}else{var result;queue.forEach(function(fn){result=fn()});return result}};BackgroundItem.prototype.show=RangeItem.prototype.show;BackgroundItem.prototype.hide=RangeItem.prototype.hide;BackgroundItem.prototype.repositionX=RangeItem.prototype.repositionX;BackgroundItem.prototype.repositionY=function(margin){var height;var orientation=this.options.orientation.item;if(this.data.subgroup!==undefined){var itemSubgroup=this.data.subgroup;this.dom.box.style.height=this.parent.subgroups[itemSubgroup].height+\"px\";if(orientation==\"top\"){this.dom.box.style.top=this.parent.top+this.parent.subgroups[itemSubgroup].top+\"px\"}else{this.dom.box.style.top=this.parent.top+this.parent.height-this.parent.subgroups[itemSubgroup].top-this.parent.subgroups[itemSubgroup].height+\"px\"}this.dom.box.style.bottom=\"\"}else{if(this.parent instanceof BackgroundGroup){height=Math.max(this.parent.height,this.parent.itemSet.body.domProps.center.height,this.parent.itemSet.body.domProps.centerContainer.height);this.dom.box.style.bottom=orientation==\"bottom\"?\"0\":\"\";this.dom.box.style.top=orientation==\"top\"?\"0\":\"\"}else{height=this.parent.height;this.dom.box.style.top=this.parent.top+\"px\";this.dom.box.style.bottom=\"\"}}this.dom.box.style.height=height+\"px\"};module.exports=BackgroundItem},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Popup=function(){function Popup(container,overflowMethod){(0,_classCallCheck3[\"default\"])(this,Popup);this.container=container;this.overflowMethod=overflowMethod||\"cap\";this.x=0;this.y=0;this.padding=5;this.hidden=false;this.frame=document.createElement(\"div\");this.frame.className=\"vis-tooltip\";this.container.appendChild(this.frame)}(0,_createClass3[\"default\"])(Popup,[{key:\"setPosition\",value:function setPosition(x,y){this.x=parseInt(x);this.y=parseInt(y)}},{key:\"setText\",value:function setText(content){if(content instanceof Element){this.frame.innerHTML=\"\";this.frame.appendChild(content)}else{this.frame.innerHTML=content}}},{key:\"show\",value:function show(doShow){if(doShow===undefined){doShow=true}if(doShow===true){var height=this.frame.clientHeight;var width=this.frame.clientWidth;var maxHeight=this.frame.parentNode.clientHeight;var maxWidth=this.frame.parentNode.clientWidth;var left=0,top=0;if(this.overflowMethod==\"flip\"){var isLeft=false,isTop=true;if(this.y-height<this.padding){isTop=false}if(this.x+width>maxWidth-this.padding){isLeft=true}if(isLeft){left=this.x-width}else{left=this.x}if(isTop){top=this.y-height}else{top=this.y}}else{top=this.y-height;if(top+height+this.padding>maxHeight){top=maxHeight-height-this.padding}if(top<this.padding){top=this.padding}left=this.x;if(left+width+this.padding>maxWidth){left=maxWidth-width-this.padding}if(left<this.padding){left=this.padding}}this.frame.style.left=left+\"px\";this.frame.style.top=top+\"px\";this.frame.style.visibility=\"visible\";this.hidden=false}else{this.hide()}}},{key:\"hide\",value:function hide(){this.hidden=true;this.frame.style.left=\"0\";this.frame.style.top=\"0\";this.frame.style.visibility=\"hidden\"}},{key:\"destroy\",value:function destroy(){this.frame.parentNode.removeChild(this.frame)}}]);return Popup}();exports[\"default\"]=Popup},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var string=\"string\";var bool=\"boolean\";var number=\"number\";var array=\"array\";var date=\"date\";var object=\"object\";var dom=\"dom\";var moment=\"moment\";var any=\"any\";var allOptions={configure:{enabled:{boolean:bool},filter:{boolean:bool,function:\"function\"},container:{dom:dom},__type__:{object:object,boolean:bool,function:\"function\"}},align:{string:string},rtl:{boolean:bool,undefined:\"undefined\"},rollingMode:{follow:{boolean:bool},offset:{number:number,undefined:\"undefined\"},__type__:{object:object}},verticalScroll:{boolean:bool,undefined:\"undefined\"},horizontalScroll:{boolean:bool,undefined:\"undefined\"},autoResize:{boolean:bool},throttleRedraw:{number:number},clickToUse:{boolean:bool},dataAttributes:{string:string,array:array},editable:{add:{boolean:bool,undefined:\"undefined\"},remove:{boolean:bool,undefined:\"undefined\"},updateGroup:{boolean:bool,undefined:\"undefined\"},updateTime:{boolean:bool,undefined:\"undefined\"},overrideItems:{boolean:bool,undefined:\"undefined\"},__type__:{boolean:bool,object:object}},end:{number:number,date:date,string:string,moment:moment},format:{minorLabels:{millisecond:{string:string,undefined:\"undefined\"},second:{string:string,undefined:\"undefined\"},minute:{string:string,undefined:\"undefined\"},hour:{string:string,undefined:\"undefined\"},weekday:{string:string,undefined:\"undefined\"},day:{string:string,undefined:\"undefined\"},week:{string:string,undefined:\"undefined\"},month:{string:string,undefined:\"undefined\"},year:{string:string,undefined:\"undefined\"},__type__:{object:object,function:\"function\"}},majorLabels:{millisecond:{string:string,undefined:\"undefined\"},second:{string:string,undefined:\"undefined\"},minute:{string:string,undefined:\"undefined\"},hour:{string:string,undefined:\"undefined\"},weekday:{string:string,undefined:\"undefined\"},day:{string:string,undefined:\"undefined\"},week:{string:string,undefined:\"undefined\"},month:{string:string,undefined:\"undefined\"},year:{string:string,undefined:\"undefined\"},__type__:{object:object,function:\"function\"}},__type__:{object:object}},moment:{function:\"function\"},groupOrder:{string:string,function:\"function\"},groupEditable:{add:{boolean:bool,undefined:\"undefined\"},remove:{boolean:bool,undefined:\"undefined\"},order:{boolean:bool,undefined:\"undefined\"},__type__:{boolean:bool,object:object}},groupOrderSwap:{function:\"function\"},height:{string:string,number:number},hiddenDates:{start:{date:date,number:number,string:string,moment:moment},end:{date:date,number:number,string:string,moment:moment},repeat:{string:string},__type__:{object:object,array:array}},itemsAlwaysDraggable:{item:{boolean:bool,undefined:\"undefined\"},range:{boolean:bool,undefined:\"undefined\"},__type__:{boolean:bool,object:object}},limitSize:{boolean:bool},locale:{string:string},locales:{__any__:{any:any},__type__:{object:object}},margin:{axis:{number:number},item:{horizontal:{number:number,undefined:\"undefined\"},vertical:{number:number,undefined:\"undefined\"},__type__:{object:object,number:number}},__type__:{object:object,number:number}},max:{date:date,number:number,string:string,moment:moment},maxHeight:{number:number,string:string},maxMinorChars:{number:number},min:{date:date,number:number,string:string,moment:moment},minHeight:{number:number,string:string},moveable:{boolean:bool},multiselect:{boolean:bool},multiselectPerGroup:{boolean:bool},onAdd:{function:\"function\"},onDropObjectOnItem:{function:\"function\"},onUpdate:{function:\"function\"},onMove:{function:\"function\"},onMoving:{function:\"function\"},onRemove:{function:\"function\"},onAddGroup:{function:\"function\"},onMoveGroup:{function:\"function\"},onRemoveGroup:{function:\"function\"},onInitialDrawComplete:{function:\"function\"},order:{function:\"function\"},orientation:{axis:{string:string,undefined:\"undefined\"},item:{string:string,undefined:\"undefined\"},__type__:{string:string,object:object}},selectable:{boolean:bool},showCurrentTime:{boolean:bool},showMajorLabels:{boolean:bool},showMinorLabels:{boolean:bool},stack:{boolean:bool},stackSubgroups:{boolean:bool},snap:{function:\"function\",null:\"null\"},start:{date:date,number:number,string:string,moment:moment},template:{function:\"function\"},groupTemplate:{function:\"function\"},visibleFrameTemplate:{string:string,function:\"function\"},showTooltips:{boolean:bool},tooltip:{followMouse:{boolean:bool},overflowMethod:{string:[\"cap\",\"flip\"]},__type__:{object:object}},tooltipOnItemUpdateTime:{template:{function:\"function\"},__type__:{boolean:bool,object:object}},timeAxis:{scale:{string:string,undefined:\"undefined\"},step:{number:number,undefined:\"undefined\"},__type__:{object:object}},type:{string:string},width:{string:string,number:number},zoomable:{boolean:bool},zoomKey:{string:[\"ctrlKey\",\"altKey\",\"metaKey\",\"\"]},zoomMax:{number:number},zoomMin:{number:number},__type__:{object:object}};var configureOptions={global:{align:[\"center\",\"left\",\"right\"],direction:false,autoResize:true,clickToUse:false,editable:{add:false,remove:false,updateGroup:false,updateTime:false},end:\"\",format:{minorLabels:{millisecond:\"SSS\",second:\"s\",minute:\"HH:mm\",hour:\"HH:mm\",weekday:\"ddd D\",day:\"D\",week:\"w\",month:\"MMM\",year:\"YYYY\"},majorLabels:{millisecond:\"HH:mm:ss\",second:\"D MMMM HH:mm\",minute:\"ddd D MMMM\",hour:\"ddd D MMMM\",weekday:\"MMMM YYYY\",day:\"MMMM YYYY\",week:\"MMMM YYYY\",month:\"YYYY\",year:\"\"}},groupsDraggable:false,height:\"\",locale:\"\",margin:{axis:[20,0,100,1],item:{horizontal:[10,0,100,1],vertical:[10,0,100,1]}},max:\"\",maxHeight:\"\",maxMinorChars:[7,0,20,1],min:\"\",minHeight:\"\",moveable:false,multiselect:false,multiselectPerGroup:false,orientation:{axis:[\"both\",\"bottom\",\"top\"],item:[\"bottom\",\"top\"]},selectable:true,showCurrentTime:false,showMajorLabels:true,showMinorLabels:true,stack:true,stackSubgroups:true,start:\"\",showTooltips:true,tooltip:{followMouse:false,overflowMethod:\"flip\"},tooltipOnItemUpdateTime:false,type:[\"box\",\"point\",\"range\",\"background\"],width:\"100%\",zoomable:true,zoomKey:[\"ctrlKey\",\"altKey\",\"metaKey\",\"\"],zoomMax:[31536e10,10,31536e10,1],zoomMin:[10,10,31536e10,1]}};exports.allOptions=allOptions;exports.configureOptions=configureOptions},function(module,exports,__webpack_require__){\"use strict\";var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var DOMutil=__webpack_require__(14);var DataSet=__webpack_require__(11);var DataView=__webpack_require__(12);var Component=__webpack_require__(16);var DataAxis=__webpack_require__(107);var GraphGroup=__webpack_require__(109);var Legend=__webpack_require__(112);var Bars=__webpack_require__(110)\n;var Lines=__webpack_require__(111);var Points=__webpack_require__(72);var UNGROUPED=\"__ungrouped__\";function LineGraph(body,options){this.id=util.randomUUID();this.body=body;this.defaultOptions={yAxisOrientation:\"left\",defaultGroup:\"default\",sort:true,sampling:true,stack:false,graphHeight:\"400px\",shaded:{enabled:false,orientation:\"bottom\"},style:\"line\",barChart:{width:50,sideBySide:false,align:\"center\"},interpolation:{enabled:true,parametrization:\"centripetal\",alpha:.5},drawPoints:{enabled:true,size:6,style:\"square\"},dataAxis:{},legend:{},groups:{visibility:{}}};this.options=util.extend({},this.defaultOptions);this.dom={};this.props={};this.hammer=null;this.groups={};this.abortedGraphUpdate=false;this.updateSVGheight=false;this.updateSVGheightOnResize=false;this.forceGraphUpdate=true;var me=this;this.itemsData=null;this.groupsData=null;this.itemListeners={add:function add(event,params,senderId){me._onAdd(params.items)},update:function update(event,params,senderId){me._onUpdate(params.items)},remove:function remove(event,params,senderId){me._onRemove(params.items)}};this.groupListeners={add:function add(event,params,senderId){me._onAddGroups(params.items)},update:function update(event,params,senderId){me._onUpdateGroups(params.items)},remove:function remove(event,params,senderId){me._onRemoveGroups(params.items)}};this.items={};this.selection=[];this.lastStart=this.body.range.start;this.touchParams={};this.svgElements={};this.setOptions(options);this.groupsUsingDefaultStyles=[0];this.body.emitter.on(\"rangechanged\",function(){me.lastStart=me.body.range.start;me.svg.style.left=util.option.asSize(-me.props.width);me.forceGraphUpdate=true;me.redraw.call(me)});this._create();this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups}}LineGraph.prototype=new Component;LineGraph.prototype._create=function(){var frame=document.createElement(\"div\");frame.className=\"vis-line-graph\";this.dom.frame=frame;this.svg=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");this.svg.style.position=\"relative\";this.svg.style.height=(\"\"+this.options.graphHeight).replace(\"px\",\"\")+\"px\";this.svg.style.display=\"block\";frame.appendChild(this.svg);this.options.dataAxis.orientation=\"left\";this.yAxisLeft=new DataAxis(this.body,this.options.dataAxis,this.svg,this.options.groups);this.options.dataAxis.orientation=\"right\";this.yAxisRight=new DataAxis(this.body,this.options.dataAxis,this.svg,this.options.groups);delete this.options.dataAxis.orientation;this.legendLeft=new Legend(this.body,this.options.legend,\"left\",this.options.groups);this.legendRight=new Legend(this.body,this.options.legend,\"right\",this.options.groups);this.show()};LineGraph.prototype.setOptions=function(options){if(options){var fields=[\"sampling\",\"defaultGroup\",\"stack\",\"height\",\"graphHeight\",\"yAxisOrientation\",\"style\",\"barChart\",\"dataAxis\",\"sort\",\"groups\"];if(options.graphHeight===undefined&&options.height!==undefined){this.updateSVGheight=true;this.updateSVGheightOnResize=true}else if(this.body.domProps.centerContainer.height!==undefined&&options.graphHeight!==undefined){if(parseInt((options.graphHeight+\"\").replace(\"px\",\"\"))<this.body.domProps.centerContainer.height){this.updateSVGheight=true}}util.selectiveDeepExtend(fields,this.options,options);util.mergeOptions(this.options,options,\"interpolation\");util.mergeOptions(this.options,options,\"drawPoints\");util.mergeOptions(this.options,options,\"shaded\");util.mergeOptions(this.options,options,\"legend\");if(options.interpolation){if((0,_typeof3[\"default\"])(options.interpolation)==\"object\"){if(options.interpolation.parametrization){if(options.interpolation.parametrization==\"uniform\"){this.options.interpolation.alpha=0}else if(options.interpolation.parametrization==\"chordal\"){this.options.interpolation.alpha=1}else{this.options.interpolation.parametrization=\"centripetal\";this.options.interpolation.alpha=.5}}}}if(this.yAxisLeft){if(options.dataAxis!==undefined){this.yAxisLeft.setOptions(this.options.dataAxis);this.yAxisRight.setOptions(this.options.dataAxis)}}if(this.legendLeft){if(options.legend!==undefined){this.legendLeft.setOptions(this.options.legend);this.legendRight.setOptions(this.options.legend)}}if(this.groups.hasOwnProperty(UNGROUPED)){this.groups[UNGROUPED].setOptions(options)}}if(this.dom.frame){this.forceGraphUpdate=true;this.body.emitter.emit(\"_change\",{queue:true})}};LineGraph.prototype.hide=function(){if(this.dom.frame.parentNode){this.dom.frame.parentNode.removeChild(this.dom.frame)}};LineGraph.prototype.show=function(){if(!this.dom.frame.parentNode){this.body.dom.center.appendChild(this.dom.frame)}};LineGraph.prototype.setItems=function(items){var me=this,ids,oldItemsData=this.itemsData;if(!items){this.itemsData=null}else if(items instanceof DataSet||items instanceof DataView){this.itemsData=items}else{throw new TypeError(\"Data must be an instance of DataSet or DataView\")}if(oldItemsData){util.forEach(this.itemListeners,function(callback,event){oldItemsData.off(event,callback)});ids=oldItemsData.getIds();this._onRemove(ids)}if(this.itemsData){var id=this.id;util.forEach(this.itemListeners,function(callback,event){me.itemsData.on(event,callback,id)});ids=this.itemsData.getIds();this._onAdd(ids)}};LineGraph.prototype.setGroups=function(groups){var me=this;var ids;if(this.groupsData){util.forEach(this.groupListeners,function(callback,event){me.groupsData.off(event,callback)});ids=this.groupsData.getIds();this.groupsData=null;for(var i=0;i<ids.length;i++){this._removeGroup(ids[i])}}if(!groups){this.groupsData=null}else if(groups instanceof DataSet||groups instanceof DataView){this.groupsData=groups}else{throw new TypeError(\"Data must be an instance of DataSet or DataView\")}if(this.groupsData){var id=this.id;util.forEach(this.groupListeners,function(callback,event){me.groupsData.on(event,callback,id)});ids=this.groupsData.getIds();this._onAddGroups(ids)}};LineGraph.prototype._onUpdate=function(ids){this._updateAllGroupData(ids)};LineGraph.prototype._onAdd=function(ids){this._onUpdate(ids)};LineGraph.prototype._onRemove=function(ids){this._onUpdate(ids)};LineGraph.prototype._onUpdateGroups=function(groupIds){this._updateAllGroupData(null,groupIds)};LineGraph.prototype._onAddGroups=function(groupIds){this._onUpdateGroups(groupIds)};LineGraph.prototype._onRemoveGroups=function(groupIds){for(var i=0;i<groupIds.length;i++){this._removeGroup(groupIds[i])}this.forceGraphUpdate=true;this.body.emitter.emit(\"_change\",{queue:true})};LineGraph.prototype._removeGroup=function(groupId){if(this.groups.hasOwnProperty(groupId)){if(this.groups[groupId].options.yAxisOrientation==\"right\"){this.yAxisRight.removeGroup(groupId);this.legendRight.removeGroup(groupId);this.legendRight.redraw()}else{this.yAxisLeft.removeGroup(groupId);this.legendLeft.removeGroup(groupId);this.legendLeft.redraw()}delete this.groups[groupId]}};LineGraph.prototype._updateGroup=function(group,groupId){if(!this.groups.hasOwnProperty(groupId)){this.groups[groupId]=new GraphGroup(group,groupId,this.options,this.groupsUsingDefaultStyles);if(this.groups[groupId].options.yAxisOrientation==\"right\"){this.yAxisRight.addGroup(groupId,this.groups[groupId]);this.legendRight.addGroup(groupId,this.groups[groupId])}else{this.yAxisLeft.addGroup(groupId,this.groups[groupId]);this.legendLeft.addGroup(groupId,this.groups[groupId])}}else{this.groups[groupId].update(group);if(this.groups[groupId].options.yAxisOrientation==\"right\"){this.yAxisRight.updateGroup(groupId,this.groups[groupId]);this.legendRight.updateGroup(groupId,this.groups[groupId]);this.yAxisLeft.removeGroup(groupId);this.legendLeft.removeGroup(groupId)}else{this.yAxisLeft.updateGroup(groupId,this.groups[groupId]);this.legendLeft.updateGroup(groupId,this.groups[groupId]);this.yAxisRight.removeGroup(groupId);this.legendRight.removeGroup(groupId)}}this.legendLeft.redraw();this.legendRight.redraw()};LineGraph.prototype._updateAllGroupData=function(ids,groupIds){if(this.itemsData!=null){var groupsContent={};var items=this.itemsData.get();var fieldId=this.itemsData._fieldId;var idMap={};if(ids){ids.map(function(id){idMap[id]=id})}var groupCounts={};for(var i=0;i<items.length;i++){var item=items[i];var groupId=item.group;if(groupId===null||groupId===undefined){groupId=UNGROUPED}groupCounts.hasOwnProperty(groupId)?groupCounts[groupId]++:groupCounts[groupId]=1}var existingItemsMap={};if(!groupIds&&ids){for(groupId in this.groups){if(this.groups.hasOwnProperty(groupId)){group=this.groups[groupId];var existing_items=group.getItems();groupsContent[groupId]=existing_items.filter(function(item){existingItemsMap[item[fieldId]]=item[fieldId];return item[fieldId]!==idMap[item[fieldId]]});var newLength=groupCounts[groupId];groupCounts[groupId]-=groupsContent[groupId].length;if(groupsContent[groupId].length<newLength){groupsContent[groupId][newLength-1]={}}}}}for(i=0;i<items.length;i++){item=items[i];groupId=item.group;if(groupId===null||groupId===undefined){groupId=UNGROUPED}if(!groupIds&&ids&&item[fieldId]!==idMap[item[fieldId]]&&existingItemsMap.hasOwnProperty(item[fieldId])){continue}if(!groupsContent.hasOwnProperty(groupId)){groupsContent[groupId]=new Array(groupCounts[groupId])}var extended=util.bridgeObject(item);extended.x=util.convert(item.x,\"Date\");extended.end=util.convert(item.end,\"Date\");extended.orginalY=item.y;extended.y=Number(item.y);extended[fieldId]=item[fieldId];var index=groupsContent[groupId].length-groupCounts[groupId]--;groupsContent[groupId][index]=extended}for(groupId in this.groups){if(this.groups.hasOwnProperty(groupId)){if(!groupsContent.hasOwnProperty(groupId)){groupsContent[groupId]=new Array(0)}}}for(groupId in groupsContent){if(groupsContent.hasOwnProperty(groupId)){if(groupsContent[groupId].length==0){if(this.groups.hasOwnProperty(groupId)){this._removeGroup(groupId)}}else{var group=undefined;if(this.groupsData!=undefined){group=this.groupsData.get(groupId)}if(group==undefined){group={id:groupId,content:this.options.defaultGroup+groupId}}this._updateGroup(group,groupId);this.groups[groupId].setItems(groupsContent[groupId])}}}this.forceGraphUpdate=true;this.body.emitter.emit(\"_change\",{queue:true})}};LineGraph.prototype.redraw=function(){var resized=false;this.props.width=this.dom.frame.offsetWidth;this.props.height=this.body.domProps.centerContainer.height-this.body.domProps.border.top-this.body.domProps.border.bottom;resized=this._isResized()||resized;var visibleInterval=this.body.range.end-this.body.range.start;var zoomed=visibleInterval!=this.lastVisibleInterval;this.lastVisibleInterval=visibleInterval;if(resized==true){this.svg.style.width=util.option.asSize(3*this.props.width);this.svg.style.left=util.option.asSize(-this.props.width);if((this.options.height+\"\").indexOf(\"%\")!=-1||this.updateSVGheightOnResize==true){this.updateSVGheight=true}}if(this.updateSVGheight==true){if(this.options.graphHeight!=this.props.height+\"px\"){this.options.graphHeight=this.props.height+\"px\";this.svg.style.height=this.props.height+\"px\"}this.updateSVGheight=false}else{this.svg.style.height=(\"\"+this.options.graphHeight).replace(\"px\",\"\")+\"px\"}if(resized==true||zoomed==true||this.abortedGraphUpdate==true||this.forceGraphUpdate==true){resized=this._updateGraph()||resized;this.forceGraphUpdate=false}else{if(this.lastStart!=0){var offset=this.body.range.start-this.lastStart;var range=this.body.range.end-this.body.range.start;if(this.props.width!=0){var rangePerPixelInv=this.props.width/range;var xOffset=offset*rangePerPixelInv;this.svg.style.left=-this.props.width-xOffset+\"px\"}}}this.legendLeft.redraw();this.legendRight.redraw();return resized};LineGraph.prototype._getSortedGroupIds=function(){var grouplist=[];for(var groupId in this.groups){if(this.groups.hasOwnProperty(groupId)){var group=this.groups[groupId];if(group.visible==true&&(this.options.groups.visibility[groupId]===undefined||this.options.groups.visibility[groupId]==true)){grouplist.push({id:groupId,zIndex:group.options.zIndex})}}}util.insertSort(grouplist,function(a,b){var az=a.zIndex;var bz=b.zIndex;if(az===undefined)az=0;if(bz===undefined)bz=0;return az==bz?0:az<bz?-1:1});var groupIds=new Array(grouplist.length);for(var i=0;i<grouplist.length;i++){groupIds[i]=grouplist[i].id}return groupIds};LineGraph.prototype._updateGraph=function(){DOMutil.prepareElements(this.svgElements);if(this.props.width!=0&&this.itemsData!=null){var group,i;var groupRanges={};var changeCalled=false;var minDate=this.body.util.toGlobalTime(-this.body.domProps.root.width);var maxDate=this.body.util.toGlobalTime(2*this.body.domProps.root.width);var groupIds=this._getSortedGroupIds();if(groupIds.length>0){var groupsData={};this._getRelevantData(groupIds,groupsData,minDate,maxDate);this._applySampling(groupIds,groupsData);for(i=0;i<groupIds.length;i++){this._convertXcoordinates(groupsData[groupIds[i]])}this._getYRanges(groupIds,groupsData,groupRanges);changeCalled=this._updateYAxis(groupIds,groupRanges);if(changeCalled==true){DOMutil.cleanupElements(this.svgElements);this.abortedGraphUpdate=true;return true}this.abortedGraphUpdate=false;var below=undefined;for(i=0;i<groupIds.length;i++){group=this.groups[groupIds[i]];if(this.options.stack===true&&this.options.style===\"line\"){if(group.options.excludeFromStacking==undefined||!group.options.excludeFromStacking){if(below!=undefined){this._stack(groupsData[group.id],groupsData[below.id]);if(group.options.shaded.enabled==true&&group.options.shaded.orientation!==\"group\"){if(group.options.shaded.orientation==\"top\"&&below.options.shaded.orientation!==\"group\"){below.options.shaded.orientation=\"group\";below.options.shaded.groupId=group.id}else{group.options.shaded.orientation=\"group\";group.options.shaded.groupId=below.id}}}below=group}}this._convertYcoordinates(groupsData[groupIds[i]],group)}var paths={};for(i=0;i<groupIds.length;i++){group=this.groups[groupIds[i]];if(group.options.style===\"line\"&&group.options.shaded.enabled==true){var dataset=groupsData[groupIds[i]];if(dataset==null||dataset.length==0){continue}if(!paths.hasOwnProperty(groupIds[i])){paths[groupIds[i]]=Lines.calcPath(dataset,group)}if(group.options.shaded.orientation===\"group\"){var subGroupId=group.options.shaded.groupId;if(groupIds.indexOf(subGroupId)===-1){console.log(group.id+\": Unknown shading group target given:\"+subGroupId);continue}if(!paths.hasOwnProperty(subGroupId)){paths[subGroupId]=Lines.calcPath(groupsData[subGroupId],this.groups[subGroupId])}Lines.drawShading(paths[groupIds[i]],group,paths[subGroupId],this.framework)}else{Lines.drawShading(paths[groupIds[i]],group,undefined,this.framework)}}}Bars.draw(groupIds,groupsData,this.framework);for(i=0;i<groupIds.length;i++){group=this.groups[groupIds[i]];if(groupsData[groupIds[i]].length>0){switch(group.options.style){case\"line\":if(!paths.hasOwnProperty(groupIds[i])){paths[groupIds[i]]=Lines.calcPath(groupsData[groupIds[i]],group)}Lines.draw(paths[groupIds[i]],group,this.framework);case\"point\":case\"points\":if(group.options.style==\"point\"||group.options.style==\"points\"||group.options.drawPoints.enabled==true){Points.draw(groupsData[groupIds[i]],group,this.framework)}break;case\"bar\":default:}}}}}DOMutil.cleanupElements(this.svgElements);return false};LineGraph.prototype._stack=function(data,subData){var index,dx,dy,subPrevPoint,subNextPoint;index=0;for(var j=0;j<data.length;j++){subPrevPoint=undefined;subNextPoint=undefined;for(var k=index;k<subData.length;k++){if(subData[k].x===data[j].x){subPrevPoint=subData[k];subNextPoint=subData[k];index=k;break}else if(subData[k].x>data[j].x){subNextPoint=subData[k];if(k==0){subPrevPoint=subNextPoint}else{subPrevPoint=subData[k-1]}index=k;break}}if(subNextPoint===undefined){subPrevPoint=subData[subData.length-1];subNextPoint=subData[subData.length-1]}dx=subNextPoint.x-subPrevPoint.x;dy=subNextPoint.y-subPrevPoint.y;if(dx==0){data[j].y=data[j].orginalY+subNextPoint.y}else{data[j].y=data[j].orginalY+dy/dx*(data[j].x-subPrevPoint.x)+subPrevPoint.y}}};LineGraph.prototype._getRelevantData=function(groupIds,groupsData,minDate,maxDate){var group,i,j,item;if(groupIds.length>0){for(i=0;i<groupIds.length;i++){group=this.groups[groupIds[i]];var itemsData=group.getItems();if(group.options.sort==true){var dateComparator=function dateComparator(a,b){return a.getTime()==b.getTime()?0:a<b?-1:1};var first=Math.max(0,util.binarySearchValue(itemsData,minDate,\"x\",\"before\",dateComparator));var last=Math.min(itemsData.length,util.binarySearchValue(itemsData,maxDate,\"x\",\"after\",dateComparator)+1);if(last<=0){last=itemsData.length}var dataContainer=new Array(last-first);for(j=first;j<last;j++){item=group.itemsData[j];dataContainer[j-first]=item}groupsData[groupIds[i]]=dataContainer}else{groupsData[groupIds[i]]=group.itemsData}}}};LineGraph.prototype._applySampling=function(groupIds,groupsData){var group;if(groupIds.length>0){for(var i=0;i<groupIds.length;i++){group=this.groups[groupIds[i]];if(group.options.sampling==true){var dataContainer=groupsData[groupIds[i]];if(dataContainer.length>0){var increment=1;var amountOfPoints=dataContainer.length;var xDistance=this.body.util.toGlobalScreen(dataContainer[dataContainer.length-1].x)-this.body.util.toGlobalScreen(dataContainer[0].x);var pointsPerPixel=amountOfPoints/xDistance;increment=Math.min(Math.ceil(.2*amountOfPoints),Math.max(1,Math.round(pointsPerPixel)));var sampledData=new Array(amountOfPoints);for(var j=0;j<amountOfPoints;j+=increment){var idx=Math.round(j/increment);sampledData[idx]=dataContainer[j]}groupsData[groupIds[i]]=sampledData.splice(0,Math.round(amountOfPoints/increment))}}}}};LineGraph.prototype._getYRanges=function(groupIds,groupsData,groupRanges){var groupData,group,i;var combinedDataLeft=[];var combinedDataRight=[];var options;if(groupIds.length>0){for(i=0;i<groupIds.length;i++){groupData=groupsData[groupIds[i]];options=this.groups[groupIds[i]].options;if(groupData.length>0){group=this.groups[groupIds[i]];if(options.stack===true&&options.style===\"bar\"){if(options.yAxisOrientation===\"left\"){combinedDataLeft=combinedDataLeft.concat(groupData)}else{combinedDataRight=combinedDataRight.concat(groupData)}}else{groupRanges[groupIds[i]]=group.getYRange(groupData,groupIds[i])}}}Bars.getStackedYRange(combinedDataLeft,groupRanges,groupIds,\"__barStackLeft\",\"left\");Bars.getStackedYRange(combinedDataRight,groupRanges,groupIds,\"__barStackRight\",\"right\")}};LineGraph.prototype._updateYAxis=function(groupIds,groupRanges){var resized=false;var yAxisLeftUsed=false;var yAxisRightUsed=false;var minLeft=1e9,minRight=1e9,maxLeft=-1e9,maxRight=-1e9,minVal,maxVal;if(groupIds.length>0){for(var i=0;i<groupIds.length;i++){var group=this.groups[groupIds[i]];if(group&&group.options.yAxisOrientation!=\"right\"){yAxisLeftUsed=true;minLeft=1e9;maxLeft=-1e9}else if(group&&group.options.yAxisOrientation){yAxisRightUsed=true;minRight=1e9;maxRight=-1e9}}for(i=0;i<groupIds.length;i++){if(groupRanges.hasOwnProperty(groupIds[i])){if(groupRanges[groupIds[i]].ignore!==true){minVal=groupRanges[groupIds[i]].min;maxVal=groupRanges[groupIds[i]].max;if(groupRanges[groupIds[i]].yAxisOrientation!=\"right\"){yAxisLeftUsed=true;minLeft=minLeft>minVal?minVal:minLeft;maxLeft=maxLeft<maxVal?maxVal:maxLeft}else{yAxisRightUsed=true;minRight=minRight>minVal?minVal:minRight;maxRight=maxRight<maxVal?maxVal:maxRight}}}}if(yAxisLeftUsed==true){this.yAxisLeft.setRange(minLeft,maxLeft)}if(yAxisRightUsed==true){this.yAxisRight.setRange(minRight,maxRight)}}resized=this._toggleAxisVisiblity(yAxisLeftUsed,this.yAxisLeft)||resized;resized=this._toggleAxisVisiblity(yAxisRightUsed,this.yAxisRight)||resized;if(yAxisRightUsed==true&&yAxisLeftUsed==true){this.yAxisLeft.drawIcons=true;this.yAxisRight.drawIcons=true}else{this.yAxisLeft.drawIcons=false;this.yAxisRight.drawIcons=false}this.yAxisRight.master=!yAxisLeftUsed;this.yAxisRight.masterAxis=this.yAxisLeft;if(this.yAxisRight.master==false){if(yAxisRightUsed==true){this.yAxisLeft.lineOffset=this.yAxisRight.width}else{this.yAxisLeft.lineOffset=0}resized=this.yAxisLeft.redraw()||resized;resized=this.yAxisRight.redraw()||resized}else{resized=this.yAxisRight.redraw()||resized}var tempGroups=[\"__barStackLeft\",\"__barStackRight\",\"__lineStackLeft\",\"__lineStackRight\"];for(i=0;i<tempGroups.length;i++){if(groupIds.indexOf(tempGroups[i])!=-1){groupIds.splice(groupIds.indexOf(tempGroups[i]),1)}}return resized};LineGraph.prototype._toggleAxisVisiblity=function(axisUsed,axis){var changed=false;if(axisUsed==false){if(axis.dom.frame.parentNode&&axis.hidden==false){axis.hide();changed=true}}else{if(!axis.dom.frame.parentNode&&axis.hidden==true){axis.show();changed=true}}return changed};LineGraph.prototype._convertXcoordinates=function(datapoints){var toScreen=this.body.util.toScreen;for(var i=0;i<datapoints.length;i++){datapoints[i].screen_x=toScreen(datapoints[i].x)+this.props.width;datapoints[i].screen_y=datapoints[i].y;if(datapoints[i].end!=undefined){datapoints[i].screen_end=toScreen(datapoints[i].end)+this.props.width}else{datapoints[i].screen_end=undefined}}};LineGraph.prototype._convertYcoordinates=function(datapoints,group){var axis=this.yAxisLeft;var svgHeight=Number(this.svg.style.height.replace(\"px\",\"\"));if(group.options.yAxisOrientation==\"right\"){axis=this.yAxisRight}for(var i=0;i<datapoints.length;i++){datapoints[i].screen_y=Math.round(axis.convertValue(datapoints[i].y))}group.setZeroPosition(Math.min(svgHeight,axis.convertValue(0)))};module.exports=LineGraph},function(module,exports,__webpack_require__){\"use strict\";var _keys=__webpack_require__(8);var _keys2=_interopRequireDefault(_keys);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var DOMutil=__webpack_require__(14);var Component=__webpack_require__(16);var DataScale=__webpack_require__(108);function DataAxis(body,options,svg,linegraphOptions){this.id=util.randomUUID();this.body=body;this.defaultOptions={orientation:\"left\",showMinorLabels:true,showMajorLabels:true,icons:false,majorLinesOffset:7,minorLinesOffset:4,labelOffsetX:10,labelOffsetY:2,iconWidth:20,width:\"40px\",visible:true,alignZeros:true,left:{range:{min:undefined,max:undefined},format:function format(value){return\"\"+parseFloat(value.toPrecision(3))},title:{text:undefined,style:undefined}},right:{range:{min:undefined,max:undefined},format:function format(value){return\"\"+parseFloat(value.toPrecision(3))},title:{text:undefined,style:undefined}}};this.linegraphOptions=linegraphOptions;this.linegraphSVG=svg;this.props={};this.DOMelements={lines:{},labels:{},title:{}};this.dom={};this.scale=undefined;this.range={start:0,end:0};this.options=util.extend({},this.defaultOptions);this.conversionFactor=1;this.setOptions(options);this.width=Number((\"\"+this.options.width).replace(\"px\",\"\"));this.minWidth=this.width;this.height=this.linegraphSVG.getBoundingClientRect().height;this.hidden=false;this.stepPixels=25;this.zeroCrossing=-1;this.amountOfSteps=-1;this.lineOffset=0;this.master=true;this.masterAxis=null;this.svgElements={};this.iconsRemoved=false;this.groups={};this.amountOfGroups=0;this._create();this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups};var me=this;this.body.emitter.on(\"verticalDrag\",function(){me.dom.lineContainer.style.top=me.body.domProps.scrollTop+\"px\"})}DataAxis.prototype=new Component;DataAxis.prototype.addGroup=function(label,graphOptions){if(!this.groups.hasOwnProperty(label)){this.groups[label]=graphOptions}this.amountOfGroups+=1};DataAxis.prototype.updateGroup=function(label,graphOptions){if(!this.groups.hasOwnProperty(label)){this.amountOfGroups+=1}this.groups[label]=graphOptions};DataAxis.prototype.removeGroup=function(label){if(this.groups.hasOwnProperty(label)){delete this.groups[label];this.amountOfGroups-=1}};DataAxis.prototype.setOptions=function(options){if(options){var redraw=false;if(this.options.orientation!=options.orientation&&options.orientation!==undefined){redraw=true}var fields=[\"orientation\",\"showMinorLabels\",\"showMajorLabels\",\"icons\",\"majorLinesOffset\",\"minorLinesOffset\",\"labelOffsetX\",\"labelOffsetY\",\"iconWidth\",\"width\",\"visible\",\"left\",\"right\",\"alignZeros\"];util.selectiveDeepExtend(fields,this.options,options);this.minWidth=Number((\"\"+this.options.width).replace(\"px\",\"\"));if(redraw===true&&this.dom.frame){this.hide();this.show()}}};DataAxis.prototype._create=function(){this.dom.frame=document.createElement(\"div\");this.dom.frame.style.width=this.options.width;this.dom.frame.style.height=this.height;this.dom.lineContainer=document.createElement(\"div\");this.dom.lineContainer.style.width=\"100%\";this.dom.lineContainer.style.height=this.height;this.dom.lineContainer.style.position=\"relative\";this.svg=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");this.svg.style.position=\"absolute\";this.svg.style.top=\"0px\";this.svg.style.height=\"100%\";this.svg.style.width=\"100%\";this.svg.style.display=\"block\";this.dom.frame.appendChild(this.svg)};DataAxis.prototype._redrawGroupIcons=function(){DOMutil.prepareElements(this.svgElements);var x;var iconWidth=this.options.iconWidth;var iconHeight=15;var iconOffset=4;var y=iconOffset+.5*iconHeight;if(this.options.orientation===\"left\"){x=iconOffset}else{x=this.width-iconWidth-iconOffset}var groupArray=(0,_keys2[\"default\"])(this.groups);groupArray.sort(function(a,b){return a<b?-1:1});for(var i=0;i<groupArray.length;i++){var groupId=groupArray[i];if(this.groups[groupId].visible===true&&(this.linegraphOptions.visibility[groupId]===undefined||this.linegraphOptions.visibility[groupId]===true)){this.groups[groupId].getLegend(iconWidth,iconHeight,this.framework,x,y);y+=iconHeight+iconOffset}}DOMutil.cleanupElements(this.svgElements);this.iconsRemoved=false};DataAxis.prototype._cleanupIcons=function(){if(this.iconsRemoved===false){DOMutil.prepareElements(this.svgElements);DOMutil.cleanupElements(this.svgElements);this.iconsRemoved=true}};DataAxis.prototype.show=function(){this.hidden=false;if(!this.dom.frame.parentNode){if(this.options.orientation===\"left\"){this.body.dom.left.appendChild(this.dom.frame)}else{this.body.dom.right.appendChild(this.dom.frame)}}if(!this.dom.lineContainer.parentNode){this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer)}};DataAxis.prototype.hide=function(){this.hidden=true;if(this.dom.frame.parentNode){this.dom.frame.parentNode.removeChild(this.dom.frame)}if(this.dom.lineContainer.parentNode){this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer)}};DataAxis.prototype.setRange=function(start,end){this.range.start=start;this.range.end=end};DataAxis.prototype.redraw=function(){var resized=false;var activeGroups=0;this.dom.lineContainer.style.top=this.body.domProps.scrollTop+\"px\";for(var groupId in this.groups){if(this.groups.hasOwnProperty(groupId)){if(this.groups[groupId].visible===true&&(this.linegraphOptions.visibility[groupId]===undefined||this.linegraphOptions.visibility[groupId]===true)){activeGroups++}}}if(this.amountOfGroups===0||activeGroups===0){this.hide()}else{this.show();this.height=Number(this.linegraphSVG.style.height.replace(\"px\",\"\"));this.dom.lineContainer.style.height=this.height+\"px\";this.width=this.options.visible===true?Number((\"\"+this.options.width).replace(\"px\",\"\")):0;var props=this.props;var frame=this.dom.frame;frame.className=\"vis-data-axis\";this._calculateCharSize();var orientation=this.options.orientation;var showMinorLabels=this.options.showMinorLabels;var showMajorLabels=this.options.showMajorLabels;props.minorLabelHeight=showMinorLabels?props.minorCharHeight:0;props.majorLabelHeight=showMajorLabels?props.majorCharHeight:0;props.minorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.minorLinesOffset;props.minorLineHeight=1;props.majorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.majorLinesOffset;props.majorLineHeight=1;if(orientation===\"left\"){frame.style.top=\"0\";frame.style.left=\"0\";frame.style.bottom=\"\";frame.style.width=this.width+\"px\";frame.style.height=this.height+\"px\";this.props.width=this.body.domProps.left.width;this.props.height=this.body.domProps.left.height}else{frame.style.top=\"\";frame.style.bottom=\"0\";frame.style.left=\"0\";frame.style.width=this.width+\"px\";frame.style.height=this.height+\"px\";this.props.width=this.body.domProps.right.width;this.props.height=this.body.domProps.right.height}resized=this._redrawLabels();resized=this._isResized()||resized;if(this.options.icons===true){this._redrawGroupIcons()}else{this._cleanupIcons()}this._redrawTitle(orientation)}return resized};DataAxis.prototype._redrawLabels=function(){var _this=this;var resized=false;DOMutil.prepareElements(this.DOMelements.lines);DOMutil.prepareElements(this.DOMelements.labels);var orientation=this.options[\"orientation\"];var customRange=this.options[orientation].range!=undefined?this.options[orientation].range:{};var autoScaleEnd=true;if(customRange.max!=undefined){this.range.end=customRange.max;autoScaleEnd=false}var autoScaleStart=true;if(customRange.min!=undefined){this.range.start=customRange.min;autoScaleStart=false}this.scale=new DataScale(this.range.start,this.range.end,autoScaleStart,autoScaleEnd,this.dom.frame.offsetHeight,this.props.majorCharHeight,this.options.alignZeros,this.options[orientation].format);if(this.master===false&&this.masterAxis!=undefined){this.scale.followScale(this.masterAxis.scale)}this.maxLabelSize=0;var lines=this.scale.getLines();lines.forEach(function(line){var y=line.y;var isMajor=line.major;if(_this.options[\"showMinorLabels\"]&&isMajor===false){_this._redrawLabel(y-2,line.val,orientation,\"vis-y-axis vis-minor\",_this.props.minorCharHeight)}if(isMajor){if(y>=0){_this._redrawLabel(y-2,line.val,orientation,\"vis-y-axis vis-major\",_this.props.majorCharHeight)}}if(_this.master===true){if(isMajor){_this._redrawLine(y,orientation,\"vis-grid vis-horizontal vis-major\",_this.options.majorLinesOffset,_this.props.majorLineWidth)}else{_this._redrawLine(y,orientation,\"vis-grid vis-horizontal vis-minor\",_this.options.minorLinesOffset,_this.props.minorLineWidth)}}});var titleWidth=0;if(this.options[orientation].title!==undefined&&this.options[orientation].title.text!==undefined){titleWidth=this.props.titleCharHeight}var offset=this.options.icons===true?Math.max(this.options.iconWidth,titleWidth)+this.options.labelOffsetX+15:titleWidth+this.options.labelOffsetX+15;if(this.maxLabelSize>this.width-offset&&this.options.visible===true){this.width=this.maxLabelSize+offset;this.options.width=this.width+\"px\";DOMutil.cleanupElements(this.DOMelements.lines);DOMutil.cleanupElements(this.DOMelements.labels);this.redraw();resized=true}else if(this.maxLabelSize<this.width-offset&&this.options.visible===true&&this.width>this.minWidth){this.width=Math.max(this.minWidth,this.maxLabelSize+offset);this.options.width=this.width+\"px\";DOMutil.cleanupElements(this.DOMelements.lines);DOMutil.cleanupElements(this.DOMelements.labels);this.redraw();resized=true}else{DOMutil.cleanupElements(this.DOMelements.lines);DOMutil.cleanupElements(this.DOMelements.labels);resized=false}return resized};DataAxis.prototype.convertValue=function(value){return this.scale.convertValue(value)};DataAxis.prototype.screenToValue=function(x){return this.scale.screenToValue(x)};DataAxis.prototype._redrawLabel=function(y,text,orientation,className,characterHeight){var label=DOMutil.getDOMElement(\"div\",this.DOMelements.labels,this.dom.frame);label.className=className;label.innerHTML=text;if(orientation===\"left\"){label.style.left=\"-\"+this.options.labelOffsetX+\"px\";label.style.textAlign=\"right\"}else{label.style.right=\"-\"+this.options.labelOffsetX+\"px\";label.style.textAlign=\"left\"}label.style.top=y-.5*characterHeight+this.options.labelOffsetY+\"px\";text+=\"\";var largestWidth=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);if(this.maxLabelSize<text.length*largestWidth){this.maxLabelSize=text.length*largestWidth}};DataAxis.prototype._redrawLine=function(y,orientation,className,offset,width){if(this.master===true){\nvar line=DOMutil.getDOMElement(\"div\",this.DOMelements.lines,this.dom.lineContainer);line.className=className;line.innerHTML=\"\";if(orientation===\"left\"){line.style.left=this.width-offset+\"px\"}else{line.style.right=this.width-offset+\"px\"}line.style.width=width+\"px\";line.style.top=y+\"px\"}};DataAxis.prototype._redrawTitle=function(orientation){DOMutil.prepareElements(this.DOMelements.title);if(this.options[orientation].title!==undefined&&this.options[orientation].title.text!==undefined){var title=DOMutil.getDOMElement(\"div\",this.DOMelements.title,this.dom.frame);title.className=\"vis-y-axis vis-title vis-\"+orientation;title.innerHTML=this.options[orientation].title.text;if(this.options[orientation].title.style!==undefined){util.addCssText(title,this.options[orientation].title.style)}if(orientation===\"left\"){title.style.left=this.props.titleCharHeight+\"px\"}else{title.style.right=this.props.titleCharHeight+\"px\"}title.style.width=this.height+\"px\"}DOMutil.cleanupElements(this.DOMelements.title)};DataAxis.prototype._calculateCharSize=function(){if(!(\"minorCharHeight\"in this.props)){var textMinor=document.createTextNode(\"0\");var measureCharMinor=document.createElement(\"div\");measureCharMinor.className=\"vis-y-axis vis-minor vis-measure\";measureCharMinor.appendChild(textMinor);this.dom.frame.appendChild(measureCharMinor);this.props.minorCharHeight=measureCharMinor.clientHeight;this.props.minorCharWidth=measureCharMinor.clientWidth;this.dom.frame.removeChild(measureCharMinor)}if(!(\"majorCharHeight\"in this.props)){var textMajor=document.createTextNode(\"0\");var measureCharMajor=document.createElement(\"div\");measureCharMajor.className=\"vis-y-axis vis-major vis-measure\";measureCharMajor.appendChild(textMajor);this.dom.frame.appendChild(measureCharMajor);this.props.majorCharHeight=measureCharMajor.clientHeight;this.props.majorCharWidth=measureCharMajor.clientWidth;this.dom.frame.removeChild(measureCharMajor)}if(!(\"titleCharHeight\"in this.props)){var textTitle=document.createTextNode(\"0\");var measureCharTitle=document.createElement(\"div\");measureCharTitle.className=\"vis-y-axis vis-title vis-measure\";measureCharTitle.appendChild(textTitle);this.dom.frame.appendChild(measureCharTitle);this.props.titleCharHeight=measureCharTitle.clientHeight;this.props.titleCharWidth=measureCharTitle.clientWidth;this.dom.frame.removeChild(measureCharTitle)}};module.exports=DataAxis},function(module,exports,__webpack_require__){\"use strict\";function DataScale(start,end,autoScaleStart,autoScaleEnd,containerHeight,majorCharHeight){var zeroAlign=arguments.length>6&&arguments[6]!==undefined?arguments[6]:false;var formattingFunction=arguments.length>7&&arguments[7]!==undefined?arguments[7]:false;this.majorSteps=[1,2,5,10];this.minorSteps=[.25,.5,1,2];this.customLines=null;this.containerHeight=containerHeight;this.majorCharHeight=majorCharHeight;this._start=start;this._end=end;this.scale=1;this.minorStepIdx=-1;this.magnitudefactor=1;this.determineScale();this.zeroAlign=zeroAlign;this.autoScaleStart=autoScaleStart;this.autoScaleEnd=autoScaleEnd;this.formattingFunction=formattingFunction;if(autoScaleStart||autoScaleEnd){var me=this;var roundToMinor=function roundToMinor(value){var rounded=value-value%(me.magnitudefactor*me.minorSteps[me.minorStepIdx]);if(value%(me.magnitudefactor*me.minorSteps[me.minorStepIdx])>.5*(me.magnitudefactor*me.minorSteps[me.minorStepIdx])){return rounded+me.magnitudefactor*me.minorSteps[me.minorStepIdx]}else{return rounded}};if(autoScaleStart){this._start-=this.magnitudefactor*2*this.minorSteps[this.minorStepIdx];this._start=roundToMinor(this._start)}if(autoScaleEnd){this._end+=this.magnitudefactor*this.minorSteps[this.minorStepIdx];this._end=roundToMinor(this._end)}this.determineScale()}}DataScale.prototype.setCharHeight=function(majorCharHeight){this.majorCharHeight=majorCharHeight};DataScale.prototype.setHeight=function(containerHeight){this.containerHeight=containerHeight};DataScale.prototype.determineScale=function(){var range=this._end-this._start;this.scale=this.containerHeight/range;var minimumStepValue=this.majorCharHeight/this.scale;var orderOfMagnitude=range>0?Math.round(Math.log(range)/Math.LN10):0;this.minorStepIdx=-1;this.magnitudefactor=Math.pow(10,orderOfMagnitude);var start=0;if(orderOfMagnitude<0){start=orderOfMagnitude}var solutionFound=false;for(var l=start;Math.abs(l)<=Math.abs(orderOfMagnitude);l++){this.magnitudefactor=Math.pow(10,l);for(var j=0;j<this.minorSteps.length;j++){var stepSize=this.magnitudefactor*this.minorSteps[j];if(stepSize>=minimumStepValue){solutionFound=true;this.minorStepIdx=j;break}}if(solutionFound===true){break}}};DataScale.prototype.is_major=function(value){return value%(this.magnitudefactor*this.majorSteps[this.minorStepIdx])===0};DataScale.prototype.getStep=function(){return this.magnitudefactor*this.minorSteps[this.minorStepIdx]};DataScale.prototype.getFirstMajor=function(){var majorStep=this.magnitudefactor*this.majorSteps[this.minorStepIdx];return this.convertValue(this._start+(majorStep-this._start%majorStep)%majorStep)};DataScale.prototype.formatValue=function(current){var returnValue=current.toPrecision(5);if(typeof this.formattingFunction===\"function\"){returnValue=this.formattingFunction(current)}if(typeof returnValue===\"number\"){return\"\"+returnValue}else if(typeof returnValue===\"string\"){return returnValue}else{return current.toPrecision(5)}};DataScale.prototype.getLines=function(){var lines=[];var step=this.getStep();var bottomOffset=(step-this._start%step)%step;for(var i=this._start+bottomOffset;this._end-i>1e-5;i+=step){if(i!=this._start){lines.push({major:this.is_major(i),y:this.convertValue(i),val:this.formatValue(i)})}}return lines};DataScale.prototype.followScale=function(other){var oldStepIdx=this.minorStepIdx;var oldStart=this._start;var oldEnd=this._end;var me=this;var increaseMagnitude=function increaseMagnitude(){me.magnitudefactor*=2};var decreaseMagnitude=function decreaseMagnitude(){me.magnitudefactor/=2};if(other.minorStepIdx<=1&&this.minorStepIdx<=1||other.minorStepIdx>1&&this.minorStepIdx>1){}else if(other.minorStepIdx<this.minorStepIdx){this.minorStepIdx=1;if(oldStepIdx==2){increaseMagnitude()}else{increaseMagnitude();increaseMagnitude()}}else{this.minorStepIdx=2;if(oldStepIdx==1){decreaseMagnitude()}else{decreaseMagnitude();decreaseMagnitude()}}var otherZero=other.convertValue(0);var otherStep=other.getStep()*other.scale;var done=false;var count=0;while(!done&&count++<5){this.scale=otherStep/(this.minorSteps[this.minorStepIdx]*this.magnitudefactor);var newRange=this.containerHeight/this.scale;this._start=oldStart;this._end=this._start+newRange;var myOriginalZero=this._end*this.scale;var majorStep=this.magnitudefactor*this.majorSteps[this.minorStepIdx];var majorOffset=this.getFirstMajor()-other.getFirstMajor();if(this.zeroAlign){var zeroOffset=otherZero-myOriginalZero;this._end+=zeroOffset/this.scale;this._start=this._end-newRange}else{if(!this.autoScaleStart){this._start+=majorStep-majorOffset/this.scale;this._end=this._start+newRange}else{this._start-=majorOffset/this.scale;this._end=this._start+newRange}}if(!this.autoScaleEnd&&this._end>oldEnd+1e-5){decreaseMagnitude();done=false;continue}if(!this.autoScaleStart&&this._start<oldStart-1e-5){if(this.zeroAlign&&oldStart>=0){console.warn(\"Can't adhere to given 'min' range, due to zeroalign\")}else{decreaseMagnitude();done=false;continue}}if(this.autoScaleStart&&this.autoScaleEnd&&newRange<oldEnd-oldStart){increaseMagnitude();done=false;continue}done=true}};DataScale.prototype.convertValue=function(value){return this.containerHeight-(value-this._start)*this.scale};DataScale.prototype.screenToValue=function(pixels){return(this.containerHeight-pixels)/this.scale+this._start};module.exports=DataScale},function(module,exports,__webpack_require__){\"use strict\";var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var Bars=__webpack_require__(110);var Lines=__webpack_require__(111);var Points=__webpack_require__(72);function GraphGroup(group,groupId,options,groupsUsingDefaultStyles){this.id=groupId;var fields=[\"sampling\",\"style\",\"sort\",\"yAxisOrientation\",\"barChart\",\"drawPoints\",\"shaded\",\"interpolation\",\"zIndex\",\"excludeFromStacking\",\"excludeFromLegend\"];this.options=util.selectiveBridgeObject(fields,options);this.usingDefaultStyle=group.className===undefined;this.groupsUsingDefaultStyles=groupsUsingDefaultStyles;this.zeroPosition=0;this.update(group);if(this.usingDefaultStyle==true){this.groupsUsingDefaultStyles[0]+=1}this.itemsData=[];this.visible=group.visible===undefined?true:group.visible}GraphGroup.prototype.setItems=function(items){if(items!=null){this.itemsData=items;if(this.options.sort==true){util.insertSort(this.itemsData,function(a,b){return a.x>b.x?1:-1})}}else{this.itemsData=[]}};GraphGroup.prototype.getItems=function(){return this.itemsData};GraphGroup.prototype.setZeroPosition=function(pos){this.zeroPosition=pos};GraphGroup.prototype.setOptions=function(options){if(options!==undefined){var fields=[\"sampling\",\"style\",\"sort\",\"yAxisOrientation\",\"barChart\",\"zIndex\",\"excludeFromStacking\",\"excludeFromLegend\"];util.selectiveDeepExtend(fields,this.options,options);if(typeof options.drawPoints==\"function\"){options.drawPoints={onRender:options.drawPoints}}util.mergeOptions(this.options,options,\"interpolation\");util.mergeOptions(this.options,options,\"drawPoints\");util.mergeOptions(this.options,options,\"shaded\");if(options.interpolation){if((0,_typeof3[\"default\"])(options.interpolation)==\"object\"){if(options.interpolation.parametrization){if(options.interpolation.parametrization==\"uniform\"){this.options.interpolation.alpha=0}else if(options.interpolation.parametrization==\"chordal\"){this.options.interpolation.alpha=1}else{this.options.interpolation.parametrization=\"centripetal\";this.options.interpolation.alpha=.5}}}}}};GraphGroup.prototype.update=function(group){this.group=group;this.content=group.content||\"graph\";this.className=group.className||this.className||\"vis-graph-group\"+this.groupsUsingDefaultStyles[0]%10;this.visible=group.visible===undefined?true:group.visible;this.style=group.style;this.setOptions(group.options)};GraphGroup.prototype.getLegend=function(iconWidth,iconHeight,framework,x,y){if(framework==undefined||framework==null){var svg=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");framework={svg:svg,svgElements:{},options:this.options,groups:[this]}}if(x==undefined||x==null){x=0}if(y==undefined||y==null){y=.5*iconHeight}switch(this.options.style){case\"line\":Lines.drawIcon(this,x,y,iconWidth,iconHeight,framework);break;case\"points\":case\"point\":Points.drawIcon(this,x,y,iconWidth,iconHeight,framework);break;case\"bar\":Bars.drawIcon(this,x,y,iconWidth,iconHeight,framework);break}return{icon:framework.svg,label:this.content,orientation:this.options.yAxisOrientation}};GraphGroup.prototype.getYRange=function(groupData){var yMin=groupData[0].y;var yMax=groupData[0].y;for(var j=0;j<groupData.length;j++){yMin=yMin>groupData[j].y?groupData[j].y:yMin;yMax=yMax<groupData[j].y?groupData[j].y:yMax}return{min:yMin,max:yMax,yAxisOrientation:this.options.yAxisOrientation}};module.exports=GraphGroup},function(module,exports,__webpack_require__){\"use strict\";var DOMutil=__webpack_require__(14);var Points=__webpack_require__(72);function Bargraph(groupId,options){}Bargraph.drawIcon=function(group,x,y,iconWidth,iconHeight,framework){var fillHeight=iconHeight*.5;var outline=DOMutil.getSVGElement(\"rect\",framework.svgElements,framework.svg);outline.setAttributeNS(null,\"x\",x);outline.setAttributeNS(null,\"y\",y-fillHeight);outline.setAttributeNS(null,\"width\",iconWidth);outline.setAttributeNS(null,\"height\",2*fillHeight);outline.setAttributeNS(null,\"class\",\"vis-outline\");var barWidth=Math.round(.3*iconWidth);var originalWidth=group.options.barChart.width;var scale=originalWidth/barWidth;var bar1Height=Math.round(.4*iconHeight);var bar2Height=Math.round(.75*iconHeight);var offset=Math.round((iconWidth-2*barWidth)/3);DOMutil.drawBar(x+.5*barWidth+offset,y+fillHeight-bar1Height-1,barWidth,bar1Height,group.className+\" vis-bar\",framework.svgElements,framework.svg,group.style);DOMutil.drawBar(x+1.5*barWidth+offset+2,y+fillHeight-bar2Height-1,barWidth,bar2Height,group.className+\" vis-bar\",framework.svgElements,framework.svg,group.style);if(group.options.drawPoints.enabled==true){var groupTemplate={style:group.options.drawPoints.style,styles:group.options.drawPoints.styles,size:group.options.drawPoints.size/scale,className:group.className};DOMutil.drawPoint(x+.5*barWidth+offset,y+fillHeight-bar1Height-1,groupTemplate,framework.svgElements,framework.svg);DOMutil.drawPoint(x+1.5*barWidth+offset+2,y+fillHeight-bar2Height-1,groupTemplate,framework.svgElements,framework.svg)}};Bargraph.draw=function(groupIds,processedGroupData,framework){var combinedData=[];var intersections={};var coreDistance;var key,drawData;var group;var i,j;var barPoints=0;for(i=0;i<groupIds.length;i++){group=framework.groups[groupIds[i]];if(group.options.style===\"bar\"){if(group.visible===true&&(framework.options.groups.visibility[groupIds[i]]===undefined||framework.options.groups.visibility[groupIds[i]]===true)){for(j=0;j<processedGroupData[groupIds[i]].length;j++){combinedData.push({screen_x:processedGroupData[groupIds[i]][j].screen_x,screen_end:processedGroupData[groupIds[i]][j].screen_end,screen_y:processedGroupData[groupIds[i]][j].screen_y,x:processedGroupData[groupIds[i]][j].x,end:processedGroupData[groupIds[i]][j].end,y:processedGroupData[groupIds[i]][j].y,groupId:groupIds[i],label:processedGroupData[groupIds[i]][j].label});barPoints+=1}}}}if(barPoints===0){return}combinedData.sort(function(a,b){if(a.screen_x===b.screen_x){return a.groupId<b.groupId?-1:1}else{return a.screen_x-b.screen_x}});Bargraph._getDataIntersections(intersections,combinedData);for(i=0;i<combinedData.length;i++){group=framework.groups[combinedData[i].groupId];var minWidth=group.options.barChart.minWidth!=undefined?group.options.barChart.minWidth:.1*group.options.barChart.width;key=combinedData[i].screen_x;var heightOffset=0;if(intersections[key]===undefined){if(i+1<combinedData.length){coreDistance=Math.abs(combinedData[i+1].screen_x-key)}drawData=Bargraph._getSafeDrawData(coreDistance,group,minWidth)}else{var nextKey=i+(intersections[key].amount-intersections[key].resolved);if(nextKey<combinedData.length){coreDistance=Math.abs(combinedData[nextKey].screen_x-key)}drawData=Bargraph._getSafeDrawData(coreDistance,group,minWidth);intersections[key].resolved+=1;if(group.options.stack===true&&group.options.excludeFromStacking!==true){if(combinedData[i].screen_y<group.zeroPosition){heightOffset=intersections[key].accumulatedNegative;intersections[key].accumulatedNegative+=group.zeroPosition-combinedData[i].screen_y}else{heightOffset=intersections[key].accumulatedPositive;intersections[key].accumulatedPositive+=group.zeroPosition-combinedData[i].screen_y}}else if(group.options.barChart.sideBySide===true){drawData.width=drawData.width/intersections[key].amount;drawData.offset+=intersections[key].resolved*drawData.width-.5*drawData.width*(intersections[key].amount+1)}}var dataWidth=drawData.width;var start=combinedData[i].screen_x;if(combinedData[i].screen_end!=undefined){dataWidth=combinedData[i].screen_end-combinedData[i].screen_x;start+=dataWidth*.5}else{start+=drawData.offset}DOMutil.drawBar(start,combinedData[i].screen_y-heightOffset,dataWidth,group.zeroPosition-combinedData[i].screen_y,group.className+\" vis-bar\",framework.svgElements,framework.svg,group.style);if(group.options.drawPoints.enabled===true){var pointData={screen_x:combinedData[i].screen_x,screen_y:combinedData[i].screen_y-heightOffset,x:combinedData[i].x,y:combinedData[i].y,groupId:combinedData[i].groupId,label:combinedData[i].label};Points.draw([pointData],group,framework,drawData.offset)}}};Bargraph._getDataIntersections=function(intersections,combinedData){var coreDistance;for(var i=0;i<combinedData.length;i++){if(i+1<combinedData.length){coreDistance=Math.abs(combinedData[i+1].screen_x-combinedData[i].screen_x)}if(i>0){coreDistance=Math.min(coreDistance,Math.abs(combinedData[i-1].screen_x-combinedData[i].screen_x))}if(coreDistance===0){if(intersections[combinedData[i].screen_x]===undefined){intersections[combinedData[i].screen_x]={amount:0,resolved:0,accumulatedPositive:0,accumulatedNegative:0}}intersections[combinedData[i].screen_x].amount+=1}}};Bargraph._getSafeDrawData=function(coreDistance,group,minWidth){var width,offset;if(coreDistance<group.options.barChart.width&&coreDistance>0){width=coreDistance<minWidth?minWidth:coreDistance;offset=0;if(group.options.barChart.align===\"left\"){offset-=.5*coreDistance}else if(group.options.barChart.align===\"right\"){offset+=.5*coreDistance}}else{width=group.options.barChart.width;offset=0;if(group.options.barChart.align===\"left\"){offset-=.5*group.options.barChart.width}else if(group.options.barChart.align===\"right\"){offset+=.5*group.options.barChart.width}}return{width:width,offset:offset}};Bargraph.getStackedYRange=function(combinedData,groupRanges,groupIds,groupLabel,orientation){if(combinedData.length>0){combinedData.sort(function(a,b){if(a.screen_x===b.screen_x){return a.groupId<b.groupId?-1:1}else{return a.screen_x-b.screen_x}});var intersections={};Bargraph._getDataIntersections(intersections,combinedData);groupRanges[groupLabel]=Bargraph._getStackedYRange(intersections,combinedData);groupRanges[groupLabel].yAxisOrientation=orientation;groupIds.push(groupLabel)}};Bargraph._getStackedYRange=function(intersections,combinedData){var key;var yMin=combinedData[0].screen_y;var yMax=combinedData[0].screen_y;for(var i=0;i<combinedData.length;i++){key=combinedData[i].screen_x;if(intersections[key]===undefined){yMin=yMin>combinedData[i].screen_y?combinedData[i].screen_y:yMin;yMax=yMax<combinedData[i].screen_y?combinedData[i].screen_y:yMax}else{if(combinedData[i].screen_y<0){intersections[key].accumulatedNegative+=combinedData[i].screen_y}else{intersections[key].accumulatedPositive+=combinedData[i].screen_y}}}for(var xpos in intersections){if(intersections.hasOwnProperty(xpos)){yMin=yMin>intersections[xpos].accumulatedNegative?intersections[xpos].accumulatedNegative:yMin;yMin=yMin>intersections[xpos].accumulatedPositive?intersections[xpos].accumulatedPositive:yMin;yMax=yMax<intersections[xpos].accumulatedNegative?intersections[xpos].accumulatedNegative:yMax;yMax=yMax<intersections[xpos].accumulatedPositive?intersections[xpos].accumulatedPositive:yMax}}return{min:yMin,max:yMax}};module.exports=Bargraph},function(module,exports,__webpack_require__){\"use strict\";var DOMutil=__webpack_require__(14);function Line(groupId,options){}Line.calcPath=function(dataset,group){if(dataset!=null){if(dataset.length>0){var d=[];if(group.options.interpolation.enabled==true){d=Line._catmullRom(dataset,group)}else{d=Line._linear(dataset)}return d}}};Line.drawIcon=function(group,x,y,iconWidth,iconHeight,framework){var fillHeight=iconHeight*.5;var path,fillPath;var outline=DOMutil.getSVGElement(\"rect\",framework.svgElements,framework.svg);outline.setAttributeNS(null,\"x\",x);outline.setAttributeNS(null,\"y\",y-fillHeight);outline.setAttributeNS(null,\"width\",iconWidth);outline.setAttributeNS(null,\"height\",2*fillHeight);outline.setAttributeNS(null,\"class\",\"vis-outline\");path=DOMutil.getSVGElement(\"path\",framework.svgElements,framework.svg);path.setAttributeNS(null,\"class\",group.className);if(group.style!==undefined){path.setAttributeNS(null,\"style\",group.style)}path.setAttributeNS(null,\"d\",\"M\"+x+\",\"+y+\" L\"+(x+iconWidth)+\",\"+y+\"\");if(group.options.shaded.enabled==true){fillPath=DOMutil.getSVGElement(\"path\",framework.svgElements,framework.svg);if(group.options.shaded.orientation==\"top\"){fillPath.setAttributeNS(null,\"d\",\"M\"+x+\", \"+(y-fillHeight)+\"L\"+x+\",\"+y+\" L\"+(x+iconWidth)+\",\"+y+\" L\"+(x+iconWidth)+\",\"+(y-fillHeight))}else{fillPath.setAttributeNS(null,\"d\",\"M\"+x+\",\"+y+\" \"+\"L\"+x+\",\"+(y+fillHeight)+\" \"+\"L\"+(x+iconWidth)+\",\"+(y+fillHeight)+\"L\"+(x+iconWidth)+\",\"+y)}fillPath.setAttributeNS(null,\"class\",group.className+\" vis-icon-fill\");if(group.options.shaded.style!==undefined&&group.options.shaded.style!==\"\"){fillPath.setAttributeNS(null,\"style\",group.options.shaded.style)}}if(group.options.drawPoints.enabled==true){var groupTemplate={style:group.options.drawPoints.style,styles:group.options.drawPoints.styles,size:group.options.drawPoints.size,className:group.className};DOMutil.drawPoint(x+.5*iconWidth,y,groupTemplate,framework.svgElements,framework.svg)}};Line.drawShading=function(pathArray,group,subPathArray,framework){if(group.options.shaded.enabled==true){var svgHeight=Number(framework.svg.style.height.replace(\"px\",\"\"));var fillPath=DOMutil.getSVGElement(\"path\",framework.svgElements,framework.svg);var type=\"L\";if(group.options.interpolation.enabled==true){type=\"C\"}var dFill;var zero=0;if(group.options.shaded.orientation==\"top\"){zero=0}else if(group.options.shaded.orientation==\"bottom\"){zero=svgHeight}else{zero=Math.min(Math.max(0,group.zeroPosition),svgHeight)}if(group.options.shaded.orientation==\"group\"&&subPathArray!=null&&subPathArray!=undefined){dFill=\"M\"+pathArray[0][0]+\",\"+pathArray[0][1]+\" \"+this.serializePath(pathArray,type,false)+\" L\"+subPathArray[subPathArray.length-1][0]+\",\"+subPathArray[subPathArray.length-1][1]+\" \"+this.serializePath(subPathArray,type,true)+subPathArray[0][0]+\",\"+subPathArray[0][1]+\" Z\"}else{dFill=\"M\"+pathArray[0][0]+\",\"+pathArray[0][1]+\" \"+this.serializePath(pathArray,type,false)+\" V\"+zero+\" H\"+pathArray[0][0]+\" Z\"}fillPath.setAttributeNS(null,\"class\",group.className+\" vis-fill\");if(group.options.shaded.style!==undefined){fillPath.setAttributeNS(null,\"style\",group.options.shaded.style)}fillPath.setAttributeNS(null,\"d\",dFill)}};Line.draw=function(pathArray,group,framework){if(pathArray!=null&&pathArray!=undefined){var path=DOMutil.getSVGElement(\"path\",framework.svgElements,framework.svg);path.setAttributeNS(null,\"class\",group.className);if(group.style!==undefined){path.setAttributeNS(null,\"style\",group.style)}var type=\"L\";if(group.options.interpolation.enabled==true){type=\"C\"}path.setAttributeNS(null,\"d\",\"M\"+pathArray[0][0]+\",\"+pathArray[0][1]+\" \"+this.serializePath(pathArray,type,false))}};Line.serializePath=function(pathArray,type,inverse){if(pathArray.length<2){return\"\"}var d=type;var i;if(inverse){for(i=pathArray.length-2;i>0;i--){d+=pathArray[i][0]+\",\"+pathArray[i][1]+\" \"}}else{for(i=1;i<pathArray.length;i++){d+=pathArray[i][0]+\",\"+pathArray[i][1]+\" \"}}return d};Line._catmullRomUniform=function(data){var p0,p1,p2,p3,bp1,bp2;var d=[];d.push([Math.round(data[0].screen_x),Math.round(data[0].screen_y)]);var normalization=1/6;var length=data.length;for(var i=0;i<length-1;i++){p0=i==0?data[0]:data[i-1];p1=data[i];p2=data[i+1];p3=i+2<length?data[i+2]:p2;bp1={screen_x:(-p0.screen_x+6*p1.screen_x+p2.screen_x)*normalization,screen_y:(-p0.screen_y+6*p1.screen_y+p2.screen_y)*normalization};bp2={screen_x:(p1.screen_x+6*p2.screen_x-p3.screen_x)*normalization,screen_y:(p1.screen_y+6*p2.screen_y-p3.screen_y)*normalization};d.push([bp1.screen_x,bp1.screen_y]);d.push([bp2.screen_x,bp2.screen_y]);d.push([p2.screen_x,p2.screen_y])}return d};Line._catmullRom=function(data,group){var alpha=group.options.interpolation.alpha;if(alpha==0||alpha===undefined){return this._catmullRomUniform(data)}else{var p0,p1,p2,p3,bp1,bp2,d1,d2,d3,A,B,N,M;var d3powA,d2powA,d3pow2A,d2pow2A,d1pow2A,d1powA;var d=[];d.push([Math.round(data[0].screen_x),Math.round(data[0].screen_y)]);var length=data.length;for(var i=0;i<length-1;i++){p0=i==0?data[0]:data[i-1];p1=data[i];p2=data[i+1];p3=i+2<length?data[i+2]:p2;d1=Math.sqrt(Math.pow(p0.screen_x-p1.screen_x,2)+Math.pow(p0.screen_y-p1.screen_y,2));d2=Math.sqrt(Math.pow(p1.screen_x-p2.screen_x,2)+Math.pow(p1.screen_y-p2.screen_y,2));d3=Math.sqrt(Math.pow(p2.screen_x-p3.screen_x,2)+Math.pow(p2.screen_y-p3.screen_y,2));d3powA=Math.pow(d3,alpha);d3pow2A=Math.pow(d3,2*alpha);d2powA=Math.pow(d2,alpha);d2pow2A=Math.pow(d2,2*alpha);d1powA=Math.pow(d1,alpha);d1pow2A=Math.pow(d1,2*alpha);A=2*d1pow2A+3*d1powA*d2powA+d2pow2A;B=2*d3pow2A+3*d3powA*d2powA+d2pow2A;N=3*d1powA*(d1powA+d2powA);if(N>0){N=1/N}M=3*d3powA*(d3powA+d2powA);if(M>0){M=1/M}bp1={screen_x:(-d2pow2A*p0.screen_x+A*p1.screen_x+d1pow2A*p2.screen_x)*N,screen_y:(-d2pow2A*p0.screen_y+A*p1.screen_y+d1pow2A*p2.screen_y)*N};bp2={screen_x:(d3pow2A*p1.screen_x+B*p2.screen_x-d2pow2A*p3.screen_x)*M,screen_y:(d3pow2A*p1.screen_y+B*p2.screen_y-d2pow2A*p3.screen_y)*M};if(bp1.screen_x==0&&bp1.screen_y==0){bp1=p1}if(bp2.screen_x==0&&bp2.screen_y==0){bp2=p2}d.push([bp1.screen_x,bp1.screen_y]);d.push([bp2.screen_x,bp2.screen_y]);d.push([p2.screen_x,p2.screen_y])}return d}};Line._linear=function(data){var d=[];for(var i=0;i<data.length;i++){d.push([data[i].screen_x,data[i].screen_y])}return d};module.exports=Line},function(module,exports,__webpack_require__){\"use strict\";var _keys=__webpack_require__(8);var _keys2=_interopRequireDefault(_keys);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var DOMutil=__webpack_require__(14);var Component=__webpack_require__(16);function Legend(body,options,side,linegraphOptions){this.body=body;this.defaultOptions={enabled:false,icons:true,iconSize:20,iconSpacing:6,left:{visible:true,position:\"top-left\"},right:{visible:true,position:\"top-right\"}};this.side=side;this.options=util.extend({},this.defaultOptions);this.linegraphOptions=linegraphOptions;this.svgElements={};this.dom={};this.groups={};this.amountOfGroups=0;this._create();this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups};this.setOptions(options)}Legend.prototype=new Component;Legend.prototype.clear=function(){this.groups={};this.amountOfGroups=0};Legend.prototype.addGroup=function(label,graphOptions){if(graphOptions.options.excludeFromLegend!=true){if(!this.groups.hasOwnProperty(label)){this.groups[label]=graphOptions}this.amountOfGroups+=1}};Legend.prototype.updateGroup=function(label,graphOptions){this.groups[label]=graphOptions};Legend.prototype.removeGroup=function(label){if(this.groups.hasOwnProperty(label)){delete this.groups[label];this.amountOfGroups-=1}};Legend.prototype._create=function(){this.dom.frame=document.createElement(\"div\");this.dom.frame.className=\"vis-legend\";this.dom.frame.style.position=\"absolute\";this.dom.frame.style.top=\"10px\";this.dom.frame.style.display=\"block\";this.dom.textArea=document.createElement(\"div\");this.dom.textArea.className=\"vis-legend-text\";this.dom.textArea.style.position=\"relative\";this.dom.textArea.style.top=\"0px\";this.svg=document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\");this.svg.style.position=\"absolute\";this.svg.style.top=0+\"px\";this.svg.style.width=this.options.iconSize+5+\"px\";this.svg.style.height=\"100%\";this.dom.frame.appendChild(this.svg);this.dom.frame.appendChild(this.dom.textArea)};Legend.prototype.hide=function(){if(this.dom.frame.parentNode){this.dom.frame.parentNode.removeChild(this.dom.frame)}};Legend.prototype.show=function(){if(!this.dom.frame.parentNode){this.body.dom.center.appendChild(this.dom.frame)}};Legend.prototype.setOptions=function(options){var fields=[\"enabled\",\"orientation\",\"icons\",\"left\",\"right\"];util.selectiveDeepExtend(fields,this.options,options)};Legend.prototype.redraw=function(){var activeGroups=0;var groupArray=(0,_keys2[\"default\"])(this.groups);groupArray.sort(function(a,b){return a<b?-1:1});for(var i=0;i<groupArray.length;i++){var groupId=groupArray[i];if(this.groups[groupId].visible==true&&(this.linegraphOptions.visibility[groupId]===undefined||this.linegraphOptions.visibility[groupId]==true)){activeGroups++}}if(this.options[this.side].visible==false||this.amountOfGroups==0||this.options.enabled==false||activeGroups==0){this.hide()}else{this.show();if(this.options[this.side].position==\"top-left\"||this.options[this.side].position==\"bottom-left\"){this.dom.frame.style.left=\"4px\";this.dom.frame.style.textAlign=\"left\";this.dom.textArea.style.textAlign=\"left\";this.dom.textArea.style.left=this.options.iconSize+15+\"px\";this.dom.textArea.style.right=\"\";this.svg.style.left=0+\"px\";this.svg.style.right=\"\"}else{this.dom.frame.style.right=\"4px\";this.dom.frame.style.textAlign=\"right\";this.dom.textArea.style.textAlign=\"right\";this.dom.textArea.style.right=this.options.iconSize+15+\"px\";this.dom.textArea.style.left=\"\";this.svg.style.right=0+\"px\";this.svg.style.left=\"\"}if(this.options[this.side].position==\"top-left\"||this.options[this.side].position==\"top-right\"){this.dom.frame.style.top=4-Number(this.body.dom.center.style.top.replace(\"px\",\"\"))+\"px\";this.dom.frame.style.bottom=\"\"}else{var scrollableHeight=this.body.domProps.center.height-this.body.domProps.centerContainer.height;this.dom.frame.style.bottom=4+scrollableHeight+Number(this.body.dom.center.style.top.replace(\"px\",\"\"))+\"px\";this.dom.frame.style.top=\"\"}if(this.options.icons==false){this.dom.frame.style.width=this.dom.textArea.offsetWidth+10+\"px\";this.dom.textArea.style.right=\"\";this.dom.textArea.style.left=\"\";this.svg.style.width=\"0px\"}else{this.dom.frame.style.width=this.options.iconSize+15+this.dom.textArea.offsetWidth+10+\"px\";this.drawLegendIcons()}var content=\"\";for(i=0;i<groupArray.length;i++){groupId=groupArray[i];if(this.groups[groupId].visible==true&&(this.linegraphOptions.visibility[groupId]===undefined||this.linegraphOptions.visibility[groupId]==true)){content+=this.groups[groupId].content+\"<br />\"}}this.dom.textArea.innerHTML=content;this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+\"px\"}};Legend.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){var groupArray=(0,_keys2[\"default\"])(this.groups);groupArray.sort(function(a,b){return a<b?-1:1});DOMutil.resetElements(this.svgElements);var padding=window.getComputedStyle(this.dom.frame).paddingTop;var iconOffset=Number(padding.replace(\"px\",\"\"));var x=iconOffset;var iconWidth=this.options.iconSize;var iconHeight=.75*this.options.iconSize;var y=iconOffset+.5*iconHeight+3;this.svg.style.width=iconWidth+5+iconOffset+\"px\";for(var i=0;i<groupArray.length;i++){var groupId=groupArray[i];if(this.groups[groupId].visible==true&&(this.linegraphOptions.visibility[groupId]===undefined||this.linegraphOptions.visibility[groupId]==true)){this.groups[groupId].getLegend(iconWidth,iconHeight,this.framework,x,y);y+=iconHeight+this.options.iconSpacing}}}};module.exports=Legend},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var string=\"string\";var bool=\"boolean\";var number=\"number\";var array=\"array\";var date=\"date\";var object=\"object\";var dom=\"dom\";var moment=\"moment\";var any=\"any\";var allOptions={configure:{enabled:{boolean:bool},filter:{boolean:bool,function:\"function\"},container:{dom:dom},__type__:{object:object,boolean:bool,function:\"function\"}},yAxisOrientation:{string:[\"left\",\"right\"]},defaultGroup:{string:string},sort:{boolean:bool},sampling:{boolean:bool},stack:{boolean:bool},graphHeight:{string:string,number:number},shaded:{enabled:{boolean:bool},orientation:{string:[\"bottom\",\"top\",\"zero\",\"group\"]},groupId:{object:object},__type__:{boolean:bool,object:object}},style:{string:[\"line\",\"bar\",\"points\"]},barChart:{width:{number:number},minWidth:{number:number},sideBySide:{boolean:bool},align:{string:[\"left\",\"center\",\"right\"]},__type__:{object:object}},interpolation:{enabled:{boolean:bool},parametrization:{string:[\"centripetal\",\"chordal\",\"uniform\"]},alpha:{number:number},__type__:{object:object,boolean:bool}},drawPoints:{enabled:{boolean:bool},onRender:{function:\"function\"},size:{number:number},style:{string:[\"square\",\"circle\"]},__type__:{object:object,boolean:bool,function:\"function\"}},dataAxis:{showMinorLabels:{boolean:bool},showMajorLabels:{boolean:bool},icons:{boolean:bool},width:{string:string,number:number},visible:{boolean:bool},alignZeros:{boolean:bool},left:{range:{min:{\nnumber:number,undefined:\"undefined\"},max:{number:number,undefined:\"undefined\"},__type__:{object:object}},format:{function:\"function\"},title:{text:{string:string,number:number,undefined:\"undefined\"},style:{string:string,undefined:\"undefined\"},__type__:{object:object}},__type__:{object:object}},right:{range:{min:{number:number,undefined:\"undefined\"},max:{number:number,undefined:\"undefined\"},__type__:{object:object}},format:{function:\"function\"},title:{text:{string:string,number:number,undefined:\"undefined\"},style:{string:string,undefined:\"undefined\"},__type__:{object:object}},__type__:{object:object}},__type__:{object:object}},legend:{enabled:{boolean:bool},icons:{boolean:bool},left:{visible:{boolean:bool},position:{string:[\"top-right\",\"bottom-right\",\"top-left\",\"bottom-left\"]},__type__:{object:object}},right:{visible:{boolean:bool},position:{string:[\"top-right\",\"bottom-right\",\"top-left\",\"bottom-left\"]},__type__:{object:object}},__type__:{object:object,boolean:bool}},groups:{visibility:{any:any},__type__:{object:object}},autoResize:{boolean:bool},throttleRedraw:{number:number},clickToUse:{boolean:bool},end:{number:number,date:date,string:string,moment:moment},format:{minorLabels:{millisecond:{string:string,undefined:\"undefined\"},second:{string:string,undefined:\"undefined\"},minute:{string:string,undefined:\"undefined\"},hour:{string:string,undefined:\"undefined\"},weekday:{string:string,undefined:\"undefined\"},day:{string:string,undefined:\"undefined\"},month:{string:string,undefined:\"undefined\"},year:{string:string,undefined:\"undefined\"},__type__:{object:object}},majorLabels:{millisecond:{string:string,undefined:\"undefined\"},second:{string:string,undefined:\"undefined\"},minute:{string:string,undefined:\"undefined\"},hour:{string:string,undefined:\"undefined\"},weekday:{string:string,undefined:\"undefined\"},day:{string:string,undefined:\"undefined\"},month:{string:string,undefined:\"undefined\"},year:{string:string,undefined:\"undefined\"},__type__:{object:object}},__type__:{object:object}},moment:{function:\"function\"},height:{string:string,number:number},hiddenDates:{start:{date:date,number:number,string:string,moment:moment},end:{date:date,number:number,string:string,moment:moment},repeat:{string:string},__type__:{object:object,array:array}},locale:{string:string},locales:{__any__:{any:any},__type__:{object:object}},max:{date:date,number:number,string:string,moment:moment},maxHeight:{number:number,string:string},maxMinorChars:{number:number},min:{date:date,number:number,string:string,moment:moment},minHeight:{number:number,string:string},moveable:{boolean:bool},multiselect:{boolean:bool},orientation:{string:string},showCurrentTime:{boolean:bool},showMajorLabels:{boolean:bool},showMinorLabels:{boolean:bool},start:{date:date,number:number,string:string,moment:moment},timeAxis:{scale:{string:string,undefined:\"undefined\"},step:{number:number,undefined:\"undefined\"},__type__:{object:object}},width:{string:string,number:number},zoomable:{boolean:bool},zoomKey:{string:[\"ctrlKey\",\"altKey\",\"metaKey\",\"\"]},zoomMax:{number:number},zoomMin:{number:number},zIndex:{number:number},__type__:{object:object}};var configureOptions={global:{sort:true,sampling:true,stack:false,shaded:{enabled:false,orientation:[\"zero\",\"top\",\"bottom\",\"group\"]},style:[\"line\",\"bar\",\"points\"],barChart:{width:[50,5,100,5],minWidth:[50,5,100,5],sideBySide:false,align:[\"left\",\"center\",\"right\"]},interpolation:{enabled:true,parametrization:[\"centripetal\",\"chordal\",\"uniform\"]},drawPoints:{enabled:true,size:[6,2,30,1],style:[\"square\",\"circle\"]},dataAxis:{showMinorLabels:true,showMajorLabels:true,icons:false,width:[40,0,200,1],visible:true,alignZeros:true,left:{title:{text:\"\",style:\"\"}},right:{title:{text:\"\",style:\"\"}}},legend:{enabled:false,icons:true,left:{visible:true,position:[\"top-right\",\"bottom-right\",\"top-left\",\"bottom-left\"]},right:{visible:true,position:[\"top-right\",\"bottom-right\",\"top-left\",\"bottom-left\"]}},autoResize:true,clickToUse:false,end:\"\",format:{minorLabels:{millisecond:\"SSS\",second:\"s\",minute:\"HH:mm\",hour:\"HH:mm\",weekday:\"ddd D\",day:\"D\",month:\"MMM\",year:\"YYYY\"},majorLabels:{millisecond:\"HH:mm:ss\",second:\"D MMMM HH:mm\",minute:\"ddd D MMMM\",hour:\"ddd D MMMM\",weekday:\"MMMM YYYY\",day:\"MMMM YYYY\",month:\"YYYY\",year:\"\"}},height:\"\",locale:\"\",max:\"\",maxHeight:\"\",maxMinorChars:[7,0,20,1],min:\"\",minHeight:\"\",moveable:true,orientation:[\"both\",\"bottom\",\"top\"],showCurrentTime:false,showMajorLabels:true,showMinorLabels:true,start:\"\",width:\"100%\",zoomable:true,zoomKey:[\"ctrlKey\",\"altKey\",\"metaKey\",\"\"],zoomMax:[31536e10,10,31536e10,1],zoomMin:[10,10,31536e10,1],zIndex:0}};exports.allOptions=allOptions;exports.configureOptions=configureOptions},function(module,exports,__webpack_require__){\"use strict\";var _create=__webpack_require__(29);var _create2=_interopRequireDefault(_create);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function parseDOT(data){dot=data;return parseGraph()}var NODE_ATTR_MAPPING={fontsize:\"font.size\",fontcolor:\"font.color\",labelfontcolor:\"font.color\",fontname:\"font.face\",color:[\"color.border\",\"color.background\"],fillcolor:\"color.background\",tooltip:\"title\",labeltooltip:\"title\"};var EDGE_ATTR_MAPPING=(0,_create2[\"default\"])(NODE_ATTR_MAPPING);EDGE_ATTR_MAPPING.color=\"color.color\";EDGE_ATTR_MAPPING.style=\"dashes\";var TOKENTYPE={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3};var DELIMITERS={\"{\":true,\"}\":true,\"[\":true,\"]\":true,\";\":true,\"=\":true,\",\":true,\"->\":true,\"--\":true};var dot=\"\";var index=0;var c=\"\";var token=\"\";var tokenType=TOKENTYPE.NULL;function first(){index=0;c=dot.charAt(0)}function next(){index++;c=dot.charAt(index)}function nextPreview(){return dot.charAt(index+1)}var regexAlphaNumeric=/[a-zA-Z_0-9.:#]/;function isAlphaNumeric(c){return regexAlphaNumeric.test(c)}function merge(a,b){if(!a){a={}}if(b){for(var name in b){if(b.hasOwnProperty(name)){a[name]=b[name]}}}return a}function setValue(obj,path,value){var keys=path.split(\".\");var o=obj;while(keys.length){var key=keys.shift();if(keys.length){if(!o[key]){o[key]={}}o=o[key]}else{o[key]=value}}}function addNode(graph,node){var i,len;var current=null;var graphs=[graph];var root=graph;while(root.parent){graphs.push(root.parent);root=root.parent}if(root.nodes){for(i=0,len=root.nodes.length;i<len;i++){if(node.id===root.nodes[i].id){current=root.nodes[i];break}}}if(!current){current={id:node.id};if(graph.node){current.attr=merge(current.attr,graph.node)}}for(i=graphs.length-1;i>=0;i--){var g=graphs[i];if(!g.nodes){g.nodes=[]}if(g.nodes.indexOf(current)===-1){g.nodes.push(current)}}if(node.attr){current.attr=merge(current.attr,node.attr)}}function addEdge(graph,edge){if(!graph.edges){graph.edges=[]}graph.edges.push(edge);if(graph.edge){var attr=merge({},graph.edge);edge.attr=merge(attr,edge.attr)}}function createEdge(graph,from,to,type,attr){var edge={from:from,to:to,type:type};if(graph.edge){edge.attr=merge({},graph.edge)}edge.attr=merge(edge.attr||{},attr);return edge}function getToken(){tokenType=TOKENTYPE.NULL;token=\"\";while(c===\" \"||c===\"\\t\"||c===\"\\n\"||c===\"\\r\"){next()}do{var isComment=false;if(c===\"#\"){var i=index-1;while(dot.charAt(i)===\" \"||dot.charAt(i)===\"\\t\"){i--}if(dot.charAt(i)===\"\\n\"||dot.charAt(i)===\"\"){while(c!=\"\"&&c!=\"\\n\"){next()}isComment=true}}if(c===\"/\"&&nextPreview()===\"/\"){while(c!=\"\"&&c!=\"\\n\"){next()}isComment=true}if(c===\"/\"&&nextPreview()===\"*\"){while(c!=\"\"){if(c===\"*\"&&nextPreview()===\"/\"){next();next();break}else{next()}}isComment=true}while(c===\" \"||c===\"\\t\"||c===\"\\n\"||c===\"\\r\"){next()}}while(isComment);if(c===\"\"){tokenType=TOKENTYPE.DELIMITER;return}var c2=c+nextPreview();if(DELIMITERS[c2]){tokenType=TOKENTYPE.DELIMITER;token=c2;next();next();return}if(DELIMITERS[c]){tokenType=TOKENTYPE.DELIMITER;token=c;next();return}if(isAlphaNumeric(c)||c===\"-\"){token+=c;next();while(isAlphaNumeric(c)){token+=c;next()}if(token===\"false\"){token=false}else if(token===\"true\"){token=true}else if(!isNaN(Number(token))){token=Number(token)}tokenType=TOKENTYPE.IDENTIFIER;return}if(c==='\"'){next();while(c!=\"\"&&(c!='\"'||c==='\"'&&nextPreview()==='\"')){if(c==='\"'){token+=c;next()}else if(c===\"\\\\\"&&nextPreview()===\"n\"){token+=\"\\n\";next()}else{token+=c}next()}if(c!='\"'){throw newSyntaxError('End of string \" expected')}next();tokenType=TOKENTYPE.IDENTIFIER;return}tokenType=TOKENTYPE.UNKNOWN;while(c!=\"\"){token+=c;next()}throw new SyntaxError('Syntax error in part \"'+chop(token,30)+'\"')}function parseGraph(){var graph={};first();getToken();if(token===\"strict\"){graph.strict=true;getToken()}if(token===\"graph\"||token===\"digraph\"){graph.type=token;getToken()}if(tokenType===TOKENTYPE.IDENTIFIER){graph.id=token;getToken()}if(token!=\"{\"){throw newSyntaxError(\"Angle bracket { expected\")}getToken();parseStatements(graph);if(token!=\"}\"){throw newSyntaxError(\"Angle bracket } expected\")}getToken();if(token!==\"\"){throw newSyntaxError(\"End of file expected\")}getToken();delete graph.node;delete graph.edge;delete graph.graph;return graph}function parseStatements(graph){while(token!==\"\"&&token!=\"}\"){parseStatement(graph);if(token===\";\"){getToken()}}}function parseStatement(graph){var subgraph=parseSubgraph(graph);if(subgraph){parseEdge(graph,subgraph);return}var attr=parseAttributeStatement(graph);if(attr){return}if(tokenType!=TOKENTYPE.IDENTIFIER){throw newSyntaxError(\"Identifier expected\")}var id=token;getToken();if(token===\"=\"){getToken();if(tokenType!=TOKENTYPE.IDENTIFIER){throw newSyntaxError(\"Identifier expected\")}graph[id]=token;getToken()}else{parseNodeStatement(graph,id)}}function parseSubgraph(graph){var subgraph=null;if(token===\"subgraph\"){subgraph={};subgraph.type=\"subgraph\";getToken();if(tokenType===TOKENTYPE.IDENTIFIER){subgraph.id=token;getToken()}}if(token===\"{\"){getToken();if(!subgraph){subgraph={}}subgraph.parent=graph;subgraph.node=graph.node;subgraph.edge=graph.edge;subgraph.graph=graph.graph;parseStatements(subgraph);if(token!=\"}\"){throw newSyntaxError(\"Angle bracket } expected\")}getToken();delete subgraph.node;delete subgraph.edge;delete subgraph.graph;delete subgraph.parent;if(!graph.subgraphs){graph.subgraphs=[]}graph.subgraphs.push(subgraph)}return subgraph}function parseAttributeStatement(graph){if(token===\"node\"){getToken();graph.node=parseAttributeList();return\"node\"}else if(token===\"edge\"){getToken();graph.edge=parseAttributeList();return\"edge\"}else if(token===\"graph\"){getToken();graph.graph=parseAttributeList();return\"graph\"}return null}function parseNodeStatement(graph,id){var node={id:id};var attr=parseAttributeList();if(attr){node.attr=attr}addNode(graph,node);parseEdge(graph,id)}function parseEdge(graph,from){while(token===\"->\"||token===\"--\"){var to;var type=token;getToken();var subgraph=parseSubgraph(graph);if(subgraph){to=subgraph}else{if(tokenType!=TOKENTYPE.IDENTIFIER){throw newSyntaxError(\"Identifier or subgraph expected\")}to=token;addNode(graph,{id:to});getToken()}var attr=parseAttributeList();var edge=createEdge(graph,from,to,type,attr);addEdge(graph,edge);from=to}}function parseAttributeList(){var attr=null;var edgeStyles={dashed:true,solid:false,dotted:[1,5]};while(token===\"[\"){getToken();attr={};while(token!==\"\"&&token!=\"]\"){if(tokenType!=TOKENTYPE.IDENTIFIER){throw newSyntaxError(\"Attribute name expected\")}var name=token;getToken();if(token!=\"=\"){throw newSyntaxError(\"Equal sign = expected\")}getToken();if(tokenType!=TOKENTYPE.IDENTIFIER){throw newSyntaxError(\"Attribute value expected\")}var value=token;if(name===\"style\"){value=edgeStyles[value]}setValue(attr,name,value);getToken();if(token==\",\"){getToken()}}if(token!=\"]\"){throw newSyntaxError(\"Bracket ] expected\")}getToken()}return attr}function newSyntaxError(message){return new SyntaxError(message+', got \"'+chop(token,30)+'\" (char '+index+\")\")}function chop(text,maxLength){return text.length<=maxLength?text:text.substr(0,27)+\"...\"}function forEach2(array1,array2,fn){if(Array.isArray(array1)){array1.forEach(function(elem1){if(Array.isArray(array2)){array2.forEach(function(elem2){fn(elem1,elem2)})}else{fn(elem1,array2)}})}else{if(Array.isArray(array2)){array2.forEach(function(elem2){fn(array1,elem2)})}else{fn(array1,array2)}}}function setProp(object,path,value){var names=path.split(\".\");var prop=names.pop();var obj=object;for(var i=0;i<names.length;i++){var name=names[i];if(!(name in obj)){obj[name]={}}obj=obj[name]}obj[prop]=value;return object}function convertAttr(attr,mapping){var converted={};for(var prop in attr){if(attr.hasOwnProperty(prop)){var visProp=mapping[prop];if(Array.isArray(visProp)){visProp.forEach(function(visPropI){setProp(converted,visPropI,attr[prop])})}else if(typeof visProp===\"string\"){setProp(converted,visProp,attr[prop])}else{setProp(converted,prop,attr[prop])}}}return converted}function DOTToGraph(data){var dotData=parseDOT(data);var graphData={nodes:[],edges:[],options:{}};if(dotData.nodes){dotData.nodes.forEach(function(dotNode){var graphNode={id:dotNode.id,label:String(dotNode.label||dotNode.id)};merge(graphNode,convertAttr(dotNode.attr,NODE_ATTR_MAPPING));if(graphNode.image){graphNode.shape=\"image\"}graphData.nodes.push(graphNode)})}if(dotData.edges){var convertEdge=function convertEdge(dotEdge){var graphEdge={from:dotEdge.from,to:dotEdge.to};merge(graphEdge,convertAttr(dotEdge.attr,EDGE_ATTR_MAPPING));graphEdge.arrows=dotEdge.type===\"->\"?\"to\":undefined;return graphEdge};dotData.edges.forEach(function(dotEdge){var from,to;if(dotEdge.from instanceof Object){from=dotEdge.from.nodes}else{from={id:dotEdge.from}}if(dotEdge.to instanceof Object){to=dotEdge.to.nodes}else{to={id:dotEdge.to}}if(dotEdge.from instanceof Object&&dotEdge.from.edges){dotEdge.from.edges.forEach(function(subEdge){var graphEdge=convertEdge(subEdge);graphData.edges.push(graphEdge)})}forEach2(from,to,function(from,to){var subEdge=createEdge(graphData,from.id,to.id,dotEdge.type,dotEdge.attr);var graphEdge=convertEdge(subEdge);graphData.edges.push(graphEdge)});if(dotEdge.to instanceof Object&&dotEdge.to.edges){dotEdge.to.edges.forEach(function(subEdge){var graphEdge=convertEdge(subEdge);graphData.edges.push(graphEdge)})}})}if(dotData.attr){graphData.options=dotData.attr}return graphData}exports.parseDOT=parseDOT;exports.DOTToGraph=DOTToGraph},function(module,exports,__webpack_require__){\"use strict\";function parseGephi(gephiJSON,optionsObj){var edges=[];var nodes=[];var options={edges:{inheritColor:false},nodes:{fixed:false,parseColor:false}};if(optionsObj!==undefined){if(optionsObj.fixed!==undefined){options.nodes.fixed=optionsObj.fixed}if(optionsObj.parseColor!==undefined){options.nodes.parseColor=optionsObj.parseColor}if(optionsObj.inheritColor!==undefined){options.edges.inheritColor=optionsObj.inheritColor}}var gEdges=gephiJSON.edges;var gNodes=gephiJSON.nodes;for(var i=0;i<gEdges.length;i++){var edge={};var gEdge=gEdges[i];edge[\"id\"]=gEdge.id;edge[\"from\"]=gEdge.source;edge[\"to\"]=gEdge.target;edge[\"attributes\"]=gEdge.attributes;edge[\"label\"]=gEdge.label;edge[\"title\"]=gEdge.attributes!==undefined?gEdge.attributes.title:undefined;if(gEdge[\"type\"]===\"Directed\"){edge[\"arrows\"]=\"to\"}if(gEdge.color&&options.inheritColor===false){edge[\"color\"]=gEdge.color}edges.push(edge)}for(var j=0;j<gNodes.length;j++){var node={};var gNode=gNodes[j];node[\"id\"]=gNode.id;node[\"attributes\"]=gNode.attributes;node[\"x\"]=gNode.x;node[\"y\"]=gNode.y;node[\"label\"]=gNode.label;node[\"title\"]=gNode.attributes!==undefined?gNode.attributes.title:gNode.title;if(options.nodes.parseColor===true){node[\"color\"]=gNode.color}else{node[\"color\"]=gNode.color!==undefined?{background:gNode.color,border:gNode.color,highlight:{background:gNode.color,border:gNode.color},hover:{background:gNode.color,border:gNode.color}}:undefined}node[\"size\"]=gNode.size;node[\"fixed\"]=options.nodes.fixed&&gNode.x!==undefined&&gNode.y!==undefined;nodes.push(node)}return{nodes:nodes,edges:edges}}exports.parseGephi=parseGephi},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _CachedImage=__webpack_require__(185);var _CachedImage2=_interopRequireDefault(_CachedImage);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Images=function(){function Images(callback){(0,_classCallCheck3[\"default\"])(this,Images);this.images={};this.imageBroken={};this.callback=callback}(0,_createClass3[\"default\"])(Images,[{key:\"_tryloadBrokenUrl\",value:function _tryloadBrokenUrl(url,brokenUrl,imageToLoadBrokenUrlOn){if(url===undefined||imageToLoadBrokenUrlOn===undefined)return;if(brokenUrl===undefined){console.warn(\"No broken url image defined\");return}imageToLoadBrokenUrlOn.onerror=function(){console.error(\"Could not load brokenImage:\",brokenUrl)};imageToLoadBrokenUrlOn.image.src=brokenUrl}},{key:\"_redrawWithImage\",value:function _redrawWithImage(imageToRedrawWith){if(this.callback){this.callback(imageToRedrawWith)}}},{key:\"load\",value:function load(url,brokenUrl){var _this=this;var cachedImage=this.images[url];if(cachedImage)return cachedImage;var img=new _CachedImage2[\"default\"];this.images[url]=img;img.image.onload=function(){_this._fixImageCoordinates(img.image);img.init();_this._redrawWithImage(img)};img.image.onerror=function(){console.error(\"Could not load image:\",url);_this._tryloadBrokenUrl(url,brokenUrl,img)};img.image.src=url;return img}},{key:\"_fixImageCoordinates\",value:function _fixImageCoordinates(imageToCache){if(imageToCache.width===0){document.body.appendChild(imageToCache);imageToCache.width=imageToCache.offsetWidth;imageToCache.height=imageToCache.offsetHeight;document.body.removeChild(imageToCache)}}}]);return Images}();exports[\"default\"]=Images},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _slicedToArray2=__webpack_require__(30);var _slicedToArray3=_interopRequireDefault(_slicedToArray2);var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var ComponentUtil=__webpack_require__(48)[\"default\"];var LabelSplitter=__webpack_require__(191)[\"default\"];var multiFontStyle=[\"bold\",\"ital\",\"boldital\",\"mono\"];var Label=function(){function Label(body,options){var edgelabel=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;(0,_classCallCheck3[\"default\"])(this,Label);this.body=body;this.pointToSelf=false;this.baseSize=undefined;this.fontOptions={};this.setOptions(options);this.size={top:0,left:0,width:0,height:0,yLine:0};this.isEdgeLabel=edgelabel}(0,_createClass3[\"default\"])(Label,[{key:\"setOptions\",value:function setOptions(options){this.elementOptions=options;this.initFontOptions(options.font);if(ComponentUtil.isValidLabel(options.label)){this.labelDirty=true}else{options.label=\"\"}if(options.font!==undefined&&options.font!==null){if(typeof options.font===\"string\"){this.baseSize=this.fontOptions.size}else if((0,_typeof3[\"default\"])(options.font)===\"object\"){var size=options.font.size;if(size!==undefined){this.baseSize=size}}}}},{key:\"initFontOptions\",value:function initFontOptions(newFontOptions){var _this=this;util.forEach(multiFontStyle,function(style){_this.fontOptions[style]={}});if(Label.parseFontString(this.fontOptions,newFontOptions)){this.fontOptions.vadjust=0;return}util.forEach(newFontOptions,function(prop,n){if(prop!==undefined&&prop!==null&&(typeof prop===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(prop))!==\"object\"){_this.fontOptions[n]=prop}})}},{key:\"constrain\",value:function constrain(pile){var fontOptions={constrainWidth:false,maxWdt:-1,minWdt:-1,constrainHeight:false,minHgt:-1,valign:\"middle\"};var widthConstraint=util.topMost(pile,\"widthConstraint\");if(typeof widthConstraint===\"number\"){fontOptions.maxWdt=Number(widthConstraint);fontOptions.minWdt=Number(widthConstraint)}else if((typeof widthConstraint===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(widthConstraint))===\"object\"){var widthConstraintMaximum=util.topMost(pile,[\"widthConstraint\",\"maximum\"]);if(typeof widthConstraintMaximum===\"number\"){fontOptions.maxWdt=Number(widthConstraintMaximum)}var widthConstraintMinimum=util.topMost(pile,[\"widthConstraint\",\"minimum\"]);if(typeof widthConstraintMinimum===\"number\"){fontOptions.minWdt=Number(widthConstraintMinimum)}}var heightConstraint=util.topMost(pile,\"heightConstraint\");if(typeof heightConstraint===\"number\"){fontOptions.minHgt=Number(heightConstraint)}else if((typeof heightConstraint===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(heightConstraint))===\"object\"){var heightConstraintMinimum=util.topMost(pile,[\"heightConstraint\",\"minimum\"]);if(typeof heightConstraintMinimum===\"number\"){fontOptions.minHgt=Number(heightConstraintMinimum)}var heightConstraintValign=util.topMost(pile,[\"heightConstraint\",\"valign\"]);if(typeof heightConstraintValign===\"string\"){if(heightConstraintValign===\"top\"||heightConstraintValign===\"bottom\"){fontOptions.valign=heightConstraintValign}}}return fontOptions}},{key:\"update\",value:function update(options,pile){this.setOptions(options,true);this.propagateFonts(pile);util.deepExtend(this.fontOptions,this.constrain(pile));this.fontOptions.chooser=ComponentUtil.choosify(\"label\",pile)}},{key:\"adjustSizes\",value:function adjustSizes(margins){var widthBias=margins?margins.right+margins.left:0;if(this.fontOptions.constrainWidth){this.fontOptions.maxWdt-=widthBias;this.fontOptions.minWdt-=widthBias}var heightBias=margins?margins.top+margins.bottom:0;if(this.fontOptions.constrainHeight){this.fontOptions.minHgt-=heightBias}}},{key:\"addFontOptionsToPile\",value:function addFontOptionsToPile(dstPile,srcPile){for(var i=0;i<srcPile.length;++i){this.addFontToPile(dstPile,srcPile[i])}}},{key:\"addFontToPile\",value:function addFontToPile(pile,options){if(options===undefined)return;if(options.font===undefined||options.font===null)return;var item=options.font;pile.push(item)}},{key:\"getBasicOptions\",value:function getBasicOptions(pile){var ret={};for(var n=0;n<pile.length;++n){var fontOptions=pile[n];var tmpShorthand={};if(Label.parseFontString(tmpShorthand,fontOptions)){fontOptions=tmpShorthand}util.forEach(fontOptions,function(opt,name){if(opt===undefined)return;if(ret.hasOwnProperty(name))return;if(multiFontStyle.indexOf(name)!==-1){ret[name]={}}else{ret[name]=opt}})}return ret}},{key:\"getFontOption\",value:function getFontOption(pile,multiName,option){var multiFont=void 0;for(var n=0;n<pile.length;++n){var fontOptions=pile[n];if(fontOptions.hasOwnProperty(multiName)){multiFont=fontOptions[multiName];if(multiFont===undefined||multiFont===null)continue;var tmpShorthand={};if(Label.parseFontString(tmpShorthand,multiFont)){multiFont=tmpShorthand}if(multiFont.hasOwnProperty(option)){return multiFont[option]}}}if(this.fontOptions.hasOwnProperty(option)){return this.fontOptions[option]}throw new Error(\"Did not find value for multi-font for property: '\"+option+\"'\")}},{key:\"getFontOptions\",value:function getFontOptions(pile,multiName){var result={};var optionNames=[\"color\",\"size\",\"face\",\"mod\",\"vadjust\"];for(var i=0;i<optionNames.length;++i){var mod=optionNames[i];result[mod]=this.getFontOption(pile,multiName,mod)}return result}},{key:\"propagateFonts\",value:function propagateFonts(pile){var _this2=this;var fontPile=[];this.addFontOptionsToPile(fontPile,pile);this.fontOptions=this.getBasicOptions(fontPile);var _loop=function _loop(i){var mod=multiFontStyle[i];var modOptions=_this2.fontOptions[mod];var tmpMultiFontOptions=_this2.getFontOptions(fontPile,mod);util.forEach(tmpMultiFontOptions,function(option,n){modOptions[n]=option});modOptions.size=Number(modOptions.size);modOptions.vadjust=Number(modOptions.vadjust)};for(var i=0;i<multiFontStyle.length;++i){_loop(i)}}},{key:\"draw\",value:function draw(ctx,x,y,selected,hover){var baseline=arguments.length>5&&arguments[5]!==undefined?arguments[5]:\"middle\";if(this.elementOptions.label===undefined)return;var viewFontSize=this.fontOptions.size*this.body.view.scale;if(this.elementOptions.label&&viewFontSize<this.elementOptions.scaling.label.drawThreshold-1)return;if(viewFontSize>=this.elementOptions.scaling.label.maxVisible){viewFontSize=Number(this.elementOptions.scaling.label.maxVisible)/this.body.view.scale}this.calculateLabelSize(ctx,selected,hover,x,y,baseline);this._drawBackground(ctx);this._drawText(ctx,x,this.size.yLine,baseline,viewFontSize)}},{key:\"_drawBackground\",value:function _drawBackground(ctx){if(this.fontOptions.background!==undefined&&this.fontOptions.background!==\"none\"){ctx.fillStyle=this.fontOptions.background;var size=this.getSize();ctx.fillRect(size.left,size.top,size.width,size.height)}}},{key:\"_drawText\",value:function _drawText(ctx,x,y){var baseline=arguments.length>3&&arguments[3]!==undefined?arguments[3]:\"middle\";var viewFontSize=arguments[4];var _setAlignment2=this._setAlignment(ctx,x,y,baseline);var _setAlignment3=(0,_slicedToArray3[\"default\"])(_setAlignment2,2);x=_setAlignment3[0];y=_setAlignment3[1];ctx.textAlign=\"left\";x=x-this.size.width/2;if(this.fontOptions.valign&&this.size.height>this.size.labelHeight){if(this.fontOptions.valign===\"top\"){y-=(this.size.height-this.size.labelHeight)/2}if(this.fontOptions.valign===\"bottom\"){y+=(this.size.height-this.size.labelHeight)/2}}for(var i=0;i<this.lineCount;i++){var line=this.lines[i];if(line&&line.blocks){var width=0;if(this.isEdgeLabel||this.fontOptions.align===\"center\"){width+=(this.size.width-line.width)/2}else if(this.fontOptions.align===\"right\"){width+=this.size.width-line.width}for(var j=0;j<line.blocks.length;j++){var block=line.blocks[j];ctx.font=block.font;var _getColor2=this._getColor(block.color,viewFontSize,block.strokeColor),_getColor3=(0,_slicedToArray3[\"default\"])(_getColor2,2),fontColor=_getColor3[0],strokeColor=_getColor3[1];if(block.strokeWidth>0){ctx.lineWidth=block.strokeWidth;ctx.strokeStyle=strokeColor;ctx.lineJoin=\"round\"}ctx.fillStyle=fontColor;if(block.strokeWidth>0){ctx.strokeText(block.text,x+width,y+block.vadjust)}ctx.fillText(block.text,x+width,y+block.vadjust);width+=block.width}y+=line.height}}}},{key:\"_setAlignment\",value:function _setAlignment(ctx,x,y,baseline){if(this.isEdgeLabel&&this.fontOptions.align!==\"horizontal\"&&this.pointToSelf===false){x=0;y=0;var lineMargin=2;if(this.fontOptions.align===\"top\"){ctx.textBaseline=\"alphabetic\";y-=2*lineMargin}else if(this.fontOptions.align===\"bottom\"){ctx.textBaseline=\"hanging\";y+=2*lineMargin}else{ctx.textBaseline=\"middle\"}}else{ctx.textBaseline=baseline}return[x,y]}},{key:\"_getColor\",value:function _getColor(color,viewFontSize,initialStrokeColor){var fontColor=color||\"#000000\";var strokeColor=initialStrokeColor||\"#ffffff\";if(viewFontSize<=this.elementOptions.scaling.label.drawThreshold){var opacity=Math.max(0,Math.min(1,1-(this.elementOptions.scaling.label.drawThreshold-viewFontSize)));fontColor=util.overrideOpacity(fontColor,opacity);strokeColor=util.overrideOpacity(strokeColor,opacity)}return[fontColor,strokeColor]}},{key:\"getTextSize\",value:function getTextSize(ctx){var selected=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var hover=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;this._processLabel(ctx,selected,hover);return{width:this.size.width,height:this.size.height,lineCount:this.lineCount}}},{key:\"getSize\",value:function getSize(){var lineMargin=2;var x=this.size.left;var y=this.size.top-.5*lineMargin;if(this.isEdgeLabel){var x2=-this.size.width*.5;switch(this.fontOptions.align){case\"middle\":x=x2;y=-this.size.height*.5;break;case\"top\":x=x2;y=-(this.size.height+lineMargin);break;case\"bottom\":x=x2;y=lineMargin;break}}var ret={left:x,top:y,width:this.size.width,height:this.size.height};return ret}},{key:\"calculateLabelSize\",value:function calculateLabelSize(ctx,selected,hover){var x=arguments.length>3&&arguments[3]!==undefined?arguments[3]:0;var y=arguments.length>4&&arguments[4]!==undefined?arguments[4]:0;var baseline=arguments.length>5&&arguments[5]!==undefined?arguments[5]:\"middle\";this._processLabel(ctx,selected,hover);this.size.left=x-this.size.width*.5;this.size.top=y-this.size.height*.5;this.size.yLine=y+(1-this.lineCount)*.5*this.fontOptions.size;if(baseline===\"hanging\"){this.size.top+=.5*this.fontOptions.size;this.size.top+=4;this.size.yLine+=4}}},{key:\"getFormattingValues\",value:function getFormattingValues(ctx,selected,hover,mod){var getValue=function getValue(fontOptions,mod,option){if(mod===\"normal\"){if(option===\"mod\")return\"\";return fontOptions[option]}if(fontOptions[mod][option]!==undefined){return fontOptions[mod][option]}else{return fontOptions[option]}};var values={color:getValue(this.fontOptions,mod,\"color\"),size:getValue(this.fontOptions,mod,\"size\"),face:getValue(this.fontOptions,mod,\"face\"),mod:getValue(this.fontOptions,mod,\"mod\"),vadjust:getValue(this.fontOptions,mod,\"vadjust\"),strokeWidth:this.fontOptions.strokeWidth,strokeColor:this.fontOptions.strokeColor};if(selected||hover){if(mod===\"normal\"&&this.fontOptions.chooser===true&&this.elementOptions.labelHighlightBold){values.mod=\"bold\"}else{if(typeof this.fontOptions.chooser===\"function\"){this.fontOptions.chooser(values,this.elementOptions.id,selected,hover)}}}var fontString=\"\";if(values.mod!==undefined&&values.mod!==\"\"){fontString+=values.mod+\" \"}fontString+=values.size+\"px \"+values.face;ctx.font=fontString.replace(/\"/g,\"\");values.font=ctx.font;values.height=values.size;return values}},{key:\"differentState\",value:function differentState(selected,hover){return selected!==this.selectedState||hover!==this.hoverState}},{key:\"_processLabelText\",value:function _processLabelText(ctx,selected,hover,inText){var splitter=new LabelSplitter(ctx,this,selected,hover);return splitter.process(inText)}},{key:\"_processLabel\",value:function _processLabel(ctx,selected,hover){if(this.labelDirty===false&&!this.differentState(selected,hover))return;var state=this._processLabelText(ctx,selected,hover,this.elementOptions.label);if(this.fontOptions.minWdt>0&&state.width<this.fontOptions.minWdt){state.width=this.fontOptions.minWdt}this.size.labelHeight=state.height;if(this.fontOptions.minHgt>0&&state.height<this.fontOptions.minHgt){state.height=this.fontOptions.minHgt}this.lines=state.lines;this.lineCount=state.lines.length;this.size.width=state.width;this.size.height=state.height;this.selectedState=selected;this.hoverState=hover;this.labelDirty=false}},{key:\"visible\",value:function visible(){if(this.size.width===0||this.size.height===0||this.elementOptions.label===undefined){return false}var viewFontSize=this.fontOptions.size*this.body.view.scale;if(viewFontSize<this.elementOptions.scaling.label.drawThreshold-1){return false}return true}}],[{key:\"parseFontString\",value:function parseFontString(outOptions,inOptions){if(!inOptions||typeof inOptions!==\"string\")return false;var newOptionsArray=inOptions.split(\" \");outOptions.size=newOptionsArray[0].replace(\"px\",\"\");outOptions.face=newOptionsArray[1];outOptions.color=newOptionsArray[2];return true}}]);return Label}();exports[\"default\"]=Label},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _slicedToArray2=__webpack_require__(30);var _slicedToArray3=_interopRequireDefault(_slicedToArray2);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var EndPoints=__webpack_require__(119)[\"default\"];var EdgeBase=function(){function EdgeBase(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,EdgeBase);this.body=body;this.labelModule=labelModule\n;this.options={};this.setOptions(options);this.colorDirty=true;this.color={};this.selectionWidth=2;this.hoverWidth=1.5;this.fromPoint=this.from;this.toPoint=this.to}(0,_createClass3[\"default\"])(EdgeBase,[{key:\"connect\",value:function connect(){this.from=this.body.nodes[this.options.from];this.to=this.body.nodes[this.options.to]}},{key:\"cleanup\",value:function cleanup(){return false}},{key:\"setOptions\",value:function setOptions(options){this.options=options;this.from=this.body.nodes[this.options.from];this.to=this.body.nodes[this.options.to];this.id=this.options.id}},{key:\"drawLine\",value:function drawLine(ctx,values,selected,hover,viaNode){ctx.strokeStyle=this.getColor(ctx,values,selected,hover);ctx.lineWidth=values.width;if(values.dashes!==false){this._drawDashedLine(ctx,values,viaNode)}else{this._drawLine(ctx,values,viaNode)}}},{key:\"_drawLine\",value:function _drawLine(ctx,values,viaNode,fromPoint,toPoint){if(this.from!=this.to){this._line(ctx,values,viaNode,fromPoint,toPoint)}else{var _getCircleData2=this._getCircleData(ctx),_getCircleData3=(0,_slicedToArray3[\"default\"])(_getCircleData2,3),x=_getCircleData3[0],y=_getCircleData3[1],radius=_getCircleData3[2];this._circle(ctx,values,x,y,radius)}}},{key:\"_drawDashedLine\",value:function _drawDashedLine(ctx,values,viaNode,fromPoint,toPoint){ctx.lineCap=\"round\";var pattern=[5,5];if(Array.isArray(values.dashes)===true){pattern=values.dashes}if(ctx.setLineDash!==undefined){ctx.save();ctx.setLineDash(pattern);ctx.lineDashOffset=0;if(this.from!=this.to){this._line(ctx,values,viaNode)}else{var _getCircleData4=this._getCircleData(ctx),_getCircleData5=(0,_slicedToArray3[\"default\"])(_getCircleData4,3),x=_getCircleData5[0],y=_getCircleData5[1],radius=_getCircleData5[2];this._circle(ctx,values,x,y,radius)}ctx.setLineDash([0]);ctx.lineDashOffset=0;ctx.restore()}else{if(this.from!=this.to){ctx.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,pattern)}else{var _getCircleData6=this._getCircleData(ctx),_getCircleData7=(0,_slicedToArray3[\"default\"])(_getCircleData6,3),_x=_getCircleData7[0],_y=_getCircleData7[1],_radius=_getCircleData7[2];this._circle(ctx,values,_x,_y,_radius)}this.enableShadow(ctx,values);ctx.stroke();this.disableShadow(ctx,values)}}},{key:\"findBorderPosition\",value:function findBorderPosition(nearNode,ctx,options){if(this.from!=this.to){return this._findBorderPosition(nearNode,ctx,options)}else{return this._findBorderPositionCircle(nearNode,ctx,options)}}},{key:\"findBorderPositions\",value:function findBorderPositions(ctx){var from={};var to={};if(this.from!=this.to){from=this._findBorderPosition(this.from,ctx);to=this._findBorderPosition(this.to,ctx)}else{var _getCircleData$slice=this._getCircleData(ctx).slice(0,2),_getCircleData$slice2=(0,_slicedToArray3[\"default\"])(_getCircleData$slice,2),x=_getCircleData$slice2[0],y=_getCircleData$slice2[1];from=this._findBorderPositionCircle(this.from,ctx,{x:x,y:y,low:.25,high:.6,direction:-1});to=this._findBorderPositionCircle(this.from,ctx,{x:x,y:y,low:.6,high:.8,direction:1})}return{from:from,to:to}}},{key:\"_getCircleData\",value:function _getCircleData(ctx){var x=void 0,y=void 0;var node=this.from;var radius=this.options.selfReferenceSize;if(ctx!==undefined){if(node.shape.width===undefined){node.shape.resize(ctx)}}if(node.shape.width>node.shape.height){x=node.x+node.shape.width*.5;y=node.y-radius}else{x=node.x+radius;y=node.y-node.shape.height*.5}return[x,y,radius]}},{key:\"_pointOnCircle\",value:function _pointOnCircle(x,y,radius,percentage){var angle=percentage*2*Math.PI;return{x:x+radius*Math.cos(angle),y:y-radius*Math.sin(angle)}}},{key:\"_findBorderPositionCircle\",value:function _findBorderPositionCircle(node,ctx,options){var x=options.x;var y=options.y;var low=options.low;var high=options.high;var direction=options.direction;var maxIterations=10;var iteration=0;var radius=this.options.selfReferenceSize;var pos=void 0,angle=void 0,distanceToBorder=void 0,distanceToPoint=void 0,difference=void 0;var threshold=.05;var middle=(low+high)*.5;while(low<=high&&iteration<maxIterations){middle=(low+high)*.5;pos=this._pointOnCircle(x,y,radius,middle);angle=Math.atan2(node.y-pos.y,node.x-pos.x);distanceToBorder=node.distanceToBorder(ctx,angle);distanceToPoint=Math.sqrt(Math.pow(pos.x-node.x,2)+Math.pow(pos.y-node.y,2));difference=distanceToBorder-distanceToPoint;if(Math.abs(difference)<threshold){break}else if(difference>0){if(direction>0){low=middle}else{high=middle}}else{if(direction>0){high=middle}else{low=middle}}iteration++}pos.t=middle;return pos}},{key:\"getLineWidth\",value:function getLineWidth(selected,hover){if(selected===true){return Math.max(this.selectionWidth,.3/this.body.view.scale)}else{if(hover===true){return Math.max(this.hoverWidth,.3/this.body.view.scale)}else{return Math.max(this.options.width,.3/this.body.view.scale)}}}},{key:\"getColor\",value:function getColor(ctx,values,selected,hover){if(values.inheritsColor!==false){if(values.inheritsColor===\"both\"&&this.from.id!==this.to.id){var grd=ctx.createLinearGradient(this.from.x,this.from.y,this.to.x,this.to.y);var fromColor=void 0,toColor=void 0;fromColor=this.from.options.color.highlight.border;toColor=this.to.options.color.highlight.border;if(this.from.selected===false&&this.to.selected===false){fromColor=util.overrideOpacity(this.from.options.color.border,values.opacity);toColor=util.overrideOpacity(this.to.options.color.border,values.opacity)}else if(this.from.selected===true&&this.to.selected===false){toColor=this.to.options.color.border}else if(this.from.selected===false&&this.to.selected===true){fromColor=this.from.options.color.border}grd.addColorStop(0,fromColor);grd.addColorStop(1,toColor);return grd}if(values.inheritsColor===\"to\"){return util.overrideOpacity(this.to.options.color.border,values.opacity)}else{return util.overrideOpacity(this.from.options.color.border,values.opacity)}}else{return util.overrideOpacity(values.color,values.opacity)}}},{key:\"_circle\",value:function _circle(ctx,values,x,y,radius){this.enableShadow(ctx,values);ctx.beginPath();ctx.arc(x,y,radius,0,2*Math.PI,false);ctx.stroke();this.disableShadow(ctx,values)}},{key:\"getDistanceToEdge\",value:function getDistanceToEdge(x1,y1,x2,y2,x3,y3,via,values){var returnValue=0;if(this.from!=this.to){returnValue=this._getDistanceToEdge(x1,y1,x2,y2,x3,y3,via)}else{var _getCircleData8=this._getCircleData(undefined),_getCircleData9=(0,_slicedToArray3[\"default\"])(_getCircleData8,3),x=_getCircleData9[0],y=_getCircleData9[1],radius=_getCircleData9[2];var dx=x-x3;var dy=y-y3;returnValue=Math.abs(Math.sqrt(dx*dx+dy*dy)-radius)}return returnValue}},{key:\"_getDistanceToLine\",value:function _getDistanceToLine(x1,y1,x2,y2,x3,y3){var px=x2-x1;var py=y2-y1;var something=px*px+py*py;var u=((x3-x1)*px+(y3-y1)*py)/something;if(u>1){u=1}else if(u<0){u=0}var x=x1+u*px;var y=y1+u*py;var dx=x-x3;var dy=y-y3;return Math.sqrt(dx*dx+dy*dy)}},{key:\"getArrowData\",value:function getArrowData(ctx,position,viaNode,selected,hover,values){var angle=void 0;var arrowPoint=void 0;var node1=void 0;var node2=void 0;var guideOffset=void 0;var scaleFactor=void 0;var type=void 0;var lineWidth=values.width;if(position===\"from\"){node1=this.from;node2=this.to;guideOffset=.1;scaleFactor=values.fromArrowScale;type=values.fromArrowType}else if(position===\"to\"){node1=this.to;node2=this.from;guideOffset=-.1;scaleFactor=values.toArrowScale;type=values.toArrowType}else{node1=this.to;node2=this.from;scaleFactor=values.middleArrowScale;type=values.middleArrowType}if(node1!=node2){if(position!==\"middle\"){if(this.options.smooth.enabled===true){arrowPoint=this.findBorderPosition(node1,ctx,{via:viaNode});var guidePos=this.getPoint(Math.max(0,Math.min(1,arrowPoint.t+guideOffset)),viaNode);angle=Math.atan2(arrowPoint.y-guidePos.y,arrowPoint.x-guidePos.x)}else{angle=Math.atan2(node1.y-node2.y,node1.x-node2.x);arrowPoint=this.findBorderPosition(node1,ctx)}}else{angle=Math.atan2(node1.y-node2.y,node1.x-node2.x);arrowPoint=this.getPoint(.5,viaNode)}}else{var _getCircleData10=this._getCircleData(ctx),_getCircleData11=(0,_slicedToArray3[\"default\"])(_getCircleData10,3),x=_getCircleData11[0],y=_getCircleData11[1],radius=_getCircleData11[2];if(position===\"from\"){arrowPoint=this.findBorderPosition(this.from,ctx,{x:x,y:y,low:.25,high:.6,direction:-1});angle=arrowPoint.t*-2*Math.PI+1.5*Math.PI+.1*Math.PI}else if(position===\"to\"){arrowPoint=this.findBorderPosition(this.from,ctx,{x:x,y:y,low:.6,high:1,direction:1});angle=arrowPoint.t*-2*Math.PI+1.5*Math.PI-1.1*Math.PI}else{arrowPoint=this._pointOnCircle(x,y,radius,.175);angle=3.9269908169872414}}if(position===\"middle\"&&scaleFactor<0)lineWidth*=-1;var length=15*scaleFactor+3*lineWidth;var xi=arrowPoint.x-length*.9*Math.cos(angle);var yi=arrowPoint.y-length*.9*Math.sin(angle);var arrowCore={x:xi,y:yi};return{point:arrowPoint,core:arrowCore,angle:angle,length:length,type:type}}},{key:\"drawArrowHead\",value:function drawArrowHead(ctx,values,selected,hover,arrowData){ctx.strokeStyle=this.getColor(ctx,values,selected,hover);ctx.fillStyle=ctx.strokeStyle;ctx.lineWidth=values.width;EndPoints.draw(ctx,arrowData);this.enableShadow(ctx,values);ctx.fill();this.disableShadow(ctx,values)}},{key:\"enableShadow\",value:function enableShadow(ctx,values){if(values.shadow===true){ctx.shadowColor=values.shadowColor;ctx.shadowBlur=values.shadowSize;ctx.shadowOffsetX=values.shadowX;ctx.shadowOffsetY=values.shadowY}}},{key:\"disableShadow\",value:function disableShadow(ctx,values){if(values.shadow===true){ctx.shadowColor=\"rgba(0,0,0,0)\";ctx.shadowBlur=0;ctx.shadowOffsetX=0;ctx.shadowOffsetY=0}}}]);return EdgeBase}();exports[\"default\"]=EdgeBase},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var EndPoint=function(){function EndPoint(){(0,_classCallCheck3[\"default\"])(this,EndPoint)}(0,_createClass3[\"default\"])(EndPoint,null,[{key:\"transform\",value:function transform(points,arrowData){if(!(points instanceof Array)){points=[points]}var x=arrowData.point.x;var y=arrowData.point.y;var angle=arrowData.angle;var length=arrowData.length;for(var i=0;i<points.length;++i){var p=points[i];var xt=p.x*Math.cos(angle)-p.y*Math.sin(angle);var yt=p.x*Math.sin(angle)+p.y*Math.cos(angle);p.x=x+length*xt;p.y=y+length*yt}}},{key:\"drawPath\",value:function drawPath(ctx,points){ctx.beginPath();ctx.moveTo(points[0].x,points[0].y);for(var i=1;i<points.length;++i){ctx.lineTo(points[i].x,points[i].y)}ctx.closePath()}}]);return EndPoint}();var Arrow=function(_EndPoint){(0,_inherits3[\"default\"])(Arrow,_EndPoint);function Arrow(){(0,_classCallCheck3[\"default\"])(this,Arrow);return(0,_possibleConstructorReturn3[\"default\"])(this,(Arrow.__proto__||(0,_getPrototypeOf2[\"default\"])(Arrow)).apply(this,arguments))}(0,_createClass3[\"default\"])(Arrow,null,[{key:\"draw\",value:function draw(ctx,arrowData){var points=[{x:0,y:0},{x:-1,y:.3},{x:-.9,y:0},{x:-1,y:-.3}];EndPoint.transform(points,arrowData);EndPoint.drawPath(ctx,points)}}]);return Arrow}(EndPoint);var Circle=function(){function Circle(){(0,_classCallCheck3[\"default\"])(this,Circle)}(0,_createClass3[\"default\"])(Circle,null,[{key:\"draw\",value:function draw(ctx,arrowData){var point={x:-.4,y:0};EndPoint.transform(point,arrowData);ctx.circle(point.x,point.y,arrowData.length*.4)}}]);return Circle}();var Bar=function(){function Bar(){(0,_classCallCheck3[\"default\"])(this,Bar)}(0,_createClass3[\"default\"])(Bar,null,[{key:\"draw\",value:function draw(ctx,arrowData){var points=[{x:0,y:.5},{x:0,y:-.5},{x:-.15,y:-.5},{x:-.15,y:.5}];EndPoint.transform(points,arrowData);EndPoint.drawPath(ctx,points)}}]);return Bar}();var EndPoints=function(){function EndPoints(){(0,_classCallCheck3[\"default\"])(this,EndPoints)}(0,_createClass3[\"default\"])(EndPoints,null,[{key:\"draw\",value:function draw(ctx,arrowData){var type;if(arrowData.type){type=arrowData.type.toLowerCase()}switch(type){case\"circle\":Circle.draw(ctx,arrowData);break;case\"bar\":Bar.draw(ctx,arrowData);break;case\"arrow\":default:Arrow.draw(ctx,arrowData)}}}]);return EndPoints}();exports[\"default\"]=EndPoints},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var BarnesHutSolver=function(){function BarnesHutSolver(body,physicsBody,options){(0,_classCallCheck3[\"default\"])(this,BarnesHutSolver);this.body=body;this.physicsBody=physicsBody;this.barnesHutTree;this.setOptions(options);this.randomSeed=5}(0,_createClass3[\"default\"])(BarnesHutSolver,[{key:\"setOptions\",value:function setOptions(options){this.options=options;this.thetaInversed=1/this.options.theta;this.overlapAvoidanceFactor=1-Math.max(0,Math.min(1,this.options.avoidOverlap))}},{key:\"seededRandom\",value:function seededRandom(){var x=Math.sin(this.randomSeed++)*1e4;return x-Math.floor(x)}},{key:\"solve\",value:function solve(){if(this.options.gravitationalConstant!==0&&this.physicsBody.physicsNodeIndices.length>0){var node=void 0;var nodes=this.body.nodes;var nodeIndices=this.physicsBody.physicsNodeIndices;var nodeCount=nodeIndices.length;var barnesHutTree=this._formBarnesHutTree(nodes,nodeIndices);this.barnesHutTree=barnesHutTree;for(var i=0;i<nodeCount;i++){node=nodes[nodeIndices[i]];if(node.options.mass>0){this._getForceContributions(barnesHutTree.root,node)}}}}},{key:\"_getForceContributions\",value:function _getForceContributions(parentBranch,node){this._getForceContribution(parentBranch.children.NW,node);this._getForceContribution(parentBranch.children.NE,node);this._getForceContribution(parentBranch.children.SW,node);this._getForceContribution(parentBranch.children.SE,node)}},{key:\"_getForceContribution\",value:function _getForceContribution(parentBranch,node){if(parentBranch.childrenCount>0){var dx=void 0,dy=void 0,distance=void 0;dx=parentBranch.centerOfMass.x-node.x;dy=parentBranch.centerOfMass.y-node.y;distance=Math.sqrt(dx*dx+dy*dy);if(distance*parentBranch.calcSize>this.thetaInversed){this._calculateForces(distance,dx,dy,node,parentBranch)}else{if(parentBranch.childrenCount===4){this._getForceContributions(parentBranch,node)}else{if(parentBranch.children.data.id!=node.id){this._calculateForces(distance,dx,dy,node,parentBranch)}}}}}},{key:\"_calculateForces\",value:function _calculateForces(distance,dx,dy,node,parentBranch){if(distance===0){distance=.1;dx=distance}if(this.overlapAvoidanceFactor<1&&node.shape.radius){distance=Math.max(.1+this.overlapAvoidanceFactor*node.shape.radius,distance-node.shape.radius)}var gravityForce=this.options.gravitationalConstant*parentBranch.mass*node.options.mass/Math.pow(distance,3);var fx=dx*gravityForce;var fy=dy*gravityForce;this.physicsBody.forces[node.id].x+=fx;this.physicsBody.forces[node.id].y+=fy}},{key:\"_formBarnesHutTree\",value:function _formBarnesHutTree(nodes,nodeIndices){var node=void 0;var nodeCount=nodeIndices.length;var minX=nodes[nodeIndices[0]].x;var minY=nodes[nodeIndices[0]].y;var maxX=nodes[nodeIndices[0]].x;var maxY=nodes[nodeIndices[0]].y;for(var i=1;i<nodeCount;i++){var _node=nodes[nodeIndices[i]];var x=_node.x;var y=_node.y;if(_node.options.mass>0){if(x<minX){minX=x}if(x>maxX){maxX=x}if(y<minY){minY=y}if(y>maxY){maxY=y}}}var sizeDiff=Math.abs(maxX-minX)-Math.abs(maxY-minY);if(sizeDiff>0){minY-=.5*sizeDiff;maxY+=.5*sizeDiff}else{minX+=.5*sizeDiff;maxX-=.5*sizeDiff}var minimumTreeSize=1e-5;var rootSize=Math.max(minimumTreeSize,Math.abs(maxX-minX));var halfRootSize=.5*rootSize;var centerX=.5*(minX+maxX),centerY=.5*(minY+maxY);var barnesHutTree={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:centerX-halfRootSize,maxX:centerX+halfRootSize,minY:centerY-halfRootSize,maxY:centerY+halfRootSize},size:rootSize,calcSize:1/rootSize,children:{data:null},maxWidth:0,level:0,childrenCount:4}};this._splitBranch(barnesHutTree.root);for(var _i=0;_i<nodeCount;_i++){node=nodes[nodeIndices[_i]];if(node.options.mass>0){this._placeInTree(barnesHutTree.root,node)}}return barnesHutTree}},{key:\"_updateBranchMass\",value:function _updateBranchMass(parentBranch,node){var centerOfMass=parentBranch.centerOfMass;var totalMass=parentBranch.mass+node.options.mass;var totalMassInv=1/totalMass;centerOfMass.x=centerOfMass.x*parentBranch.mass+node.x*node.options.mass;centerOfMass.x*=totalMassInv;centerOfMass.y=centerOfMass.y*parentBranch.mass+node.y*node.options.mass;centerOfMass.y*=totalMassInv;parentBranch.mass=totalMass;var biggestSize=Math.max(Math.max(node.height,node.radius),node.width);parentBranch.maxWidth=parentBranch.maxWidth<biggestSize?biggestSize:parentBranch.maxWidth}},{key:\"_placeInTree\",value:function _placeInTree(parentBranch,node,skipMassUpdate){if(skipMassUpdate!=true||skipMassUpdate===undefined){this._updateBranchMass(parentBranch,node)}var range=parentBranch.children.NW.range;var region=void 0;if(range.maxX>node.x){if(range.maxY>node.y){region=\"NW\"}else{region=\"SW\"}}else{if(range.maxY>node.y){region=\"NE\"}else{region=\"SE\"}}this._placeInRegion(parentBranch,node,region)}},{key:\"_placeInRegion\",value:function _placeInRegion(parentBranch,node,region){var children=parentBranch.children[region];switch(children.childrenCount){case 0:children.children.data=node;children.childrenCount=1;this._updateBranchMass(children,node);break;case 1:if(children.children.data.x===node.x&&children.children.data.y===node.y){node.x+=this.seededRandom();node.y+=this.seededRandom()}else{this._splitBranch(children);this._placeInTree(children,node)}break;case 4:this._placeInTree(children,node);break}}},{key:\"_splitBranch\",value:function _splitBranch(parentBranch){var containedNode=null;if(parentBranch.childrenCount===1){containedNode=parentBranch.children.data;parentBranch.mass=0;parentBranch.centerOfMass.x=0;parentBranch.centerOfMass.y=0}parentBranch.childrenCount=4;parentBranch.children.data=null;this._insertRegion(parentBranch,\"NW\");this._insertRegion(parentBranch,\"NE\");this._insertRegion(parentBranch,\"SW\");this._insertRegion(parentBranch,\"SE\");if(containedNode!=null){this._placeInTree(parentBranch,containedNode)}}},{key:\"_insertRegion\",value:function _insertRegion(parentBranch,region){var minX=void 0,maxX=void 0,minY=void 0,maxY=void 0;var childSize=.5*parentBranch.size;switch(region){case\"NW\":minX=parentBranch.range.minX;maxX=parentBranch.range.minX+childSize;minY=parentBranch.range.minY;maxY=parentBranch.range.minY+childSize;break;case\"NE\":minX=parentBranch.range.minX+childSize;maxX=parentBranch.range.maxX;minY=parentBranch.range.minY;maxY=parentBranch.range.minY+childSize;break;case\"SW\":minX=parentBranch.range.minX;maxX=parentBranch.range.minX+childSize;minY=parentBranch.range.minY+childSize;maxY=parentBranch.range.maxY;break;case\"SE\":minX=parentBranch.range.minX+childSize;maxX=parentBranch.range.maxX;minY=parentBranch.range.minY+childSize;maxY=parentBranch.range.maxY;break}parentBranch.children[region]={centerOfMass:{x:0,y:0},mass:0,range:{minX:minX,maxX:maxX,minY:minY,maxY:maxY},size:.5*parentBranch.size,calcSize:2*parentBranch.calcSize,children:{data:null},maxWidth:0,level:parentBranch.level+1,childrenCount:0}}},{key:\"_debug\",value:function _debug(ctx,color){if(this.barnesHutTree!==undefined){ctx.lineWidth=1;this._drawBranch(this.barnesHutTree.root,ctx,color)}}},{key:\"_drawBranch\",value:function _drawBranch(branch,ctx,color){if(color===undefined){color=\"#FF0000\"}if(branch.childrenCount===4){this._drawBranch(branch.children.NW,ctx);this._drawBranch(branch.children.NE,ctx);this._drawBranch(branch.children.SE,ctx);this._drawBranch(branch.children.SW,ctx)}ctx.strokeStyle=color;ctx.beginPath();ctx.moveTo(branch.range.minX,branch.range.minY);ctx.lineTo(branch.range.maxX,branch.range.minY);ctx.stroke();ctx.beginPath();ctx.moveTo(branch.range.maxX,branch.range.minY);ctx.lineTo(branch.range.maxX,branch.range.maxY);ctx.stroke();ctx.beginPath();ctx.moveTo(branch.range.maxX,branch.range.maxY);ctx.lineTo(branch.range.minX,branch.range.maxY);ctx.stroke();ctx.beginPath();ctx.moveTo(branch.range.minX,branch.range.maxY);ctx.lineTo(branch.range.minX,branch.range.minY);ctx.stroke()}}]);return BarnesHutSolver}();exports[\"default\"]=BarnesHutSolver},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var CentralGravitySolver=function(){function CentralGravitySolver(body,physicsBody,options){(0,_classCallCheck3[\"default\"])(this,CentralGravitySolver);this.body=body;this.physicsBody=physicsBody;this.setOptions(options)}(0,_createClass3[\"default\"])(CentralGravitySolver,[{key:\"setOptions\",value:function setOptions(options){this.options=options}},{key:\"solve\",value:function solve(){var dx=void 0,dy=void 0,distance=void 0,node=void 0;var nodes=this.body.nodes;var nodeIndices=this.physicsBody.physicsNodeIndices;var forces=this.physicsBody.forces;for(var i=0;i<nodeIndices.length;i++){var nodeId=nodeIndices[i];node=nodes[nodeId];dx=-node.x;dy=-node.y;distance=Math.sqrt(dx*dx+dy*dy);this._calculateForces(distance,dx,dy,forces,node)}}},{key:\"_calculateForces\",value:function _calculateForces(distance,dx,dy,forces,node){var gravityForce=distance===0?0:this.options.centralGravity/distance;forces[node.id].x=dx*gravityForce;forces[node.id].y=dy*gravityForce}}]);return CentralGravitySolver}();exports[\"default\"]=CentralGravitySolver},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var string=\"string\";var bool=\"boolean\";var number=\"number\";var array=\"array\";var object=\"object\";var dom=\"dom\";var any=\"any\";var endPoints=[\"arrow\",\"circle\",\"bar\"];var allOptions={configure:{enabled:{boolean:bool},filter:{boolean:bool,string:string,array:array,function:\"function\"},container:{dom:dom},showButton:{boolean:bool},__type__:{object:object,boolean:bool,string:string,array:array,function:\"function\"}},edges:{arrows:{to:{enabled:{boolean:bool},scaleFactor:{number:number},type:{string:endPoints},__type__:{object:object,boolean:bool}},middle:{enabled:{boolean:bool},scaleFactor:{number:number},type:{string:endPoints},__type__:{object:object,boolean:bool}},from:{enabled:{boolean:bool},scaleFactor:{number:number},type:{string:endPoints},__type__:{object:object,boolean:bool}},__type__:{string:[\"from\",\"to\",\"middle\"],object:object}},arrowStrikethrough:{boolean:bool},chosen:{label:{boolean:bool,function:\"function\"},edge:{boolean:bool,function:\"function\"},__type__:{object:object,boolean:bool}},color:{color:{string:string},highlight:{string:string},hover:{string:string},inherit:{string:[\"from\",\"to\",\"both\"],boolean:bool},opacity:{number:number},__type__:{object:object,string:string}},dashes:{boolean:bool,array:array},font:{color:{string:string},size:{number:number},face:{string:string},background:{string:string},strokeWidth:{number:number},strokeColor:{string:string},align:{string:[\"horizontal\",\"top\",\"middle\",\"bottom\"]},vadjust:{number:number},multi:{boolean:bool,string:string},bold:{color:{string:string},size:{number:number},face:{string:string},mod:{string:string},vadjust:{number:number},__type__:{object:object,string:string}},boldital:{color:{string:string},size:{number:number},face:{string:string},mod:{string:string},vadjust:{number:number},__type__:{object:object,string:string}},ital:{color:{string:string},size:{number:number},face:{string:string},mod:{string:string},vadjust:{number:number},__type__:{object:object,string:string}},mono:{color:{string:string},size:{number:number},face:{string:string},mod:{string:string},vadjust:{number:number},__type__:{object:object,string:string}},__type__:{object:object,string:string}},hidden:{boolean:bool},hoverWidth:{function:\"function\",number:number},label:{string:string,undefined:\"undefined\"},labelHighlightBold:{boolean:bool},length:{number:number,undefined:\"undefined\"},physics:{boolean:bool},scaling:{min:{number:number},max:{number:number},label:{enabled:{boolean:bool},min:{number:number},max:{number:number},maxVisible:{number:number},drawThreshold:{number:number},__type__:{object:object,boolean:bool}},customScalingFunction:{function:\"function\"},__type__:{object:object}},selectionWidth:{function:\"function\",number:number},selfReferenceSize:{number:number},shadow:{enabled:{boolean:bool},color:{string:string},size:{number:number},x:{number:number},y:{number:number},__type__:{object:object,boolean:bool}},smooth:{enabled:{boolean:bool},type:{string:[\"dynamic\",\"continuous\",\"discrete\",\"diagonalCross\",\"straightCross\",\"horizontal\",\"vertical\",\"curvedCW\",\"curvedCCW\",\"cubicBezier\"]},roundness:{number:number},forceDirection:{string:[\"horizontal\",\"vertical\",\"none\"],boolean:bool},__type__:{object:object,boolean:bool}},title:{string:string,undefined:\"undefined\"},width:{number:number},widthConstraint:{maximum:{number:number},__type__:{object:object,boolean:bool,number:number}},value:{number:number,undefined:\"undefined\"},__type__:{object:object}},groups:{useDefaultGroups:{boolean:bool},__any__:\"get from nodes, will be overwritten below\",__type__:{object:object}},interaction:{dragNodes:{boolean:bool},dragView:{boolean:bool},hideEdgesOnDrag:{boolean:bool},hideNodesOnDrag:{boolean:bool},hover:{boolean:bool},keyboard:{enabled:{boolean:bool},speed:{x:{number:number},y:{number:number},zoom:{number:number},__type__:{object:object}},bindToWindow:{boolean:bool},__type__:{object:object,boolean:bool}},multiselect:{boolean:bool},navigationButtons:{boolean:bool},selectable:{boolean:bool},selectConnectedEdges:{boolean:bool},hoverConnectedEdges:{boolean:bool},tooltipDelay:{number:number},zoomView:{boolean:bool},__type__:{object:object}},layout:{randomSeed:{undefined:\"undefined\",number:number},improvedLayout:{boolean:bool},hierarchical:{enabled:{boolean:bool},levelSeparation:{number:number},nodeSpacing:{number:number},treeSpacing:{number:number},blockShifting:{boolean:bool},edgeMinimization:{boolean:bool},parentCentralization:{boolean:bool},direction:{string:[\"UD\",\"DU\",\"LR\",\"RL\"]},sortMethod:{string:[\"hubsize\",\"directed\"]},__type__:{object:object,boolean:bool}},__type__:{object:object}},manipulation:{enabled:{boolean:bool},initiallyActive:{boolean:bool},addNode:{boolean:bool,function:\"function\"},addEdge:{boolean:bool,function:\"function\"},editNode:{function:\"function\"},editEdge:{editWithoutDrag:{function:\"function\"},__type__:{object:object,boolean:bool,function:\"function\"}},deleteNode:{boolean:bool,function:\"function\"},deleteEdge:{boolean:bool,function:\"function\"},controlNodeStyle:\"get from nodes, will be overwritten below\",__type__:{object:object,boolean:bool}},nodes:{borderWidth:{number:number},borderWidthSelected:{number:number,undefined:\"undefined\"},brokenImage:{string:string,undefined:\"undefined\"},chosen:{label:{boolean:bool,function:\"function\"},node:{boolean:bool,function:\"function\"},__type__:{object:object,boolean:bool}},color:{border:{string:string},background:{string:string},highlight:{border:{string:string},background:{string:string},__type__:{object:object,string:string}},hover:{border:{string:string},background:{string:string},__type__:{object:object,string:string}},__type__:{object:object,string:string}},fixed:{x:{boolean:bool},y:{boolean:bool},__type__:{object:object,boolean:bool}},font:{align:{string:string},color:{string:string},size:{number:number},face:{string:string},background:{string:string},strokeWidth:{number:number},strokeColor:{string:string},vadjust:{number:number},multi:{boolean:bool,string:string},bold:{color:{string:string},size:{number:number},face:{string:string},mod:{string:string},vadjust:{number:number},__type__:{object:object,string:string}},boldital:{color:{string:string},size:{number:number},face:{string:string},mod:{string:string},vadjust:{number:number},__type__:{object:object,string:string}},ital:{color:{string:string},size:{number:number},face:{string:string},mod:{string:string},vadjust:{number:number},__type__:{object:object,string:string}},mono:{color:{string:string},size:{number:number},face:{string:string},mod:{string:string},vadjust:{number:number},__type__:{object:object,string:string}},__type__:{object:object,string:string}},group:{string:string,number:number,undefined:\"undefined\"},heightConstraint:{minimum:{number:number},valign:{string:string},__type__:{object:object,boolean:bool,number:number}},hidden:{boolean:bool},icon:{face:{string:string},code:{string:string},size:{number:number},color:{string:string},__type__:{object:object}},id:{string:string,number:number},image:{selected:{string:string,undefined:\"undefined\"},unselected:{string:string,undefined:\"undefined\"},__type__:{object:object,string:string}},label:{string:string,undefined:\"undefined\"},labelHighlightBold:{boolean:bool},level:{number:number,undefined:\"undefined\"},margin:{top:{number:number},right:{number:number},bottom:{number:number},left:{number:number},__type__:{object:object,number:number}},mass:{number:number},physics:{boolean:bool},scaling:{min:{number:number},max:{number:number},label:{enabled:{boolean:bool},min:{number:number},max:{number:number},maxVisible:{number:number},drawThreshold:{number:number},__type__:{object:object,boolean:bool}},customScalingFunction:{function:\"function\"},__type__:{object:object}},shadow:{enabled:{boolean:bool},color:{string:string},size:{number:number},x:{number:number},y:{number:number},__type__:{object:object,boolean:bool}},shape:{string:[\"ellipse\",\"circle\",\"database\",\"box\",\"text\",\"image\",\"circularImage\",\"diamond\",\"dot\",\"star\",\"triangle\",\"triangleDown\",\"square\",\"icon\",\"hexagon\"]},shapeProperties:{borderDashes:{boolean:bool,array:array},borderRadius:{number:number},interpolation:{boolean:bool},useImageSize:{boolean:bool},useBorderWithImage:{boolean:bool},__type__:{object:object}},size:{number:number},title:{string:string,dom:dom,undefined:\"undefined\"},value:{number:number,undefined:\"undefined\"},widthConstraint:{minimum:{number:number},maximum:{number:number},__type__:{object:object,boolean:bool,number:number}},x:{number:number},y:{number:number},__type__:{object:object}},physics:{enabled:{boolean:bool},barnesHut:{gravitationalConstant:{number:number},centralGravity:{number:number},springLength:{number:number},springConstant:{number:number},damping:{number:number},avoidOverlap:{number:number},__type__:{object:object}},forceAtlas2Based:{gravitationalConstant:{number:number},centralGravity:{number:number},springLength:{number:number},springConstant:{number:number},damping:{number:number},avoidOverlap:{number:number},__type__:{object:object}},repulsion:{centralGravity:{number:number},springLength:{number:number},springConstant:{number:number},nodeDistance:{number:number},damping:{number:number},__type__:{object:object}},hierarchicalRepulsion:{centralGravity:{number:number},springLength:{number:number},springConstant:{number:number},nodeDistance:{number:number},damping:{number:number},__type__:{object:object}},maxVelocity:{number:number},minVelocity:{number:number},solver:{string:[\"barnesHut\",\"repulsion\",\"hierarchicalRepulsion\",\"forceAtlas2Based\"]},stabilization:{enabled:{boolean:bool},iterations:{number:number},updateInterval:{number:number},onlyDynamicEdges:{boolean:bool},\nfit:{boolean:bool},__type__:{object:object,boolean:bool}},timestep:{number:number},adaptiveTimestep:{boolean:bool},__type__:{object:object,boolean:bool}},autoResize:{boolean:bool},clickToUse:{boolean:bool},locale:{string:string},locales:{__any__:{any:any},__type__:{object:object}},height:{string:string},width:{string:string},__type__:{object:object}};allOptions.groups.__any__=allOptions.nodes;allOptions.manipulation.controlNodeStyle=allOptions.nodes;var configureOptions={nodes:{borderWidth:[1,0,10,1],borderWidthSelected:[2,0,10,1],color:{border:[\"color\",\"#2B7CE9\"],background:[\"color\",\"#97C2FC\"],highlight:{border:[\"color\",\"#2B7CE9\"],background:[\"color\",\"#D2E5FF\"]},hover:{border:[\"color\",\"#2B7CE9\"],background:[\"color\",\"#D2E5FF\"]}},fixed:{x:false,y:false},font:{color:[\"color\",\"#343434\"],size:[14,0,100,1],face:[\"arial\",\"verdana\",\"tahoma\"],background:[\"color\",\"none\"],strokeWidth:[0,0,50,1],strokeColor:[\"color\",\"#ffffff\"]},hidden:false,labelHighlightBold:true,physics:true,scaling:{min:[10,0,200,1],max:[30,0,200,1],label:{enabled:false,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},shadow:{enabled:false,color:\"rgba(0,0,0,0.5)\",size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},shape:[\"ellipse\",\"box\",\"circle\",\"database\",\"diamond\",\"dot\",\"square\",\"star\",\"text\",\"triangle\",\"triangleDown\",\"hexagon\"],shapeProperties:{borderDashes:false,borderRadius:[6,0,20,1],interpolation:true,useImageSize:false},size:[25,0,200,1]},edges:{arrows:{to:{enabled:false,scaleFactor:[1,0,3,.05],type:\"arrow\"},middle:{enabled:false,scaleFactor:[1,0,3,.05],type:\"arrow\"},from:{enabled:false,scaleFactor:[1,0,3,.05],type:\"arrow\"}},arrowStrikethrough:true,color:{color:[\"color\",\"#848484\"],highlight:[\"color\",\"#848484\"],hover:[\"color\",\"#848484\"],inherit:[\"from\",\"to\",\"both\",true,false],opacity:[1,0,1,.05]},dashes:false,font:{color:[\"color\",\"#343434\"],size:[14,0,100,1],face:[\"arial\",\"verdana\",\"tahoma\"],background:[\"color\",\"none\"],strokeWidth:[2,0,50,1],strokeColor:[\"color\",\"#ffffff\"],align:[\"horizontal\",\"top\",\"middle\",\"bottom\"]},hidden:false,hoverWidth:[1.5,0,5,.1],labelHighlightBold:true,physics:true,scaling:{min:[1,0,100,1],max:[15,0,100,1],label:{enabled:true,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},selectionWidth:[1.5,0,5,.1],selfReferenceSize:[20,0,200,1],shadow:{enabled:false,color:\"rgba(0,0,0,0.5)\",size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},smooth:{enabled:true,type:[\"dynamic\",\"continuous\",\"discrete\",\"diagonalCross\",\"straightCross\",\"horizontal\",\"vertical\",\"curvedCW\",\"curvedCCW\",\"cubicBezier\"],forceDirection:[\"horizontal\",\"vertical\",\"none\"],roundness:[.5,0,1,.05]},width:[1,0,30,1]},layout:{hierarchical:{enabled:false,levelSeparation:[150,20,500,5],nodeSpacing:[100,20,500,5],treeSpacing:[200,20,500,5],blockShifting:true,edgeMinimization:true,parentCentralization:true,direction:[\"UD\",\"DU\",\"LR\",\"RL\"],sortMethod:[\"hubsize\",\"directed\"]}},interaction:{dragNodes:true,dragView:true,hideEdgesOnDrag:false,hideNodesOnDrag:false,hover:false,keyboard:{enabled:false,speed:{x:[10,0,40,1],y:[10,0,40,1],zoom:[.02,0,.1,.005]},bindToWindow:true},multiselect:false,navigationButtons:false,selectable:true,selectConnectedEdges:true,hoverConnectedEdges:true,tooltipDelay:[300,0,1e3,25],zoomView:true},manipulation:{enabled:false,initiallyActive:false},physics:{enabled:true,barnesHut:{gravitationalConstant:[-2e3,-3e4,0,50],centralGravity:[.3,0,10,.05],springLength:[95,0,500,5],springConstant:[.04,0,1.2,.005],damping:[.09,0,1,.01],avoidOverlap:[0,0,1,.01]},forceAtlas2Based:{gravitationalConstant:[-50,-500,0,1],centralGravity:[.01,0,1,.005],springLength:[95,0,500,5],springConstant:[.08,0,1.2,.005],damping:[.4,0,1,.01],avoidOverlap:[0,0,1,.01]},repulsion:{centralGravity:[.2,0,10,.05],springLength:[200,0,500,5],springConstant:[.05,0,1.2,.005],nodeDistance:[100,0,500,5],damping:[.09,0,1,.01]},hierarchicalRepulsion:{centralGravity:[.2,0,10,.05],springLength:[100,0,500,5],springConstant:[.01,0,1.2,.005],nodeDistance:[120,0,500,5],damping:[.09,0,1,.01]},maxVelocity:[50,0,150,1],minVelocity:[.1,.01,.5,.01],solver:[\"barnesHut\",\"forceAtlas2Based\",\"repulsion\",\"hierarchicalRepulsion\"],timestep:[.5,.01,1,.01]}};exports.allOptions=allOptions;exports.configureOptions=configureOptions},function(module,exports,__webpack_require__){\"use strict\";var util=__webpack_require__(2);util.extend(exports,__webpack_require__(159));util.extend(exports,__webpack_require__(177));util.extend(exports,__webpack_require__(181))},function(module,exports,__webpack_require__){__webpack_require__(49);__webpack_require__(60);module.exports=__webpack_require__(136)},function(module,exports,__webpack_require__){\"use strict\";var addToUnscopables=__webpack_require__(126);var step=__webpack_require__(127);var Iterators=__webpack_require__(31);var toIObject=__webpack_require__(25);module.exports=__webpack_require__(79)(Array,\"Array\",function(iterated,kind){this._t=toIObject(iterated);this._i=0;this._k=kind},function(){var O=this._t;var kind=this._k;var index=this._i++;if(!O||index>=O.length){this._t=undefined;return step(1)}if(kind==\"keys\")return step(0,index);if(kind==\"values\")return step(0,O[index]);return step(0,[index,O[index]])},\"values\");Iterators.Arguments=Iterators.Array;addToUnscopables(\"keys\");addToUnscopables(\"values\");addToUnscopables(\"entries\")},function(module,exports){module.exports=function(){}},function(module,exports){module.exports=function(done,value){return{value:value,done:!!done}}},function(module,exports){module.exports=function(it){if(typeof it!=\"function\")throw TypeError(it+\" is not a function!\");return it}},function(module,exports,__webpack_require__){\"use strict\";var create=__webpack_require__(54);var descriptor=__webpack_require__(39);var setToStringTag=__webpack_require__(59);var IteratorPrototype={};__webpack_require__(26)(IteratorPrototype,__webpack_require__(13)(\"iterator\"),function(){return this});module.exports=function(Constructor,NAME,next){Constructor.prototype=create(IteratorPrototype,{next:descriptor(1,next)});setToStringTag(Constructor,NAME+\" Iterator\")}},function(module,exports,__webpack_require__){var dP=__webpack_require__(20);var anObject=__webpack_require__(27);var getKeys=__webpack_require__(33);module.exports=__webpack_require__(21)?Object.defineProperties:function defineProperties(O,Properties){anObject(O);var keys=getKeys(Properties);var length=keys.length;var i=0;var P;while(length>i)dP.f(O,P=keys[i++],Properties[P]);return O}},function(module,exports,__webpack_require__){var toIObject=__webpack_require__(25);var toLength=__webpack_require__(132);var toAbsoluteIndex=__webpack_require__(133);module.exports=function(IS_INCLUDES){return function($this,el,fromIndex){var O=toIObject($this);var length=toLength(O.length);var index=toAbsoluteIndex(fromIndex,length);var value;if(IS_INCLUDES&&el!=el)while(length>index){value=O[index++];if(value!=value)return true}else for(;length>index;index++)if(IS_INCLUDES||index in O){if(O[index]===el)return IS_INCLUDES||index||0}return!IS_INCLUDES&&-1}}},function(module,exports,__webpack_require__){var toInteger=__webpack_require__(55);var min=Math.min;module.exports=function(it){return it>0?min(toInteger(it),9007199254740991):0}},function(module,exports,__webpack_require__){var toInteger=__webpack_require__(55);var max=Math.max;var min=Math.min;module.exports=function(index,length){index=toInteger(index);return index<0?max(index+length,0):min(index,length)}},function(module,exports,__webpack_require__){var document=__webpack_require__(18).document;module.exports=document&&document.documentElement},function(module,exports,__webpack_require__){var toInteger=__webpack_require__(55);var defined=__webpack_require__(51);module.exports=function(TO_STRING){return function(that,pos){var s=String(defined(that));var i=toInteger(pos);var l=s.length;var a,b;if(i<0||i>=l)return TO_STRING?\"\":undefined;a=s.charCodeAt(i);return a<55296||a>56319||i+1===l||(b=s.charCodeAt(i+1))<56320||b>57343?TO_STRING?s.charAt(i):a:TO_STRING?s.slice(i,i+2):(a-55296<<10)+(b-56320)+65536}}},function(module,exports,__webpack_require__){var anObject=__webpack_require__(27);var get=__webpack_require__(137);module.exports=__webpack_require__(7).getIterator=function(it){var iterFn=get(it);if(typeof iterFn!=\"function\")throw TypeError(it+\" is not iterable!\");return anObject(iterFn.call(it))}},function(module,exports,__webpack_require__){var classof=__webpack_require__(86);var ITERATOR=__webpack_require__(13)(\"iterator\");var Iterators=__webpack_require__(31);module.exports=__webpack_require__(7).getIteratorMethod=function(it){if(it!=undefined)return it[ITERATOR]||it[\"@@iterator\"]||Iterators[classof(it)]}},function(module,exports,__webpack_require__){__webpack_require__(139);var $Object=__webpack_require__(7).Object;module.exports=function create(P,D){return $Object.create(P,D)}},function(module,exports,__webpack_require__){var $export=__webpack_require__(17);$export($export.S,\"Object\",{create:__webpack_require__(54)})},function(module,exports,__webpack_require__){__webpack_require__(141);module.exports=__webpack_require__(7).Object.keys},function(module,exports,__webpack_require__){var toObject=__webpack_require__(41);var $keys=__webpack_require__(33);__webpack_require__(87)(\"keys\",function(){return function keys(it){return $keys(toObject(it))}})},function(module,exports,__webpack_require__){module.exports={default:__webpack_require__(143),__esModule:true}},function(module,exports,__webpack_require__){__webpack_require__(60);__webpack_require__(49);module.exports=__webpack_require__(61).f(\"iterator\")},function(module,exports,__webpack_require__){module.exports={default:__webpack_require__(145),__esModule:true}},function(module,exports,__webpack_require__){__webpack_require__(146);__webpack_require__(151);__webpack_require__(152);__webpack_require__(153);module.exports=__webpack_require__(7).Symbol},function(module,exports,__webpack_require__){\"use strict\";var global=__webpack_require__(18);var has=__webpack_require__(22);var DESCRIPTORS=__webpack_require__(21);var $export=__webpack_require__(17);var redefine=__webpack_require__(83);var META=__webpack_require__(147).KEY;var $fails=__webpack_require__(28);var shared=__webpack_require__(57);var setToStringTag=__webpack_require__(59);var uid=__webpack_require__(40);var wks=__webpack_require__(13);var wksExt=__webpack_require__(61);var wksDefine=__webpack_require__(62);var enumKeys=__webpack_require__(148);var isArray=__webpack_require__(149);var anObject=__webpack_require__(27);var toIObject=__webpack_require__(25);var toPrimitive=__webpack_require__(53);var createDesc=__webpack_require__(39);var _create=__webpack_require__(54);var gOPNExt=__webpack_require__(150);var $GOPD=__webpack_require__(89);var $DP=__webpack_require__(20);var $keys=__webpack_require__(33);var gOPD=$GOPD.f;var dP=$DP.f;var gOPN=gOPNExt.f;var $Symbol=global.Symbol;var $JSON=global.JSON;var _stringify=$JSON&&$JSON.stringify;var PROTOTYPE=\"prototype\";var HIDDEN=wks(\"_hidden\");var TO_PRIMITIVE=wks(\"toPrimitive\");var isEnum={}.propertyIsEnumerable;var SymbolRegistry=shared(\"symbol-registry\");var AllSymbols=shared(\"symbols\");var OPSymbols=shared(\"op-symbols\");var ObjectProto=Object[PROTOTYPE];var USE_NATIVE=typeof $Symbol==\"function\";var QObject=global.QObject;var setter=!QObject||!QObject[PROTOTYPE]||!QObject[PROTOTYPE].findChild;var setSymbolDesc=DESCRIPTORS&&$fails(function(){return _create(dP({},\"a\",{get:function(){return dP(this,\"a\",{value:7}).a}})).a!=7})?function(it,key,D){var protoDesc=gOPD(ObjectProto,key);if(protoDesc)delete ObjectProto[key];dP(it,key,D);if(protoDesc&&it!==ObjectProto)dP(ObjectProto,key,protoDesc)}:dP;var wrap=function(tag){var sym=AllSymbols[tag]=_create($Symbol[PROTOTYPE]);sym._k=tag;return sym};var isSymbol=USE_NATIVE&&typeof $Symbol.iterator==\"symbol\"?function(it){return typeof it==\"symbol\"}:function(it){return it instanceof $Symbol};var $defineProperty=function defineProperty(it,key,D){if(it===ObjectProto)$defineProperty(OPSymbols,key,D);anObject(it);key=toPrimitive(key,true);anObject(D);if(has(AllSymbols,key)){if(!D.enumerable){if(!has(it,HIDDEN))dP(it,HIDDEN,createDesc(1,{}));it[HIDDEN][key]=true}else{if(has(it,HIDDEN)&&it[HIDDEN][key])it[HIDDEN][key]=false;D=_create(D,{enumerable:createDesc(0,false)})}return setSymbolDesc(it,key,D)}return dP(it,key,D)};var $defineProperties=function defineProperties(it,P){anObject(it);var keys=enumKeys(P=toIObject(P));var i=0;var l=keys.length;var key;while(l>i)$defineProperty(it,key=keys[i++],P[key]);return it};var $create=function create(it,P){return P===undefined?_create(it):$defineProperties(_create(it),P)};var $propertyIsEnumerable=function propertyIsEnumerable(key){var E=isEnum.call(this,key=toPrimitive(key,true));if(this===ObjectProto&&has(AllSymbols,key)&&!has(OPSymbols,key))return false;return E||!has(this,key)||!has(AllSymbols,key)||has(this,HIDDEN)&&this[HIDDEN][key]?E:true};var $getOwnPropertyDescriptor=function getOwnPropertyDescriptor(it,key){it=toIObject(it);key=toPrimitive(key,true);if(it===ObjectProto&&has(AllSymbols,key)&&!has(OPSymbols,key))return;var D=gOPD(it,key);if(D&&has(AllSymbols,key)&&!(has(it,HIDDEN)&&it[HIDDEN][key]))D.enumerable=true;return D};var $getOwnPropertyNames=function getOwnPropertyNames(it){var names=gOPN(toIObject(it));var result=[];var i=0;var key;while(names.length>i){if(!has(AllSymbols,key=names[i++])&&key!=HIDDEN&&key!=META)result.push(key)}return result};var $getOwnPropertySymbols=function getOwnPropertySymbols(it){var IS_OP=it===ObjectProto;var names=gOPN(IS_OP?OPSymbols:toIObject(it));var result=[];var i=0;var key;while(names.length>i){if(has(AllSymbols,key=names[i++])&&(IS_OP?has(ObjectProto,key):true))result.push(AllSymbols[key])}return result};if(!USE_NATIVE){$Symbol=function Symbol(){if(this instanceof $Symbol)throw TypeError(\"Symbol is not a constructor!\");var tag=uid(arguments.length>0?arguments[0]:undefined);var $set=function(value){if(this===ObjectProto)$set.call(OPSymbols,value);if(has(this,HIDDEN)&&has(this[HIDDEN],tag))this[HIDDEN][tag]=false;setSymbolDesc(this,tag,createDesc(1,value))};if(DESCRIPTORS&&setter)setSymbolDesc(ObjectProto,tag,{configurable:true,set:$set});return wrap(tag)};redefine($Symbol[PROTOTYPE],\"toString\",function toString(){return this._k});$GOPD.f=$getOwnPropertyDescriptor;$DP.f=$defineProperty;__webpack_require__(88).f=gOPNExt.f=$getOwnPropertyNames;__webpack_require__(42).f=$propertyIsEnumerable;__webpack_require__(63).f=$getOwnPropertySymbols;if(DESCRIPTORS&&!__webpack_require__(52)){redefine(ObjectProto,\"propertyIsEnumerable\",$propertyIsEnumerable,true)}wksExt.f=function(name){return wrap(wks(name))}}$export($export.G+$export.W+$export.F*!USE_NATIVE,{Symbol:$Symbol});for(var es6Symbols=\"hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables\".split(\",\"),j=0;es6Symbols.length>j;)wks(es6Symbols[j++]);for(var wellKnownSymbols=$keys(wks.store),k=0;wellKnownSymbols.length>k;)wksDefine(wellKnownSymbols[k++]);$export($export.S+$export.F*!USE_NATIVE,\"Symbol\",{for:function(key){return has(SymbolRegistry,key+=\"\")?SymbolRegistry[key]:SymbolRegistry[key]=$Symbol(key)},keyFor:function keyFor(sym){if(!isSymbol(sym))throw TypeError(sym+\" is not a symbol!\");for(var key in SymbolRegistry)if(SymbolRegistry[key]===sym)return key},useSetter:function(){setter=true},useSimple:function(){setter=false}});$export($export.S+$export.F*!USE_NATIVE,\"Object\",{create:$create,defineProperty:$defineProperty,defineProperties:$defineProperties,getOwnPropertyDescriptor:$getOwnPropertyDescriptor,getOwnPropertyNames:$getOwnPropertyNames,getOwnPropertySymbols:$getOwnPropertySymbols});$JSON&&$export($export.S+$export.F*(!USE_NATIVE||$fails(function(){var S=$Symbol();return _stringify([S])!=\"[null]\"||_stringify({a:S})!=\"{}\"||_stringify(Object(S))!=\"{}\"})),\"JSON\",{stringify:function stringify(it){if(it===undefined||isSymbol(it))return;var args=[it];var i=1;var replacer,$replacer;while(arguments.length>i)args.push(arguments[i++]);replacer=args[1];if(typeof replacer==\"function\")$replacer=replacer;if($replacer||!isArray(replacer))replacer=function(key,value){if($replacer)value=$replacer.call(this,key,value);if(!isSymbol(value))return value};args[1]=replacer;return _stringify.apply($JSON,args)}});$Symbol[PROTOTYPE][TO_PRIMITIVE]||__webpack_require__(26)($Symbol[PROTOTYPE],TO_PRIMITIVE,$Symbol[PROTOTYPE].valueOf);setToStringTag($Symbol,\"Symbol\");setToStringTag(Math,\"Math\",true);setToStringTag(global.JSON,\"JSON\",true)},function(module,exports,__webpack_require__){var META=__webpack_require__(40)(\"meta\");var isObject=__webpack_require__(32);var has=__webpack_require__(22);var setDesc=__webpack_require__(20).f;var id=0;var isExtensible=Object.isExtensible||function(){return true};var FREEZE=!__webpack_require__(28)(function(){return isExtensible(Object.preventExtensions({}))});var setMeta=function(it){setDesc(it,META,{value:{i:\"O\"+ ++id,w:{}}})};var fastKey=function(it,create){if(!isObject(it))return typeof it==\"symbol\"?it:(typeof it==\"string\"?\"S\":\"P\")+it;if(!has(it,META)){if(!isExtensible(it))return\"F\";if(!create)return\"E\";setMeta(it)}return it[META].i};var getWeak=function(it,create){if(!has(it,META)){if(!isExtensible(it))return true;if(!create)return false;setMeta(it)}return it[META].w};var onFreeze=function(it){if(FREEZE&&meta.NEED&&isExtensible(it)&&!has(it,META))setMeta(it);return it};var meta=module.exports={KEY:META,NEED:false,fastKey:fastKey,getWeak:getWeak,onFreeze:onFreeze}},function(module,exports,__webpack_require__){var getKeys=__webpack_require__(33);var gOPS=__webpack_require__(63);var pIE=__webpack_require__(42);module.exports=function(it){var result=getKeys(it);var getSymbols=gOPS.f;if(getSymbols){var symbols=getSymbols(it);var isEnum=pIE.f;var i=0;var key;while(symbols.length>i)if(isEnum.call(it,key=symbols[i++]))result.push(key)}return result}},function(module,exports,__webpack_require__){var cof=__webpack_require__(50);module.exports=Array.isArray||function isArray(arg){return cof(arg)==\"Array\"}},function(module,exports,__webpack_require__){var toIObject=__webpack_require__(25);var gOPN=__webpack_require__(88).f;var toString={}.toString;var windowNames=typeof window==\"object\"&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];var getWindowNames=function(it){try{return gOPN(it)}catch(e){return windowNames.slice()}};module.exports.f=function getOwnPropertyNames(it){return windowNames&&toString.call(it)==\"[object Window]\"?getWindowNames(it):gOPN(toIObject(it))}},function(module,exports){},function(module,exports,__webpack_require__){__webpack_require__(62)(\"asyncIterator\")},function(module,exports,__webpack_require__){__webpack_require__(62)(\"observable\")},function(module,exports,__webpack_require__){(function(module){var require;(function(global,factory){true?module.exports=factory():typeof define===\"function\"&&define.amd?define(factory):global.moment=factory()})(this,function(){\"use strict\";var hookCallback;function hooks(){return hookCallback.apply(null,arguments)}function setHookCallback(callback){hookCallback=callback}function isArray(input){return input instanceof Array||Object.prototype.toString.call(input)===\"[object Array]\"}function isObject(input){return input!=null&&Object.prototype.toString.call(input)===\"[object Object]\"}function isObjectEmpty(obj){if(Object.getOwnPropertyNames){return Object.getOwnPropertyNames(obj).length===0}else{var k;for(k in obj){if(obj.hasOwnProperty(k)){return false}}return true}}function isUndefined(input){return input===void 0}function isNumber(input){return typeof input===\"number\"||Object.prototype.toString.call(input)===\"[object Number]\"}function isDate(input){return input instanceof Date||Object.prototype.toString.call(input)===\"[object Date]\"}function map(arr,fn){var res=[],i;for(i=0;i<arr.length;++i){res.push(fn(arr[i],i))}return res}function hasOwnProp(a,b){return Object.prototype.hasOwnProperty.call(a,b)}function extend(a,b){for(var i in b){if(hasOwnProp(b,i)){a[i]=b[i]}}if(hasOwnProp(b,\"toString\")){a.toString=b.toString}if(hasOwnProp(b,\"valueOf\")){a.valueOf=b.valueOf}return a}function createUTC(input,format,locale,strict){return createLocalOrUTC(input,format,locale,strict,true).utc()}function defaultParsingFlags(){return{empty:false,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:false,invalidMonth:null,invalidFormat:false,userInvalidated:false,iso:false,parsedDateParts:[],meridiem:null,rfc2822:false,weekdayMismatch:false}}function getParsingFlags(m){if(m._pf==null){m._pf=defaultParsingFlags()}return m._pf}var some;if(Array.prototype.some){some=Array.prototype.some}else{some=function(fun){var t=Object(this);var len=t.length>>>0;for(var i=0;i<len;i++){if(i in t&&fun.call(this,t[i],i,t)){return true}}return false}}function isValid(m){if(m._isValid==null){var flags=getParsingFlags(m);var parsedParts=some.call(flags.parsedDateParts,function(i){return i!=null});var isNowValid=!isNaN(m._d.getTime())&&flags.overflow<0&&!flags.empty&&!flags.invalidMonth&&!flags.invalidWeekday&&!flags.weekdayMismatch&&!flags.nullInput&&!flags.invalidFormat&&!flags.userInvalidated&&(!flags.meridiem||flags.meridiem&&parsedParts);if(m._strict){isNowValid=isNowValid&&flags.charsLeftOver===0&&flags.unusedTokens.length===0&&flags.bigHour===undefined}if(Object.isFrozen==null||!Object.isFrozen(m)){m._isValid=isNowValid}else{return isNowValid}}return m._isValid}function createInvalid(flags){var m=createUTC(NaN);if(flags!=null){extend(getParsingFlags(m),flags)}else{getParsingFlags(m).userInvalidated=true}return m}var momentProperties=hooks.momentProperties=[];function copyConfig(to,from){var i,prop,val;if(!isUndefined(from._isAMomentObject)){to._isAMomentObject=from._isAMomentObject}if(!isUndefined(from._i)){to._i=from._i}if(!isUndefined(from._f)){to._f=from._f}if(!isUndefined(from._l)){to._l=from._l}if(!isUndefined(from._strict)){to._strict=from._strict}if(!isUndefined(from._tzm)){to._tzm=from._tzm}if(!isUndefined(from._isUTC)){to._isUTC=from._isUTC}if(!isUndefined(from._offset)){to._offset=from._offset}if(!isUndefined(from._pf)){to._pf=getParsingFlags(from)}if(!isUndefined(from._locale)){to._locale=from._locale}if(momentProperties.length>0){for(i=0;i<momentProperties.length;i++){prop=momentProperties[i];val=from[prop];if(!isUndefined(val)){to[prop]=val}}}return to}var updateInProgress=false;function Moment(config){copyConfig(this,config);this._d=new Date(config._d!=null?config._d.getTime():NaN);if(!this.isValid()){this._d=new Date(NaN)}if(updateInProgress===false){updateInProgress=true;hooks.updateOffset(this);updateInProgress=false}}function isMoment(obj){return obj instanceof Moment||obj!=null&&obj._isAMomentObject!=null}function absFloor(number){if(number<0){return Math.ceil(number)||0}else{return Math.floor(number)}}function toInt(argumentForCoercion){var coercedNumber=+argumentForCoercion,value=0;if(coercedNumber!==0&&isFinite(coercedNumber)){value=absFloor(coercedNumber)}return value}function compareArrays(array1,array2,dontConvert){var len=Math.min(array1.length,array2.length),lengthDiff=Math.abs(array1.length-array2.length),diffs=0,i;for(i=0;i<len;i++){if(dontConvert&&array1[i]!==array2[i]||!dontConvert&&toInt(array1[i])!==toInt(array2[i])){diffs++}}return diffs+lengthDiff}function warn(msg){if(hooks.suppressDeprecationWarnings===false&&typeof console!==\"undefined\"&&console.warn){console.warn(\"Deprecation warning: \"+msg)}}function deprecate(msg,fn){var firstTime=true;return extend(function(){if(hooks.deprecationHandler!=null){hooks.deprecationHandler(null,msg)}if(firstTime){var args=[];var arg;for(var i=0;i<arguments.length;i++){arg=\"\";if(typeof arguments[i]===\"object\"){arg+=\"\\n[\"+i+\"] \";for(var key in arguments[0]){arg+=key+\": \"+arguments[0][key]+\", \"}arg=arg.slice(0,-2)}else{arg=arguments[i]}args.push(arg)}warn(msg+\"\\nArguments: \"+Array.prototype.slice.call(args).join(\"\")+\"\\n\"+(new Error).stack);firstTime=false}return fn.apply(this,arguments)},fn)}var deprecations={};function deprecateSimple(name,msg){if(hooks.deprecationHandler!=null){hooks.deprecationHandler(name,msg)}if(!deprecations[name]){warn(msg);deprecations[name]=true}}hooks.suppressDeprecationWarnings=false;hooks.deprecationHandler=null;function isFunction(input){return input instanceof Function||Object.prototype.toString.call(input)===\"[object Function]\"}function set(config){var prop,i;for(i in config){prop=config[i];if(isFunction(prop)){this[i]=prop}else{this[\"_\"+i]=prop}}this._config=config;this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+\"|\"+/\\d{1,2}/.source)}function mergeConfigs(parentConfig,childConfig){var res=extend({},parentConfig),prop;for(prop in childConfig){if(hasOwnProp(childConfig,prop)){if(isObject(parentConfig[prop])&&isObject(childConfig[prop])){res[prop]={};extend(res[prop],parentConfig[prop]);extend(res[prop],childConfig[prop])}else if(childConfig[prop]!=null){res[prop]=childConfig[prop]}else{delete res[prop]}}}for(prop in parentConfig){if(hasOwnProp(parentConfig,prop)&&!hasOwnProp(childConfig,prop)&&isObject(parentConfig[prop])){res[prop]=extend({},res[prop])}}return res}function Locale(config){if(config!=null){this.set(config)}}var keys;if(Object.keys){keys=Object.keys}else{keys=function(obj){var i,res=[];for(i in obj){if(hasOwnProp(obj,i)){res.push(i)}}return res}}var defaultCalendar={sameDay:\"[Today at] LT\",nextDay:\"[Tomorrow at] LT\",nextWeek:\"dddd [at] LT\",lastDay:\"[Yesterday at] LT\",lastWeek:\"[Last] dddd [at] LT\",sameElse:\"L\"};function calendar(key,mom,now){var output=this._calendar[key]||this._calendar[\"sameElse\"];return isFunction(output)?output.call(mom,now):output}var defaultLongDateFormat={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"};function longDateFormat(key){var format=this._longDateFormat[key],formatUpper=this._longDateFormat[key.toUpperCase()];if(format||!formatUpper){return format}this._longDateFormat[key]=formatUpper.replace(/MMMM|MM|DD|dddd/g,function(val){return val.slice(1)});return this._longDateFormat[key]}var defaultInvalidDate=\"Invalid date\";function invalidDate(){return this._invalidDate}var defaultOrdinal=\"%d\";var defaultDayOfMonthOrdinalParse=/\\d{1,2}/;function ordinal(number){return this._ordinal.replace(\"%d\",number)}var defaultRelativeTime={future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",ss:\"%d seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"};function relativeTime(number,withoutSuffix,string,isFuture){var output=this._relativeTime[string];return isFunction(output)?output(number,withoutSuffix,string,isFuture):output.replace(/%d/i,number)}function pastFuture(diff,output){var format=this._relativeTime[diff>0?\"future\":\"past\"];return isFunction(format)?format(output):format.replace(/%s/i,output)}var aliases={};function addUnitAlias(unit,shorthand){var lowerCase=unit.toLowerCase();aliases[lowerCase]=aliases[lowerCase+\"s\"]=aliases[shorthand]=unit}function normalizeUnits(units){return typeof units===\"string\"?aliases[units]||aliases[units.toLowerCase()]:undefined}function normalizeObjectUnits(inputObject){var normalizedInput={},normalizedProp,prop;for(prop in inputObject){if(hasOwnProp(inputObject,prop)){normalizedProp=normalizeUnits(prop);if(normalizedProp){normalizedInput[normalizedProp]=inputObject[prop]}}}return normalizedInput}var priorities={};function addUnitPriority(unit,priority){priorities[unit]=priority}function getPrioritizedUnits(unitsObj){var units=[];for(var u in unitsObj){units.push({unit:u,priority:priorities[u]})}units.sort(function(a,b){return a.priority-b.priority});return units}function zeroFill(number,targetLength,forceSign){var absNumber=\"\"+Math.abs(number),zerosToFill=targetLength-absNumber.length,sign=number>=0;return(sign?forceSign?\"+\":\"\":\"-\")+Math.pow(10,Math.max(0,zerosToFill)).toString().substr(1)+absNumber}var formattingTokens=/(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;var localFormattingTokens=/(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;var formatFunctions={};var formatTokenFunctions={};function addFormatToken(token,padded,ordinal,callback){var func=callback;if(typeof callback===\"string\"){func=function(){return this[callback]()}}if(token){formatTokenFunctions[token]=func}if(padded){formatTokenFunctions[padded[0]]=function(){return zeroFill(func.apply(this,arguments),padded[1],padded[2])}}if(ordinal){formatTokenFunctions[ordinal]=function(){return this.localeData().ordinal(func.apply(this,arguments),token)}}}function removeFormattingTokens(input){if(input.match(/\\[[\\s\\S]/)){return input.replace(/^\\[|\\]$/g,\"\")}return input.replace(/\\\\/g,\"\")}function makeFormatFunction(format){var array=format.match(formattingTokens),i,length;for(i=0,length=array.length;i<length;i++){if(formatTokenFunctions[array[i]]){array[i]=formatTokenFunctions[array[i]]}else{array[i]=removeFormattingTokens(array[i])}}return function(mom){var output=\"\",i;for(i=0;i<length;i++){output+=isFunction(array[i])?array[i].call(mom,format):array[i]}return output}}function formatMoment(m,format){if(!m.isValid()){return m.localeData().invalidDate()}format=expandFormat(format,m.localeData());formatFunctions[format]=formatFunctions[format]||makeFormatFunction(format);return formatFunctions[format](m)}function expandFormat(format,locale){var i=5;function replaceLongDateFormatTokens(input){return locale.longDateFormat(input)||input}localFormattingTokens.lastIndex=0;while(i>=0&&localFormattingTokens.test(format)){format=format.replace(localFormattingTokens,replaceLongDateFormatTokens);localFormattingTokens.lastIndex=0;i-=1}return format}var match1=/\\d/;var match2=/\\d\\d/;var match3=/\\d{3}/;var match4=/\\d{4}/;var match6=/[+-]?\\d{6}/;var match1to2=/\\d\\d?/;var match3to4=/\\d\\d\\d\\d?/;var match5to6=/\\d\\d\\d\\d\\d\\d?/;var match1to3=/\\d{1,3}/;var match1to4=/\\d{1,4}/;var match1to6=/[+-]?\\d{1,6}/;var matchUnsigned=/\\d+/;var matchSigned=/[+-]?\\d+/;var matchOffset=/Z|[+-]\\d\\d:?\\d\\d/gi;var matchShortOffset=/Z|[+-]\\d\\d(?::?\\d\\d)?/gi;var matchTimestamp=/[+-]?\\d+(\\.\\d{1,3})?/;var matchWord=/[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i;var regexes={};function addRegexToken(token,regex,strictRegex){regexes[token]=isFunction(regex)?regex:function(isStrict,localeData){return isStrict&&strictRegex?strictRegex:regex}}function getParseRegexForToken(token,config){if(!hasOwnProp(regexes,token)){return new RegExp(unescapeFormat(token))}return regexes[token](config._strict,config._locale)}function unescapeFormat(s){return regexEscape(s.replace(\"\\\\\",\"\").replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g,function(matched,p1,p2,p3,p4){return p1||p2||p3||p4}))}function regexEscape(s){return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\")}var tokens={};function addParseToken(token,callback){var i,func=callback;if(typeof token===\"string\"){token=[token]}if(isNumber(callback)){func=function(input,array){array[callback]=toInt(input)}}for(i=0;i<token.length;i++){tokens[token[i]]=func}}function addWeekParseToken(token,callback){addParseToken(token,function(input,array,config,token){config._w=config._w||{};callback(input,config._w,config,token)})}function addTimeToArrayFromToken(token,input,config){if(input!=null&&hasOwnProp(tokens,token)){tokens[token](input,config._a,config,token)}}var YEAR=0;var MONTH=1;var DATE=2;var HOUR=3;var MINUTE=4;var SECOND=5;var MILLISECOND=6;var WEEK=7;var WEEKDAY=8;addFormatToken(\"Y\",0,0,function(){var y=this.year();return y<=9999?\"\"+y:\"+\"+y});addFormatToken(0,[\"YY\",2],0,function(){return this.year()%100});addFormatToken(0,[\"YYYY\",4],0,\"year\");addFormatToken(0,[\"YYYYY\",5],0,\"year\");addFormatToken(0,[\"YYYYYY\",6,true],0,\"year\");addUnitAlias(\"year\",\"y\");addUnitPriority(\"year\",1);addRegexToken(\"Y\",matchSigned)\n;addRegexToken(\"YY\",match1to2,match2);addRegexToken(\"YYYY\",match1to4,match4);addRegexToken(\"YYYYY\",match1to6,match6);addRegexToken(\"YYYYYY\",match1to6,match6);addParseToken([\"YYYYY\",\"YYYYYY\"],YEAR);addParseToken(\"YYYY\",function(input,array){array[YEAR]=input.length===2?hooks.parseTwoDigitYear(input):toInt(input)});addParseToken(\"YY\",function(input,array){array[YEAR]=hooks.parseTwoDigitYear(input)});addParseToken(\"Y\",function(input,array){array[YEAR]=parseInt(input,10)});function daysInYear(year){return isLeapYear(year)?366:365}function isLeapYear(year){return year%4===0&&year%100!==0||year%400===0}hooks.parseTwoDigitYear=function(input){return toInt(input)+(toInt(input)>68?1900:2e3)};var getSetYear=makeGetSet(\"FullYear\",true);function getIsLeapYear(){return isLeapYear(this.year())}function makeGetSet(unit,keepTime){return function(value){if(value!=null){set$1(this,unit,value);hooks.updateOffset(this,keepTime);return this}else{return get(this,unit)}}}function get(mom,unit){return mom.isValid()?mom._d[\"get\"+(mom._isUTC?\"UTC\":\"\")+unit]():NaN}function set$1(mom,unit,value){if(mom.isValid()&&!isNaN(value)){if(unit===\"FullYear\"&&isLeapYear(mom.year())){mom._d[\"set\"+(mom._isUTC?\"UTC\":\"\")+unit](value,mom.month(),daysInMonth(value,mom.month()))}else{mom._d[\"set\"+(mom._isUTC?\"UTC\":\"\")+unit](value)}}}function stringGet(units){units=normalizeUnits(units);if(isFunction(this[units])){return this[units]()}return this}function stringSet(units,value){if(typeof units===\"object\"){units=normalizeObjectUnits(units);var prioritized=getPrioritizedUnits(units);for(var i=0;i<prioritized.length;i++){this[prioritized[i].unit](units[prioritized[i].unit])}}else{units=normalizeUnits(units);if(isFunction(this[units])){return this[units](value)}}return this}function mod(n,x){return(n%x+x)%x}var indexOf;if(Array.prototype.indexOf){indexOf=Array.prototype.indexOf}else{indexOf=function(o){var i;for(i=0;i<this.length;++i){if(this[i]===o){return i}}return-1}}function daysInMonth(year,month){if(isNaN(year)||isNaN(month)){return NaN}var modMonth=mod(month,12);year+=(month-modMonth)/12;return modMonth===1?isLeapYear(year)?29:28:31-modMonth%7%2}addFormatToken(\"M\",[\"MM\",2],\"Mo\",function(){return this.month()+1});addFormatToken(\"MMM\",0,0,function(format){return this.localeData().monthsShort(this,format)});addFormatToken(\"MMMM\",0,0,function(format){return this.localeData().months(this,format)});addUnitAlias(\"month\",\"M\");addUnitPriority(\"month\",8);addRegexToken(\"M\",match1to2);addRegexToken(\"MM\",match1to2,match2);addRegexToken(\"MMM\",function(isStrict,locale){return locale.monthsShortRegex(isStrict)});addRegexToken(\"MMMM\",function(isStrict,locale){return locale.monthsRegex(isStrict)});addParseToken([\"M\",\"MM\"],function(input,array){array[MONTH]=toInt(input)-1});addParseToken([\"MMM\",\"MMMM\"],function(input,array,config,token){var month=config._locale.monthsParse(input,token,config._strict);if(month!=null){array[MONTH]=month}else{getParsingFlags(config).invalidMonth=input}});var MONTHS_IN_FORMAT=/D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/;var defaultLocaleMonths=\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\");function localeMonths(m,format){if(!m){return isArray(this._months)?this._months:this._months[\"standalone\"]}return isArray(this._months)?this._months[m.month()]:this._months[(this._months.isFormat||MONTHS_IN_FORMAT).test(format)?\"format\":\"standalone\"][m.month()]}var defaultLocaleMonthsShort=\"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec\".split(\"_\");function localeMonthsShort(m,format){if(!m){return isArray(this._monthsShort)?this._monthsShort:this._monthsShort[\"standalone\"]}return isArray(this._monthsShort)?this._monthsShort[m.month()]:this._monthsShort[MONTHS_IN_FORMAT.test(format)?\"format\":\"standalone\"][m.month()]}function handleStrictParse(monthName,format,strict){var i,ii,mom,llc=monthName.toLocaleLowerCase();if(!this._monthsParse){this._monthsParse=[];this._longMonthsParse=[];this._shortMonthsParse=[];for(i=0;i<12;++i){mom=createUTC([2e3,i]);this._shortMonthsParse[i]=this.monthsShort(mom,\"\").toLocaleLowerCase();this._longMonthsParse[i]=this.months(mom,\"\").toLocaleLowerCase()}}if(strict){if(format===\"MMM\"){ii=indexOf.call(this._shortMonthsParse,llc);return ii!==-1?ii:null}else{ii=indexOf.call(this._longMonthsParse,llc);return ii!==-1?ii:null}}else{if(format===\"MMM\"){ii=indexOf.call(this._shortMonthsParse,llc);if(ii!==-1){return ii}ii=indexOf.call(this._longMonthsParse,llc);return ii!==-1?ii:null}else{ii=indexOf.call(this._longMonthsParse,llc);if(ii!==-1){return ii}ii=indexOf.call(this._shortMonthsParse,llc);return ii!==-1?ii:null}}}function localeMonthsParse(monthName,format,strict){var i,mom,regex;if(this._monthsParseExact){return handleStrictParse.call(this,monthName,format,strict)}if(!this._monthsParse){this._monthsParse=[];this._longMonthsParse=[];this._shortMonthsParse=[]}for(i=0;i<12;i++){mom=createUTC([2e3,i]);if(strict&&!this._longMonthsParse[i]){this._longMonthsParse[i]=new RegExp(\"^\"+this.months(mom,\"\").replace(\".\",\"\")+\"$\",\"i\");this._shortMonthsParse[i]=new RegExp(\"^\"+this.monthsShort(mom,\"\").replace(\".\",\"\")+\"$\",\"i\")}if(!strict&&!this._monthsParse[i]){regex=\"^\"+this.months(mom,\"\")+\"|^\"+this.monthsShort(mom,\"\");this._monthsParse[i]=new RegExp(regex.replace(\".\",\"\"),\"i\")}if(strict&&format===\"MMMM\"&&this._longMonthsParse[i].test(monthName)){return i}else if(strict&&format===\"MMM\"&&this._shortMonthsParse[i].test(monthName)){return i}else if(!strict&&this._monthsParse[i].test(monthName)){return i}}}function setMonth(mom,value){var dayOfMonth;if(!mom.isValid()){return mom}if(typeof value===\"string\"){if(/^\\d+$/.test(value)){value=toInt(value)}else{value=mom.localeData().monthsParse(value);if(!isNumber(value)){return mom}}}dayOfMonth=Math.min(mom.date(),daysInMonth(mom.year(),value));mom._d[\"set\"+(mom._isUTC?\"UTC\":\"\")+\"Month\"](value,dayOfMonth);return mom}function getSetMonth(value){if(value!=null){setMonth(this,value);hooks.updateOffset(this,true);return this}else{return get(this,\"Month\")}}function getDaysInMonth(){return daysInMonth(this.year(),this.month())}var defaultMonthsShortRegex=matchWord;function monthsShortRegex(isStrict){if(this._monthsParseExact){if(!hasOwnProp(this,\"_monthsRegex\")){computeMonthsParse.call(this)}if(isStrict){return this._monthsShortStrictRegex}else{return this._monthsShortRegex}}else{if(!hasOwnProp(this,\"_monthsShortRegex\")){this._monthsShortRegex=defaultMonthsShortRegex}return this._monthsShortStrictRegex&&isStrict?this._monthsShortStrictRegex:this._monthsShortRegex}}var defaultMonthsRegex=matchWord;function monthsRegex(isStrict){if(this._monthsParseExact){if(!hasOwnProp(this,\"_monthsRegex\")){computeMonthsParse.call(this)}if(isStrict){return this._monthsStrictRegex}else{return this._monthsRegex}}else{if(!hasOwnProp(this,\"_monthsRegex\")){this._monthsRegex=defaultMonthsRegex}return this._monthsStrictRegex&&isStrict?this._monthsStrictRegex:this._monthsRegex}}function computeMonthsParse(){function cmpLenRev(a,b){return b.length-a.length}var shortPieces=[],longPieces=[],mixedPieces=[],i,mom;for(i=0;i<12;i++){mom=createUTC([2e3,i]);shortPieces.push(this.monthsShort(mom,\"\"));longPieces.push(this.months(mom,\"\"));mixedPieces.push(this.months(mom,\"\"));mixedPieces.push(this.monthsShort(mom,\"\"))}shortPieces.sort(cmpLenRev);longPieces.sort(cmpLenRev);mixedPieces.sort(cmpLenRev);for(i=0;i<12;i++){shortPieces[i]=regexEscape(shortPieces[i]);longPieces[i]=regexEscape(longPieces[i])}for(i=0;i<24;i++){mixedPieces[i]=regexEscape(mixedPieces[i])}this._monthsRegex=new RegExp(\"^(\"+mixedPieces.join(\"|\")+\")\",\"i\");this._monthsShortRegex=this._monthsRegex;this._monthsStrictRegex=new RegExp(\"^(\"+longPieces.join(\"|\")+\")\",\"i\");this._monthsShortStrictRegex=new RegExp(\"^(\"+shortPieces.join(\"|\")+\")\",\"i\")}function createDate(y,m,d,h,M,s,ms){var date=new Date(y,m,d,h,M,s,ms);if(y<100&&y>=0&&isFinite(date.getFullYear())){date.setFullYear(y)}return date}function createUTCDate(y){var date=new Date(Date.UTC.apply(null,arguments));if(y<100&&y>=0&&isFinite(date.getUTCFullYear())){date.setUTCFullYear(y)}return date}function firstWeekOffset(year,dow,doy){var fwd=7+dow-doy,fwdlw=(7+createUTCDate(year,0,fwd).getUTCDay()-dow)%7;return-fwdlw+fwd-1}function dayOfYearFromWeeks(year,week,weekday,dow,doy){var localWeekday=(7+weekday-dow)%7,weekOffset=firstWeekOffset(year,dow,doy),dayOfYear=1+7*(week-1)+localWeekday+weekOffset,resYear,resDayOfYear;if(dayOfYear<=0){resYear=year-1;resDayOfYear=daysInYear(resYear)+dayOfYear}else if(dayOfYear>daysInYear(year)){resYear=year+1;resDayOfYear=dayOfYear-daysInYear(year)}else{resYear=year;resDayOfYear=dayOfYear}return{year:resYear,dayOfYear:resDayOfYear}}function weekOfYear(mom,dow,doy){var weekOffset=firstWeekOffset(mom.year(),dow,doy),week=Math.floor((mom.dayOfYear()-weekOffset-1)/7)+1,resWeek,resYear;if(week<1){resYear=mom.year()-1;resWeek=week+weeksInYear(resYear,dow,doy)}else if(week>weeksInYear(mom.year(),dow,doy)){resWeek=week-weeksInYear(mom.year(),dow,doy);resYear=mom.year()+1}else{resYear=mom.year();resWeek=week}return{week:resWeek,year:resYear}}function weeksInYear(year,dow,doy){var weekOffset=firstWeekOffset(year,dow,doy),weekOffsetNext=firstWeekOffset(year+1,dow,doy);return(daysInYear(year)-weekOffset+weekOffsetNext)/7}addFormatToken(\"w\",[\"ww\",2],\"wo\",\"week\");addFormatToken(\"W\",[\"WW\",2],\"Wo\",\"isoWeek\");addUnitAlias(\"week\",\"w\");addUnitAlias(\"isoWeek\",\"W\");addUnitPriority(\"week\",5);addUnitPriority(\"isoWeek\",5);addRegexToken(\"w\",match1to2);addRegexToken(\"ww\",match1to2,match2);addRegexToken(\"W\",match1to2);addRegexToken(\"WW\",match1to2,match2);addWeekParseToken([\"w\",\"ww\",\"W\",\"WW\"],function(input,week,config,token){week[token.substr(0,1)]=toInt(input)});function localeWeek(mom){return weekOfYear(mom,this._week.dow,this._week.doy).week}var defaultLocaleWeek={dow:0,doy:6};function localeFirstDayOfWeek(){return this._week.dow}function localeFirstDayOfYear(){return this._week.doy}function getSetWeek(input){var week=this.localeData().week(this);return input==null?week:this.add((input-week)*7,\"d\")}function getSetISOWeek(input){var week=weekOfYear(this,1,4).week;return input==null?week:this.add((input-week)*7,\"d\")}addFormatToken(\"d\",0,\"do\",\"day\");addFormatToken(\"dd\",0,0,function(format){return this.localeData().weekdaysMin(this,format)});addFormatToken(\"ddd\",0,0,function(format){return this.localeData().weekdaysShort(this,format)});addFormatToken(\"dddd\",0,0,function(format){return this.localeData().weekdays(this,format)});addFormatToken(\"e\",0,0,\"weekday\");addFormatToken(\"E\",0,0,\"isoWeekday\");addUnitAlias(\"day\",\"d\");addUnitAlias(\"weekday\",\"e\");addUnitAlias(\"isoWeekday\",\"E\");addUnitPriority(\"day\",11);addUnitPriority(\"weekday\",11);addUnitPriority(\"isoWeekday\",11);addRegexToken(\"d\",match1to2);addRegexToken(\"e\",match1to2);addRegexToken(\"E\",match1to2);addRegexToken(\"dd\",function(isStrict,locale){return locale.weekdaysMinRegex(isStrict)});addRegexToken(\"ddd\",function(isStrict,locale){return locale.weekdaysShortRegex(isStrict)});addRegexToken(\"dddd\",function(isStrict,locale){return locale.weekdaysRegex(isStrict)});addWeekParseToken([\"dd\",\"ddd\",\"dddd\"],function(input,week,config,token){var weekday=config._locale.weekdaysParse(input,token,config._strict);if(weekday!=null){week.d=weekday}else{getParsingFlags(config).invalidWeekday=input}});addWeekParseToken([\"d\",\"e\",\"E\"],function(input,week,config,token){week[token]=toInt(input)});function parseWeekday(input,locale){if(typeof input!==\"string\"){return input}if(!isNaN(input)){return parseInt(input,10)}input=locale.weekdaysParse(input);if(typeof input===\"number\"){return input}return null}function parseIsoWeekday(input,locale){if(typeof input===\"string\"){return locale.weekdaysParse(input)%7||7}return isNaN(input)?null:input}var defaultLocaleWeekdays=\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\");function localeWeekdays(m,format){if(!m){return isArray(this._weekdays)?this._weekdays:this._weekdays[\"standalone\"]}return isArray(this._weekdays)?this._weekdays[m.day()]:this._weekdays[this._weekdays.isFormat.test(format)?\"format\":\"standalone\"][m.day()]}var defaultLocaleWeekdaysShort=\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\".split(\"_\");function localeWeekdaysShort(m){return m?this._weekdaysShort[m.day()]:this._weekdaysShort}var defaultLocaleWeekdaysMin=\"Su_Mo_Tu_We_Th_Fr_Sa\".split(\"_\");function localeWeekdaysMin(m){return m?this._weekdaysMin[m.day()]:this._weekdaysMin}function handleStrictParse$1(weekdayName,format,strict){var i,ii,mom,llc=weekdayName.toLocaleLowerCase();if(!this._weekdaysParse){this._weekdaysParse=[];this._shortWeekdaysParse=[];this._minWeekdaysParse=[];for(i=0;i<7;++i){mom=createUTC([2e3,1]).day(i);this._minWeekdaysParse[i]=this.weekdaysMin(mom,\"\").toLocaleLowerCase();this._shortWeekdaysParse[i]=this.weekdaysShort(mom,\"\").toLocaleLowerCase();this._weekdaysParse[i]=this.weekdays(mom,\"\").toLocaleLowerCase()}}if(strict){if(format===\"dddd\"){ii=indexOf.call(this._weekdaysParse,llc);return ii!==-1?ii:null}else if(format===\"ddd\"){ii=indexOf.call(this._shortWeekdaysParse,llc);return ii!==-1?ii:null}else{ii=indexOf.call(this._minWeekdaysParse,llc);return ii!==-1?ii:null}}else{if(format===\"dddd\"){ii=indexOf.call(this._weekdaysParse,llc);if(ii!==-1){return ii}ii=indexOf.call(this._shortWeekdaysParse,llc);if(ii!==-1){return ii}ii=indexOf.call(this._minWeekdaysParse,llc);return ii!==-1?ii:null}else if(format===\"ddd\"){ii=indexOf.call(this._shortWeekdaysParse,llc);if(ii!==-1){return ii}ii=indexOf.call(this._weekdaysParse,llc);if(ii!==-1){return ii}ii=indexOf.call(this._minWeekdaysParse,llc);return ii!==-1?ii:null}else{ii=indexOf.call(this._minWeekdaysParse,llc);if(ii!==-1){return ii}ii=indexOf.call(this._weekdaysParse,llc);if(ii!==-1){return ii}ii=indexOf.call(this._shortWeekdaysParse,llc);return ii!==-1?ii:null}}}function localeWeekdaysParse(weekdayName,format,strict){var i,mom,regex;if(this._weekdaysParseExact){return handleStrictParse$1.call(this,weekdayName,format,strict)}if(!this._weekdaysParse){this._weekdaysParse=[];this._minWeekdaysParse=[];this._shortWeekdaysParse=[];this._fullWeekdaysParse=[]}for(i=0;i<7;i++){mom=createUTC([2e3,1]).day(i);if(strict&&!this._fullWeekdaysParse[i]){this._fullWeekdaysParse[i]=new RegExp(\"^\"+this.weekdays(mom,\"\").replace(\".\",\".?\")+\"$\",\"i\");this._shortWeekdaysParse[i]=new RegExp(\"^\"+this.weekdaysShort(mom,\"\").replace(\".\",\".?\")+\"$\",\"i\");this._minWeekdaysParse[i]=new RegExp(\"^\"+this.weekdaysMin(mom,\"\").replace(\".\",\".?\")+\"$\",\"i\")}if(!this._weekdaysParse[i]){regex=\"^\"+this.weekdays(mom,\"\")+\"|^\"+this.weekdaysShort(mom,\"\")+\"|^\"+this.weekdaysMin(mom,\"\");this._weekdaysParse[i]=new RegExp(regex.replace(\".\",\"\"),\"i\")}if(strict&&format===\"dddd\"&&this._fullWeekdaysParse[i].test(weekdayName)){return i}else if(strict&&format===\"ddd\"&&this._shortWeekdaysParse[i].test(weekdayName)){return i}else if(strict&&format===\"dd\"&&this._minWeekdaysParse[i].test(weekdayName)){return i}else if(!strict&&this._weekdaysParse[i].test(weekdayName)){return i}}}function getSetDayOfWeek(input){if(!this.isValid()){return input!=null?this:NaN}var day=this._isUTC?this._d.getUTCDay():this._d.getDay();if(input!=null){input=parseWeekday(input,this.localeData());return this.add(input-day,\"d\")}else{return day}}function getSetLocaleDayOfWeek(input){if(!this.isValid()){return input!=null?this:NaN}var weekday=(this.day()+7-this.localeData()._week.dow)%7;return input==null?weekday:this.add(input-weekday,\"d\")}function getSetISODayOfWeek(input){if(!this.isValid()){return input!=null?this:NaN}if(input!=null){var weekday=parseIsoWeekday(input,this.localeData());return this.day(this.day()%7?weekday:weekday-7)}else{return this.day()||7}}var defaultWeekdaysRegex=matchWord;function weekdaysRegex(isStrict){if(this._weekdaysParseExact){if(!hasOwnProp(this,\"_weekdaysRegex\")){computeWeekdaysParse.call(this)}if(isStrict){return this._weekdaysStrictRegex}else{return this._weekdaysRegex}}else{if(!hasOwnProp(this,\"_weekdaysRegex\")){this._weekdaysRegex=defaultWeekdaysRegex}return this._weekdaysStrictRegex&&isStrict?this._weekdaysStrictRegex:this._weekdaysRegex}}var defaultWeekdaysShortRegex=matchWord;function weekdaysShortRegex(isStrict){if(this._weekdaysParseExact){if(!hasOwnProp(this,\"_weekdaysRegex\")){computeWeekdaysParse.call(this)}if(isStrict){return this._weekdaysShortStrictRegex}else{return this._weekdaysShortRegex}}else{if(!hasOwnProp(this,\"_weekdaysShortRegex\")){this._weekdaysShortRegex=defaultWeekdaysShortRegex}return this._weekdaysShortStrictRegex&&isStrict?this._weekdaysShortStrictRegex:this._weekdaysShortRegex}}var defaultWeekdaysMinRegex=matchWord;function weekdaysMinRegex(isStrict){if(this._weekdaysParseExact){if(!hasOwnProp(this,\"_weekdaysRegex\")){computeWeekdaysParse.call(this)}if(isStrict){return this._weekdaysMinStrictRegex}else{return this._weekdaysMinRegex}}else{if(!hasOwnProp(this,\"_weekdaysMinRegex\")){this._weekdaysMinRegex=defaultWeekdaysMinRegex}return this._weekdaysMinStrictRegex&&isStrict?this._weekdaysMinStrictRegex:this._weekdaysMinRegex}}function computeWeekdaysParse(){function cmpLenRev(a,b){return b.length-a.length}var minPieces=[],shortPieces=[],longPieces=[],mixedPieces=[],i,mom,minp,shortp,longp;for(i=0;i<7;i++){mom=createUTC([2e3,1]).day(i);minp=this.weekdaysMin(mom,\"\");shortp=this.weekdaysShort(mom,\"\");longp=this.weekdays(mom,\"\");minPieces.push(minp);shortPieces.push(shortp);longPieces.push(longp);mixedPieces.push(minp);mixedPieces.push(shortp);mixedPieces.push(longp)}minPieces.sort(cmpLenRev);shortPieces.sort(cmpLenRev);longPieces.sort(cmpLenRev);mixedPieces.sort(cmpLenRev);for(i=0;i<7;i++){shortPieces[i]=regexEscape(shortPieces[i]);longPieces[i]=regexEscape(longPieces[i]);mixedPieces[i]=regexEscape(mixedPieces[i])}this._weekdaysRegex=new RegExp(\"^(\"+mixedPieces.join(\"|\")+\")\",\"i\");this._weekdaysShortRegex=this._weekdaysRegex;this._weekdaysMinRegex=this._weekdaysRegex;this._weekdaysStrictRegex=new RegExp(\"^(\"+longPieces.join(\"|\")+\")\",\"i\");this._weekdaysShortStrictRegex=new RegExp(\"^(\"+shortPieces.join(\"|\")+\")\",\"i\");this._weekdaysMinStrictRegex=new RegExp(\"^(\"+minPieces.join(\"|\")+\")\",\"i\")}function hFormat(){return this.hours()%12||12}function kFormat(){return this.hours()||24}addFormatToken(\"H\",[\"HH\",2],0,\"hour\");addFormatToken(\"h\",[\"hh\",2],0,hFormat);addFormatToken(\"k\",[\"kk\",2],0,kFormat);addFormatToken(\"hmm\",0,0,function(){return\"\"+hFormat.apply(this)+zeroFill(this.minutes(),2)});addFormatToken(\"hmmss\",0,0,function(){return\"\"+hFormat.apply(this)+zeroFill(this.minutes(),2)+zeroFill(this.seconds(),2)});addFormatToken(\"Hmm\",0,0,function(){return\"\"+this.hours()+zeroFill(this.minutes(),2)});addFormatToken(\"Hmmss\",0,0,function(){return\"\"+this.hours()+zeroFill(this.minutes(),2)+zeroFill(this.seconds(),2)});function meridiem(token,lowercase){addFormatToken(token,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),lowercase)})}meridiem(\"a\",true);meridiem(\"A\",false);addUnitAlias(\"hour\",\"h\");addUnitPriority(\"hour\",13);function matchMeridiem(isStrict,locale){return locale._meridiemParse}addRegexToken(\"a\",matchMeridiem);addRegexToken(\"A\",matchMeridiem);addRegexToken(\"H\",match1to2);addRegexToken(\"h\",match1to2);addRegexToken(\"k\",match1to2);addRegexToken(\"HH\",match1to2,match2);addRegexToken(\"hh\",match1to2,match2);addRegexToken(\"kk\",match1to2,match2);addRegexToken(\"hmm\",match3to4);addRegexToken(\"hmmss\",match5to6);addRegexToken(\"Hmm\",match3to4);addRegexToken(\"Hmmss\",match5to6);addParseToken([\"H\",\"HH\"],HOUR);addParseToken([\"k\",\"kk\"],function(input,array,config){var kInput=toInt(input);array[HOUR]=kInput===24?0:kInput});addParseToken([\"a\",\"A\"],function(input,array,config){config._isPm=config._locale.isPM(input);config._meridiem=input});addParseToken([\"h\",\"hh\"],function(input,array,config){array[HOUR]=toInt(input);getParsingFlags(config).bigHour=true});addParseToken(\"hmm\",function(input,array,config){var pos=input.length-2;array[HOUR]=toInt(input.substr(0,pos));array[MINUTE]=toInt(input.substr(pos));getParsingFlags(config).bigHour=true});addParseToken(\"hmmss\",function(input,array,config){var pos1=input.length-4;var pos2=input.length-2;array[HOUR]=toInt(input.substr(0,pos1));array[MINUTE]=toInt(input.substr(pos1,2));array[SECOND]=toInt(input.substr(pos2));getParsingFlags(config).bigHour=true});addParseToken(\"Hmm\",function(input,array,config){var pos=input.length-2;array[HOUR]=toInt(input.substr(0,pos));array[MINUTE]=toInt(input.substr(pos))});addParseToken(\"Hmmss\",function(input,array,config){var pos1=input.length-4;var pos2=input.length-2;array[HOUR]=toInt(input.substr(0,pos1));array[MINUTE]=toInt(input.substr(pos1,2));array[SECOND]=toInt(input.substr(pos2))});function localeIsPM(input){return(input+\"\").toLowerCase().charAt(0)===\"p\"}var defaultLocaleMeridiemParse=/[ap]\\.?m?\\.?/i;function localeMeridiem(hours,minutes,isLower){if(hours>11){return isLower?\"pm\":\"PM\"}else{return isLower?\"am\":\"AM\"}}var getSetHour=makeGetSet(\"Hours\",true);var baseConfig={calendar:defaultCalendar,longDateFormat:defaultLongDateFormat,invalidDate:defaultInvalidDate,ordinal:defaultOrdinal,dayOfMonthOrdinalParse:defaultDayOfMonthOrdinalParse,relativeTime:defaultRelativeTime,months:defaultLocaleMonths,monthsShort:defaultLocaleMonthsShort,week:defaultLocaleWeek,weekdays:defaultLocaleWeekdays,weekdaysMin:defaultLocaleWeekdaysMin,weekdaysShort:defaultLocaleWeekdaysShort,meridiemParse:defaultLocaleMeridiemParse};var locales={};var localeFamilies={};var globalLocale;function normalizeLocale(key){return key?key.toLowerCase().replace(\"_\",\"-\"):key}function chooseLocale(names){var i=0,j,next,locale,split;while(i<names.length){split=normalizeLocale(names[i]).split(\"-\");j=split.length;next=normalizeLocale(names[i+1]);next=next?next.split(\"-\"):null;while(j>0){locale=loadLocale(split.slice(0,j).join(\"-\"));if(locale){return locale}if(next&&next.length>=j&&compareArrays(split,next,true)>=j-1){break}j--}i++}return null}function loadLocale(name){var oldLocale=null;if(!locales[name]&&typeof module!==\"undefined\"&&module&&module.exports){try{oldLocale=globalLocale._abbr;var aliasedRequire=require;!function webpackMissingModule(){var e=new Error('Cannot find module \"./locale\"');e.code=\"MODULE_NOT_FOUND\";throw e}();getSetGlobalLocale(oldLocale)}catch(e){}}return locales[name]}function getSetGlobalLocale(key,values){var data;if(key){if(isUndefined(values)){data=getLocale(key)}else{data=defineLocale(key,values)}if(data){globalLocale=data}}return globalLocale._abbr}function defineLocale(name,config){if(config!==null){var parentConfig=baseConfig;config.abbr=name;if(locales[name]!=null){deprecateSimple(\"defineLocaleOverride\",\"use moment.updateLocale(localeName, config) to change \"+\"an existing locale. moment.defineLocale(localeName, \"+\"config) should only be used for creating a new locale \"+\"See http://momentjs.com/guides/#/warnings/define-locale/ for more info.\");parentConfig=locales[name]._config}else if(config.parentLocale!=null){if(locales[config.parentLocale]!=null){parentConfig=locales[config.parentLocale]._config}else{if(!localeFamilies[config.parentLocale]){localeFamilies[config.parentLocale]=[]}localeFamilies[config.parentLocale].push({name:name,config:config});return null}}locales[name]=new Locale(mergeConfigs(parentConfig,config));if(localeFamilies[name]){localeFamilies[name].forEach(function(x){defineLocale(x.name,x.config)})}getSetGlobalLocale(name);return locales[name]}else{delete locales[name];return null}}function updateLocale(name,config){if(config!=null){var locale,parentConfig=baseConfig;if(locales[name]!=null){parentConfig=locales[name]._config}config=mergeConfigs(parentConfig,config);locale=new Locale(config);locale.parentLocale=locales[name];locales[name]=locale;getSetGlobalLocale(name)}else{if(locales[name]!=null){if(locales[name].parentLocale!=null){locales[name]=locales[name].parentLocale}else if(locales[name]!=null){delete locales[name]}}}return locales[name]}function getLocale(key){var locale;if(key&&key._locale&&key._locale._abbr){key=key._locale._abbr}if(!key){return globalLocale}if(!isArray(key)){locale=loadLocale(key);if(locale){return locale}key=[key]}return chooseLocale(key)}function listLocales(){return keys(locales)}function checkOverflow(m){var overflow;var a=m._a;if(a&&getParsingFlags(m).overflow===-2){overflow=a[MONTH]<0||a[MONTH]>11?MONTH:a[DATE]<1||a[DATE]>daysInMonth(a[YEAR],a[MONTH])?DATE:a[HOUR]<0||a[HOUR]>24||a[HOUR]===24&&(a[MINUTE]!==0||a[SECOND]!==0||a[MILLISECOND]!==0)?HOUR:a[MINUTE]<0||a[MINUTE]>59?MINUTE:a[SECOND]<0||a[SECOND]>59?SECOND:a[MILLISECOND]<0||a[MILLISECOND]>999?MILLISECOND:-1;if(getParsingFlags(m)._overflowDayOfYear&&(overflow<YEAR||overflow>DATE)){overflow=DATE}if(getParsingFlags(m)._overflowWeeks&&overflow===-1){overflow=WEEK}if(getParsingFlags(m)._overflowWeekday&&overflow===-1){overflow=WEEKDAY}getParsingFlags(m).overflow=overflow}return m}function defaults(a,b,c){if(a!=null){return a}if(b!=null){return b}return c}function currentDateArray(config){var nowValue=new Date(hooks.now());if(config._useUTC){return[nowValue.getUTCFullYear(),nowValue.getUTCMonth(),nowValue.getUTCDate()]}return[nowValue.getFullYear(),nowValue.getMonth(),nowValue.getDate()]}function configFromArray(config){var i,date,input=[],currentDate,yearToUse;if(config._d){return}currentDate=currentDateArray(config);if(config._w&&config._a[DATE]==null&&config._a[MONTH]==null){dayOfYearFromWeekInfo(config)}if(config._dayOfYear!=null){yearToUse=defaults(config._a[YEAR],currentDate[YEAR]);if(config._dayOfYear>daysInYear(yearToUse)||config._dayOfYear===0){getParsingFlags(config)._overflowDayOfYear=true}date=createUTCDate(yearToUse,0,config._dayOfYear);config._a[MONTH]=date.getUTCMonth();config._a[DATE]=date.getUTCDate()}for(i=0;i<3&&config._a[i]==null;++i){config._a[i]=input[i]=currentDate[i]}for(;i<7;i++){config._a[i]=input[i]=config._a[i]==null?i===2?1:0:config._a[i]}if(config._a[HOUR]===24&&config._a[MINUTE]===0&&config._a[SECOND]===0&&config._a[MILLISECOND]===0){config._nextDay=true;config._a[HOUR]=0}config._d=(config._useUTC?createUTCDate:createDate).apply(null,input);if(config._tzm!=null){config._d.setUTCMinutes(config._d.getUTCMinutes()-config._tzm)}if(config._nextDay){config._a[HOUR]=24}if(config._w&&typeof config._w.d!==\"undefined\"&&config._w.d!==config._d.getDay()){getParsingFlags(config).weekdayMismatch=true}}function dayOfYearFromWeekInfo(config){var w,weekYear,week,weekday,dow,doy,temp,weekdayOverflow;w=config._w;if(w.GG!=null||w.W!=null||w.E!=null){dow=1;doy=4;weekYear=defaults(w.GG,config._a[YEAR],weekOfYear(createLocal(),1,4).year);week=defaults(w.W,1);weekday=defaults(w.E,1);if(weekday<1||weekday>7){weekdayOverflow=true}}else{dow=config._locale._week.dow;doy=config._locale._week.doy;var curWeek=weekOfYear(createLocal(),dow,doy);weekYear=defaults(w.gg,config._a[YEAR],curWeek.year);week=defaults(w.w,curWeek.week);if(w.d!=null){weekday=w.d;if(weekday<0||weekday>6){weekdayOverflow=true}}else if(w.e!=null){weekday=w.e+dow;if(w.e<0||w.e>6){weekdayOverflow=true}}else{weekday=dow}}if(week<1||week>weeksInYear(weekYear,dow,doy)){getParsingFlags(config)._overflowWeeks=true}else if(weekdayOverflow!=null){getParsingFlags(config)._overflowWeekday=true}else{temp=dayOfYearFromWeeks(weekYear,week,weekday,dow,doy);config._a[YEAR]=temp.year;config._dayOfYear=temp.dayOfYear}}var extendedIsoRegex=/^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;var basicIsoRegex=/^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/;var tzRegex=/Z|[+-]\\d\\d(?::?\\d\\d)?/;var isoDates=[[\"YYYYYY-MM-DD\",/[+-]\\d{6}-\\d\\d-\\d\\d/],[\"YYYY-MM-DD\",/\\d{4}-\\d\\d-\\d\\d/],[\"GGGG-[W]WW-E\",/\\d{4}-W\\d\\d-\\d/],[\"GGGG-[W]WW\",/\\d{4}-W\\d\\d/,false],[\"YYYY-DDD\",/\\d{4}-\\d{3}/],[\"YYYY-MM\",/\\d{4}-\\d\\d/,false],[\"YYYYYYMMDD\",/[+-]\\d{10}/],[\"YYYYMMDD\",/\\d{8}/],[\"GGGG[W]WWE\",/\\d{4}W\\d{3}/],[\"GGGG[W]WW\",/\\d{4}W\\d{2}/,false],[\"YYYYDDD\",/\\d{7}/]];var isoTimes=[[\"HH:mm:ss.SSSS\",/\\d\\d:\\d\\d:\\d\\d\\.\\d+/],[\"HH:mm:ss,SSSS\",/\\d\\d:\\d\\d:\\d\\d,\\d+/],[\"HH:mm:ss\",/\\d\\d:\\d\\d:\\d\\d/],[\"HH:mm\",/\\d\\d:\\d\\d/],[\"HHmmss.SSSS\",/\\d\\d\\d\\d\\d\\d\\.\\d+/],[\"HHmmss,SSSS\",/\\d\\d\\d\\d\\d\\d,\\d+/],[\"HHmmss\",/\\d\\d\\d\\d\\d\\d/],[\"HHmm\",/\\d\\d\\d\\d/],[\"HH\",/\\d\\d/]];var aspNetJsonRegex=/^\\/?Date\\((\\-?\\d+)/i;function configFromISO(config){var i,l,string=config._i,match=extendedIsoRegex.exec(string)||basicIsoRegex.exec(string),allowTime,dateFormat,timeFormat,tzFormat;if(match){getParsingFlags(config).iso=true;for(i=0,l=isoDates.length;i<l;i++){if(isoDates[i][1].exec(match[1])){dateFormat=isoDates[i][0];allowTime=isoDates[i][2]!==false;break}}if(dateFormat==null){config._isValid=false;return}if(match[3]){for(i=0,l=isoTimes.length;i<l;i++){if(isoTimes[i][1].exec(match[3])){timeFormat=(match[2]||\" \")+isoTimes[i][0];break}}if(timeFormat==null){config._isValid=false;return}}if(!allowTime&&timeFormat!=null){config._isValid=false;return}if(match[4]){if(tzRegex.exec(match[4])){tzFormat=\"Z\"}else{config._isValid=false;return}}config._f=dateFormat+(timeFormat||\"\")+(tzFormat||\"\");configFromStringAndFormat(config)}else{config._isValid=false}}var rfc2822=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/;function extractFromRFC2822Strings(yearStr,monthStr,dayStr,hourStr,minuteStr,secondStr){var result=[untruncateYear(yearStr),defaultLocaleMonthsShort.indexOf(monthStr),parseInt(dayStr,10),parseInt(hourStr,10),parseInt(minuteStr,10)];if(secondStr){result.push(parseInt(secondStr,10))}return result}function untruncateYear(yearStr){var year=parseInt(yearStr,10);if(year<=49){return 2e3+year}else if(year<=999){return 1900+year}return year}function preprocessRFC2822(s){return s.replace(/\\([^)]*\\)|[\\n\\t]/g,\" \").replace(/(\\s\\s+)/g,\" \").trim()}function checkWeekday(weekdayStr,parsedInput,config){if(weekdayStr){var weekdayProvided=defaultLocaleWeekdaysShort.indexOf(weekdayStr),weekdayActual=new Date(parsedInput[0],parsedInput[1],parsedInput[2]).getDay();if(weekdayProvided!==weekdayActual){getParsingFlags(config).weekdayMismatch=true;config._isValid=false;return false}}return true}var obsOffsets={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function calculateOffset(obsOffset,militaryOffset,numOffset){if(obsOffset){return obsOffsets[obsOffset]}else if(militaryOffset){return 0}else{var hm=parseInt(numOffset,10);var m=hm%100,h=(hm-m)/100;return h*60+m}}function configFromRFC2822(config){var match=rfc2822.exec(preprocessRFC2822(config._i));if(match){var parsedArray=extractFromRFC2822Strings(match[4],match[3],match[2],match[5],match[6],match[7]);if(!checkWeekday(match[1],parsedArray,config)){return}config._a=parsedArray;config._tzm=calculateOffset(match[8],match[9],match[10]);config._d=createUTCDate.apply(null,config._a);config._d.setUTCMinutes(config._d.getUTCMinutes()-config._tzm);getParsingFlags(config).rfc2822=true}else{config._isValid=false}}function configFromString(config){var matched=aspNetJsonRegex.exec(config._i);if(matched!==null){config._d=new Date(+matched[1]);return}configFromISO(config);if(config._isValid===false){delete config._isValid}else{return}configFromRFC2822(config);if(config._isValid===false){delete config._isValid}else{return}hooks.createFromInputFallback(config)}hooks.createFromInputFallback=deprecate(\"value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), \"+\"which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are \"+\"discouraged and will be removed in an upcoming major release. Please refer to \"+\"http://momentjs.com/guides/#/warnings/js-date/ for more info.\",function(config){config._d=new Date(config._i+(config._useUTC?\" UTC\":\"\"))});hooks.ISO_8601=function(){};hooks.RFC_2822=function(){};function configFromStringAndFormat(config){if(config._f===hooks.ISO_8601){configFromISO(config);return}if(config._f===hooks.RFC_2822){configFromRFC2822(config);return}config._a=[];getParsingFlags(config).empty=true\n;var string=\"\"+config._i,i,parsedInput,tokens,token,skipped,stringLength=string.length,totalParsedInputLength=0;tokens=expandFormat(config._f,config._locale).match(formattingTokens)||[];for(i=0;i<tokens.length;i++){token=tokens[i];parsedInput=(string.match(getParseRegexForToken(token,config))||[])[0];if(parsedInput){skipped=string.substr(0,string.indexOf(parsedInput));if(skipped.length>0){getParsingFlags(config).unusedInput.push(skipped)}string=string.slice(string.indexOf(parsedInput)+parsedInput.length);totalParsedInputLength+=parsedInput.length}if(formatTokenFunctions[token]){if(parsedInput){getParsingFlags(config).empty=false}else{getParsingFlags(config).unusedTokens.push(token)}addTimeToArrayFromToken(token,parsedInput,config)}else if(config._strict&&!parsedInput){getParsingFlags(config).unusedTokens.push(token)}}getParsingFlags(config).charsLeftOver=stringLength-totalParsedInputLength;if(string.length>0){getParsingFlags(config).unusedInput.push(string)}if(config._a[HOUR]<=12&&getParsingFlags(config).bigHour===true&&config._a[HOUR]>0){getParsingFlags(config).bigHour=undefined}getParsingFlags(config).parsedDateParts=config._a.slice(0);getParsingFlags(config).meridiem=config._meridiem;config._a[HOUR]=meridiemFixWrap(config._locale,config._a[HOUR],config._meridiem);configFromArray(config);checkOverflow(config)}function meridiemFixWrap(locale,hour,meridiem){var isPm;if(meridiem==null){return hour}if(locale.meridiemHour!=null){return locale.meridiemHour(hour,meridiem)}else if(locale.isPM!=null){isPm=locale.isPM(meridiem);if(isPm&&hour<12){hour+=12}if(!isPm&&hour===12){hour=0}return hour}else{return hour}}function configFromStringAndArray(config){var tempConfig,bestMoment,scoreToBeat,i,currentScore;if(config._f.length===0){getParsingFlags(config).invalidFormat=true;config._d=new Date(NaN);return}for(i=0;i<config._f.length;i++){currentScore=0;tempConfig=copyConfig({},config);if(config._useUTC!=null){tempConfig._useUTC=config._useUTC}tempConfig._f=config._f[i];configFromStringAndFormat(tempConfig);if(!isValid(tempConfig)){continue}currentScore+=getParsingFlags(tempConfig).charsLeftOver;currentScore+=getParsingFlags(tempConfig).unusedTokens.length*10;getParsingFlags(tempConfig).score=currentScore;if(scoreToBeat==null||currentScore<scoreToBeat){scoreToBeat=currentScore;bestMoment=tempConfig}}extend(config,bestMoment||tempConfig)}function configFromObject(config){if(config._d){return}var i=normalizeObjectUnits(config._i);config._a=map([i.year,i.month,i.day||i.date,i.hour,i.minute,i.second,i.millisecond],function(obj){return obj&&parseInt(obj,10)});configFromArray(config)}function createFromConfig(config){var res=new Moment(checkOverflow(prepareConfig(config)));if(res._nextDay){res.add(1,\"d\");res._nextDay=undefined}return res}function prepareConfig(config){var input=config._i,format=config._f;config._locale=config._locale||getLocale(config._l);if(input===null||format===undefined&&input===\"\"){return createInvalid({nullInput:true})}if(typeof input===\"string\"){config._i=input=config._locale.preparse(input)}if(isMoment(input)){return new Moment(checkOverflow(input))}else if(isDate(input)){config._d=input}else if(isArray(format)){configFromStringAndArray(config)}else if(format){configFromStringAndFormat(config)}else{configFromInput(config)}if(!isValid(config)){config._d=null}return config}function configFromInput(config){var input=config._i;if(isUndefined(input)){config._d=new Date(hooks.now())}else if(isDate(input)){config._d=new Date(input.valueOf())}else if(typeof input===\"string\"){configFromString(config)}else if(isArray(input)){config._a=map(input.slice(0),function(obj){return parseInt(obj,10)});configFromArray(config)}else if(isObject(input)){configFromObject(config)}else if(isNumber(input)){config._d=new Date(input)}else{hooks.createFromInputFallback(config)}}function createLocalOrUTC(input,format,locale,strict,isUTC){var c={};if(locale===true||locale===false){strict=locale;locale=undefined}if(isObject(input)&&isObjectEmpty(input)||isArray(input)&&input.length===0){input=undefined}c._isAMomentObject=true;c._useUTC=c._isUTC=isUTC;c._l=locale;c._i=input;c._f=format;c._strict=strict;return createFromConfig(c)}function createLocal(input,format,locale,strict){return createLocalOrUTC(input,format,locale,strict,false)}var prototypeMin=deprecate(\"moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/\",function(){var other=createLocal.apply(null,arguments);if(this.isValid()&&other.isValid()){return other<this?this:other}else{return createInvalid()}});var prototypeMax=deprecate(\"moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/\",function(){var other=createLocal.apply(null,arguments);if(this.isValid()&&other.isValid()){return other>this?this:other}else{return createInvalid()}});function pickBy(fn,moments){var res,i;if(moments.length===1&&isArray(moments[0])){moments=moments[0]}if(!moments.length){return createLocal()}res=moments[0];for(i=1;i<moments.length;++i){if(!moments[i].isValid()||moments[i][fn](res)){res=moments[i]}}return res}function min(){var args=[].slice.call(arguments,0);return pickBy(\"isBefore\",args)}function max(){var args=[].slice.call(arguments,0);return pickBy(\"isAfter\",args)}var now=function(){return Date.now?Date.now():+new Date};var ordering=[\"year\",\"quarter\",\"month\",\"week\",\"day\",\"hour\",\"minute\",\"second\",\"millisecond\"];function isDurationValid(m){for(var key in m){if(!(indexOf.call(ordering,key)!==-1&&(m[key]==null||!isNaN(m[key])))){return false}}var unitHasDecimal=false;for(var i=0;i<ordering.length;++i){if(m[ordering[i]]){if(unitHasDecimal){return false}if(parseFloat(m[ordering[i]])!==toInt(m[ordering[i]])){unitHasDecimal=true}}}return true}function isValid$1(){return this._isValid}function createInvalid$1(){return createDuration(NaN)}function Duration(duration){var normalizedInput=normalizeObjectUnits(duration),years=normalizedInput.year||0,quarters=normalizedInput.quarter||0,months=normalizedInput.month||0,weeks=normalizedInput.week||0,days=normalizedInput.day||0,hours=normalizedInput.hour||0,minutes=normalizedInput.minute||0,seconds=normalizedInput.second||0,milliseconds=normalizedInput.millisecond||0;this._isValid=isDurationValid(normalizedInput);this._milliseconds=+milliseconds+seconds*1e3+minutes*6e4+hours*1e3*60*60;this._days=+days+weeks*7;this._months=+months+quarters*3+years*12;this._data={};this._locale=getLocale();this._bubble()}function isDuration(obj){return obj instanceof Duration}function absRound(number){if(number<0){return Math.round(-1*number)*-1}else{return Math.round(number)}}function offset(token,separator){addFormatToken(token,0,0,function(){var offset=this.utcOffset();var sign=\"+\";if(offset<0){offset=-offset;sign=\"-\"}return sign+zeroFill(~~(offset/60),2)+separator+zeroFill(~~offset%60,2)})}offset(\"Z\",\":\");offset(\"ZZ\",\"\");addRegexToken(\"Z\",matchShortOffset);addRegexToken(\"ZZ\",matchShortOffset);addParseToken([\"Z\",\"ZZ\"],function(input,array,config){config._useUTC=true;config._tzm=offsetFromString(matchShortOffset,input)});var chunkOffset=/([\\+\\-]|\\d\\d)/gi;function offsetFromString(matcher,string){var matches=(string||\"\").match(matcher);if(matches===null){return null}var chunk=matches[matches.length-1]||[];var parts=(chunk+\"\").match(chunkOffset)||[\"-\",0,0];var minutes=+(parts[1]*60)+toInt(parts[2]);return minutes===0?0:parts[0]===\"+\"?minutes:-minutes}function cloneWithOffset(input,model){var res,diff;if(model._isUTC){res=model.clone();diff=(isMoment(input)||isDate(input)?input.valueOf():createLocal(input).valueOf())-res.valueOf();res._d.setTime(res._d.valueOf()+diff);hooks.updateOffset(res,false);return res}else{return createLocal(input).local()}}function getDateOffset(m){return-Math.round(m._d.getTimezoneOffset()/15)*15}hooks.updateOffset=function(){};function getSetOffset(input,keepLocalTime,keepMinutes){var offset=this._offset||0,localAdjust;if(!this.isValid()){return input!=null?this:NaN}if(input!=null){if(typeof input===\"string\"){input=offsetFromString(matchShortOffset,input);if(input===null){return this}}else if(Math.abs(input)<16&&!keepMinutes){input=input*60}if(!this._isUTC&&keepLocalTime){localAdjust=getDateOffset(this)}this._offset=input;this._isUTC=true;if(localAdjust!=null){this.add(localAdjust,\"m\")}if(offset!==input){if(!keepLocalTime||this._changeInProgress){addSubtract(this,createDuration(input-offset,\"m\"),1,false)}else if(!this._changeInProgress){this._changeInProgress=true;hooks.updateOffset(this,true);this._changeInProgress=null}}return this}else{return this._isUTC?offset:getDateOffset(this)}}function getSetZone(input,keepLocalTime){if(input!=null){if(typeof input!==\"string\"){input=-input}this.utcOffset(input,keepLocalTime);return this}else{return-this.utcOffset()}}function setOffsetToUTC(keepLocalTime){return this.utcOffset(0,keepLocalTime)}function setOffsetToLocal(keepLocalTime){if(this._isUTC){this.utcOffset(0,keepLocalTime);this._isUTC=false;if(keepLocalTime){this.subtract(getDateOffset(this),\"m\")}}return this}function setOffsetToParsedOffset(){if(this._tzm!=null){this.utcOffset(this._tzm,false,true)}else if(typeof this._i===\"string\"){var tZone=offsetFromString(matchOffset,this._i);if(tZone!=null){this.utcOffset(tZone)}else{this.utcOffset(0,true)}}return this}function hasAlignedHourOffset(input){if(!this.isValid()){return false}input=input?createLocal(input).utcOffset():0;return(this.utcOffset()-input)%60===0}function isDaylightSavingTime(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function isDaylightSavingTimeShifted(){if(!isUndefined(this._isDSTShifted)){return this._isDSTShifted}var c={};copyConfig(c,this);c=prepareConfig(c);if(c._a){var other=c._isUTC?createUTC(c._a):createLocal(c._a);this._isDSTShifted=this.isValid()&&compareArrays(c._a,other.toArray())>0}else{this._isDSTShifted=false}return this._isDSTShifted}function isLocal(){return this.isValid()?!this._isUTC:false}function isUtcOffset(){return this.isValid()?this._isUTC:false}function isUtc(){return this.isValid()?this._isUTC&&this._offset===0:false}var aspNetRegex=/^(\\-|\\+)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;var isoRegex=/^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function createDuration(input,key){var duration=input,match=null,sign,ret,diffRes;if(isDuration(input)){duration={ms:input._milliseconds,d:input._days,M:input._months}}else if(isNumber(input)){duration={};if(key){duration[key]=input}else{duration.milliseconds=input}}else if(!!(match=aspNetRegex.exec(input))){sign=match[1]===\"-\"?-1:1;duration={y:0,d:toInt(match[DATE])*sign,h:toInt(match[HOUR])*sign,m:toInt(match[MINUTE])*sign,s:toInt(match[SECOND])*sign,ms:toInt(absRound(match[MILLISECOND]*1e3))*sign}}else if(!!(match=isoRegex.exec(input))){sign=match[1]===\"-\"?-1:match[1]===\"+\"?1:1;duration={y:parseIso(match[2],sign),M:parseIso(match[3],sign),w:parseIso(match[4],sign),d:parseIso(match[5],sign),h:parseIso(match[6],sign),m:parseIso(match[7],sign),s:parseIso(match[8],sign)}}else if(duration==null){duration={}}else if(typeof duration===\"object\"&&(\"from\"in duration||\"to\"in duration)){diffRes=momentsDifference(createLocal(duration.from),createLocal(duration.to));duration={};duration.ms=diffRes.milliseconds;duration.M=diffRes.months}ret=new Duration(duration);if(isDuration(input)&&hasOwnProp(input,\"_locale\")){ret._locale=input._locale}return ret}createDuration.fn=Duration.prototype;createDuration.invalid=createInvalid$1;function parseIso(inp,sign){var res=inp&&parseFloat(inp.replace(\",\",\".\"));return(isNaN(res)?0:res)*sign}function positiveMomentsDifference(base,other){var res={milliseconds:0,months:0};res.months=other.month()-base.month()+(other.year()-base.year())*12;if(base.clone().add(res.months,\"M\").isAfter(other)){--res.months}res.milliseconds=+other-+base.clone().add(res.months,\"M\");return res}function momentsDifference(base,other){var res;if(!(base.isValid()&&other.isValid())){return{milliseconds:0,months:0}}other=cloneWithOffset(other,base);if(base.isBefore(other)){res=positiveMomentsDifference(base,other)}else{res=positiveMomentsDifference(other,base);res.milliseconds=-res.milliseconds;res.months=-res.months}return res}function createAdder(direction,name){return function(val,period){var dur,tmp;if(period!==null&&!isNaN(+period)){deprecateSimple(name,\"moment().\"+name+\"(period, number) is deprecated. Please use moment().\"+name+\"(number, period). \"+\"See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.\");tmp=val;val=period;period=tmp}val=typeof val===\"string\"?+val:val;dur=createDuration(val,period);addSubtract(this,dur,direction);return this}}function addSubtract(mom,duration,isAdding,updateOffset){var milliseconds=duration._milliseconds,days=absRound(duration._days),months=absRound(duration._months);if(!mom.isValid()){return}updateOffset=updateOffset==null?true:updateOffset;if(months){setMonth(mom,get(mom,\"Month\")+months*isAdding)}if(days){set$1(mom,\"Date\",get(mom,\"Date\")+days*isAdding)}if(milliseconds){mom._d.setTime(mom._d.valueOf()+milliseconds*isAdding)}if(updateOffset){hooks.updateOffset(mom,days||months)}}var add=createAdder(1,\"add\");var subtract=createAdder(-1,\"subtract\");function getCalendarFormat(myMoment,now){var diff=myMoment.diff(now,\"days\",true);return diff<-6?\"sameElse\":diff<-1?\"lastWeek\":diff<0?\"lastDay\":diff<1?\"sameDay\":diff<2?\"nextDay\":diff<7?\"nextWeek\":\"sameElse\"}function calendar$1(time,formats){var now=time||createLocal(),sod=cloneWithOffset(now,this).startOf(\"day\"),format=hooks.calendarFormat(this,sod)||\"sameElse\";var output=formats&&(isFunction(formats[format])?formats[format].call(this,now):formats[format]);return this.format(output||this.localeData().calendar(format,this,createLocal(now)))}function clone(){return new Moment(this)}function isAfter(input,units){var localInput=isMoment(input)?input:createLocal(input);if(!(this.isValid()&&localInput.isValid())){return false}units=normalizeUnits(!isUndefined(units)?units:\"millisecond\");if(units===\"millisecond\"){return this.valueOf()>localInput.valueOf()}else{return localInput.valueOf()<this.clone().startOf(units).valueOf()}}function isBefore(input,units){var localInput=isMoment(input)?input:createLocal(input);if(!(this.isValid()&&localInput.isValid())){return false}units=normalizeUnits(!isUndefined(units)?units:\"millisecond\");if(units===\"millisecond\"){return this.valueOf()<localInput.valueOf()}else{return this.clone().endOf(units).valueOf()<localInput.valueOf()}}function isBetween(from,to,units,inclusivity){inclusivity=inclusivity||\"()\";return(inclusivity[0]===\"(\"?this.isAfter(from,units):!this.isBefore(from,units))&&(inclusivity[1]===\")\"?this.isBefore(to,units):!this.isAfter(to,units))}function isSame(input,units){var localInput=isMoment(input)?input:createLocal(input),inputMs;if(!(this.isValid()&&localInput.isValid())){return false}units=normalizeUnits(units||\"millisecond\");if(units===\"millisecond\"){return this.valueOf()===localInput.valueOf()}else{inputMs=localInput.valueOf();return this.clone().startOf(units).valueOf()<=inputMs&&inputMs<=this.clone().endOf(units).valueOf()}}function isSameOrAfter(input,units){return this.isSame(input,units)||this.isAfter(input,units)}function isSameOrBefore(input,units){return this.isSame(input,units)||this.isBefore(input,units)}function diff(input,units,asFloat){var that,zoneDelta,delta,output;if(!this.isValid()){return NaN}that=cloneWithOffset(input,this);if(!that.isValid()){return NaN}zoneDelta=(that.utcOffset()-this.utcOffset())*6e4;units=normalizeUnits(units);switch(units){case\"year\":output=monthDiff(this,that)/12;break;case\"month\":output=monthDiff(this,that);break;case\"quarter\":output=monthDiff(this,that)/3;break;case\"second\":output=(this-that)/1e3;break;case\"minute\":output=(this-that)/6e4;break;case\"hour\":output=(this-that)/36e5;break;case\"day\":output=(this-that-zoneDelta)/864e5;break;case\"week\":output=(this-that-zoneDelta)/6048e5;break;default:output=this-that}return asFloat?output:absFloor(output)}function monthDiff(a,b){var wholeMonthDiff=(b.year()-a.year())*12+(b.month()-a.month()),anchor=a.clone().add(wholeMonthDiff,\"months\"),anchor2,adjust;if(b-anchor<0){anchor2=a.clone().add(wholeMonthDiff-1,\"months\");adjust=(b-anchor)/(anchor-anchor2)}else{anchor2=a.clone().add(wholeMonthDiff+1,\"months\");adjust=(b-anchor)/(anchor2-anchor)}return-(wholeMonthDiff+adjust)||0}hooks.defaultFormat=\"YYYY-MM-DDTHH:mm:ssZ\";hooks.defaultFormatUtc=\"YYYY-MM-DDTHH:mm:ss[Z]\";function toString(){return this.clone().locale(\"en\").format(\"ddd MMM DD YYYY HH:mm:ss [GMT]ZZ\")}function toISOString(){if(!this.isValid()){return null}var m=this.clone().utc();if(m.year()<0||m.year()>9999){return formatMoment(m,\"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]\")}if(isFunction(Date.prototype.toISOString)){return this.toDate().toISOString()}return formatMoment(m,\"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]\")}function inspect(){if(!this.isValid()){return\"moment.invalid(/* \"+this._i+\" */)\"}var func=\"moment\";var zone=\"\";if(!this.isLocal()){func=this.utcOffset()===0?\"moment.utc\":\"moment.parseZone\";zone=\"Z\"}var prefix=\"[\"+func+'(\"]';var year=0<=this.year()&&this.year()<=9999?\"YYYY\":\"YYYYYY\";var datetime=\"-MM-DD[T]HH:mm:ss.SSS\";var suffix=zone+'[\")]';return this.format(prefix+year+datetime+suffix)}function format(inputString){if(!inputString){inputString=this.isUtc()?hooks.defaultFormatUtc:hooks.defaultFormat}var output=formatMoment(this,inputString);return this.localeData().postformat(output)}function from(time,withoutSuffix){if(this.isValid()&&(isMoment(time)&&time.isValid()||createLocal(time).isValid())){return createDuration({to:this,from:time}).locale(this.locale()).humanize(!withoutSuffix)}else{return this.localeData().invalidDate()}}function fromNow(withoutSuffix){return this.from(createLocal(),withoutSuffix)}function to(time,withoutSuffix){if(this.isValid()&&(isMoment(time)&&time.isValid()||createLocal(time).isValid())){return createDuration({from:this,to:time}).locale(this.locale()).humanize(!withoutSuffix)}else{return this.localeData().invalidDate()}}function toNow(withoutSuffix){return this.to(createLocal(),withoutSuffix)}function locale(key){var newLocaleData;if(key===undefined){return this._locale._abbr}else{newLocaleData=getLocale(key);if(newLocaleData!=null){this._locale=newLocaleData}return this}}var lang=deprecate(\"moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.\",function(key){if(key===undefined){return this.localeData()}else{return this.locale(key)}});function localeData(){return this._locale}function startOf(units){units=normalizeUnits(units);switch(units){case\"year\":this.month(0);case\"quarter\":case\"month\":this.date(1);case\"week\":case\"isoWeek\":case\"day\":case\"date\":this.hours(0);case\"hour\":this.minutes(0);case\"minute\":this.seconds(0);case\"second\":this.milliseconds(0)}if(units===\"week\"){this.weekday(0)}if(units===\"isoWeek\"){this.isoWeekday(1)}if(units===\"quarter\"){this.month(Math.floor(this.month()/3)*3)}return this}function endOf(units){units=normalizeUnits(units);if(units===undefined||units===\"millisecond\"){return this}if(units===\"date\"){units=\"day\"}return this.startOf(units).add(1,units===\"isoWeek\"?\"week\":units).subtract(1,\"ms\")}function valueOf(){return this._d.valueOf()-(this._offset||0)*6e4}function unix(){return Math.floor(this.valueOf()/1e3)}function toDate(){return new Date(this.valueOf())}function toArray(){var m=this;return[m.year(),m.month(),m.date(),m.hour(),m.minute(),m.second(),m.millisecond()]}function toObject(){var m=this;return{years:m.year(),months:m.month(),date:m.date(),hours:m.hours(),minutes:m.minutes(),seconds:m.seconds(),milliseconds:m.milliseconds()}}function toJSON(){return this.isValid()?this.toISOString():null}function isValid$2(){return isValid(this)}function parsingFlags(){return extend({},getParsingFlags(this))}function invalidAt(){return getParsingFlags(this).overflow}function creationData(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}addFormatToken(0,[\"gg\",2],0,function(){return this.weekYear()%100});addFormatToken(0,[\"GG\",2],0,function(){return this.isoWeekYear()%100});function addWeekYearFormatToken(token,getter){addFormatToken(0,[token,token.length],0,getter)}addWeekYearFormatToken(\"gggg\",\"weekYear\");addWeekYearFormatToken(\"ggggg\",\"weekYear\");addWeekYearFormatToken(\"GGGG\",\"isoWeekYear\");addWeekYearFormatToken(\"GGGGG\",\"isoWeekYear\");addUnitAlias(\"weekYear\",\"gg\");addUnitAlias(\"isoWeekYear\",\"GG\");addUnitPriority(\"weekYear\",1);addUnitPriority(\"isoWeekYear\",1);addRegexToken(\"G\",matchSigned);addRegexToken(\"g\",matchSigned);addRegexToken(\"GG\",match1to2,match2);addRegexToken(\"gg\",match1to2,match2);addRegexToken(\"GGGG\",match1to4,match4);addRegexToken(\"gggg\",match1to4,match4);addRegexToken(\"GGGGG\",match1to6,match6);addRegexToken(\"ggggg\",match1to6,match6);addWeekParseToken([\"gggg\",\"ggggg\",\"GGGG\",\"GGGGG\"],function(input,week,config,token){week[token.substr(0,2)]=toInt(input)});addWeekParseToken([\"gg\",\"GG\"],function(input,week,config,token){week[token]=hooks.parseTwoDigitYear(input)});function getSetWeekYear(input){return getSetWeekYearHelper.call(this,input,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function getSetISOWeekYear(input){return getSetWeekYearHelper.call(this,input,this.isoWeek(),this.isoWeekday(),1,4)}function getISOWeeksInYear(){return weeksInYear(this.year(),1,4)}function getWeeksInYear(){var weekInfo=this.localeData()._week;return weeksInYear(this.year(),weekInfo.dow,weekInfo.doy)}function getSetWeekYearHelper(input,week,weekday,dow,doy){var weeksTarget;if(input==null){return weekOfYear(this,dow,doy).year}else{weeksTarget=weeksInYear(input,dow,doy);if(week>weeksTarget){week=weeksTarget}return setWeekAll.call(this,input,week,weekday,dow,doy)}}function setWeekAll(weekYear,week,weekday,dow,doy){var dayOfYearData=dayOfYearFromWeeks(weekYear,week,weekday,dow,doy),date=createUTCDate(dayOfYearData.year,0,dayOfYearData.dayOfYear);this.year(date.getUTCFullYear());this.month(date.getUTCMonth());this.date(date.getUTCDate());return this}addFormatToken(\"Q\",0,\"Qo\",\"quarter\");addUnitAlias(\"quarter\",\"Q\");addUnitPriority(\"quarter\",7);addRegexToken(\"Q\",match1);addParseToken(\"Q\",function(input,array){array[MONTH]=(toInt(input)-1)*3});function getSetQuarter(input){return input==null?Math.ceil((this.month()+1)/3):this.month((input-1)*3+this.month()%3)}addFormatToken(\"D\",[\"DD\",2],\"Do\",\"date\");addUnitAlias(\"date\",\"D\");addUnitPriority(\"date\",9);addRegexToken(\"D\",match1to2);addRegexToken(\"DD\",match1to2,match2);addRegexToken(\"Do\",function(isStrict,locale){return isStrict?locale._dayOfMonthOrdinalParse||locale._ordinalParse:locale._dayOfMonthOrdinalParseLenient});addParseToken([\"D\",\"DD\"],DATE);addParseToken(\"Do\",function(input,array){array[DATE]=toInt(input.match(match1to2)[0],10)});var getSetDayOfMonth=makeGetSet(\"Date\",true);addFormatToken(\"DDD\",[\"DDDD\",3],\"DDDo\",\"dayOfYear\");addUnitAlias(\"dayOfYear\",\"DDD\");addUnitPriority(\"dayOfYear\",4);addRegexToken(\"DDD\",match1to3);addRegexToken(\"DDDD\",match3);addParseToken([\"DDD\",\"DDDD\"],function(input,array,config){config._dayOfYear=toInt(input)});function getSetDayOfYear(input){var dayOfYear=Math.round((this.clone().startOf(\"day\")-this.clone().startOf(\"year\"))/864e5)+1;return input==null?dayOfYear:this.add(input-dayOfYear,\"d\")}addFormatToken(\"m\",[\"mm\",2],0,\"minute\");addUnitAlias(\"minute\",\"m\");addUnitPriority(\"minute\",14);addRegexToken(\"m\",match1to2);addRegexToken(\"mm\",match1to2,match2);addParseToken([\"m\",\"mm\"],MINUTE);var getSetMinute=makeGetSet(\"Minutes\",false);addFormatToken(\"s\",[\"ss\",2],0,\"second\");addUnitAlias(\"second\",\"s\");addUnitPriority(\"second\",15);addRegexToken(\"s\",match1to2);addRegexToken(\"ss\",match1to2,match2);addParseToken([\"s\",\"ss\"],SECOND);var getSetSecond=makeGetSet(\"Seconds\",false);addFormatToken(\"S\",0,0,function(){return~~(this.millisecond()/100)});addFormatToken(0,[\"SS\",2],0,function(){return~~(this.millisecond()/10)});addFormatToken(0,[\"SSS\",3],0,\"millisecond\");addFormatToken(0,[\"SSSS\",4],0,function(){return this.millisecond()*10});addFormatToken(0,[\"SSSSS\",5],0,function(){return this.millisecond()*100});addFormatToken(0,[\"SSSSSS\",6],0,function(){return this.millisecond()*1e3});addFormatToken(0,[\"SSSSSSS\",7],0,function(){return this.millisecond()*1e4});addFormatToken(0,[\"SSSSSSSS\",8],0,function(){return this.millisecond()*1e5});addFormatToken(0,[\"SSSSSSSSS\",9],0,function(){return this.millisecond()*1e6});addUnitAlias(\"millisecond\",\"ms\");addUnitPriority(\"millisecond\",16);addRegexToken(\"S\",match1to3,match1);addRegexToken(\"SS\",match1to3,match2);addRegexToken(\"SSS\",match1to3,match3);var token;for(token=\"SSSS\";token.length<=9;token+=\"S\"){addRegexToken(token,matchUnsigned)}function parseMs(input,array){array[MILLISECOND]=toInt((\"0.\"+input)*1e3)}for(token=\"S\";token.length<=9;token+=\"S\"){addParseToken(token,parseMs)}var getSetMillisecond=makeGetSet(\"Milliseconds\",false);addFormatToken(\"z\",0,0,\"zoneAbbr\");addFormatToken(\"zz\",0,0,\"zoneName\");function getZoneAbbr(){return this._isUTC?\"UTC\":\"\"}function getZoneName(){return this._isUTC?\"Coordinated Universal Time\":\"\"}var proto=Moment.prototype;proto.add=add;proto.calendar=calendar$1;proto.clone=clone;proto.diff=diff;proto.endOf=endOf;proto.format=format;proto.from=from;proto.fromNow=fromNow;proto.to=to;proto.toNow=toNow;proto.get=stringGet;proto.invalidAt=invalidAt;proto.isAfter=isAfter;proto.isBefore=isBefore;proto.isBetween=isBetween;proto.isSame=isSame;proto.isSameOrAfter=isSameOrAfter;proto.isSameOrBefore=isSameOrBefore;proto.isValid=isValid$2;proto.lang=lang;proto.locale=locale;proto.localeData=localeData;proto.max=prototypeMax;proto.min=prototypeMin;proto.parsingFlags=parsingFlags;proto.set=stringSet;proto.startOf=startOf;proto.subtract=subtract;proto.toArray=toArray;proto.toObject=toObject;proto.toDate=toDate;proto.toISOString=toISOString;proto.inspect=inspect;proto.toJSON=toJSON;proto.toString=toString;proto.unix=unix;proto.valueOf=valueOf;proto.creationData=creationData;proto.year=getSetYear;proto.isLeapYear=getIsLeapYear;proto.weekYear=getSetWeekYear;proto.isoWeekYear=getSetISOWeekYear;proto.quarter=proto.quarters=getSetQuarter;proto.month=getSetMonth;proto.daysInMonth=getDaysInMonth;proto.week=proto.weeks=getSetWeek;proto.isoWeek=proto.isoWeeks=getSetISOWeek;proto.weeksInYear=getWeeksInYear;proto.isoWeeksInYear=getISOWeeksInYear;proto.date=getSetDayOfMonth;proto.day=proto.days=getSetDayOfWeek;proto.weekday=getSetLocaleDayOfWeek;proto.isoWeekday=getSetISODayOfWeek;proto.dayOfYear=getSetDayOfYear;proto.hour=proto.hours=getSetHour;proto.minute=proto.minutes=getSetMinute;proto.second=proto.seconds=getSetSecond;proto.millisecond=proto.milliseconds=getSetMillisecond;proto.utcOffset=getSetOffset;proto.utc=setOffsetToUTC;proto.local=setOffsetToLocal;proto.parseZone=setOffsetToParsedOffset;proto.hasAlignedHourOffset=hasAlignedHourOffset;proto.isDST=isDaylightSavingTime;proto.isLocal=isLocal;proto.isUtcOffset=isUtcOffset;proto.isUtc=isUtc;proto.isUTC=isUtc;proto.zoneAbbr=getZoneAbbr;proto.zoneName=getZoneName;proto.dates=deprecate(\"dates accessor is deprecated. Use date instead.\",getSetDayOfMonth);proto.months=deprecate(\"months accessor is deprecated. Use month instead\",getSetMonth);proto.years=deprecate(\"years accessor is deprecated. Use year instead\",getSetYear);proto.zone=deprecate(\"moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/\",getSetZone);proto.isDSTShifted=deprecate(\"isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information\",isDaylightSavingTimeShifted);function createUnix(input){return createLocal(input*1e3)}function createInZone(){return createLocal.apply(null,arguments).parseZone()}function preParsePostFormat(string){return string}var proto$1=Locale.prototype;proto$1.calendar=calendar;proto$1.longDateFormat=longDateFormat;proto$1.invalidDate=invalidDate;proto$1.ordinal=ordinal;proto$1.preparse=preParsePostFormat;proto$1.postformat=preParsePostFormat;proto$1.relativeTime=relativeTime;proto$1.pastFuture=pastFuture;proto$1.set=set;proto$1.months=localeMonths;proto$1.monthsShort=localeMonthsShort;proto$1.monthsParse=localeMonthsParse;proto$1.monthsRegex=monthsRegex;proto$1.monthsShortRegex=monthsShortRegex;proto$1.week=localeWeek;proto$1.firstDayOfYear=localeFirstDayOfYear;proto$1.firstDayOfWeek=localeFirstDayOfWeek;proto$1.weekdays=localeWeekdays;proto$1.weekdaysMin=localeWeekdaysMin;proto$1.weekdaysShort=localeWeekdaysShort;proto$1.weekdaysParse=localeWeekdaysParse;proto$1.weekdaysRegex=weekdaysRegex;proto$1.weekdaysShortRegex=weekdaysShortRegex;proto$1.weekdaysMinRegex=weekdaysMinRegex;proto$1.isPM=localeIsPM;proto$1.meridiem=localeMeridiem;function get$1(format,index,field,setter){var locale=getLocale();var utc=createUTC().set(setter,index);return locale[field](utc,format)}function listMonthsImpl(format,index,field){if(isNumber(format)){index=format;format=undefined}format=format||\"\";if(index!=null){return get$1(format,index,field,\"month\")}var i;var out=[];for(i=0;i<12;i++){out[i]=get$1(format,i,field,\"month\")}return out}function listWeekdaysImpl(localeSorted,format,index,field){if(typeof localeSorted===\"boolean\"){if(isNumber(format)){index=format;format=undefined}format=format||\"\"}else{format=localeSorted;index=format;localeSorted=false;if(isNumber(format)){index=format;format=undefined}format=format||\"\"}var locale=getLocale(),shift=localeSorted?locale._week.dow:0;if(index!=null){return get$1(format,(index+shift)%7,field,\"day\")}var i;var out=[];for(i=0;i<7;i++){out[i]=get$1(format,(i+shift)%7,field,\"day\")}return out}function listMonths(format,index){return listMonthsImpl(format,index,\"months\")}function listMonthsShort(format,index){return listMonthsImpl(format,index,\"monthsShort\")}function listWeekdays(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,\"weekdays\")}function listWeekdaysShort(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,\"weekdaysShort\")}function listWeekdaysMin(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,\"weekdaysMin\")}getSetGlobalLocale(\"en\",{dayOfMonthOrdinalParse:/\\d{1,2}(th|st|nd|rd)/,ordinal:function(number){var b=number%10,output=toInt(number%100/10)===1?\"th\":b===1?\"st\":b===2?\"nd\":b===3?\"rd\":\"th\";return number+output}});hooks.lang=deprecate(\"moment.lang is deprecated. Use moment.locale instead.\",getSetGlobalLocale);hooks.langData=deprecate(\"moment.langData is deprecated. Use moment.localeData instead.\",getLocale);var mathAbs=Math.abs;function abs(){var data=this._data;this._milliseconds=mathAbs(this._milliseconds);this._days=mathAbs(this._days);this._months=mathAbs(this._months);data.milliseconds=mathAbs(data.milliseconds);data.seconds=mathAbs(data.seconds);data.minutes=mathAbs(data.minutes);data.hours=mathAbs(data.hours);data.months=mathAbs(data.months);data.years=mathAbs(data.years);return this}function addSubtract$1(duration,input,value,direction){var other=createDuration(input,value);duration._milliseconds+=direction*other._milliseconds;duration._days+=direction*other._days;duration._months+=direction*other._months;return duration._bubble()}function add$1(input,value){return addSubtract$1(this,input,value,1)}function subtract$1(input,value){return addSubtract$1(this,input,value,-1)}function absCeil(number){if(number<0){return Math.floor(number)}else{return Math.ceil(number)}}function bubble(){var milliseconds=this._milliseconds;var days=this._days;var months=this._months;var data=this._data;var seconds,minutes,hours,years,monthsFromDays;if(!(milliseconds>=0&&days>=0&&months>=0||milliseconds<=0&&days<=0&&months<=0)){milliseconds+=absCeil(monthsToDays(months)+days)*864e5;days=0;months=0}data.milliseconds=milliseconds%1e3;seconds=absFloor(milliseconds/1e3);data.seconds=seconds%60;minutes=absFloor(seconds/60)\n;data.minutes=minutes%60;hours=absFloor(minutes/60);data.hours=hours%24;days+=absFloor(hours/24);monthsFromDays=absFloor(daysToMonths(days));months+=monthsFromDays;days-=absCeil(monthsToDays(monthsFromDays));years=absFloor(months/12);months%=12;data.days=days;data.months=months;data.years=years;return this}function daysToMonths(days){return days*4800/146097}function monthsToDays(months){return months*146097/4800}function as(units){if(!this.isValid()){return NaN}var days;var months;var milliseconds=this._milliseconds;units=normalizeUnits(units);if(units===\"month\"||units===\"year\"){days=this._days+milliseconds/864e5;months=this._months+daysToMonths(days);return units===\"month\"?months:months/12}else{days=this._days+Math.round(monthsToDays(this._months));switch(units){case\"week\":return days/7+milliseconds/6048e5;case\"day\":return days+milliseconds/864e5;case\"hour\":return days*24+milliseconds/36e5;case\"minute\":return days*1440+milliseconds/6e4;case\"second\":return days*86400+milliseconds/1e3;case\"millisecond\":return Math.floor(days*864e5)+milliseconds;default:throw new Error(\"Unknown unit \"+units)}}}function valueOf$1(){if(!this.isValid()){return NaN}return this._milliseconds+this._days*864e5+this._months%12*2592e6+toInt(this._months/12)*31536e6}function makeAs(alias){return function(){return this.as(alias)}}var asMilliseconds=makeAs(\"ms\");var asSeconds=makeAs(\"s\");var asMinutes=makeAs(\"m\");var asHours=makeAs(\"h\");var asDays=makeAs(\"d\");var asWeeks=makeAs(\"w\");var asMonths=makeAs(\"M\");var asYears=makeAs(\"y\");function clone$1(){return createDuration(this)}function get$2(units){units=normalizeUnits(units);return this.isValid()?this[units+\"s\"]():NaN}function makeGetter(name){return function(){return this.isValid()?this._data[name]:NaN}}var milliseconds=makeGetter(\"milliseconds\");var seconds=makeGetter(\"seconds\");var minutes=makeGetter(\"minutes\");var hours=makeGetter(\"hours\");var days=makeGetter(\"days\");var months=makeGetter(\"months\");var years=makeGetter(\"years\");function weeks(){return absFloor(this.days()/7)}var round=Math.round;var thresholds={ss:44,s:45,m:45,h:22,d:26,M:11};function substituteTimeAgo(string,number,withoutSuffix,isFuture,locale){return locale.relativeTime(number||1,!!withoutSuffix,string,isFuture)}function relativeTime$1(posNegDuration,withoutSuffix,locale){var duration=createDuration(posNegDuration).abs();var seconds=round(duration.as(\"s\"));var minutes=round(duration.as(\"m\"));var hours=round(duration.as(\"h\"));var days=round(duration.as(\"d\"));var months=round(duration.as(\"M\"));var years=round(duration.as(\"y\"));var a=seconds<=thresholds.ss&&[\"s\",seconds]||seconds<thresholds.s&&[\"ss\",seconds]||minutes<=1&&[\"m\"]||minutes<thresholds.m&&[\"mm\",minutes]||hours<=1&&[\"h\"]||hours<thresholds.h&&[\"hh\",hours]||days<=1&&[\"d\"]||days<thresholds.d&&[\"dd\",days]||months<=1&&[\"M\"]||months<thresholds.M&&[\"MM\",months]||years<=1&&[\"y\"]||[\"yy\",years];a[2]=withoutSuffix;a[3]=+posNegDuration>0;a[4]=locale;return substituteTimeAgo.apply(null,a)}function getSetRelativeTimeRounding(roundingFunction){if(roundingFunction===undefined){return round}if(typeof roundingFunction===\"function\"){round=roundingFunction;return true}return false}function getSetRelativeTimeThreshold(threshold,limit){if(thresholds[threshold]===undefined){return false}if(limit===undefined){return thresholds[threshold]}thresholds[threshold]=limit;if(threshold===\"s\"){thresholds.ss=limit-1}return true}function humanize(withSuffix){if(!this.isValid()){return this.localeData().invalidDate()}var locale=this.localeData();var output=relativeTime$1(this,!withSuffix,locale);if(withSuffix){output=locale.pastFuture(+this,output)}return locale.postformat(output)}var abs$1=Math.abs;function sign(x){return(x>0)-(x<0)||+x}function toISOString$1(){if(!this.isValid()){return this.localeData().invalidDate()}var seconds=abs$1(this._milliseconds)/1e3;var days=abs$1(this._days);var months=abs$1(this._months);var minutes,hours,years;minutes=absFloor(seconds/60);hours=absFloor(minutes/60);seconds%=60;minutes%=60;years=absFloor(months/12);months%=12;var Y=years;var M=months;var D=days;var h=hours;var m=minutes;var s=seconds?seconds.toFixed(3).replace(/\\.?0+$/,\"\"):\"\";var total=this.asSeconds();if(!total){return\"P0D\"}var totalSign=total<0?\"-\":\"\";var ymSign=sign(this._months)!==sign(total)?\"-\":\"\";var daysSign=sign(this._days)!==sign(total)?\"-\":\"\";var hmsSign=sign(this._milliseconds)!==sign(total)?\"-\":\"\";return totalSign+\"P\"+(Y?ymSign+Y+\"Y\":\"\")+(M?ymSign+M+\"M\":\"\")+(D?daysSign+D+\"D\":\"\")+(h||m||s?\"T\":\"\")+(h?hmsSign+h+\"H\":\"\")+(m?hmsSign+m+\"M\":\"\")+(s?hmsSign+s+\"S\":\"\")}var proto$2=Duration.prototype;proto$2.isValid=isValid$1;proto$2.abs=abs;proto$2.add=add$1;proto$2.subtract=subtract$1;proto$2.as=as;proto$2.asMilliseconds=asMilliseconds;proto$2.asSeconds=asSeconds;proto$2.asMinutes=asMinutes;proto$2.asHours=asHours;proto$2.asDays=asDays;proto$2.asWeeks=asWeeks;proto$2.asMonths=asMonths;proto$2.asYears=asYears;proto$2.valueOf=valueOf$1;proto$2._bubble=bubble;proto$2.clone=clone$1;proto$2.get=get$2;proto$2.milliseconds=milliseconds;proto$2.seconds=seconds;proto$2.minutes=minutes;proto$2.hours=hours;proto$2.days=days;proto$2.weeks=weeks;proto$2.months=months;proto$2.years=years;proto$2.humanize=humanize;proto$2.toISOString=toISOString$1;proto$2.toString=toISOString$1;proto$2.toJSON=toISOString$1;proto$2.locale=locale;proto$2.localeData=localeData;proto$2.toIsoString=deprecate(\"toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)\",toISOString$1);proto$2.lang=lang;addFormatToken(\"X\",0,0,\"unix\");addFormatToken(\"x\",0,0,\"valueOf\");addRegexToken(\"x\",matchSigned);addRegexToken(\"X\",matchTimestamp);addParseToken(\"X\",function(input,array,config){config._d=new Date(parseFloat(input,10)*1e3)});addParseToken(\"x\",function(input,array,config){config._d=new Date(toInt(input))});hooks.version=\"2.19.1\";setHookCallback(createLocal);hooks.fn=proto;hooks.min=min;hooks.max=max;hooks.now=now;hooks.utc=createUTC;hooks.unix=createUnix;hooks.months=listMonths;hooks.isDate=isDate;hooks.locale=getSetGlobalLocale;hooks.invalid=createInvalid;hooks.duration=createDuration;hooks.isMoment=isMoment;hooks.weekdays=listWeekdays;hooks.parseZone=createInZone;hooks.localeData=getLocale;hooks.isDuration=isDuration;hooks.monthsShort=listMonthsShort;hooks.weekdaysMin=listWeekdaysMin;hooks.defineLocale=defineLocale;hooks.updateLocale=updateLocale;hooks.locales=listLocales;hooks.weekdaysShort=listWeekdaysShort;hooks.normalizeUnits=normalizeUnits;hooks.relativeTimeRounding=getSetRelativeTimeRounding;hooks.relativeTimeThreshold=getSetRelativeTimeThreshold;hooks.calendarFormat=getCalendarFormat;hooks.prototype=proto;return hooks})}).call(exports,__webpack_require__(155)(module))},function(module,exports){module.exports=function(module){if(!module.webpackPolyfill){module.deprecate=function(){};module.paths=[];if(!module.children)module.children=[];Object.defineProperty(module,\"loaded\",{enumerable:true,get:function(){return module.l}});Object.defineProperty(module,\"id\",{enumerable:true,get:function(){return module.i}});module.webpackPolyfill=1}return module}},function(module,exports){function webpackEmptyContext(req){throw new Error(\"Cannot find module '\"+req+\"'.\")}webpackEmptyContext.keys=function(){return[]};webpackEmptyContext.resolve=webpackEmptyContext;module.exports=webpackEmptyContext;webpackEmptyContext.id=156},function(module,exports,__webpack_require__){\"use strict\";(function(global){var _rng;var globalVar=typeof window!==\"undefined\"?window:typeof global!==\"undefined\"?global:null;if(globalVar&&globalVar.crypto&&crypto.getRandomValues){var _rnds8=new Uint8Array(16);_rng=function whatwgRNG(){crypto.getRandomValues(_rnds8);return _rnds8}}if(!_rng){var _rnds=new Array(16);_rng=function _rng(){for(var i=0,r;i<16;i++){if((i&3)===0)r=Math.random()*4294967296;_rnds[i]=r>>>((i&3)<<3)&255}return _rnds}}var _byteToHex=[];var _hexToByte={};for(var i=0;i<256;i++){_byteToHex[i]=(i+256).toString(16).substr(1);_hexToByte[_byteToHex[i]]=i}function parse(s,buf,offset){var i=buf&&offset||0,ii=0;buf=buf||[];s.toLowerCase().replace(/[0-9a-f]{2}/g,function(oct){if(ii<16){buf[i+ii++]=_hexToByte[oct]}});while(ii<16){buf[i+ii++]=0}return buf}function unparse(buf,offset){var i=offset||0,bth=_byteToHex;return bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+\"-\"+bth[buf[i++]]+bth[buf[i++]]+\"-\"+bth[buf[i++]]+bth[buf[i++]]+\"-\"+bth[buf[i++]]+bth[buf[i++]]+\"-\"+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]}var _seedBytes=_rng();var _nodeId=[_seedBytes[0]|1,_seedBytes[1],_seedBytes[2],_seedBytes[3],_seedBytes[4],_seedBytes[5]];var _clockseq=(_seedBytes[6]<<8|_seedBytes[7])&16383;var _lastMSecs=0,_lastNSecs=0;function v1(options,buf,offset){var i=buf&&offset||0;var b=buf||[];options=options||{};var clockseq=options.clockseq!==undefined?options.clockseq:_clockseq;var msecs=options.msecs!==undefined?options.msecs:(new Date).getTime();var nsecs=options.nsecs!==undefined?options.nsecs:_lastNSecs+1;var dt=msecs-_lastMSecs+(nsecs-_lastNSecs)/1e4;if(dt<0&&options.clockseq===undefined){clockseq=clockseq+1&16383}if((dt<0||msecs>_lastMSecs)&&options.nsecs===undefined){nsecs=0}if(nsecs>=1e4){throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\")}_lastMSecs=msecs;_lastNSecs=nsecs;_clockseq=clockseq;msecs+=122192928e5;var tl=((msecs&268435455)*1e4+nsecs)%4294967296;b[i++]=tl>>>24&255;b[i++]=tl>>>16&255;b[i++]=tl>>>8&255;b[i++]=tl&255;var tmh=msecs/4294967296*1e4&268435455;b[i++]=tmh>>>8&255;b[i++]=tmh&255;b[i++]=tmh>>>24&15|16;b[i++]=tmh>>>16&255;b[i++]=clockseq>>>8|128;b[i++]=clockseq&255;var node=options.node||_nodeId;for(var n=0;n<6;n++){b[i+n]=node[n]}return buf?buf:unparse(b)}function v4(options,buf,offset){var i=buf&&offset||0;if(typeof options==\"string\"){buf=options==\"binary\"?new Array(16):null;options=null}options=options||{};var rnds=options.random||(options.rng||_rng)();rnds[6]=rnds[6]&15|64;rnds[8]=rnds[8]&63|128;if(buf){for(var ii=0;ii<16;ii++){buf[i+ii]=rnds[ii]}}return buf||unparse(rnds)}var uuid=v4;uuid.v1=v1;uuid.v4=v4;uuid.parse=parse;uuid.unparse=unparse;module.exports=uuid}).call(exports,__webpack_require__(158))},function(module,exports){var g;g=function(){return this}();try{g=g||Function(\"return this\")()||(1,eval)(\"this\")}catch(e){if(typeof window===\"object\")g=window}module.exports=g},function(module,exports,__webpack_require__){\"use strict\";exports.util=__webpack_require__(2);exports.DOMutil=__webpack_require__(14);exports.DataSet=__webpack_require__(11);exports.DataView=__webpack_require__(12);exports.Queue=__webpack_require__(43);exports.Graph3d=__webpack_require__(161);exports.graph3d={Camera:__webpack_require__(95),Filter:__webpack_require__(96),Point2d:__webpack_require__(91),Point3d:__webpack_require__(34),Slider:__webpack_require__(92),StepNumber:__webpack_require__(93)};exports.moment=__webpack_require__(9);exports.Hammer=__webpack_require__(10);exports.keycharm=__webpack_require__(35)},function(module,exports,__webpack_require__){var core=__webpack_require__(7);var $JSON=core.JSON||(core.JSON={stringify:JSON.stringify});module.exports=function stringify(it){return $JSON.stringify.apply($JSON,arguments)}},function(module,exports,__webpack_require__){\"use strict\";var _assign=__webpack_require__(90);var _assign2=_interopRequireDefault(_assign);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Emitter=__webpack_require__(44);var util=__webpack_require__(2);var Point3d=__webpack_require__(34);var Point2d=__webpack_require__(91);var Slider=__webpack_require__(92);var StepNumber=__webpack_require__(93);var Settings=__webpack_require__(94);var Validator=__webpack_require__(15)[\"default\"];var _require=__webpack_require__(15),printStyle=_require.printStyle;var _require2=__webpack_require__(172),allOptions=_require2.allOptions;var DataGroup=__webpack_require__(173);Graph3d.STYLE=Settings.STYLE;var autoByDefault=undefined;Graph3d.DEFAULTS={width:\"400px\",height:\"400px\",filterLabel:\"time\",legendLabel:\"value\",xLabel:\"x\",yLabel:\"y\",zLabel:\"z\",xValueLabel:function xValueLabel(v){return v},yValueLabel:function yValueLabel(v){return v},zValueLabel:function zValueLabel(v){return v},showXAxis:true,showYAxis:true,showZAxis:true,showGrid:true,showPerspective:true,showShadow:false,keepAspectRatio:true,verticalRatio:.5,dotSizeRatio:.02,dotSizeMinFraction:.5,dotSizeMaxFraction:2.5,showAnimationControls:autoByDefault,animationInterval:1e3,animationPreload:false,animationAutoStart:autoByDefault,axisColor:\"#4D4D4D\",gridColor:\"#D3D3D3\",xCenter:\"55%\",yCenter:\"50%\",style:Graph3d.STYLE.DOT,tooltip:false,tooltipStyle:{content:{padding:\"10px\",border:\"1px solid #4d4d4d\",color:\"#1a1a1a\",background:\"rgba(255,255,255,0.7)\",borderRadius:\"2px\",boxShadow:\"5px 5px 10px rgba(128,128,128,0.5)\"},line:{height:\"40px\",width:\"0\",borderLeft:\"1px solid #4d4d4d\"},dot:{height:\"0\",width:\"0\",border:\"5px solid #4d4d4d\",borderRadius:\"5px\"}},dataColor:{fill:\"#7DC1FF\",stroke:\"#3267D2\",strokeWidth:1},cameraPosition:{horizontal:1,vertical:.5,distance:1.7},showLegend:autoByDefault,backgroundColor:autoByDefault,xBarWidth:autoByDefault,yBarWidth:autoByDefault,valueMin:autoByDefault,valueMax:autoByDefault,xMin:autoByDefault,xMax:autoByDefault,xStep:autoByDefault,yMin:autoByDefault,yMax:autoByDefault,yStep:autoByDefault,zMin:autoByDefault,zMax:autoByDefault,zStep:autoByDefault};function Graph3d(container,data,options){if(!(this instanceof Graph3d)){throw new SyntaxError(\"Constructor must be called with the new operator\")}this.containerElement=container;this.dataGroup=new DataGroup;this.dataPoints=null;this.create();Settings.setDefaults(Graph3d.DEFAULTS,this);this.colX=undefined;this.colY=undefined;this.colZ=undefined;this.colValue=undefined;this.setOptions(options);this.setData(data)}Emitter(Graph3d.prototype);Graph3d.prototype._setScale=function(){this.scale=new Point3d(1/this.xRange.range(),1/this.yRange.range(),1/this.zRange.range());if(this.keepAspectRatio){if(this.scale.x<this.scale.y){this.scale.y=this.scale.x}else{this.scale.x=this.scale.y}}this.scale.z*=this.verticalRatio;if(this.valueRange!==undefined){this.scale.value=1/this.valueRange.range()}var xCenter=this.xRange.center()*this.scale.x;var yCenter=this.yRange.center()*this.scale.y;var zCenter=this.zRange.center()*this.scale.z;this.camera.setArmLocation(xCenter,yCenter,zCenter)};Graph3d.prototype._convert3Dto2D=function(point3d){var translation=this._convertPointToTranslation(point3d);return this._convertTranslationToScreen(translation)};Graph3d.prototype._convertPointToTranslation=function(point3d){var cameraLocation=this.camera.getCameraLocation(),cameraRotation=this.camera.getCameraRotation(),ax=point3d.x*this.scale.x,ay=point3d.y*this.scale.y,az=point3d.z*this.scale.z,cx=cameraLocation.x,cy=cameraLocation.y,cz=cameraLocation.z,sinTx=Math.sin(cameraRotation.x),cosTx=Math.cos(cameraRotation.x),sinTy=Math.sin(cameraRotation.y),cosTy=Math.cos(cameraRotation.y),sinTz=Math.sin(cameraRotation.z),cosTz=Math.cos(cameraRotation.z),dx=cosTy*(sinTz*(ay-cy)+cosTz*(ax-cx))-sinTy*(az-cz),dy=sinTx*(cosTy*(az-cz)+sinTy*(sinTz*(ay-cy)+cosTz*(ax-cx)))+cosTx*(cosTz*(ay-cy)-sinTz*(ax-cx)),dz=cosTx*(cosTy*(az-cz)+sinTy*(sinTz*(ay-cy)+cosTz*(ax-cx)))-sinTx*(cosTz*(ay-cy)-sinTz*(ax-cx));return new Point3d(dx,dy,dz)};Graph3d.prototype._convertTranslationToScreen=function(translation){var ex=this.eye.x,ey=this.eye.y,ez=this.eye.z,dx=translation.x,dy=translation.y,dz=translation.z;var bx;var by;if(this.showPerspective){bx=(dx-ex)*(ez/dz);by=(dy-ey)*(ez/dz)}else{bx=dx*-(ez/this.camera.getArmLength());by=dy*-(ez/this.camera.getArmLength())}return new Point2d(this.currentXCenter+bx*this.frame.canvas.clientWidth,this.currentYCenter-by*this.frame.canvas.clientWidth)};Graph3d.prototype._calcTranslations=function(points){for(var i=0;i<points.length;i++){var point=points[i];point.trans=this._convertPointToTranslation(point.point);point.screen=this._convertTranslationToScreen(point.trans);var transBottom=this._convertPointToTranslation(point.bottom);point.dist=this.showPerspective?transBottom.length():-transBottom.z}var sortDepth=function sortDepth(a,b){return b.dist-a.dist};points.sort(sortDepth)};Graph3d.prototype._initializeRanges=function(){var dg=this.dataGroup;this.xRange=dg.xRange;this.yRange=dg.yRange;this.zRange=dg.zRange;this.valueRange=dg.valueRange;this.xStep=dg.xStep;this.yStep=dg.yStep;this.zStep=dg.zStep;this.xBarWidth=dg.xBarWidth;this.yBarWidth=dg.yBarWidth;this.colX=dg.colX;this.colY=dg.colY;this.colZ=dg.colZ;this.colValue=dg.colValue;this._setScale()};Graph3d.prototype.getDataPoints=function(data){var dataPoints=[];for(var i=0;i<data.length;i++){var point=new Point3d;point.x=data[i][this.colX]||0;point.y=data[i][this.colY]||0;point.z=data[i][this.colZ]||0;point.data=data[i];if(this.colValue!==undefined){point.value=data[i][this.colValue]||0}var obj={};obj.point=point;obj.bottom=new Point3d(point.x,point.y,this.zRange.min);obj.trans=undefined;obj.screen=undefined;dataPoints.push(obj)}return dataPoints};Graph3d.prototype._getDataPoints=function(data){var x,y,i,obj;var dataPoints=[];if(this.style===Graph3d.STYLE.GRID||this.style===Graph3d.STYLE.SURFACE){var dataX=this.dataGroup.getDistinctValues(this.colX,data);var dataY=this.dataGroup.getDistinctValues(this.colY,data);dataPoints=this.getDataPoints(data);var dataMatrix=[];for(i=0;i<dataPoints.length;i++){obj=dataPoints[i];var xIndex=dataX.indexOf(obj.point.x);var yIndex=dataY.indexOf(obj.point.y);if(dataMatrix[xIndex]===undefined){dataMatrix[xIndex]=[]}dataMatrix[xIndex][yIndex]=obj}for(x=0;x<dataMatrix.length;x++){for(y=0;y<dataMatrix[x].length;y++){if(dataMatrix[x][y]){dataMatrix[x][y].pointRight=x<dataMatrix.length-1?dataMatrix[x+1][y]:undefined;dataMatrix[x][y].pointTop=y<dataMatrix[x].length-1?dataMatrix[x][y+1]:undefined;dataMatrix[x][y].pointCross=x<dataMatrix.length-1&&y<dataMatrix[x].length-1?dataMatrix[x+1][y+1]:undefined}}}}else{this._checkValueField(data);dataPoints=this.getDataPoints(data);if(this.style===Graph3d.STYLE.LINE){for(i=0;i<dataPoints.length;i++){if(i>0){dataPoints[i-1].pointNext=dataPoints[i]}}}}return dataPoints};Graph3d.prototype.create=function(){while(this.containerElement.hasChildNodes()){this.containerElement.removeChild(this.containerElement.firstChild)}this.frame=document.createElement(\"div\");this.frame.style.position=\"relative\";this.frame.style.overflow=\"hidden\";this.frame.canvas=document.createElement(\"canvas\");this.frame.canvas.style.position=\"relative\";this.frame.appendChild(this.frame.canvas);{var noCanvas=document.createElement(\"DIV\");noCanvas.style.color=\"red\";noCanvas.style.fontWeight=\"bold\";noCanvas.style.padding=\"10px\";noCanvas.innerHTML=\"Error: your browser does not support HTML canvas\";this.frame.canvas.appendChild(noCanvas)}this.frame.filter=document.createElement(\"div\");this.frame.filter.style.position=\"absolute\";this.frame.filter.style.bottom=\"0px\";this.frame.filter.style.left=\"0px\";this.frame.filter.style.width=\"100%\";this.frame.appendChild(this.frame.filter);var me=this;var onmousedown=function onmousedown(event){me._onMouseDown(event)};var ontouchstart=function ontouchstart(event){me._onTouchStart(event)};var onmousewheel=function onmousewheel(event){me._onWheel(event)};var ontooltip=function ontooltip(event){me._onTooltip(event)};var onclick=function onclick(event){me._onClick(event)};util.addEventListener(this.frame.canvas,\"mousedown\",onmousedown);util.addEventListener(this.frame.canvas,\"touchstart\",ontouchstart);util.addEventListener(this.frame.canvas,\"mousewheel\",onmousewheel);util.addEventListener(this.frame.canvas,\"mousemove\",ontooltip);util.addEventListener(this.frame.canvas,\"click\",onclick);this.containerElement.appendChild(this.frame)};Graph3d.prototype._setSize=function(width,height){this.frame.style.width=width;this.frame.style.height=height;this._resizeCanvas()};Graph3d.prototype._resizeCanvas=function(){this.frame.canvas.style.width=\"100%\";this.frame.canvas.style.height=\"100%\";this.frame.canvas.width=this.frame.canvas.clientWidth;this.frame.canvas.height=this.frame.canvas.clientHeight;this.frame.filter.style.width=this.frame.canvas.clientWidth-2*10+\"px\"};Graph3d.prototype.animationStart=function(){if(!this.animationAutoStart||!this.dataGroup.dataFilter)return;if(!this.frame.filter||!this.frame.filter.slider)throw new Error(\"No animation available\");this.frame.filter.slider.play()};Graph3d.prototype.animationStop=function(){if(!this.frame.filter||!this.frame.filter.slider)return;this.frame.filter.slider.stop()};Graph3d.prototype._resizeCenter=function(){if(this.xCenter.charAt(this.xCenter.length-1)===\"%\"){this.currentXCenter=parseFloat(this.xCenter)/100*this.frame.canvas.clientWidth}else{this.currentXCenter=parseFloat(this.xCenter)}if(this.yCenter.charAt(this.yCenter.length-1)===\"%\"){this.currentYCenter=parseFloat(this.yCenter)/100*(this.frame.canvas.clientHeight-this.frame.filter.clientHeight)}else{this.currentYCenter=parseFloat(this.yCenter)}};Graph3d.prototype.getCameraPosition=function(){var pos=this.camera.getArmRotation();pos.distance=this.camera.getArmLength();return pos};Graph3d.prototype._readData=function(data){this.dataPoints=this.dataGroup.initializeData(this,data,this.style);this._initializeRanges();this._redrawFilter()};Graph3d.prototype.setData=function(data){if(data===undefined||data===null)return;this._readData(data);this.redraw();this.animationStart()};Graph3d.prototype.setOptions=function(options){if(options===undefined)return;var errorFound=Validator.validate(options,allOptions);if(errorFound===true){console.log(\"%cErrors have been found in the supplied options object.\",printStyle)}this.animationStop();Settings.setOptions(options,this);this.setPointDrawingMethod();this._setSize(this.width,this.height);this.setData(this.dataGroup.getDataTable());this.animationStart()};Graph3d.prototype.setPointDrawingMethod=function(){var method=undefined;switch(this.style){case Graph3d.STYLE.BAR:method=Graph3d.prototype._redrawBarGraphPoint;break;case Graph3d.STYLE.BARCOLOR:method=Graph3d.prototype._redrawBarColorGraphPoint;break;case Graph3d.STYLE.BARSIZE:method=Graph3d.prototype._redrawBarSizeGraphPoint;break;case Graph3d.STYLE.DOT:method=Graph3d.prototype._redrawDotGraphPoint;break;case Graph3d.STYLE.DOTLINE:method=Graph3d.prototype._redrawDotLineGraphPoint;break;case Graph3d.STYLE.DOTCOLOR:method=Graph3d.prototype._redrawDotColorGraphPoint;break;case Graph3d.STYLE.DOTSIZE:method=Graph3d.prototype._redrawDotSizeGraphPoint;break;case Graph3d.STYLE.SURFACE:method=Graph3d.prototype._redrawSurfaceGraphPoint;break;case Graph3d.STYLE.GRID:method=Graph3d.prototype._redrawGridGraphPoint;break;case Graph3d.STYLE.LINE:method=Graph3d.prototype._redrawLineGraphPoint;break;default:throw new Error(\"Can not determine point drawing method \"+\"for graph style '\"+this.style+\"'\")}this._pointDrawingMethod=method};Graph3d.prototype.redraw=function(){if(this.dataPoints===undefined){throw new Error(\"Graph data not initialized\")}this._resizeCanvas();this._resizeCenter();this._redrawSlider();this._redrawClear();this._redrawAxis();this._redrawDataGraph();this._redrawInfo();this._redrawLegend()};Graph3d.prototype._getContext=function(){var canvas=this.frame.canvas;var ctx=canvas.getContext(\"2d\");ctx.lineJoin=\"round\";ctx.lineCap=\"round\";return ctx};Graph3d.prototype._redrawClear=function(){var canvas=this.frame.canvas;var ctx=canvas.getContext(\"2d\");ctx.clearRect(0,0,canvas.width,canvas.height)};Graph3d.prototype._dotSize=function(){return this.frame.clientWidth*this.dotSizeRatio};Graph3d.prototype._getLegendWidth=function(){var width;if(this.style===Graph3d.STYLE.DOTSIZE){var dotSize=this._dotSize();width=dotSize*this.dotSizeMaxFraction}else if(this.style===Graph3d.STYLE.BARSIZE){width=this.xBarWidth}else{width=20}return width};Graph3d.prototype._redrawLegend=function(){if(this.showLegend!==true){return}if(this.style===Graph3d.STYLE.LINE||this.style===Graph3d.STYLE.BARSIZE){return}var isSizeLegend=this.style===Graph3d.STYLE.BARSIZE||this.style===Graph3d.STYLE.DOTSIZE;var isValueLegend=this.style===Graph3d.STYLE.DOTSIZE||this.style===Graph3d.STYLE.DOTCOLOR||this.style===Graph3d.STYLE.BARCOLOR;var height=Math.max(this.frame.clientHeight*.25,100);var top=this.margin;var width=this._getLegendWidth();var right=this.frame.clientWidth-this.margin;var left=right-width;var bottom=top+height;var ctx=this._getContext();ctx.lineWidth=1;ctx.font=\"14px arial\";if(isSizeLegend===false){var ymin=0;var ymax=height;var y;for(y=ymin;y<ymax;y++){var f=(y-ymin)/(ymax-ymin);var hue=f*240;var color=this._hsv2rgb(hue,1,1);ctx.strokeStyle=color;ctx.beginPath();ctx.moveTo(left,top+y);ctx.lineTo(right,top+y);ctx.stroke()}ctx.strokeStyle=this.axisColor;ctx.strokeRect(left,top,width,height)}else{var widthMin;if(this.style===Graph3d.STYLE.DOTSIZE){widthMin=width*(this.dotSizeMinFraction/this.dotSizeMaxFraction)}else if(this.style===Graph3d.STYLE.BARSIZE){}ctx.strokeStyle=this.axisColor;ctx.fillStyle=this.dataColor.fill;ctx.beginPath();ctx.moveTo(left,top);ctx.lineTo(right,top);ctx.lineTo(left+widthMin,bottom);ctx.lineTo(left,bottom);ctx.closePath();ctx.fill();ctx.stroke()}var gridLineLen=5;var legendMin=isValueLegend?this.valueRange.min:this.zRange.min;var legendMax=isValueLegend?this.valueRange.max:this.zRange.max;var step=new StepNumber(legendMin,legendMax,(legendMax-legendMin)/5,true);step.start(true);var from;var to;while(!step.end()){y=bottom-(step.getCurrent()-legendMin)/(legendMax-legendMin)*height;from=new Point2d(left-gridLineLen,y);to=new Point2d(left,y);this._line(ctx,from,to);ctx.textAlign=\"right\";ctx.textBaseline=\"middle\";ctx.fillStyle=this.axisColor;ctx.fillText(step.getCurrent(),left-2*gridLineLen,y);step.next()}ctx.textAlign=\"right\";ctx.textBaseline=\"top\";var label=this.legendLabel;ctx.fillText(label,right,bottom+this.margin)};Graph3d.prototype._redrawFilter=function(){var dataFilter=this.dataGroup.dataFilter;var filter=this.frame.filter;filter.innerHTML=\"\";if(!dataFilter){filter.slider=undefined;return}var options={visible:this.showAnimationControls};var slider=new Slider(filter,options);filter.slider=slider;filter.style.padding=\"10px\";slider.setValues(dataFilter.values);slider.setPlayInterval(this.animationInterval);var me=this;var onchange=function onchange(){var dataFilter=me.dataGroup.dataFilter;var index=slider.getIndex();dataFilter.selectValue(index);me.dataPoints=dataFilter._getDataPoints();me.redraw()};slider.setOnChangeCallback(onchange)};Graph3d.prototype._redrawSlider=function(){if(this.frame.filter.slider!==undefined){this.frame.filter.slider.redraw()}};Graph3d.prototype._redrawInfo=function(){var info=this.dataGroup.getInfo();if(info===undefined)return;var ctx=this._getContext();ctx.font=\"14px arial\";ctx.lineStyle=\"gray\";ctx.fillStyle=\"gray\";ctx.textAlign=\"left\";ctx.textBaseline=\"top\";var x=this.margin;var y=this.margin;ctx.fillText(info,x,y)};Graph3d.prototype._line=function(ctx,from,to,strokeStyle){if(strokeStyle!==undefined){ctx.strokeStyle=strokeStyle}ctx.beginPath();ctx.moveTo(from.x,from.y);ctx.lineTo(to.x,to.y);ctx.stroke()};Graph3d.prototype.drawAxisLabelX=function(ctx,point3d,text,armAngle,yMargin){if(yMargin===undefined){yMargin=0}var point2d=this._convert3Dto2D(point3d);if(Math.cos(armAngle*2)>0){ctx.textAlign=\"center\";ctx.textBaseline=\"top\";point2d.y+=yMargin}else if(Math.sin(armAngle*2)<0){ctx.textAlign=\"right\";ctx.textBaseline=\"middle\"}else{ctx.textAlign=\"left\";ctx.textBaseline=\"middle\"}ctx.fillStyle=this.axisColor;ctx.fillText(text,point2d.x,point2d.y)};Graph3d.prototype.drawAxisLabelY=function(ctx,point3d,text,armAngle,yMargin){if(yMargin===undefined){yMargin=0}var point2d=this._convert3Dto2D(point3d);if(Math.cos(armAngle*2)<0){ctx.textAlign=\"center\";ctx.textBaseline=\"top\";point2d.y+=yMargin}else if(Math.sin(armAngle*2)>0){ctx.textAlign=\"right\";ctx.textBaseline=\"middle\"}else{ctx.textAlign=\"left\";ctx.textBaseline=\"middle\"}ctx.fillStyle=this.axisColor;ctx.fillText(text,point2d.x,point2d.y)};Graph3d.prototype.drawAxisLabelZ=function(ctx,point3d,text,offset){if(offset===undefined){offset=0}var point2d=this._convert3Dto2D(point3d);ctx.textAlign=\"right\";ctx.textBaseline=\"middle\";ctx.fillStyle=this.axisColor;ctx.fillText(text,point2d.x-offset,point2d.y)};Graph3d.prototype._line3d=function(ctx,from,to,strokeStyle){var from2d=this._convert3Dto2D(from);var to2d=this._convert3Dto2D(to);this._line(ctx,from2d,to2d,strokeStyle)};Graph3d.prototype._redrawAxis=function(){var ctx=this._getContext(),from,to,step,prettyStep,text,xText,yText,zText,offset,xOffset,yOffset;ctx.font=24/this.camera.getArmLength()+\"px arial\";var gridLenX=.025/this.scale.x;var gridLenY=.025/this.scale.y;var textMargin=5/this.camera.getArmLength();var armAngle=this.camera.getArmRotation().horizontal;var armVector=new Point2d(Math.cos(armAngle),Math.sin(armAngle));var xRange=this.xRange;var yRange=this.yRange;var zRange=this.zRange;var point3d;ctx.lineWidth=1;prettyStep=this.defaultXStep===undefined;step=new StepNumber(xRange.min,xRange.max,this.xStep,prettyStep);step.start(true);while(!step.end()){var x=step.getCurrent();if(this.showGrid){from=new Point3d(x,yRange.min,zRange.min);to=new Point3d(x,yRange.max,zRange.min);this._line3d(ctx,from,to,this.gridColor)}else if(this.showXAxis){from=new Point3d(x,yRange.min,zRange.min);to=new Point3d(x,yRange.min+gridLenX,zRange.min);this._line3d(ctx,from,to,this.axisColor);from=new Point3d(x,yRange.max,zRange.min);to=new Point3d(x,yRange.max-gridLenX,zRange.min);this._line3d(ctx,from,to,this.axisColor)}if(this.showXAxis){yText=armVector.x>0?yRange.min:yRange.max;point3d=new Point3d(x,yText,zRange.min);var msg=\" \"+this.xValueLabel(x)+\" \";this.drawAxisLabelX(ctx,point3d,msg,armAngle,textMargin)}step.next()}ctx.lineWidth=1;prettyStep=this.defaultYStep===undefined;step=new StepNumber(yRange.min,yRange.max,this.yStep,prettyStep);step.start(true);while(!step.end()){var y=step.getCurrent();if(this.showGrid){from=new Point3d(xRange.min,y,zRange.min);to=new Point3d(xRange.max,y,zRange.min);this._line3d(ctx,from,to,this.gridColor)}else if(this.showYAxis){from=new Point3d(xRange.min,y,zRange.min);to=new Point3d(xRange.min+gridLenY,y,zRange.min);this._line3d(ctx,from,to,this.axisColor);from=new Point3d(xRange.max,y,zRange.min);to=new Point3d(xRange.max-gridLenY,y,zRange.min);this._line3d(ctx,from,to,this.axisColor)}if(this.showYAxis){xText=armVector.y>0?xRange.min:xRange.max;point3d=new Point3d(xText,y,zRange.min);var _msg=\" \"+this.yValueLabel(y)+\" \";this.drawAxisLabelY(ctx,point3d,_msg,armAngle,textMargin)}step.next()}if(this.showZAxis){ctx.lineWidth=1;prettyStep=this.defaultZStep===undefined;step=new StepNumber(zRange.min,zRange.max,this.zStep,prettyStep);step.start(true);xText=armVector.x>0?xRange.min:xRange.max;yText=armVector.y<0?yRange.min:yRange.max;while(!step.end()){var z=step.getCurrent();var from3d=new Point3d(xText,yText,z);var from2d=this._convert3Dto2D(from3d);to=new Point2d(from2d.x-textMargin,from2d.y);this._line(ctx,from2d,to,this.axisColor);var _msg2=this.zValueLabel(z)+\" \";this.drawAxisLabelZ(ctx,from3d,_msg2,5);step.next()}ctx.lineWidth=1;from=new Point3d(xText,yText,zRange.min);to=new Point3d(xText,yText,zRange.max);this._line3d(ctx,from,to,this.axisColor)}if(this.showXAxis){var xMin2d;var xMax2d;ctx.lineWidth=1;xMin2d=new Point3d(xRange.min,yRange.min,zRange.min);xMax2d=new Point3d(xRange.max,yRange.min,zRange.min);this._line3d(ctx,xMin2d,xMax2d,this.axisColor);xMin2d=new Point3d(xRange.min,yRange.max,zRange.min);xMax2d=new Point3d(xRange.max,yRange.max,zRange.min);this._line3d(ctx,xMin2d,xMax2d,this.axisColor)}if(this.showYAxis){ctx.lineWidth=1;from=new Point3d(xRange.min,yRange.min,zRange.min);to=new Point3d(xRange.min,yRange.max,zRange.min);this._line3d(ctx,from,to,this.axisColor);from=new Point3d(xRange.max,yRange.min,zRange.min);to=new Point3d(xRange.max,yRange.max,zRange.min);this._line3d(ctx,from,to,this.axisColor)}var xLabel=this.xLabel;if(xLabel.length>0&&this.showXAxis){yOffset=.1/this.scale.y;xText=(xRange.max+3*xRange.min)/4;yText=armVector.x>0?yRange.min-yOffset:yRange.max+yOffset\n;text=new Point3d(xText,yText,zRange.min);this.drawAxisLabelX(ctx,text,xLabel,armAngle)}var yLabel=this.yLabel;if(yLabel.length>0&&this.showYAxis){xOffset=.1/this.scale.x;xText=armVector.y>0?xRange.min-xOffset:xRange.max+xOffset;yText=(yRange.max+3*yRange.min)/4;text=new Point3d(xText,yText,zRange.min);this.drawAxisLabelY(ctx,text,yLabel,armAngle)}var zLabel=this.zLabel;if(zLabel.length>0&&this.showZAxis){offset=30;xText=armVector.x>0?xRange.min:xRange.max;yText=armVector.y<0?yRange.min:yRange.max;zText=(zRange.max+3*zRange.min)/4;text=new Point3d(xText,yText,zText);this.drawAxisLabelZ(ctx,text,zLabel,offset)}};Graph3d.prototype._hsv2rgb=function(H,S,V){var R,G,B,C,Hi,X;C=V*S;Hi=Math.floor(H/60);X=C*(1-Math.abs(H/60%2-1));switch(Hi){case 0:R=C;G=X;B=0;break;case 1:R=X;G=C;B=0;break;case 2:R=0;G=C;B=X;break;case 3:R=0;G=X;B=C;break;case 4:R=X;G=0;B=C;break;case 5:R=C;G=0;B=X;break;default:R=0;G=0;B=0;break}return\"RGB(\"+parseInt(R*255)+\",\"+parseInt(G*255)+\",\"+parseInt(B*255)+\")\"};Graph3d.prototype._getStrokeWidth=function(point){if(point!==undefined){if(this.showPerspective){return 1/-point.trans.z*this.dataColor.strokeWidth}else{return-(this.eye.z/this.camera.getArmLength())*this.dataColor.strokeWidth}}return this.dataColor.strokeWidth};Graph3d.prototype._redrawBar=function(ctx,point,xWidth,yWidth,color,borderColor){var surface;var me=this;var point3d=point.point;var zMin=this.zRange.min;var top=[{point:new Point3d(point3d.x-xWidth,point3d.y-yWidth,point3d.z)},{point:new Point3d(point3d.x+xWidth,point3d.y-yWidth,point3d.z)},{point:new Point3d(point3d.x+xWidth,point3d.y+yWidth,point3d.z)},{point:new Point3d(point3d.x-xWidth,point3d.y+yWidth,point3d.z)}];var bottom=[{point:new Point3d(point3d.x-xWidth,point3d.y-yWidth,zMin)},{point:new Point3d(point3d.x+xWidth,point3d.y-yWidth,zMin)},{point:new Point3d(point3d.x+xWidth,point3d.y+yWidth,zMin)},{point:new Point3d(point3d.x-xWidth,point3d.y+yWidth,zMin)}];top.forEach(function(obj){obj.screen=me._convert3Dto2D(obj.point)});bottom.forEach(function(obj){obj.screen=me._convert3Dto2D(obj.point)});var surfaces=[{corners:top,center:Point3d.avg(bottom[0].point,bottom[2].point)},{corners:[top[0],top[1],bottom[1],bottom[0]],center:Point3d.avg(bottom[1].point,bottom[0].point)},{corners:[top[1],top[2],bottom[2],bottom[1]],center:Point3d.avg(bottom[2].point,bottom[1].point)},{corners:[top[2],top[3],bottom[3],bottom[2]],center:Point3d.avg(bottom[3].point,bottom[2].point)},{corners:[top[3],top[0],bottom[0],bottom[3]],center:Point3d.avg(bottom[0].point,bottom[3].point)}];point.surfaces=surfaces;for(var j=0;j<surfaces.length;j++){surface=surfaces[j];var transCenter=this._convertPointToTranslation(surface.center);surface.dist=this.showPerspective?transCenter.length():-transCenter.z}surfaces.sort(function(a,b){var diff=b.dist-a.dist;if(diff)return diff;if(a.corners===top)return 1;if(b.corners===top)return-1;return 0});ctx.lineWidth=this._getStrokeWidth(point);ctx.strokeStyle=borderColor;ctx.fillStyle=color;for(var _j=2;_j<surfaces.length;_j++){surface=surfaces[_j];this._polygon(ctx,surface.corners)}};Graph3d.prototype._polygon=function(ctx,points,fillStyle,strokeStyle){if(points.length<2){return}if(fillStyle!==undefined){ctx.fillStyle=fillStyle}if(strokeStyle!==undefined){ctx.strokeStyle=strokeStyle}ctx.beginPath();ctx.moveTo(points[0].screen.x,points[0].screen.y);for(var i=1;i<points.length;++i){var point=points[i];ctx.lineTo(point.screen.x,point.screen.y)}ctx.closePath();ctx.fill();ctx.stroke()};Graph3d.prototype._drawCircle=function(ctx,point,color,borderColor,size){var radius=this._calcRadius(point,size);ctx.lineWidth=this._getStrokeWidth(point);ctx.strokeStyle=borderColor;ctx.fillStyle=color;ctx.beginPath();ctx.arc(point.screen.x,point.screen.y,radius,0,Math.PI*2,true);ctx.fill();ctx.stroke()};Graph3d.prototype._getColorsRegular=function(point){var hue=(1-(point.point.z-this.zRange.min)*this.scale.z/this.verticalRatio)*240;var color=this._hsv2rgb(hue,1,1);var borderColor=this._hsv2rgb(hue,1,.8);return{fill:color,border:borderColor}};Graph3d.prototype._getColorsColor=function(point){var color,borderColor;if(typeof point.point.value===\"string\"){color=point.point.value;borderColor=point.point.value}else{var hue=(1-(point.point.value-this.valueRange.min)*this.scale.value)*240;color=this._hsv2rgb(hue,1,1);borderColor=this._hsv2rgb(hue,1,.8)}return{fill:color,border:borderColor}};Graph3d.prototype._getColorsSize=function(){return{fill:this.dataColor.fill,border:this.dataColor.stroke}};Graph3d.prototype._calcRadius=function(point,size){if(size===undefined){size=this._dotSize()}var radius;if(this.showPerspective){radius=size/-point.trans.z}else{radius=size*-(this.eye.z/this.camera.getArmLength())}if(radius<0){radius=0}return radius};Graph3d.prototype._redrawBarGraphPoint=function(ctx,point){var xWidth=this.xBarWidth/2;var yWidth=this.yBarWidth/2;var colors=this._getColorsRegular(point);this._redrawBar(ctx,point,xWidth,yWidth,colors.fill,colors.border)};Graph3d.prototype._redrawBarColorGraphPoint=function(ctx,point){var xWidth=this.xBarWidth/2;var yWidth=this.yBarWidth/2;var colors=this._getColorsColor(point);this._redrawBar(ctx,point,xWidth,yWidth,colors.fill,colors.border)};Graph3d.prototype._redrawBarSizeGraphPoint=function(ctx,point){var fraction=(point.point.value-this.valueRange.min)/this.valueRange.range();var xWidth=this.xBarWidth/2*(fraction*.8+.2);var yWidth=this.yBarWidth/2*(fraction*.8+.2);var colors=this._getColorsSize();this._redrawBar(ctx,point,xWidth,yWidth,colors.fill,colors.border)};Graph3d.prototype._redrawDotGraphPoint=function(ctx,point){var colors=this._getColorsRegular(point);this._drawCircle(ctx,point,colors.fill,colors.border)};Graph3d.prototype._redrawDotLineGraphPoint=function(ctx,point){var from=this._convert3Dto2D(point.bottom);ctx.lineWidth=1;this._line(ctx,from,point.screen,this.gridColor);this._redrawDotGraphPoint(ctx,point)};Graph3d.prototype._redrawDotColorGraphPoint=function(ctx,point){var colors=this._getColorsColor(point);this._drawCircle(ctx,point,colors.fill,colors.border)};Graph3d.prototype._redrawDotSizeGraphPoint=function(ctx,point){var dotSize=this._dotSize();var fraction=(point.point.value-this.valueRange.min)/this.valueRange.range();var sizeMin=dotSize*this.dotSizeMinFraction;var sizeRange=dotSize*this.dotSizeMaxFraction-sizeMin;var size=sizeMin+sizeRange*fraction;var colors=this._getColorsSize();this._drawCircle(ctx,point,colors.fill,colors.border,size)};Graph3d.prototype._redrawSurfaceGraphPoint=function(ctx,point){var right=point.pointRight;var top=point.pointTop;var cross=point.pointCross;if(point===undefined||right===undefined||top===undefined||cross===undefined){return}var topSideVisible=true;var fillStyle;var strokeStyle;if(this.showGrayBottom||this.showShadow){var aDiff=Point3d.subtract(cross.trans,point.trans);var bDiff=Point3d.subtract(top.trans,right.trans);var crossproduct=Point3d.crossProduct(aDiff,bDiff);var len=crossproduct.length();topSideVisible=crossproduct.z>0}if(topSideVisible){var zAvg=(point.point.z+right.point.z+top.point.z+cross.point.z)/4;var h=(1-(zAvg-this.zRange.min)*this.scale.z/this.verticalRatio)*240;var s=1;var v;if(this.showShadow){v=Math.min(1+crossproduct.x/len/2,1);fillStyle=this._hsv2rgb(h,s,v);strokeStyle=fillStyle}else{v=1;fillStyle=this._hsv2rgb(h,s,v);strokeStyle=this.axisColor}}else{fillStyle=\"gray\";strokeStyle=this.axisColor}ctx.lineWidth=this._getStrokeWidth(point);var points=[point,right,cross,top];this._polygon(ctx,points,fillStyle,strokeStyle)};Graph3d.prototype._drawGridLine=function(ctx,from,to){if(from===undefined||to===undefined){return}var zAvg=(from.point.z+to.point.z)/2;var h=(1-(zAvg-this.zRange.min)*this.scale.z/this.verticalRatio)*240;ctx.lineWidth=this._getStrokeWidth(from)*2;ctx.strokeStyle=this._hsv2rgb(h,1,1);this._line(ctx,from.screen,to.screen)};Graph3d.prototype._redrawGridGraphPoint=function(ctx,point){this._drawGridLine(ctx,point,point.pointRight);this._drawGridLine(ctx,point,point.pointTop)};Graph3d.prototype._redrawLineGraphPoint=function(ctx,point){if(point.pointNext===undefined){return}ctx.lineWidth=this._getStrokeWidth(point);ctx.strokeStyle=this.dataColor.stroke;this._line(ctx,point.screen,point.pointNext.screen)};Graph3d.prototype._redrawDataGraph=function(){var ctx=this._getContext();var i;if(this.dataPoints===undefined||this.dataPoints.length<=0)return;this._calcTranslations(this.dataPoints);for(i=0;i<this.dataPoints.length;i++){var point=this.dataPoints[i];this._pointDrawingMethod.call(this,ctx,point)}};Graph3d.prototype._storeMousePosition=function(event){this.startMouseX=getMouseX(event);this.startMouseY=getMouseY(event);this._startCameraOffset=this.camera.getOffset()};Graph3d.prototype._onMouseDown=function(event){event=event||window.event;if(this.leftButtonDown){this._onMouseUp(event)}this.leftButtonDown=event.which?event.which===1:event.button===1;if(!this.leftButtonDown&&!this.touchDown)return;this._storeMousePosition(event);this.startStart=new Date(this.start);this.startEnd=new Date(this.end);this.startArmRotation=this.camera.getArmRotation();this.frame.style.cursor=\"move\";var me=this;this.onmousemove=function(event){me._onMouseMove(event)};this.onmouseup=function(event){me._onMouseUp(event)};util.addEventListener(document,\"mousemove\",me.onmousemove);util.addEventListener(document,\"mouseup\",me.onmouseup);util.preventDefault(event)};Graph3d.prototype._onMouseMove=function(event){this.moving=true;event=event||window.event;var diffX=parseFloat(getMouseX(event))-this.startMouseX;var diffY=parseFloat(getMouseY(event))-this.startMouseY;if(event&&event.ctrlKey===true){var scaleX=this.frame.clientWidth*.5;var scaleY=this.frame.clientHeight*.5;var offXNew=(this._startCameraOffset.x||0)-diffX/scaleX*this.camera.armLength*.8;var offYNew=(this._startCameraOffset.y||0)+diffY/scaleY*this.camera.armLength*.8;this.camera.setOffset(offXNew,offYNew);this._storeMousePosition(event)}else{var horizontalNew=this.startArmRotation.horizontal+diffX/200;var verticalNew=this.startArmRotation.vertical+diffY/200;var snapAngle=4;var snapValue=Math.sin(snapAngle/360*2*Math.PI);if(Math.abs(Math.sin(horizontalNew))<snapValue){horizontalNew=Math.round(horizontalNew/Math.PI)*Math.PI-.001}if(Math.abs(Math.cos(horizontalNew))<snapValue){horizontalNew=(Math.round(horizontalNew/Math.PI-.5)+.5)*Math.PI-.001}if(Math.abs(Math.sin(verticalNew))<snapValue){verticalNew=Math.round(verticalNew/Math.PI)*Math.PI}if(Math.abs(Math.cos(verticalNew))<snapValue){verticalNew=(Math.round(verticalNew/Math.PI-.5)+.5)*Math.PI}this.camera.setArmRotation(horizontalNew,verticalNew)}this.redraw();var parameters=this.getCameraPosition();this.emit(\"cameraPositionChange\",parameters);util.preventDefault(event)};Graph3d.prototype._onMouseUp=function(event){this.frame.style.cursor=\"auto\";this.leftButtonDown=false;util.removeEventListener(document,\"mousemove\",this.onmousemove);util.removeEventListener(document,\"mouseup\",this.onmouseup);util.preventDefault(event)};Graph3d.prototype._onClick=function(event){if(!this.onclick_callback)return;if(!this.moving){var boundingRect=this.frame.getBoundingClientRect();var mouseX=getMouseX(event)-boundingRect.left;var mouseY=getMouseY(event)-boundingRect.top;var dataPoint=this._dataPointFromXY(mouseX,mouseY);if(dataPoint)this.onclick_callback(dataPoint.point.data)}else{this.moving=false}util.preventDefault(event)};Graph3d.prototype._onTooltip=function(event){var delay=300;var boundingRect=this.frame.getBoundingClientRect();var mouseX=getMouseX(event)-boundingRect.left;var mouseY=getMouseY(event)-boundingRect.top;if(!this.showTooltip){return}if(this.tooltipTimeout){clearTimeout(this.tooltipTimeout)}if(this.leftButtonDown){this._hideTooltip();return}if(this.tooltip&&this.tooltip.dataPoint){var dataPoint=this._dataPointFromXY(mouseX,mouseY);if(dataPoint!==this.tooltip.dataPoint){if(dataPoint){this._showTooltip(dataPoint)}else{this._hideTooltip()}}}else{var me=this;this.tooltipTimeout=setTimeout(function(){me.tooltipTimeout=null;var dataPoint=me._dataPointFromXY(mouseX,mouseY);if(dataPoint){me._showTooltip(dataPoint)}},delay)}};Graph3d.prototype._onTouchStart=function(event){this.touchDown=true;var me=this;this.ontouchmove=function(event){me._onTouchMove(event)};this.ontouchend=function(event){me._onTouchEnd(event)};util.addEventListener(document,\"touchmove\",me.ontouchmove);util.addEventListener(document,\"touchend\",me.ontouchend);this._onMouseDown(event)};Graph3d.prototype._onTouchMove=function(event){this._onMouseMove(event)};Graph3d.prototype._onTouchEnd=function(event){this.touchDown=false;util.removeEventListener(document,\"touchmove\",this.ontouchmove);util.removeEventListener(document,\"touchend\",this.ontouchend);this._onMouseUp(event)};Graph3d.prototype._onWheel=function(event){if(!event)event=window.event;var delta=0;if(event.wheelDelta){delta=event.wheelDelta/120}else if(event.detail){delta=-event.detail/3}if(delta){var oldLength=this.camera.getArmLength();var newLength=oldLength*(1-delta/10);this.camera.setArmLength(newLength);this.redraw();this._hideTooltip()}var parameters=this.getCameraPosition();this.emit(\"cameraPositionChange\",parameters);util.preventDefault(event)};Graph3d.prototype._insideTriangle=function(point,triangle){var a=triangle[0],b=triangle[1],c=triangle[2];function sign(x){return x>0?1:x<0?-1:0}var as=sign((b.x-a.x)*(point.y-a.y)-(b.y-a.y)*(point.x-a.x));var bs=sign((c.x-b.x)*(point.y-b.y)-(c.y-b.y)*(point.x-b.x));var cs=sign((a.x-c.x)*(point.y-c.y)-(a.y-c.y)*(point.x-c.x));return(as==0||bs==0||as==bs)&&(bs==0||cs==0||bs==cs)&&(as==0||cs==0||as==cs)};Graph3d.prototype._dataPointFromXY=function(x,y){var i,distMax=100,dataPoint=null,closestDataPoint=null,closestDist=null,center=new Point2d(x,y);if(this.style===Graph3d.STYLE.BAR||this.style===Graph3d.STYLE.BARCOLOR||this.style===Graph3d.STYLE.BARSIZE){for(i=this.dataPoints.length-1;i>=0;i--){dataPoint=this.dataPoints[i];var surfaces=dataPoint.surfaces;if(surfaces){for(var s=surfaces.length-1;s>=0;s--){var surface=surfaces[s];var corners=surface.corners;var triangle1=[corners[0].screen,corners[1].screen,corners[2].screen];var triangle2=[corners[2].screen,corners[3].screen,corners[0].screen];if(this._insideTriangle(center,triangle1)||this._insideTriangle(center,triangle2)){return dataPoint}}}}}else{for(i=0;i<this.dataPoints.length;i++){dataPoint=this.dataPoints[i];var point=dataPoint.screen;if(point){var distX=Math.abs(x-point.x);var distY=Math.abs(y-point.y);var dist=Math.sqrt(distX*distX+distY*distY);if((closestDist===null||dist<closestDist)&&dist<distMax){closestDist=dist;closestDataPoint=dataPoint}}}}return closestDataPoint};Graph3d.prototype.hasBars=function(style){return style==Graph3d.STYLE.BAR||style==Graph3d.STYLE.BARCOLOR||style==Graph3d.STYLE.BARSIZE};Graph3d.prototype._showTooltip=function(dataPoint){var content,line,dot;if(!this.tooltip){content=document.createElement(\"div\");(0,_assign2[\"default\"])(content.style,{},this.tooltipStyle.content);content.style.position=\"absolute\";line=document.createElement(\"div\");(0,_assign2[\"default\"])(line.style,{},this.tooltipStyle.line);line.style.position=\"absolute\";dot=document.createElement(\"div\");(0,_assign2[\"default\"])(dot.style,{},this.tooltipStyle.dot);dot.style.position=\"absolute\";this.tooltip={dataPoint:null,dom:{content:content,line:line,dot:dot}}}else{content=this.tooltip.dom.content;line=this.tooltip.dom.line;dot=this.tooltip.dom.dot}this._hideTooltip();this.tooltip.dataPoint=dataPoint;if(typeof this.showTooltip===\"function\"){content.innerHTML=this.showTooltip(dataPoint.point)}else{content.innerHTML=\"<table>\"+\"<tr><td>\"+this.xLabel+\":</td><td>\"+dataPoint.point.x+\"</td></tr>\"+\"<tr><td>\"+this.yLabel+\":</td><td>\"+dataPoint.point.y+\"</td></tr>\"+\"<tr><td>\"+this.zLabel+\":</td><td>\"+dataPoint.point.z+\"</td></tr>\"+\"</table>\"}content.style.left=\"0\";content.style.top=\"0\";this.frame.appendChild(content);this.frame.appendChild(line);this.frame.appendChild(dot);var contentWidth=content.offsetWidth;var contentHeight=content.offsetHeight;var lineHeight=line.offsetHeight;var dotWidth=dot.offsetWidth;var dotHeight=dot.offsetHeight;var left=dataPoint.screen.x-contentWidth/2;left=Math.min(Math.max(left,10),this.frame.clientWidth-10-contentWidth);line.style.left=dataPoint.screen.x+\"px\";line.style.top=dataPoint.screen.y-lineHeight+\"px\";content.style.left=left+\"px\";content.style.top=dataPoint.screen.y-lineHeight-contentHeight+\"px\";dot.style.left=dataPoint.screen.x-dotWidth/2+\"px\";dot.style.top=dataPoint.screen.y-dotHeight/2+\"px\"};Graph3d.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var prop in this.tooltip.dom){if(this.tooltip.dom.hasOwnProperty(prop)){var elem=this.tooltip.dom[prop];if(elem&&elem.parentNode){elem.parentNode.removeChild(elem)}}}}};function getMouseX(event){if(\"clientX\"in event)return event.clientX;return event.targetTouches[0]&&event.targetTouches[0].clientX||0}function getMouseY(event){if(\"clientY\"in event)return event.clientY;return event.targetTouches[0]&&event.targetTouches[0].clientY||0}Graph3d.prototype.setCameraPosition=function(pos){Settings.setCameraPosition(pos,this);this.redraw()};Graph3d.prototype.setSize=function(width,height){this._setSize(width,height);this.redraw()};module.exports=Graph3d},function(module,exports,__webpack_require__){__webpack_require__(163);module.exports=__webpack_require__(7).Object.assign},function(module,exports,__webpack_require__){var $export=__webpack_require__(17);$export($export.S+$export.F,\"Object\",{assign:__webpack_require__(164)})},function(module,exports,__webpack_require__){\"use strict\";var getKeys=__webpack_require__(33);var gOPS=__webpack_require__(63);var pIE=__webpack_require__(42);var toObject=__webpack_require__(41);var IObject=__webpack_require__(78);var $assign=Object.assign;module.exports=!$assign||__webpack_require__(28)(function(){var A={};var B={};var S=Symbol();var K=\"abcdefghijklmnopqrst\";A[S]=7;K.split(\"\").forEach(function(k){B[k]=k});return $assign({},A)[S]!=7||Object.keys($assign({},B)).join(\"\")!=K})?function assign(target,source){var T=toObject(target);var aLen=arguments.length;var index=1;var getSymbols=gOPS.f;var isEnum=pIE.f;while(aLen>index){var S=IObject(arguments[index++]);var keys=getSymbols?getKeys(S).concat(getSymbols(S)):getKeys(S);var length=keys.length;var j=0;var key;while(length>j)if(isEnum.call(S,key=keys[j++]))T[key]=S[key]}return T}:$assign},function(module,exports,__webpack_require__){module.exports={default:__webpack_require__(166),__esModule:true}},function(module,exports,__webpack_require__){__webpack_require__(167);module.exports=__webpack_require__(7).Math.sign},function(module,exports,__webpack_require__){var $export=__webpack_require__(17);$export($export.S,\"Math\",{sign:__webpack_require__(168)})},function(module,exports){module.exports=Math.sign||function sign(x){return(x=+x)==0||x!=x?x:x<0?-1:1}},function(module,exports,__webpack_require__){module.exports={default:__webpack_require__(170),__esModule:true}},function(module,exports,__webpack_require__){__webpack_require__(171);var $Object=__webpack_require__(7).Object;module.exports=function defineProperty(it,key,desc){return $Object.defineProperty(it,key,desc)}},function(module,exports,__webpack_require__){var $export=__webpack_require__(17);$export($export.S+$export.F*!__webpack_require__(21),\"Object\",{defineProperty:__webpack_require__(20).f})},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var string=\"string\";var bool=\"boolean\";var number=\"number\";var object=\"object\";var colorOptions={fill:{string:string},stroke:{string:string},strokeWidth:{number:number},__type__:{string:string,object:object,undefined:\"undefined\"}};var allOptions={animationAutoStart:{boolean:bool,undefined:\"undefined\"},animationInterval:{number:number},animationPreload:{boolean:bool},axisColor:{string:string},backgroundColor:colorOptions,xBarWidth:{number:number,undefined:\"undefined\"},yBarWidth:{number:number,undefined:\"undefined\"},cameraPosition:{distance:{number:number},horizontal:{number:number},vertical:{number:number},__type__:{object:object}},xCenter:{string:string},yCenter:{string:string},dataColor:colorOptions,dotSizeMinFraction:{number:number},dotSizeMaxFraction:{number:number},dotSizeRatio:{number:number},filterLabel:{string:string},gridColor:{string:string},onclick:{function:\"function\"},keepAspectRatio:{boolean:bool},xLabel:{string:string},yLabel:{string:string},zLabel:{string:string},legendLabel:{string:string},xMin:{number:number,undefined:\"undefined\"},yMin:{number:number,undefined:\"undefined\"},zMin:{number:number,undefined:\"undefined\"},xMax:{number:number,undefined:\"undefined\"},yMax:{number:number,undefined:\"undefined\"},zMax:{number:number,undefined:\"undefined\"},showAnimationControls:{boolean:bool,undefined:\"undefined\"},showGrid:{boolean:bool},showLegend:{boolean:bool,undefined:\"undefined\"},showPerspective:{boolean:bool},showShadow:{boolean:bool},showXAxis:{boolean:bool},showYAxis:{boolean:bool},showZAxis:{boolean:bool},xStep:{number:number,undefined:\"undefined\"},yStep:{number:number,undefined:\"undefined\"},zStep:{number:number,undefined:\"undefined\"},style:{number:number,string:[\"bar\",\"bar-color\",\"bar-size\",\"dot\",\"dot-line\",\"dot-color\",\"dot-size\",\"line\",\"grid\",\"surface\"]},tooltip:{boolean:bool,function:\"function\"},tooltipStyle:{content:{color:{string:string},background:{string:string},border:{string:string},borderRadius:{string:string},boxShadow:{string:string},padding:{string:string},__type__:{object:object}},line:{borderLeft:{string:string},height:{string:string},width:{string:string},__type__:{object:object}},dot:{border:{string:string},borderRadius:{string:string},height:{string:string},width:{string:string},__type__:{object:object}},__type__:{object:object}},xValueLabel:{function:\"function\"},yValueLabel:{function:\"function\"},zValueLabel:{function:\"function\"},valueMax:{number:number,undefined:\"undefined\"},valueMin:{number:number,undefined:\"undefined\"},verticalRatio:{number:number},height:{string:string},width:{string:string},__type__:{object:object}};exports.allOptions=allOptions},function(module,exports,__webpack_require__){\"use strict\";var DataSet=__webpack_require__(11);var DataView=__webpack_require__(12);var Range=__webpack_require__(174);var Filter=__webpack_require__(96);var Settings=__webpack_require__(94);var Point3d=__webpack_require__(34);function DataGroup(){this.dataTable=null}DataGroup.prototype.initializeData=function(graph3d,rawData,style){if(rawData===undefined)return;if(Array.isArray(rawData)){rawData=new DataSet(rawData)}var data;if(rawData instanceof DataSet||rawData instanceof DataView){data=rawData.get()}else{throw new Error(\"Array, DataSet, or DataView expected\")}if(data.length==0)return;this.style=style;if(this.dataSet){this.dataSet.off(\"*\",this._onChange)}this.dataSet=rawData;this.dataTable=data;var me=this;this._onChange=function(){graph3d.setData(me.dataSet)};this.dataSet.on(\"*\",this._onChange);this.colX=\"x\";this.colY=\"y\";this.colZ=\"z\";var withBars=graph3d.hasBars(style);if(withBars){if(graph3d.defaultXBarWidth!==undefined){this.xBarWidth=graph3d.defaultXBarWidth}else{this.xBarWidth=this.getSmallestDifference(data,this.colX)||1}if(graph3d.defaultYBarWidth!==undefined){this.yBarWidth=graph3d.defaultYBarWidth}else{this.yBarWidth=this.getSmallestDifference(data,this.colY)||1}}this._initializeRange(data,this.colX,graph3d,withBars);this._initializeRange(data,this.colY,graph3d,withBars);this._initializeRange(data,this.colZ,graph3d,false);if(data[0].hasOwnProperty(\"style\")){this.colValue=\"style\";var valueRange=this.getColumnRange(data,this.colValue);this._setRangeDefaults(valueRange,graph3d.defaultValueMin,graph3d.defaultValueMax);this.valueRange=valueRange}var table=this.getDataTable();if(table[0].hasOwnProperty(\"filter\")){if(this.dataFilter===undefined){this.dataFilter=new Filter(this,\"filter\",graph3d);this.dataFilter.setOnLoadCallback(function(){graph3d.redraw()})}}var dataPoints;if(this.dataFilter){dataPoints=this.dataFilter._getDataPoints()}else{dataPoints=this._getDataPoints(this.getDataTable())}return dataPoints};DataGroup.prototype._collectRangeSettings=function(column,graph3d){var index=[\"x\",\"y\",\"z\"].indexOf(column);if(index==-1){throw new Error(\"Column '\"+column+\"' invalid\")}var upper=column.toUpperCase();return{barWidth:this[column+\"BarWidth\"],min:graph3d[\"default\"+upper+\"Min\"],max:graph3d[\"default\"+upper+\"Max\"],step:graph3d[\"default\"+upper+\"Step\"],range_label:column+\"Range\",step_label:column+\"Step\"}};DataGroup.prototype._initializeRange=function(data,column,graph3d,withBars){var NUMSTEPS=5;var settings=this._collectRangeSettings(column,graph3d);var range=this.getColumnRange(data,column);if(withBars&&column!=\"z\"){range.expand(settings.barWidth/2)}this._setRangeDefaults(range,settings.min,settings.max);this[settings.range_label]=range;this[settings.step_label]=settings.step!==undefined?settings.step:range.range()/NUMSTEPS};DataGroup.prototype.getDistinctValues=function(column,data){if(data===undefined){data=this.dataTable}var values=[];for(var i=0;i<data.length;i++){var value=data[i][column]||0;if(values.indexOf(value)===-1){values.push(value)}}return values.sort(function(a,b){return a-b})};DataGroup.prototype.getSmallestDifference=function(data,column){var values=this.getDistinctValues(data,column);var smallest_diff=null;for(var i=1;i<values.length;i++){var diff=values[i]-values[i-1];if(smallest_diff==null||smallest_diff>diff){smallest_diff=diff}}return smallest_diff};DataGroup.prototype.getColumnRange=function(data,column){var range=new Range;for(var i=0;i<data.length;i++){var item=data[i][column];range.adjust(item)}return range};DataGroup.prototype.getNumberOfRows=function(){return this.dataTable.length};DataGroup.prototype._setRangeDefaults=function(range,defaultMin,defaultMax){if(defaultMin!==undefined){range.min=defaultMin}if(defaultMax!==undefined){range.max=defaultMax}if(range.max<=range.min)range.max=range.min+1};DataGroup.prototype.getDataTable=function(){return this.dataTable};DataGroup.prototype.getDataSet=function(){return this.dataSet};DataGroup.prototype.getDataPoints=function(data){var dataPoints=[];for(var i=0;i<data.length;i++){var point=new Point3d;point.x=data[i][this.colX]||0;point.y=data[i][this.colY]||0;point.z=data[i][this.colZ]||0;point.data=data[i];if(this.colValue!==undefined){point.value=data[i][this.colValue]||0}var obj={};obj.point=point;obj.bottom=new Point3d(point.x,point.y,this.zRange.min);obj.trans=undefined;obj.screen=undefined;dataPoints.push(obj)}return dataPoints};DataGroup.prototype.initDataAsMatrix=function(data){var x,y,i,obj;var dataX=this.getDistinctValues(this.colX,data);var dataY=this.getDistinctValues(this.colY,data);var dataPoints=this.getDataPoints(data);var dataMatrix=[];for(i=0;i<dataPoints.length;i++){obj=dataPoints[i];var xIndex=dataX.indexOf(obj.point.x);var yIndex=dataY.indexOf(obj.point.y);if(dataMatrix[xIndex]===undefined){dataMatrix[xIndex]=[]}dataMatrix[xIndex][yIndex]=obj}for(x=0;x<dataMatrix.length;x++){for(y=0;y<dataMatrix[x].length;y++){if(dataMatrix[x][y]){dataMatrix[x][y].pointRight=x<dataMatrix.length-1?dataMatrix[x+1][y]:undefined;dataMatrix[x][y].pointTop=y<dataMatrix[x].length-1?dataMatrix[x][y+1]:undefined;dataMatrix[x][y].pointCross=x<dataMatrix.length-1&&y<dataMatrix[x].length-1?dataMatrix[x+1][y+1]:undefined}}}return dataPoints};DataGroup.prototype.getInfo=function(){var dataFilter=this.dataFilter;if(!dataFilter)return undefined;return dataFilter.getLabel()+\": \"+dataFilter.getSelectedValue()};DataGroup.prototype.reload=function(){if(this.dataTable){this.setData(this.dataTable)}};DataGroup.prototype._getDataPoints=function(data){var dataPoints=[];if(this.style===Settings.STYLE.GRID||this.style===Settings.STYLE.SURFACE){dataPoints=this.initDataAsMatrix(data)}else{this._checkValueField(data);dataPoints=this.getDataPoints(data);if(this.style===Settings.STYLE.LINE){for(var i=0;i<dataPoints.length;i++){if(i>0){dataPoints[i-1].pointNext=dataPoints[i]}}}}return dataPoints};DataGroup.prototype._checkValueField=function(data){var hasValueField=this.style===Settings.STYLE.BARCOLOR||this.style===Settings.STYLE.BARSIZE||this.style===Settings.STYLE.DOTCOLOR||this.style===Settings.STYLE.DOTSIZE;if(!hasValueField){return}if(this.colValue===undefined){throw new Error(\"Expected data to have \"+\" field 'style' \"+\" for graph style '\"+this.style+\"'\")}if(data[0][this.colValue]===undefined){throw new Error(\"Expected data to have \"+\" field '\"+this.colValue+\"' \"+\" for graph style '\"+this.style+\"'\")}};module.exports=DataGroup},function(module,exports,__webpack_require__){\"use strict\";function Range(){this.min=undefined;this.max=undefined}Range.prototype.adjust=function(value){if(value===undefined)return;if(this.min===undefined||this.min>value){this.min=value}if(this.max===undefined||this.max<value){this.max=value}};Range.prototype.combine=function(range){this.add(range.min);this.add(range.max)};Range.prototype.expand=function(val){if(val===undefined){return}var newMin=this.min-val;var newMax=this.max+val;if(newMin>newMax){throw new Error(\"Passed expansion value makes range invalid\")}this.min=newMin;this.max=newMax};Range.prototype.range=function(){return this.max-this.min};Range.prototype.center=function(){return(this.min+this.max)/2};module.exports=Range},function(module,exports,__webpack_require__){\"use strict\";var __WEBPACK_AMD_DEFINE_FACTORY__,__WEBPACK_AMD_DEFINE_ARRAY__,__WEBPACK_AMD_DEFINE_RESULT__;(function(factory){if(true){!(__WEBPACK_AMD_DEFINE_ARRAY__=[],__WEBPACK_AMD_DEFINE_FACTORY__=factory,__WEBPACK_AMD_DEFINE_RESULT__=typeof __WEBPACK_AMD_DEFINE_FACTORY__===\"function\"?__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports,__WEBPACK_AMD_DEFINE_ARRAY__):__WEBPACK_AMD_DEFINE_FACTORY__,__WEBPACK_AMD_DEFINE_RESULT__!==undefined&&(module.exports=__WEBPACK_AMD_DEFINE_RESULT__))}else if(typeof exports===\"object\"){module.exports=factory()}else{window.propagating=factory()}})(function(){var _firstTarget=null;return function propagating(hammer,options){var _options=options||{preventDefault:false};if(hammer.Manager){var Hammer=hammer;var PropagatingHammer=function(element,options){var o=Object.create(_options);if(options)Hammer.assign(o,options);return propagating(new Hammer(element,o),o)};Hammer.assign(PropagatingHammer,Hammer);PropagatingHammer.Manager=function(element,options){var o=Object.create(_options);if(options)Hammer.assign(o,options);return propagating(new Hammer.Manager(element,o),o)};return PropagatingHammer}var wrapper=Object.create(hammer);var element=hammer.element;if(!element.hammer)element.hammer=[];element.hammer.push(wrapper);hammer.on(\"hammer.input\",function(event){if(_options.preventDefault===true||_options.preventDefault===event.pointerType){event.preventDefault()}if(event.isFirst){_firstTarget=event.target}});wrapper._handlers={};wrapper.on=function(events,handler){split(events).forEach(function(event){var _handlers=wrapper._handlers[event];if(!_handlers){wrapper._handlers[event]=_handlers=[];hammer.on(event,propagatedHandler)}_handlers.push(handler)});return wrapper};wrapper.off=function(events,handler){split(events).forEach(function(event){var _handlers=wrapper._handlers[event];if(_handlers){_handlers=handler?_handlers.filter(function(h){return h!==handler}):[];if(_handlers.length>0){wrapper._handlers[event]=_handlers}else{hammer.off(event,propagatedHandler);delete wrapper._handlers[event]}}});return wrapper};wrapper.emit=function(eventType,event){_firstTarget=event.target;hammer.emit(eventType,event)};wrapper.destroy=function(){var hammers=hammer.element.hammer;var idx=hammers.indexOf(wrapper);if(idx!==-1)hammers.splice(idx,1);if(!hammers.length)delete hammer.element.hammer;wrapper._handlers={};hammer.destroy()};function split(events){return events.match(/[^ ]+/g)}function propagatedHandler(event){if(event.type!==\"hammer.input\"){if(!event.srcEvent._handled){event.srcEvent._handled={}}if(event.srcEvent._handled[event.type]){return}else{event.srcEvent._handled[event.type]=true}}var stopped=false\n;event.stopPropagation=function(){stopped=true};var srcStop=event.srcEvent.stopPropagation.bind(event.srcEvent);if(typeof srcStop==\"function\"){event.srcEvent.stopPropagation=function(){srcStop();event.stopPropagation()}}event.firstTarget=_firstTarget;var elem=_firstTarget;while(elem&&!stopped){var elemHammer=elem.hammer;if(elemHammer){var _handlers;for(var k=0;k<elemHammer.length;k++){_handlers=elemHammer[k]._handlers[event.type];if(_handlers)for(var i=0;i<_handlers.length&&!stopped;i++){_handlers[i](event)}}}elem=elem.parentNode}}return wrapper}})},function(module,exports,__webpack_require__){var __WEBPACK_AMD_DEFINE_RESULT__;(function(window,document,exportName,undefined){\"use strict\";var VENDOR_PREFIXES=[\"\",\"webkit\",\"Moz\",\"MS\",\"ms\",\"o\"];var TEST_ELEMENT=document.createElement(\"div\");var TYPE_FUNCTION=\"function\";var round=Math.round;var abs=Math.abs;var now=Date.now;function setTimeoutContext(fn,timeout,context){return setTimeout(bindFn(fn,context),timeout)}function invokeArrayArg(arg,fn,context){if(Array.isArray(arg)){each(arg,context[fn],context);return true}return false}function each(obj,iterator,context){var i;if(!obj){return}if(obj.forEach){obj.forEach(iterator,context)}else if(obj.length!==undefined){i=0;while(i<obj.length){iterator.call(context,obj[i],i,obj);i++}}else{for(i in obj){obj.hasOwnProperty(i)&&iterator.call(context,obj[i],i,obj)}}}function deprecate(method,name,message){var deprecationMessage=\"DEPRECATED METHOD: \"+name+\"\\n\"+message+\" AT \\n\";return function(){var e=new Error(\"get-stack-trace\");var stack=e&&e.stack?e.stack.replace(/^[^\\(]+?[\\n$]/gm,\"\").replace(/^\\s+at\\s+/gm,\"\").replace(/^Object.<anonymous>\\s*\\(/gm,\"{anonymous}()@\"):\"Unknown Stack Trace\";var log=window.console&&(window.console.warn||window.console.log);if(log){log.call(window.console,deprecationMessage,stack)}return method.apply(this,arguments)}}var assign;if(typeof Object.assign!==\"function\"){assign=function assign(target){if(target===undefined||target===null){throw new TypeError(\"Cannot convert undefined or null to object\")}var output=Object(target);for(var index=1;index<arguments.length;index++){var source=arguments[index];if(source!==undefined&&source!==null){for(var nextKey in source){if(source.hasOwnProperty(nextKey)){output[nextKey]=source[nextKey]}}}}return output}}else{assign=Object.assign}var extend=deprecate(function extend(dest,src,merge){var keys=Object.keys(src);var i=0;while(i<keys.length){if(!merge||merge&&dest[keys[i]]===undefined){dest[keys[i]]=src[keys[i]]}i++}return dest},\"extend\",\"Use `assign`.\");var merge=deprecate(function merge(dest,src){return extend(dest,src,true)},\"merge\",\"Use `assign`.\");function inherit(child,base,properties){var baseP=base.prototype,childP;childP=child.prototype=Object.create(baseP);childP.constructor=child;childP._super=baseP;if(properties){assign(childP,properties)}}function bindFn(fn,context){return function boundFn(){return fn.apply(context,arguments)}}function boolOrFn(val,args){if(typeof val==TYPE_FUNCTION){return val.apply(args?args[0]||undefined:undefined,args)}return val}function ifUndefined(val1,val2){return val1===undefined?val2:val1}function addEventListeners(target,types,handler){each(splitStr(types),function(type){target.addEventListener(type,handler,false)})}function removeEventListeners(target,types,handler){each(splitStr(types),function(type){target.removeEventListener(type,handler,false)})}function hasParent(node,parent){while(node){if(node==parent){return true}node=node.parentNode}return false}function inStr(str,find){return str.indexOf(find)>-1}function splitStr(str){return str.trim().split(/\\s+/g)}function inArray(src,find,findByKey){if(src.indexOf&&!findByKey){return src.indexOf(find)}else{var i=0;while(i<src.length){if(findByKey&&src[i][findByKey]==find||!findByKey&&src[i]===find){return i}i++}return-1}}function toArray(obj){return Array.prototype.slice.call(obj,0)}function uniqueArray(src,key,sort){var results=[];var values=[];var i=0;while(i<src.length){var val=key?src[i][key]:src[i];if(inArray(values,val)<0){results.push(src[i])}values[i]=val;i++}if(sort){if(!key){results=results.sort()}else{results=results.sort(function sortUniqueArray(a,b){return a[key]>b[key]})}}return results}function prefixed(obj,property){var prefix,prop;var camelProp=property[0].toUpperCase()+property.slice(1);var i=0;while(i<VENDOR_PREFIXES.length){prefix=VENDOR_PREFIXES[i];prop=prefix?prefix+camelProp:property;if(prop in obj){return prop}i++}return undefined}var _uniqueId=1;function uniqueId(){return _uniqueId++}function getWindowForElement(element){var doc=element.ownerDocument||element;return doc.defaultView||doc.parentWindow||window}var MOBILE_REGEX=/mobile|tablet|ip(ad|hone|od)|android/i;var SUPPORT_TOUCH=\"ontouchstart\"in window;var SUPPORT_POINTER_EVENTS=prefixed(window,\"PointerEvent\")!==undefined;var SUPPORT_ONLY_TOUCH=SUPPORT_TOUCH&&MOBILE_REGEX.test(navigator.userAgent);var INPUT_TYPE_TOUCH=\"touch\";var INPUT_TYPE_PEN=\"pen\";var INPUT_TYPE_MOUSE=\"mouse\";var INPUT_TYPE_KINECT=\"kinect\";var COMPUTE_INTERVAL=25;var INPUT_START=1;var INPUT_MOVE=2;var INPUT_END=4;var INPUT_CANCEL=8;var DIRECTION_NONE=1;var DIRECTION_LEFT=2;var DIRECTION_RIGHT=4;var DIRECTION_UP=8;var DIRECTION_DOWN=16;var DIRECTION_HORIZONTAL=DIRECTION_LEFT|DIRECTION_RIGHT;var DIRECTION_VERTICAL=DIRECTION_UP|DIRECTION_DOWN;var DIRECTION_ALL=DIRECTION_HORIZONTAL|DIRECTION_VERTICAL;var PROPS_XY=[\"x\",\"y\"];var PROPS_CLIENT_XY=[\"clientX\",\"clientY\"];function Input(manager,callback){var self=this;this.manager=manager;this.callback=callback;this.element=manager.element;this.target=manager.options.inputTarget;this.domHandler=function(ev){if(boolOrFn(manager.options.enable,[manager])){self.handler(ev)}};this.init()}Input.prototype={handler:function(){},init:function(){this.evEl&&addEventListeners(this.element,this.evEl,this.domHandler);this.evTarget&&addEventListeners(this.target,this.evTarget,this.domHandler);this.evWin&&addEventListeners(getWindowForElement(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&removeEventListeners(this.element,this.evEl,this.domHandler);this.evTarget&&removeEventListeners(this.target,this.evTarget,this.domHandler);this.evWin&&removeEventListeners(getWindowForElement(this.element),this.evWin,this.domHandler)}};function createInputInstance(manager){var Type;var inputClass=manager.options.inputClass;if(inputClass){Type=inputClass}else if(SUPPORT_POINTER_EVENTS){Type=PointerEventInput}else if(SUPPORT_ONLY_TOUCH){Type=TouchInput}else if(!SUPPORT_TOUCH){Type=MouseInput}else{Type=TouchMouseInput}return new Type(manager,inputHandler)}function inputHandler(manager,eventType,input){var pointersLen=input.pointers.length;var changedPointersLen=input.changedPointers.length;var isFirst=eventType&INPUT_START&&pointersLen-changedPointersLen===0;var isFinal=eventType&(INPUT_END|INPUT_CANCEL)&&pointersLen-changedPointersLen===0;input.isFirst=!!isFirst;input.isFinal=!!isFinal;if(isFirst){manager.session={}}input.eventType=eventType;computeInputData(manager,input);manager.emit(\"hammer.input\",input);manager.recognize(input);manager.session.prevInput=input}function computeInputData(manager,input){var session=manager.session;var pointers=input.pointers;var pointersLength=pointers.length;if(!session.firstInput){session.firstInput=simpleCloneInputData(input)}if(pointersLength>1&&!session.firstMultiple){session.firstMultiple=simpleCloneInputData(input)}else if(pointersLength===1){session.firstMultiple=false}var firstInput=session.firstInput;var firstMultiple=session.firstMultiple;var offsetCenter=firstMultiple?firstMultiple.center:firstInput.center;var center=input.center=getCenter(pointers);input.timeStamp=now();input.deltaTime=input.timeStamp-firstInput.timeStamp;input.angle=getAngle(offsetCenter,center);input.distance=getDistance(offsetCenter,center);computeDeltaXY(session,input);input.offsetDirection=getDirection(input.deltaX,input.deltaY);var overallVelocity=getVelocity(input.deltaTime,input.deltaX,input.deltaY);input.overallVelocityX=overallVelocity.x;input.overallVelocityY=overallVelocity.y;input.overallVelocity=abs(overallVelocity.x)>abs(overallVelocity.y)?overallVelocity.x:overallVelocity.y;input.scale=firstMultiple?getScale(firstMultiple.pointers,pointers):1;input.rotation=firstMultiple?getRotation(firstMultiple.pointers,pointers):0;input.maxPointers=!session.prevInput?input.pointers.length:input.pointers.length>session.prevInput.maxPointers?input.pointers.length:session.prevInput.maxPointers;computeIntervalInputData(session,input);var target=manager.element;if(hasParent(input.srcEvent.target,target)){target=input.srcEvent.target}input.target=target}function computeDeltaXY(session,input){var center=input.center;var offset=session.offsetDelta||{};var prevDelta=session.prevDelta||{};var prevInput=session.prevInput||{};if(input.eventType===INPUT_START||prevInput.eventType===INPUT_END){prevDelta=session.prevDelta={x:prevInput.deltaX||0,y:prevInput.deltaY||0};offset=session.offsetDelta={x:center.x,y:center.y}}input.deltaX=prevDelta.x+(center.x-offset.x);input.deltaY=prevDelta.y+(center.y-offset.y)}function computeIntervalInputData(session,input){var last=session.lastInterval||input,deltaTime=input.timeStamp-last.timeStamp,velocity,velocityX,velocityY,direction;if(input.eventType!=INPUT_CANCEL&&(deltaTime>COMPUTE_INTERVAL||last.velocity===undefined)){var deltaX=input.deltaX-last.deltaX;var deltaY=input.deltaY-last.deltaY;var v=getVelocity(deltaTime,deltaX,deltaY);velocityX=v.x;velocityY=v.y;velocity=abs(v.x)>abs(v.y)?v.x:v.y;direction=getDirection(deltaX,deltaY);session.lastInterval=input}else{velocity=last.velocity;velocityX=last.velocityX;velocityY=last.velocityY;direction=last.direction}input.velocity=velocity;input.velocityX=velocityX;input.velocityY=velocityY;input.direction=direction}function simpleCloneInputData(input){var pointers=[];var i=0;while(i<input.pointers.length){pointers[i]={clientX:round(input.pointers[i].clientX),clientY:round(input.pointers[i].clientY)};i++}return{timeStamp:now(),pointers:pointers,center:getCenter(pointers),deltaX:input.deltaX,deltaY:input.deltaY}}function getCenter(pointers){var pointersLength=pointers.length;if(pointersLength===1){return{x:round(pointers[0].clientX),y:round(pointers[0].clientY)}}var x=0,y=0,i=0;while(i<pointersLength){x+=pointers[i].clientX;y+=pointers[i].clientY;i++}return{x:round(x/pointersLength),y:round(y/pointersLength)}}function getVelocity(deltaTime,x,y){return{x:x/deltaTime||0,y:y/deltaTime||0}}function getDirection(x,y){if(x===y){return DIRECTION_NONE}if(abs(x)>=abs(y)){return x<0?DIRECTION_LEFT:DIRECTION_RIGHT}return y<0?DIRECTION_UP:DIRECTION_DOWN}function getDistance(p1,p2,props){if(!props){props=PROPS_XY}var x=p2[props[0]]-p1[props[0]],y=p2[props[1]]-p1[props[1]];return Math.sqrt(x*x+y*y)}function getAngle(p1,p2,props){if(!props){props=PROPS_XY}var x=p2[props[0]]-p1[props[0]],y=p2[props[1]]-p1[props[1]];return Math.atan2(y,x)*180/Math.PI}function getRotation(start,end){return getAngle(end[1],end[0],PROPS_CLIENT_XY)+getAngle(start[1],start[0],PROPS_CLIENT_XY)}function getScale(start,end){return getDistance(end[0],end[1],PROPS_CLIENT_XY)/getDistance(start[0],start[1],PROPS_CLIENT_XY)}var MOUSE_INPUT_MAP={mousedown:INPUT_START,mousemove:INPUT_MOVE,mouseup:INPUT_END};var MOUSE_ELEMENT_EVENTS=\"mousedown\";var MOUSE_WINDOW_EVENTS=\"mousemove mouseup\";function MouseInput(){this.evEl=MOUSE_ELEMENT_EVENTS;this.evWin=MOUSE_WINDOW_EVENTS;this.pressed=false;Input.apply(this,arguments)}inherit(MouseInput,Input,{handler:function MEhandler(ev){var eventType=MOUSE_INPUT_MAP[ev.type];if(eventType&INPUT_START&&ev.button===0){this.pressed=true}if(eventType&INPUT_MOVE&&ev.which!==1){eventType=INPUT_END}if(!this.pressed){return}if(eventType&INPUT_END){this.pressed=false}this.callback(this.manager,eventType,{pointers:[ev],changedPointers:[ev],pointerType:INPUT_TYPE_MOUSE,srcEvent:ev})}});var POINTER_INPUT_MAP={pointerdown:INPUT_START,pointermove:INPUT_MOVE,pointerup:INPUT_END,pointercancel:INPUT_CANCEL,pointerout:INPUT_CANCEL};var IE10_POINTER_TYPE_ENUM={2:INPUT_TYPE_TOUCH,3:INPUT_TYPE_PEN,4:INPUT_TYPE_MOUSE,5:INPUT_TYPE_KINECT};var POINTER_ELEMENT_EVENTS=\"pointerdown\";var POINTER_WINDOW_EVENTS=\"pointermove pointerup pointercancel\";if(window.MSPointerEvent&&!window.PointerEvent){POINTER_ELEMENT_EVENTS=\"MSPointerDown\";POINTER_WINDOW_EVENTS=\"MSPointerMove MSPointerUp MSPointerCancel\"}function PointerEventInput(){this.evEl=POINTER_ELEMENT_EVENTS;this.evWin=POINTER_WINDOW_EVENTS;Input.apply(this,arguments);this.store=this.manager.session.pointerEvents=[]}inherit(PointerEventInput,Input,{handler:function PEhandler(ev){var store=this.store;var removePointer=false;var eventTypeNormalized=ev.type.toLowerCase().replace(\"ms\",\"\");var eventType=POINTER_INPUT_MAP[eventTypeNormalized];var pointerType=IE10_POINTER_TYPE_ENUM[ev.pointerType]||ev.pointerType;var isTouch=pointerType==INPUT_TYPE_TOUCH;var storeIndex=inArray(store,ev.pointerId,\"pointerId\");if(eventType&INPUT_START&&(ev.button===0||isTouch)){if(storeIndex<0){store.push(ev);storeIndex=store.length-1}}else if(eventType&(INPUT_END|INPUT_CANCEL)){removePointer=true}if(storeIndex<0){return}store[storeIndex]=ev;this.callback(this.manager,eventType,{pointers:store,changedPointers:[ev],pointerType:pointerType,srcEvent:ev});if(removePointer){store.splice(storeIndex,1)}}});var SINGLE_TOUCH_INPUT_MAP={touchstart:INPUT_START,touchmove:INPUT_MOVE,touchend:INPUT_END,touchcancel:INPUT_CANCEL};var SINGLE_TOUCH_TARGET_EVENTS=\"touchstart\";var SINGLE_TOUCH_WINDOW_EVENTS=\"touchstart touchmove touchend touchcancel\";function SingleTouchInput(){this.evTarget=SINGLE_TOUCH_TARGET_EVENTS;this.evWin=SINGLE_TOUCH_WINDOW_EVENTS;this.started=false;Input.apply(this,arguments)}inherit(SingleTouchInput,Input,{handler:function TEhandler(ev){var type=SINGLE_TOUCH_INPUT_MAP[ev.type];if(type===INPUT_START){this.started=true}if(!this.started){return}var touches=normalizeSingleTouches.call(this,ev,type);if(type&(INPUT_END|INPUT_CANCEL)&&touches[0].length-touches[1].length===0){this.started=false}this.callback(this.manager,type,{pointers:touches[0],changedPointers:touches[1],pointerType:INPUT_TYPE_TOUCH,srcEvent:ev})}});function normalizeSingleTouches(ev,type){var all=toArray(ev.touches);var changed=toArray(ev.changedTouches);if(type&(INPUT_END|INPUT_CANCEL)){all=uniqueArray(all.concat(changed),\"identifier\",true)}return[all,changed]}var TOUCH_INPUT_MAP={touchstart:INPUT_START,touchmove:INPUT_MOVE,touchend:INPUT_END,touchcancel:INPUT_CANCEL};var TOUCH_TARGET_EVENTS=\"touchstart touchmove touchend touchcancel\";function TouchInput(){this.evTarget=TOUCH_TARGET_EVENTS;this.targetIds={};Input.apply(this,arguments)}inherit(TouchInput,Input,{handler:function MTEhandler(ev){var type=TOUCH_INPUT_MAP[ev.type];var touches=getTouches.call(this,ev,type);if(!touches){return}this.callback(this.manager,type,{pointers:touches[0],changedPointers:touches[1],pointerType:INPUT_TYPE_TOUCH,srcEvent:ev})}});function getTouches(ev,type){var allTouches=toArray(ev.touches);var targetIds=this.targetIds;if(type&(INPUT_START|INPUT_MOVE)&&allTouches.length===1){targetIds[allTouches[0].identifier]=true;return[allTouches,allTouches]}var i,targetTouches,changedTouches=toArray(ev.changedTouches),changedTargetTouches=[],target=this.target;targetTouches=allTouches.filter(function(touch){return hasParent(touch.target,target)});if(type===INPUT_START){i=0;while(i<targetTouches.length){targetIds[targetTouches[i].identifier]=true;i++}}i=0;while(i<changedTouches.length){if(targetIds[changedTouches[i].identifier]){changedTargetTouches.push(changedTouches[i])}if(type&(INPUT_END|INPUT_CANCEL)){delete targetIds[changedTouches[i].identifier]}i++}if(!changedTargetTouches.length){return}return[uniqueArray(targetTouches.concat(changedTargetTouches),\"identifier\",true),changedTargetTouches]}var DEDUP_TIMEOUT=2500;var DEDUP_DISTANCE=25;function TouchMouseInput(){Input.apply(this,arguments);var handler=bindFn(this.handler,this);this.touch=new TouchInput(this.manager,handler);this.mouse=new MouseInput(this.manager,handler);this.primaryTouch=null;this.lastTouches=[]}inherit(TouchMouseInput,Input,{handler:function TMEhandler(manager,inputEvent,inputData){var isTouch=inputData.pointerType==INPUT_TYPE_TOUCH,isMouse=inputData.pointerType==INPUT_TYPE_MOUSE;if(isMouse&&inputData.sourceCapabilities&&inputData.sourceCapabilities.firesTouchEvents){return}if(isTouch){recordTouches.call(this,inputEvent,inputData)}else if(isMouse&&isSyntheticEvent.call(this,inputData)){return}this.callback(manager,inputEvent,inputData)},destroy:function destroy(){this.touch.destroy();this.mouse.destroy()}});function recordTouches(eventType,eventData){if(eventType&INPUT_START){this.primaryTouch=eventData.changedPointers[0].identifier;setLastTouch.call(this,eventData)}else if(eventType&(INPUT_END|INPUT_CANCEL)){setLastTouch.call(this,eventData)}}function setLastTouch(eventData){var touch=eventData.changedPointers[0];if(touch.identifier===this.primaryTouch){var lastTouch={x:touch.clientX,y:touch.clientY};this.lastTouches.push(lastTouch);var lts=this.lastTouches;var removeLastTouch=function(){var i=lts.indexOf(lastTouch);if(i>-1){lts.splice(i,1)}};setTimeout(removeLastTouch,DEDUP_TIMEOUT)}}function isSyntheticEvent(eventData){var x=eventData.srcEvent.clientX,y=eventData.srcEvent.clientY;for(var i=0;i<this.lastTouches.length;i++){var t=this.lastTouches[i];var dx=Math.abs(x-t.x),dy=Math.abs(y-t.y);if(dx<=DEDUP_DISTANCE&&dy<=DEDUP_DISTANCE){return true}}return false}var PREFIXED_TOUCH_ACTION=prefixed(TEST_ELEMENT.style,\"touchAction\");var NATIVE_TOUCH_ACTION=PREFIXED_TOUCH_ACTION!==undefined;var TOUCH_ACTION_COMPUTE=\"compute\";var TOUCH_ACTION_AUTO=\"auto\";var TOUCH_ACTION_MANIPULATION=\"manipulation\";var TOUCH_ACTION_NONE=\"none\";var TOUCH_ACTION_PAN_X=\"pan-x\";var TOUCH_ACTION_PAN_Y=\"pan-y\";var TOUCH_ACTION_MAP=getTouchActionProps();function TouchAction(manager,value){this.manager=manager;this.set(value)}TouchAction.prototype={set:function(value){if(value==TOUCH_ACTION_COMPUTE){value=this.compute()}if(NATIVE_TOUCH_ACTION&&this.manager.element.style&&TOUCH_ACTION_MAP[value]){this.manager.element.style[PREFIXED_TOUCH_ACTION]=value}this.actions=value.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var actions=[];each(this.manager.recognizers,function(recognizer){if(boolOrFn(recognizer.options.enable,[recognizer])){actions=actions.concat(recognizer.getTouchAction())}});return cleanTouchActions(actions.join(\" \"))},preventDefaults:function(input){var srcEvent=input.srcEvent;var direction=input.offsetDirection;if(this.manager.session.prevented){srcEvent.preventDefault();return}var actions=this.actions;var hasNone=inStr(actions,TOUCH_ACTION_NONE)&&!TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];var hasPanY=inStr(actions,TOUCH_ACTION_PAN_Y)&&!TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];var hasPanX=inStr(actions,TOUCH_ACTION_PAN_X)&&!TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];if(hasNone){var isTapPointer=input.pointers.length===1;var isTapMovement=input.distance<2;var isTapTouchTime=input.deltaTime<250;if(isTapPointer&&isTapMovement&&isTapTouchTime){return}}if(hasPanX&&hasPanY){return}if(hasNone||hasPanY&&direction&DIRECTION_HORIZONTAL||hasPanX&&direction&DIRECTION_VERTICAL){return this.preventSrc(srcEvent)}},preventSrc:function(srcEvent){this.manager.session.prevented=true;srcEvent.preventDefault()}};function cleanTouchActions(actions){if(inStr(actions,TOUCH_ACTION_NONE)){return TOUCH_ACTION_NONE}var hasPanX=inStr(actions,TOUCH_ACTION_PAN_X);var hasPanY=inStr(actions,TOUCH_ACTION_PAN_Y);if(hasPanX&&hasPanY){return TOUCH_ACTION_NONE}if(hasPanX||hasPanY){return hasPanX?TOUCH_ACTION_PAN_X:TOUCH_ACTION_PAN_Y}if(inStr(actions,TOUCH_ACTION_MANIPULATION)){return TOUCH_ACTION_MANIPULATION}return TOUCH_ACTION_AUTO}function getTouchActionProps(){if(!NATIVE_TOUCH_ACTION){return false}var touchMap={};var cssSupports=window.CSS&&window.CSS.supports;[\"auto\",\"manipulation\",\"pan-y\",\"pan-x\",\"pan-x pan-y\",\"none\"].forEach(function(val){touchMap[val]=cssSupports?window.CSS.supports(\"touch-action\",val):true});return touchMap}var STATE_POSSIBLE=1;var STATE_BEGAN=2;var STATE_CHANGED=4;var STATE_ENDED=8;var STATE_RECOGNIZED=STATE_ENDED;var STATE_CANCELLED=16;var STATE_FAILED=32;function Recognizer(options){this.options=assign({},this.defaults,options||{});this.id=uniqueId();this.manager=null;this.options.enable=ifUndefined(this.options.enable,true);this.state=STATE_POSSIBLE;this.simultaneous={};this.requireFail=[]}Recognizer.prototype={defaults:{},set:function(options){assign(this.options,options);this.manager&&this.manager.touchAction.update();return this},recognizeWith:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,\"recognizeWith\",this)){return this}var simultaneous=this.simultaneous;otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);if(!simultaneous[otherRecognizer.id]){simultaneous[otherRecognizer.id]=otherRecognizer;otherRecognizer.recognizeWith(this)}return this},dropRecognizeWith:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,\"dropRecognizeWith\",this)){return this}otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);delete this.simultaneous[otherRecognizer.id];return this},requireFailure:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,\"requireFailure\",this)){return this}var requireFail=this.requireFail;otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);if(inArray(requireFail,otherRecognizer)===-1){requireFail.push(otherRecognizer);otherRecognizer.requireFailure(this)}return this},dropRequireFailure:function(otherRecognizer){if(invokeArrayArg(otherRecognizer,\"dropRequireFailure\",this)){return this}otherRecognizer=getRecognizerByNameIfManager(otherRecognizer,this);var index=inArray(this.requireFail,otherRecognizer);if(index>-1){this.requireFail.splice(index,1)}return this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(otherRecognizer){return!!this.simultaneous[otherRecognizer.id]},emit:function(input){var self=this;var state=this.state;function emit(event){self.manager.emit(event,input)}if(state<STATE_ENDED){emit(self.options.event+stateStr(state))}emit(self.options.event);if(input.additionalEvent){emit(input.additionalEvent)}if(state>=STATE_ENDED){emit(self.options.event+stateStr(state))}},tryEmit:function(input){if(this.canEmit()){return this.emit(input)}this.state=STATE_FAILED},canEmit:function(){var i=0;while(i<this.requireFail.length){if(!(this.requireFail[i].state&(STATE_FAILED|STATE_POSSIBLE))){return false}i++}return true},recognize:function(inputData){var inputDataClone=assign({},inputData);if(!boolOrFn(this.options.enable,[this,inputDataClone])){this.reset();this.state=STATE_FAILED;return}if(this.state&(STATE_RECOGNIZED|STATE_CANCELLED|STATE_FAILED)){this.state=STATE_POSSIBLE}this.state=this.process(inputDataClone);if(this.state&(STATE_BEGAN|STATE_CHANGED|STATE_ENDED|STATE_CANCELLED)){this.tryEmit(inputDataClone)}},process:function(inputData){},getTouchAction:function(){},reset:function(){}};function stateStr(state){if(state&STATE_CANCELLED){return\"cancel\"}else if(state&STATE_ENDED){return\"end\"}else if(state&STATE_CHANGED){return\"move\"}else if(state&STATE_BEGAN){return\"start\"}return\"\"}function directionStr(direction){if(direction==DIRECTION_DOWN){return\"down\"}else if(direction==DIRECTION_UP){return\"up\"}else if(direction==DIRECTION_LEFT){return\"left\"}else if(direction==DIRECTION_RIGHT){return\"right\"}return\"\"}function getRecognizerByNameIfManager(otherRecognizer,recognizer){var manager=recognizer.manager;if(manager){return manager.get(otherRecognizer)}return otherRecognizer}function AttrRecognizer(){Recognizer.apply(this,arguments)}inherit(AttrRecognizer,Recognizer,{defaults:{pointers:1},attrTest:function(input){var optionPointers=this.options.pointers;return optionPointers===0||input.pointers.length===optionPointers},process:function(input){var state=this.state;var eventType=input.eventType;var isRecognized=state&(STATE_BEGAN|STATE_CHANGED);var isValid=this.attrTest(input);if(isRecognized&&(eventType&INPUT_CANCEL||!isValid)){return state|STATE_CANCELLED}else if(isRecognized||isValid){if(eventType&INPUT_END){return state|STATE_ENDED}else if(!(state&STATE_BEGAN)){return STATE_BEGAN}return state|STATE_CHANGED}return STATE_FAILED}});function PanRecognizer(){AttrRecognizer.apply(this,arguments);this.pX=null;this.pY=null}inherit(PanRecognizer,AttrRecognizer,{defaults:{event:\"pan\",threshold:10,pointers:1,direction:DIRECTION_ALL},getTouchAction:function(){var direction=this.options.direction;var actions=[];if(direction&DIRECTION_HORIZONTAL){actions.push(TOUCH_ACTION_PAN_Y)}if(direction&DIRECTION_VERTICAL){actions.push(TOUCH_ACTION_PAN_X)}return actions},directionTest:function(input){var options=this.options;var hasMoved=true;var distance=input.distance;var direction=input.direction;var x=input.deltaX;var y=input.deltaY;if(!(direction&options.direction)){if(options.direction&DIRECTION_HORIZONTAL){direction=x===0?DIRECTION_NONE:x<0?DIRECTION_LEFT:DIRECTION_RIGHT;hasMoved=x!=this.pX;distance=Math.abs(input.deltaX)}else{direction=y===0?DIRECTION_NONE:y<0?DIRECTION_UP:DIRECTION_DOWN;hasMoved=y!=this.pY;distance=Math.abs(input.deltaY)}}input.direction=direction;return hasMoved&&distance>options.threshold&&direction&options.direction},attrTest:function(input){return AttrRecognizer.prototype.attrTest.call(this,input)&&(this.state&STATE_BEGAN||!(this.state&STATE_BEGAN)&&this.directionTest(input))},emit:function(input){this.pX=input.deltaX;this.pY=input.deltaY;var direction=directionStr(input.direction);if(direction){input.additionalEvent=this.options.event+direction}this._super.emit.call(this,input)}});function PinchRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(PinchRecognizer,AttrRecognizer,{defaults:{event:\"pinch\",threshold:0,pointers:2},getTouchAction:function(){return[TOUCH_ACTION_NONE]},attrTest:function(input){return this._super.attrTest.call(this,input)&&(Math.abs(input.scale-1)>this.options.threshold||this.state&STATE_BEGAN)},emit:function(input){if(input.scale!==1){var inOut=input.scale<1?\"in\":\"out\";input.additionalEvent=this.options.event+inOut}this._super.emit.call(this,input)}});function PressRecognizer(){Recognizer.apply(this,arguments);this._timer=null;this._input=null}inherit(PressRecognizer,Recognizer,{defaults:{event:\"press\",pointers:1,time:251,threshold:9},getTouchAction:function(){return[TOUCH_ACTION_AUTO]},process:function(input){var options=this.options;var validPointers=input.pointers.length===options.pointers;var validMovement=input.distance<options.threshold;var validTime=input.deltaTime>options.time;this._input=input;if(!validMovement||!validPointers||input.eventType&(INPUT_END|INPUT_CANCEL)&&!validTime){this.reset()}else if(input.eventType&INPUT_START){this.reset();this._timer=setTimeoutContext(function(){this.state=STATE_RECOGNIZED;this.tryEmit()},options.time,this)}else if(input.eventType&INPUT_END){return STATE_RECOGNIZED}return STATE_FAILED},reset:function(){clearTimeout(this._timer)},emit:function(input){if(this.state!==STATE_RECOGNIZED){return}if(input&&input.eventType&INPUT_END){this.manager.emit(this.options.event+\"up\",input)}else{this._input.timeStamp=now();this.manager.emit(this.options.event,this._input)}}});function RotateRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(RotateRecognizer,AttrRecognizer,{defaults:{event:\"rotate\",threshold:0,pointers:2},getTouchAction:function(){return[TOUCH_ACTION_NONE]},attrTest:function(input){return this._super.attrTest.call(this,input)&&(Math.abs(input.rotation)>this.options.threshold||this.state&STATE_BEGAN)}});function SwipeRecognizer(){AttrRecognizer.apply(this,arguments)}inherit(SwipeRecognizer,AttrRecognizer,{defaults:{event:\"swipe\",threshold:10,velocity:.3,direction:DIRECTION_HORIZONTAL|DIRECTION_VERTICAL,pointers:1},getTouchAction:function(){return PanRecognizer.prototype.getTouchAction.call(this)},attrTest:function(input){var direction=this.options.direction;var velocity;if(direction&(DIRECTION_HORIZONTAL|DIRECTION_VERTICAL)){velocity=input.overallVelocity}else if(direction&DIRECTION_HORIZONTAL){velocity=input.overallVelocityX}else if(direction&DIRECTION_VERTICAL){velocity=input.overallVelocityY}return this._super.attrTest.call(this,input)&&direction&input.offsetDirection&&input.distance>this.options.threshold&&input.maxPointers==this.options.pointers&&abs(velocity)>this.options.velocity&&input.eventType&INPUT_END},emit:function(input){var direction=directionStr(input.offsetDirection);if(direction){this.manager.emit(this.options.event+direction,input)}this.manager.emit(this.options.event,input)}});function TapRecognizer(){Recognizer.apply(this,arguments);this.pTime=false;this.pCenter=false;this._timer=null;this._input=null;this.count=0}inherit(TapRecognizer,Recognizer,{defaults:{event:\"tap\",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[TOUCH_ACTION_MANIPULATION]},process:function(input){var options=this.options;var validPointers=input.pointers.length===options.pointers;var validMovement=input.distance<options.threshold;var validTouchTime=input.deltaTime<options.time;this.reset();if(input.eventType&INPUT_START&&this.count===0){return this.failTimeout()}if(validMovement&&validTouchTime&&validPointers){if(input.eventType!=INPUT_END){return this.failTimeout()}var validInterval=this.pTime?input.timeStamp-this.pTime<options.interval:true;var validMultiTap=!this.pCenter||getDistance(this.pCenter,input.center)<options.posThreshold;this.pTime=input.timeStamp;this.pCenter=input.center;if(!validMultiTap||!validInterval){this.count=1}else{this.count+=1}this._input=input;var tapCount=this.count%options.taps;if(tapCount===0){if(!this.hasRequireFailures()){return STATE_RECOGNIZED}else{this._timer=setTimeoutContext(function(){this.state=STATE_RECOGNIZED;this.tryEmit()},options.interval,this);return STATE_BEGAN}}}return STATE_FAILED},failTimeout:function(){this._timer=setTimeoutContext(function(){this.state=STATE_FAILED},this.options.interval,this);return STATE_FAILED},reset:function(){clearTimeout(this._timer)},emit:function(){if(this.state==STATE_RECOGNIZED){this._input.tapCount=this.count;this.manager.emit(this.options.event,this._input)}}});function Hammer(element,options){options=options||{};options.recognizers=ifUndefined(options.recognizers,Hammer.defaults.preset);return new Manager(element,options)}Hammer.VERSION=\"2.0.7\";Hammer.defaults={domEvents:false,touchAction:TOUCH_ACTION_COMPUTE,enable:true,inputTarget:null,inputClass:null,preset:[[RotateRecognizer,{enable:false}],[PinchRecognizer,{enable:false},[\"rotate\"]],[SwipeRecognizer,{direction:DIRECTION_HORIZONTAL}],[PanRecognizer,{direction:DIRECTION_HORIZONTAL},[\"swipe\"]],[TapRecognizer],[TapRecognizer,{event:\"doubletap\",taps:2},[\"tap\"]],[PressRecognizer]],cssProps:{userSelect:\"none\",touchSelect:\"none\",touchCallout:\"none\",contentZooming:\"none\",userDrag:\"none\",tapHighlightColor:\"rgba(0,0,0,0)\"}};var STOP=1;var FORCED_STOP=2;function Manager(element,options){this.options=assign({},Hammer.defaults,options||{});this.options.inputTarget=this.options.inputTarget||element;this.handlers={};this.session={};this.recognizers=[];this.oldCssProps={};this.element=element;this.input=createInputInstance(this);this.touchAction=new TouchAction(this,this.options.touchAction);toggleCssProps(this,true);each(this.options.recognizers,function(item){var recognizer=this.add(new item[0](item[1]));item[2]&&recognizer.recognizeWith(item[2]);item[3]&&recognizer.requireFailure(item[3])},this)}Manager.prototype={set:function(options){assign(this.options,options);if(options.touchAction){this.touchAction.update()}if(options.inputTarget){this.input.destroy();this.input.target=options.inputTarget;this.input.init()}return this},stop:function(force){this.session.stopped=force?FORCED_STOP:STOP},recognize:function(inputData){var session=this.session;if(session.stopped){return}this.touchAction.preventDefaults(inputData)\n;var recognizer;var recognizers=this.recognizers;var curRecognizer=session.curRecognizer;if(!curRecognizer||curRecognizer&&curRecognizer.state&STATE_RECOGNIZED){curRecognizer=session.curRecognizer=null}var i=0;while(i<recognizers.length){recognizer=recognizers[i];if(session.stopped!==FORCED_STOP&&(!curRecognizer||recognizer==curRecognizer||recognizer.canRecognizeWith(curRecognizer))){recognizer.recognize(inputData)}else{recognizer.reset()}if(!curRecognizer&&recognizer.state&(STATE_BEGAN|STATE_CHANGED|STATE_ENDED)){curRecognizer=session.curRecognizer=recognizer}i++}},get:function(recognizer){if(recognizer instanceof Recognizer){return recognizer}var recognizers=this.recognizers;for(var i=0;i<recognizers.length;i++){if(recognizers[i].options.event==recognizer){return recognizers[i]}}return null},add:function(recognizer){if(invokeArrayArg(recognizer,\"add\",this)){return this}var existing=this.get(recognizer.options.event);if(existing){this.remove(existing)}this.recognizers.push(recognizer);recognizer.manager=this;this.touchAction.update();return recognizer},remove:function(recognizer){if(invokeArrayArg(recognizer,\"remove\",this)){return this}recognizer=this.get(recognizer);if(recognizer){var recognizers=this.recognizers;var index=inArray(recognizers,recognizer);if(index!==-1){recognizers.splice(index,1);this.touchAction.update()}}return this},on:function(events,handler){if(events===undefined){return}if(handler===undefined){return}var handlers=this.handlers;each(splitStr(events),function(event){handlers[event]=handlers[event]||[];handlers[event].push(handler)});return this},off:function(events,handler){if(events===undefined){return}var handlers=this.handlers;each(splitStr(events),function(event){if(!handler){delete handlers[event]}else{handlers[event]&&handlers[event].splice(inArray(handlers[event],handler),1)}});return this},emit:function(event,data){if(this.options.domEvents){triggerDomEvent(event,data)}var handlers=this.handlers[event]&&this.handlers[event].slice();if(!handlers||!handlers.length){return}data.type=event;data.preventDefault=function(){data.srcEvent.preventDefault()};var i=0;while(i<handlers.length){handlers[i](data);i++}},destroy:function(){this.element&&toggleCssProps(this,false);this.handlers={};this.session={};this.input.destroy();this.element=null}};function toggleCssProps(manager,add){var element=manager.element;if(!element.style){return}var prop;each(manager.options.cssProps,function(value,name){prop=prefixed(element.style,name);if(add){manager.oldCssProps[prop]=element.style[prop];element.style[prop]=value}else{element.style[prop]=manager.oldCssProps[prop]||\"\"}});if(!add){manager.oldCssProps={}}}function triggerDomEvent(event,data){var gestureEvent=document.createEvent(\"Event\");gestureEvent.initEvent(event,true,true);gestureEvent.gesture=data;data.target.dispatchEvent(gestureEvent)}assign(Hammer,{INPUT_START:INPUT_START,INPUT_MOVE:INPUT_MOVE,INPUT_END:INPUT_END,INPUT_CANCEL:INPUT_CANCEL,STATE_POSSIBLE:STATE_POSSIBLE,STATE_BEGAN:STATE_BEGAN,STATE_CHANGED:STATE_CHANGED,STATE_ENDED:STATE_ENDED,STATE_RECOGNIZED:STATE_RECOGNIZED,STATE_CANCELLED:STATE_CANCELLED,STATE_FAILED:STATE_FAILED,DIRECTION_NONE:DIRECTION_NONE,DIRECTION_LEFT:DIRECTION_LEFT,DIRECTION_RIGHT:DIRECTION_RIGHT,DIRECTION_UP:DIRECTION_UP,DIRECTION_DOWN:DIRECTION_DOWN,DIRECTION_HORIZONTAL:DIRECTION_HORIZONTAL,DIRECTION_VERTICAL:DIRECTION_VERTICAL,DIRECTION_ALL:DIRECTION_ALL,Manager:Manager,Input:Input,TouchAction:TouchAction,TouchInput:TouchInput,MouseInput:MouseInput,PointerEventInput:PointerEventInput,TouchMouseInput:TouchMouseInput,SingleTouchInput:SingleTouchInput,Recognizer:Recognizer,AttrRecognizer:AttrRecognizer,Tap:TapRecognizer,Pan:PanRecognizer,Swipe:SwipeRecognizer,Pinch:PinchRecognizer,Rotate:RotateRecognizer,Press:PressRecognizer,on:addEventListeners,off:removeEventListeners,each:each,merge:merge,extend:extend,assign:assign,inherit:inherit,bindFn:bindFn,prefixed:prefixed});var freeGlobal=typeof window!==\"undefined\"?window:typeof self!==\"undefined\"?self:{};freeGlobal.Hammer=Hammer;if(true){!(__WEBPACK_AMD_DEFINE_RESULT__=function(){return Hammer}.call(exports,__webpack_require__,exports,module),__WEBPACK_AMD_DEFINE_RESULT__!==undefined&&(module.exports=__WEBPACK_AMD_DEFINE_RESULT__))}else if(typeof module!=\"undefined\"&&module.exports){module.exports=Hammer}else{window[exportName]=Hammer}})(window,document,\"Hammer\")},function(module,exports,__webpack_require__){\"use strict\";exports.util=__webpack_require__(2);exports.DOMutil=__webpack_require__(14);exports.DataSet=__webpack_require__(11);exports.DataView=__webpack_require__(12);exports.Queue=__webpack_require__(43);exports.Timeline=__webpack_require__(178);exports.Graph2d=__webpack_require__(180);exports.timeline={Core:__webpack_require__(65),DateUtil:__webpack_require__(36),Range:__webpack_require__(64),stack:__webpack_require__(100),TimeStep:__webpack_require__(66),components:{items:{Item:__webpack_require__(38),BackgroundItem:__webpack_require__(103),BoxItem:__webpack_require__(101),PointItem:__webpack_require__(102),RangeItem:__webpack_require__(70)},BackgroundGroup:__webpack_require__(69),Component:__webpack_require__(16),CurrentTime:__webpack_require__(67),CustomTime:__webpack_require__(46),DataAxis:__webpack_require__(107),DataScale:__webpack_require__(108),GraphGroup:__webpack_require__(109),Group:__webpack_require__(68),ItemSet:__webpack_require__(99),Legend:__webpack_require__(112),LineGraph:__webpack_require__(106),TimeAxis:__webpack_require__(45)}};exports.moment=__webpack_require__(9);exports.Hammer=__webpack_require__(10);exports.keycharm=__webpack_require__(35)},function(module,exports,__webpack_require__){\"use strict\";var moment=__webpack_require__(9);var util=__webpack_require__(2);var DataSet=__webpack_require__(11);var DataView=__webpack_require__(12);var Range=__webpack_require__(64);var Core=__webpack_require__(65);var TimeAxis=__webpack_require__(45);var CurrentTime=__webpack_require__(67);var CustomTime=__webpack_require__(46);var ItemSet=__webpack_require__(99);var printStyle=__webpack_require__(15).printStyle;var allOptions=__webpack_require__(105).allOptions;var configureOptions=__webpack_require__(105).configureOptions;var Configurator=__webpack_require__(71)[\"default\"];var Validator=__webpack_require__(15)[\"default\"];function Timeline(container,items,groups,options){if(!(this instanceof Timeline)){throw new SyntaxError(\"Constructor must be called with the new operator\")}if(!(Array.isArray(groups)||groups instanceof DataSet||groups instanceof DataView)&&groups instanceof Object){var forthArgument=options;options=groups;groups=forthArgument}if(options&&options.throttleRedraw){console.warn('Timeline option \"throttleRedraw\" is DEPRICATED and no longer supported. It will be removed in the next MAJOR release.')}var me=this;this.defaultOptions={start:null,end:null,autoResize:true,orientation:{axis:\"bottom\",item:\"bottom\"},moment:moment,width:null,height:null,maxHeight:null,minHeight:null};this.options=util.deepExtend({},this.defaultOptions);this._create(container);if(!options||options&&typeof options.rtl==\"undefined\"){this.dom.root.style.visibility=\"hidden\";var directionFromDom,domNode=this.dom.root;while(!directionFromDom&&domNode){directionFromDom=window.getComputedStyle(domNode,null).direction;domNode=domNode.parentElement}this.options.rtl=directionFromDom&&directionFromDom.toLowerCase()==\"rtl\"}else{this.options.rtl=options.rtl}this.options.rollingMode=options&&options.rollingMode;this.options.onInitialDrawComplete=options&&options.onInitialDrawComplete;this.components=[];this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{getScale:function getScale(){return me.timeAxis.step.scale},getStep:function getStep(){return me.timeAxis.step.step},toScreen:me._toScreen.bind(me),toGlobalScreen:me._toGlobalScreen.bind(me),toTime:me._toTime.bind(me),toGlobalTime:me._toGlobalTime.bind(me)}};this.range=new Range(this.body,this.options);this.components.push(this.range);this.body.range=this.range;this.timeAxis=new TimeAxis(this.body,this.options);this.timeAxis2=null;this.components.push(this.timeAxis);this.currentTime=new CurrentTime(this.body,this.options);this.components.push(this.currentTime);this.itemSet=new ItemSet(this.body,this.options);this.components.push(this.itemSet);this.itemsData=null;this.groupsData=null;this.dom.root.onclick=function(event){me.emit(\"click\",me.getEventProperties(event))};this.dom.root.ondblclick=function(event){me.emit(\"doubleClick\",me.getEventProperties(event))};this.dom.root.oncontextmenu=function(event){me.emit(\"contextmenu\",me.getEventProperties(event))};this.dom.root.onmouseover=function(event){me.emit(\"mouseOver\",me.getEventProperties(event))};if(window.PointerEvent){this.dom.root.onpointerdown=function(event){me.emit(\"mouseDown\",me.getEventProperties(event))};this.dom.root.onpointermove=function(event){me.emit(\"mouseMove\",me.getEventProperties(event))};this.dom.root.onpointerup=function(event){me.emit(\"mouseUp\",me.getEventProperties(event))}}else{this.dom.root.onmousemove=function(event){me.emit(\"mouseMove\",me.getEventProperties(event))};this.dom.root.onmousedown=function(event){me.emit(\"mouseDown\",me.getEventProperties(event))};this.dom.root.onmouseup=function(event){me.emit(\"mouseUp\",me.getEventProperties(event))}}this.initialFitDone=false;this.on(\"changed\",function(){if(this.itemsData==null||this.options.rollingMode)return;if(!me.initialFitDone){me.initialFitDone=true;if(me.options.start!=undefined||me.options.end!=undefined){if(me.options.start==undefined||me.options.end==undefined){var range=me.getItemRange()}var start=me.options.start!=undefined?me.options.start:range.min;var end=me.options.end!=undefined?me.options.end:range.max;me.setWindow(start,end,{animation:false})}else{me.fit({animation:false})}}if(!me.initialDrawDone&&me.initialRangeChangeDone){me.initialDrawDone=true;me.dom.root.style.visibility=\"visible\";if(me.options.onInitialDrawComplete){setTimeout(function(){return me.options.onInitialDrawComplete()},0)}}});if(options){this.setOptions(options)}if(groups){this.setGroups(groups)}if(items){this.setItems(items)}this._redraw()}Timeline.prototype=new Core;Timeline.prototype._createConfigurator=function(){return new Configurator(this,this.dom.container,configureOptions)};Timeline.prototype.redraw=function(){this.itemSet&&this.itemSet.markDirty({refreshItems:true});this._redraw()};Timeline.prototype.setOptions=function(options){var errorFound=Validator.validate(options,allOptions);if(errorFound===true){console.log(\"%cErrors have been found in the supplied options object.\",printStyle)}Core.prototype.setOptions.call(this,options);if(\"type\"in options){if(options.type!==this.options.type){this.options.type=options.type;var itemsData=this.itemsData;if(itemsData){var selection=this.getSelection();this.setItems(null);this.setItems(itemsData);this.setSelection(selection)}}}};Timeline.prototype.setItems=function(items){var newDataSet;if(!items){newDataSet=null}else if(items instanceof DataSet||items instanceof DataView){newDataSet=items}else{newDataSet=new DataSet(items,{type:{start:\"Date\",end:\"Date\"}})}this.itemsData=newDataSet;this.itemSet&&this.itemSet.setItems(newDataSet)};Timeline.prototype.setGroups=function(groups){var newDataSet;if(!groups){newDataSet=null}else{var filter=function filter(group){return group.visible!==false};if(groups instanceof DataSet||groups instanceof DataView){newDataSet=new DataView(groups,{filter:filter})}else{newDataSet=new DataSet(groups.filter(filter))}}this.groupsData=newDataSet;this.itemSet.setGroups(newDataSet)};Timeline.prototype.setData=function(data){if(data&&data.groups){this.setGroups(data.groups)}if(data&&data.items){this.setItems(data.items)}};Timeline.prototype.setSelection=function(ids,options){this.itemSet&&this.itemSet.setSelection(ids);if(options&&options.focus){this.focus(ids,options)}};Timeline.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]};Timeline.prototype.focus=function(id,options){if(!this.itemsData||id==undefined)return;var ids=Array.isArray(id)?id:[id];var itemsData=this.itemsData.getDataSet().get(ids,{type:{start:\"Date\",end:\"Date\"}});var start=null;var end=null;itemsData.forEach(function(itemData){var s=itemData.start.valueOf();var e=\"end\"in itemData?itemData.end.valueOf():itemData.start.valueOf();if(start===null||s<start){start=s}if(end===null||e>end){end=e}});if(start!==null&&end!==null){var me=this;var item=this.itemSet.items[ids[0]];var startPos=this._getScrollTop()*-1;var initialVerticalScroll=null;var verticalAnimationFrame=function verticalAnimationFrame(ease,willDraw,done){var verticalScroll=getItemVerticalScroll(me,item);if(!initialVerticalScroll){initialVerticalScroll=verticalScroll}if(initialVerticalScroll.itemTop==verticalScroll.itemTop&&!initialVerticalScroll.shouldScroll){return}else if(initialVerticalScroll.itemTop!=verticalScroll.itemTop&&verticalScroll.shouldScroll){initialVerticalScroll=verticalScroll;startPos=me._getScrollTop()*-1}var from=startPos;var to=initialVerticalScroll.scrollOffset;var scrollTop=done?to:from+(to-from)*ease;me._setScrollTop(-scrollTop);if(!willDraw){me._redraw()}};var setFinalVerticalPosition=function setFinalVerticalPosition(){var finalVerticalScroll=getItemVerticalScroll(me,item);if(finalVerticalScroll.shouldScroll&&finalVerticalScroll.itemTop!=initialVerticalScroll.itemTop){me._setScrollTop(-finalVerticalScroll.scrollOffset);me._redraw()}};var finalVerticalCallback=function finalVerticalCallback(){setFinalVerticalPosition();setTimeout(setFinalVerticalPosition,100)};var middle=(start+end)/2;var interval=Math.max(this.range.end-this.range.start,(end-start)*1.1);var animation=options&&options.animation!==undefined?options.animation:true;if(!animation){initialVerticalScroll={shouldScroll:false,scrollOffset:-1,itemTop:-1}}this.range.setRange(middle-interval/2,middle+interval/2,{animation:animation},finalVerticalCallback,verticalAnimationFrame)}};Timeline.prototype.fit=function(options,callback){var animation=options&&options.animation!==undefined?options.animation:true;var range;var dataset=this.itemsData&&this.itemsData.getDataSet();if(dataset.length===1&&dataset.get()[0].end===undefined){range=this.getDataRange();this.moveTo(range.min.valueOf(),{animation:animation},callback)}else{range=this.getItemRange();this.range.setRange(range.min,range.max,{animation:animation},callback)}};function getStart(item){return util.convert(item.data.start,\"Date\").valueOf()}function getEnd(item){var end=item.data.end!=undefined?item.data.end:item.data.start;return util.convert(end,\"Date\").valueOf()}function getItemVerticalScroll(timeline,item){var leftHeight=timeline.props.leftContainer.height;var contentHeight=timeline.props.left.height;var group=item.parent;var offset=group.top;var shouldScroll=true;var orientation=timeline.timeAxis.options.orientation.axis;var itemTop=function itemTop(){if(orientation==\"bottom\"){return group.height-item.top-item.height}else{return item.top}};var currentScrollHeight=timeline._getScrollTop()*-1;var targetOffset=offset+itemTop();var height=item.height;if(targetOffset<currentScrollHeight){if(offset+leftHeight<=offset+itemTop()+height){offset+=itemTop()-timeline.itemSet.options.margin.item.vertical}}else if(targetOffset+height>currentScrollHeight+leftHeight){offset+=itemTop()+height-leftHeight+timeline.itemSet.options.margin.item.vertical}else{shouldScroll=false}offset=Math.min(offset,contentHeight-leftHeight);return{shouldScroll:shouldScroll,scrollOffset:offset,itemTop:targetOffset}}Timeline.prototype.getItemRange=function(){var range=this.getDataRange();var min=range.min!==null?range.min.valueOf():null;var max=range.max!==null?range.max.valueOf():null;var minItem=null;var maxItem=null;if(min!=null&&max!=null){var interval=max-min;if(interval<=0){interval=10}var factor=interval/this.props.center.width;var redrawQueue={};var redrawQueueLength=0;util.forEach(this.itemSet.items,function(item,key){if(item.groupShowing){var returnQueue=true;redrawQueue[key]=item.redraw(returnQueue);redrawQueueLength=redrawQueue[key].length}});var needRedraw=redrawQueueLength>0;if(needRedraw){for(var i=0;i<redrawQueueLength;i++){util.forEach(redrawQueue,function(fns){fns[i]()})}}util.forEach(this.itemSet.items,function(item){var start=getStart(item);var end=getEnd(item);var startSide;var endSide;if(this.options.rtl){startSide=start-(item.getWidthRight()+10)*factor;endSide=end+(item.getWidthLeft()+10)*factor}else{startSide=start-(item.getWidthLeft()+10)*factor;endSide=end+(item.getWidthRight()+10)*factor}if(startSide<min){min=startSide;minItem=item}if(endSide>max){max=endSide;maxItem=item}}.bind(this));if(minItem&&maxItem){var lhs=minItem.getWidthLeft()+10;var rhs=maxItem.getWidthRight()+10;var delta=this.props.center.width-lhs-rhs;if(delta>0){if(this.options.rtl){min=getStart(minItem)-rhs*interval/delta;max=getEnd(maxItem)+lhs*interval/delta}else{min=getStart(minItem)-lhs*interval/delta;max=getEnd(maxItem)+rhs*interval/delta}}}}return{min:min!=null?new Date(min):null,max:max!=null?new Date(max):null}};Timeline.prototype.getDataRange=function(){var min=null;var max=null;var dataset=this.itemsData&&this.itemsData.getDataSet();if(dataset){dataset.forEach(function(item){var start=util.convert(item.start,\"Date\").valueOf();var end=util.convert(item.end!=undefined?item.end:item.start,\"Date\").valueOf();if(min===null||start<min){min=start}if(max===null||end>max){max=end}})}return{min:min!=null?new Date(min):null,max:max!=null?new Date(max):null}};Timeline.prototype.getEventProperties=function(event){var clientX=event.center?event.center.x:event.clientX;var clientY=event.center?event.center.y:event.clientY;var x;if(this.options.rtl){x=util.getAbsoluteRight(this.dom.centerContainer)-clientX}else{x=clientX-util.getAbsoluteLeft(this.dom.centerContainer)}var y=clientY-util.getAbsoluteTop(this.dom.centerContainer);var item=this.itemSet.itemFromTarget(event);var group=this.itemSet.groupFromTarget(event);var customTime=CustomTime.customTimeFromTarget(event);var snap=this.itemSet.options.snap||null;var scale=this.body.util.getScale();var step=this.body.util.getStep();var time=this._toTime(x);var snappedTime=snap?snap(time,scale,step):time;var element=util.getTarget(event);var what=null;if(item!=null){what=\"item\"}else if(customTime!=null){what=\"custom-time\"}else if(util.hasParent(element,this.timeAxis.dom.foreground)){what=\"axis\"}else if(this.timeAxis2&&util.hasParent(element,this.timeAxis2.dom.foreground)){what=\"axis\"}else if(util.hasParent(element,this.itemSet.dom.labelSet)){what=\"group-label\"}else if(util.hasParent(element,this.currentTime.bar)){what=\"current-time\"}else if(util.hasParent(element,this.dom.center)){what=\"background\"}return{event:event,item:item?item.id:null,group:group?group.groupId:null,what:what,pageX:event.srcEvent?event.srcEvent.pageX:event.pageX,pageY:event.srcEvent?event.srcEvent.pageY:event.pageY,x:x,y:y,time:time,snappedTime:snappedTime}};Timeline.prototype.toggleRollingMode=function(){if(this.range.rolling){this.range.stopRolling()}else{if(this.options.rollingMode==undefined){this.setOptions(this.options)}this.range.startRolling()}};module.exports=Timeline},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _stringify=__webpack_require__(19);var _stringify2=_interopRequireDefault(_stringify);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Hammer=__webpack_require__(10);var hammerUtil=__webpack_require__(37);var util=__webpack_require__(2);var ColorPicker=function(){function ColorPicker(){var pixelRatio=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1;(0,_classCallCheck3[\"default\"])(this,ColorPicker);this.pixelRatio=pixelRatio;this.generated=false;this.centerCoordinates={x:289/2,y:289/2};this.r=289*.49;this.color={r:255,g:255,b:255,a:1};this.hueCircle=undefined;this.initialColor={r:255,g:255,b:255,a:1};this.previousColor=undefined;this.applied=false;this.updateCallback=function(){};this.closeCallback=function(){};this._create()}(0,_createClass3[\"default\"])(ColorPicker,[{key:\"insertTo\",value:function insertTo(container){if(this.hammer!==undefined){this.hammer.destroy();this.hammer=undefined}this.container=container;this.container.appendChild(this.frame);this._bindHammer();this._setSize()}},{key:\"setUpdateCallback\",value:function setUpdateCallback(callback){if(typeof callback===\"function\"){this.updateCallback=callback}else{throw new Error(\"Function attempted to set as colorPicker update callback is not a function.\")}}},{key:\"setCloseCallback\",value:function setCloseCallback(callback){if(typeof callback===\"function\"){this.closeCallback=callback}else{throw new Error(\"Function attempted to set as colorPicker closing callback is not a function.\")}}},{key:\"_isColorString\",value:function _isColorString(color){var htmlColors={black:\"#000000\",navy:\"#000080\",darkblue:\"#00008B\",mediumblue:\"#0000CD\",blue:\"#0000FF\",darkgreen:\"#006400\",green:\"#008000\",teal:\"#008080\",darkcyan:\"#008B8B\",deepskyblue:\"#00BFFF\",darkturquoise:\"#00CED1\",mediumspringgreen:\"#00FA9A\",lime:\"#00FF00\",springgreen:\"#00FF7F\",aqua:\"#00FFFF\",cyan:\"#00FFFF\",midnightblue:\"#191970\",dodgerblue:\"#1E90FF\",lightseagreen:\"#20B2AA\",forestgreen:\"#228B22\",seagreen:\"#2E8B57\",darkslategray:\"#2F4F4F\",limegreen:\"#32CD32\",mediumseagreen:\"#3CB371\",turquoise:\"#40E0D0\",royalblue:\"#4169E1\",steelblue:\"#4682B4\",darkslateblue:\"#483D8B\",mediumturquoise:\"#48D1CC\",indigo:\"#4B0082\",darkolivegreen:\"#556B2F\",cadetblue:\"#5F9EA0\",cornflowerblue:\"#6495ED\",mediumaquamarine:\"#66CDAA\",dimgray:\"#696969\",slateblue:\"#6A5ACD\",olivedrab:\"#6B8E23\",slategray:\"#708090\",lightslategray:\"#778899\",mediumslateblue:\"#7B68EE\",lawngreen:\"#7CFC00\",chartreuse:\"#7FFF00\",aquamarine:\"#7FFFD4\",maroon:\"#800000\",purple:\"#800080\",olive:\"#808000\",gray:\"#808080\",skyblue:\"#87CEEB\",lightskyblue:\"#87CEFA\",blueviolet:\"#8A2BE2\",darkred:\"#8B0000\",darkmagenta:\"#8B008B\",saddlebrown:\"#8B4513\",darkseagreen:\"#8FBC8F\",lightgreen:\"#90EE90\",mediumpurple:\"#9370D8\",darkviolet:\"#9400D3\",palegreen:\"#98FB98\",darkorchid:\"#9932CC\",yellowgreen:\"#9ACD32\",sienna:\"#A0522D\",brown:\"#A52A2A\",darkgray:\"#A9A9A9\",lightblue:\"#ADD8E6\",greenyellow:\"#ADFF2F\",paleturquoise:\"#AFEEEE\",lightsteelblue:\"#B0C4DE\",powderblue:\"#B0E0E6\",firebrick:\"#B22222\",darkgoldenrod:\"#B8860B\",mediumorchid:\"#BA55D3\",rosybrown:\"#BC8F8F\",darkkhaki:\"#BDB76B\",silver:\"#C0C0C0\",mediumvioletred:\"#C71585\",indianred:\"#CD5C5C\",peru:\"#CD853F\",chocolate:\"#D2691E\",tan:\"#D2B48C\",lightgrey:\"#D3D3D3\",palevioletred:\"#D87093\",thistle:\"#D8BFD8\",orchid:\"#DA70D6\",goldenrod:\"#DAA520\",crimson:\"#DC143C\",gainsboro:\"#DCDCDC\",plum:\"#DDA0DD\",burlywood:\"#DEB887\",lightcyan:\"#E0FFFF\",lavender:\"#E6E6FA\",darksalmon:\"#E9967A\",violet:\"#EE82EE\",palegoldenrod:\"#EEE8AA\",lightcoral:\"#F08080\",khaki:\"#F0E68C\",aliceblue:\"#F0F8FF\",honeydew:\"#F0FFF0\",azure:\"#F0FFFF\",sandybrown:\"#F4A460\",wheat:\"#F5DEB3\",beige:\"#F5F5DC\",whitesmoke:\"#F5F5F5\",mintcream:\"#F5FFFA\",ghostwhite:\"#F8F8FF\",salmon:\"#FA8072\",antiquewhite:\"#FAEBD7\",linen:\"#FAF0E6\",lightgoldenrodyellow:\"#FAFAD2\",oldlace:\"#FDF5E6\",red:\"#FF0000\",fuchsia:\"#FF00FF\",magenta:\"#FF00FF\",deeppink:\"#FF1493\",orangered:\"#FF4500\",tomato:\"#FF6347\",hotpink:\"#FF69B4\",coral:\"#FF7F50\",darkorange:\"#FF8C00\",lightsalmon:\"#FFA07A\",orange:\"#FFA500\",lightpink:\"#FFB6C1\",pink:\"#FFC0CB\",gold:\"#FFD700\",peachpuff:\"#FFDAB9\",navajowhite:\"#FFDEAD\",moccasin:\"#FFE4B5\",bisque:\"#FFE4C4\",mistyrose:\"#FFE4E1\",blanchedalmond:\"#FFEBCD\",papayawhip:\"#FFEFD5\",lavenderblush:\"#FFF0F5\",seashell:\"#FFF5EE\",cornsilk:\"#FFF8DC\",lemonchiffon:\"#FFFACD\",floralwhite:\"#FFFAF0\",snow:\"#FFFAFA\",yellow:\"#FFFF00\",lightyellow:\"#FFFFE0\",ivory:\"#FFFFF0\",white:\"#FFFFFF\"};if(typeof color===\"string\"){return htmlColors[color]}}},{key:\"setColor\",value:function setColor(color){var setInitial=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;if(color===\"none\"){return}var rgba=void 0;var htmlColor=this._isColorString(color);if(htmlColor!==undefined){color=htmlColor}if(util.isString(color)===true){if(util.isValidRGB(color)===true){var rgbaArray=color.substr(4).substr(0,color.length-5).split(\",\");rgba={r:rgbaArray[0],g:rgbaArray[1],b:rgbaArray[2],a:1}}else if(util.isValidRGBA(color)===true){var _rgbaArray=color.substr(5).substr(0,color.length-6).split(\",\");rgba={r:_rgbaArray[0],g:_rgbaArray[1],b:_rgbaArray[2],a:_rgbaArray[3]}}else if(util.isValidHex(color)===true){var rgbObj=util.hexToRGB(color);rgba={r:rgbObj.r,g:rgbObj.g,b:rgbObj.b,a:1}}}else{if(color instanceof Object){if(color.r!==undefined&&color.g!==undefined&&color.b!==undefined){var alpha=color.a!==undefined?color.a:\"1.0\";rgba={r:color.r,g:color.g,b:color.b,a:alpha}}}}if(rgba===undefined){throw new Error(\"Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: \"+(0,_stringify2[\"default\"])(color))}else{this._setColor(rgba,setInitial)}}},{key:\"show\",value:function show(){if(this.closeCallback!==undefined){this.closeCallback();this.closeCallback=undefined}this.applied=false;this.frame.style.display=\"block\";this._generateHueCircle()}},{key:\"_hide\",value:function _hide(){var _this=this;var storePrevious=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;if(storePrevious===true){this.previousColor=util.extend({},this.color)}if(this.applied===true){this.updateCallback(this.initialColor)}this.frame.style.display=\"none\";setTimeout(function(){if(_this.closeCallback!==undefined){_this.closeCallback();_this.closeCallback=undefined}},0)}},{key:\"_save\",value:function _save(){this.updateCallback(this.color);this.applied=false;this._hide()}},{key:\"_apply\",value:function _apply(){this.applied=true;this.updateCallback(this.color);this._updatePicker(this.color)}},{key:\"_loadLast\",value:function _loadLast(){if(this.previousColor!==undefined){this.setColor(this.previousColor,false)}else{alert(\"There is no last color to load...\")}}},{key:\"_setColor\",value:function _setColor(rgba){var setInitial=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;if(setInitial===true){this.initialColor=util.extend({},rgba)}this.color=rgba;var hsv=util.RGBToHSV(rgba.r,rgba.g,rgba.b);var angleConvert=2*Math.PI;var radius=this.r*hsv.s;var x=this.centerCoordinates.x+radius*Math.sin(angleConvert*hsv.h);var y=this.centerCoordinates.y+radius*Math.cos(angleConvert*hsv.h);this.colorPickerSelector.style.left=x-.5*this.colorPickerSelector.clientWidth+\"px\";this.colorPickerSelector.style.top=y-.5*this.colorPickerSelector.clientHeight+\"px\";this._updatePicker(rgba)}},{key:\"_setOpacity\",value:function _setOpacity(value){this.color.a=value/100;this._updatePicker(this.color)}},{key:\"_setBrightness\",value:function _setBrightness(value){var hsv=util.RGBToHSV(this.color.r,this.color.g,this.color.b);hsv.v=value/100;var rgba=util.HSVToRGB(hsv.h,hsv.s,hsv.v);rgba[\"a\"]=this.color.a;this.color=rgba;this._updatePicker()}},{key:\"_updatePicker\",value:function _updatePicker(){var rgba=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.color;var hsv=util.RGBToHSV(rgba.r,rgba.g,rgba.b);var ctx=this.colorPickerCanvas.getContext(\"2d\");if(this.pixelRation===undefined){this.pixelRatio=(window.devicePixelRatio||1)/(ctx.webkitBackingStorePixelRatio||ctx.mozBackingStorePixelRatio||ctx.msBackingStorePixelRatio||ctx.oBackingStorePixelRatio||ctx.backingStorePixelRatio||1)}ctx.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var w=this.colorPickerCanvas.clientWidth;var h=this.colorPickerCanvas.clientHeight;ctx.clearRect(0,0,w,h);ctx.putImageData(this.hueCircle,0,0);ctx.fillStyle=\"rgba(0,0,0,\"+(1-hsv.v)+\")\";ctx.circle(this.centerCoordinates.x,this.centerCoordinates.y,this.r);ctx.fill();this.brightnessRange.value=100*hsv.v;this.opacityRange.value=100*rgba.a;this.initialColorDiv.style.backgroundColor=\"rgba(\"+this.initialColor.r+\",\"+this.initialColor.g+\",\"+this.initialColor.b+\",\"+this.initialColor.a+\")\";this.newColorDiv.style.backgroundColor=\"rgba(\"+this.color.r+\",\"+this.color.g+\",\"+this.color.b+\",\"+this.color.a+\")\"}},{key:\"_setSize\",value:function _setSize(){this.colorPickerCanvas.style.width=\"100%\";this.colorPickerCanvas.style.height=\"100%\";this.colorPickerCanvas.width=289*this.pixelRatio;this.colorPickerCanvas.height=289*this.pixelRatio}},{key:\"_create\",value:function _create(){this.frame=document.createElement(\"div\");this.frame.className=\"vis-color-picker\";this.colorPickerDiv=document.createElement(\"div\");this.colorPickerSelector=document.createElement(\"div\");this.colorPickerSelector.className=\"vis-selector\";this.colorPickerDiv.appendChild(this.colorPickerSelector);this.colorPickerCanvas=document.createElement(\"canvas\");this.colorPickerDiv.appendChild(this.colorPickerCanvas);if(!this.colorPickerCanvas.getContext){var noCanvas=document.createElement(\"DIV\");noCanvas.style.color=\"red\";noCanvas.style.fontWeight=\"bold\";noCanvas.style.padding=\"10px\";noCanvas.innerHTML=\"Error: your browser does not support HTML canvas\";this.colorPickerCanvas.appendChild(noCanvas)}else{var ctx=this.colorPickerCanvas.getContext(\"2d\");this.pixelRatio=(window.devicePixelRatio||1)/(ctx.webkitBackingStorePixelRatio||ctx.mozBackingStorePixelRatio||ctx.msBackingStorePixelRatio||ctx.oBackingStorePixelRatio||ctx.backingStorePixelRatio||1);this.colorPickerCanvas.getContext(\"2d\").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}this.colorPickerDiv.className=\"vis-color\";this.opacityDiv=document.createElement(\"div\");this.opacityDiv.className=\"vis-opacity\";this.brightnessDiv=document.createElement(\"div\");this.brightnessDiv.className=\"vis-brightness\";this.arrowDiv=document.createElement(\"div\");this.arrowDiv.className=\"vis-arrow\";this.opacityRange=document.createElement(\"input\");try{this.opacityRange.type=\"range\";this.opacityRange.min=\"0\";this.opacityRange.max=\"100\"}catch(err){}this.opacityRange.value=\"100\";this.opacityRange.className=\"vis-range\";this.brightnessRange=document.createElement(\"input\");try{this.brightnessRange.type=\"range\";this.brightnessRange.min=\"0\";this.brightnessRange.max=\"100\"}catch(err){}this.brightnessRange.value=\"100\";this.brightnessRange.className=\"vis-range\";this.opacityDiv.appendChild(this.opacityRange);this.brightnessDiv.appendChild(this.brightnessRange);var me=this;this.opacityRange.onchange=function(){me._setOpacity(this.value)};this.opacityRange.oninput=function(){me._setOpacity(this.value)};this.brightnessRange.onchange=function(){me._setBrightness(this.value)};this.brightnessRange.oninput=function(){me._setBrightness(this.value)};this.brightnessLabel=document.createElement(\"div\");this.brightnessLabel.className=\"vis-label vis-brightness\";this.brightnessLabel.innerHTML=\"brightness:\";this.opacityLabel=document.createElement(\"div\");this.opacityLabel.className=\"vis-label vis-opacity\";this.opacityLabel.innerHTML=\"opacity:\";this.newColorDiv=document.createElement(\"div\");this.newColorDiv.className=\"vis-new-color\";this.newColorDiv.innerHTML=\"new\";this.initialColorDiv=document.createElement(\"div\");this.initialColorDiv.className=\"vis-initial-color\";this.initialColorDiv.innerHTML=\"initial\";this.cancelButton=document.createElement(\"div\");this.cancelButton.className=\"vis-button vis-cancel\";this.cancelButton.innerHTML=\"cancel\";this.cancelButton.onclick=this._hide.bind(this,false);this.applyButton=document.createElement(\"div\");this.applyButton.className=\"vis-button vis-apply\";this.applyButton.innerHTML=\"apply\";this.applyButton.onclick=this._apply.bind(this);this.saveButton=document.createElement(\"div\");this.saveButton.className=\"vis-button vis-save\";this.saveButton.innerHTML=\"save\";this.saveButton.onclick=this._save.bind(this);this.loadButton=document.createElement(\"div\");this.loadButton.className=\"vis-button vis-load\";this.loadButton.innerHTML=\"load last\";this.loadButton.onclick=this._loadLast.bind(this)\n;this.frame.appendChild(this.colorPickerDiv);this.frame.appendChild(this.arrowDiv);this.frame.appendChild(this.brightnessLabel);this.frame.appendChild(this.brightnessDiv);this.frame.appendChild(this.opacityLabel);this.frame.appendChild(this.opacityDiv);this.frame.appendChild(this.newColorDiv);this.frame.appendChild(this.initialColorDiv);this.frame.appendChild(this.cancelButton);this.frame.appendChild(this.applyButton);this.frame.appendChild(this.saveButton);this.frame.appendChild(this.loadButton)}},{key:\"_bindHammer\",value:function _bindHammer(){var _this2=this;this.drag={};this.pinch={};this.hammer=new Hammer(this.colorPickerCanvas);this.hammer.get(\"pinch\").set({enable:true});hammerUtil.onTouch(this.hammer,function(event){_this2._moveSelector(event)});this.hammer.on(\"tap\",function(event){_this2._moveSelector(event)});this.hammer.on(\"panstart\",function(event){_this2._moveSelector(event)});this.hammer.on(\"panmove\",function(event){_this2._moveSelector(event)});this.hammer.on(\"panend\",function(event){_this2._moveSelector(event)})}},{key:\"_generateHueCircle\",value:function _generateHueCircle(){if(this.generated===false){var ctx=this.colorPickerCanvas.getContext(\"2d\");if(this.pixelRation===undefined){this.pixelRatio=(window.devicePixelRatio||1)/(ctx.webkitBackingStorePixelRatio||ctx.mozBackingStorePixelRatio||ctx.msBackingStorePixelRatio||ctx.oBackingStorePixelRatio||ctx.backingStorePixelRatio||1)}ctx.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var w=this.colorPickerCanvas.clientWidth;var h=this.colorPickerCanvas.clientHeight;ctx.clearRect(0,0,w,h);var x=void 0,y=void 0,hue=void 0,sat=void 0;this.centerCoordinates={x:w*.5,y:h*.5};this.r=.49*w;var angleConvert=2*Math.PI/360;var hfac=1/360;var sfac=1/this.r;var rgb=void 0;for(hue=0;hue<360;hue++){for(sat=0;sat<this.r;sat++){x=this.centerCoordinates.x+sat*Math.sin(angleConvert*hue);y=this.centerCoordinates.y+sat*Math.cos(angleConvert*hue);rgb=util.HSVToRGB(hue*hfac,sat*sfac,1);ctx.fillStyle=\"rgb(\"+rgb.r+\",\"+rgb.g+\",\"+rgb.b+\")\";ctx.fillRect(x-.5,y-.5,2,2)}}ctx.strokeStyle=\"rgba(0,0,0,1)\";ctx.circle(this.centerCoordinates.x,this.centerCoordinates.y,this.r);ctx.stroke();this.hueCircle=ctx.getImageData(0,0,w,h)}this.generated=true}},{key:\"_moveSelector\",value:function _moveSelector(event){var rect=this.colorPickerDiv.getBoundingClientRect();var left=event.center.x-rect.left;var top=event.center.y-rect.top;var centerY=.5*this.colorPickerDiv.clientHeight;var centerX=.5*this.colorPickerDiv.clientWidth;var x=left-centerX;var y=top-centerY;var angle=Math.atan2(x,y);var radius=.98*Math.min(Math.sqrt(x*x+y*y),centerX);var newTop=Math.cos(angle)*radius+centerY;var newLeft=Math.sin(angle)*radius+centerX;this.colorPickerSelector.style.top=newTop-.5*this.colorPickerSelector.clientHeight+\"px\";this.colorPickerSelector.style.left=newLeft-.5*this.colorPickerSelector.clientWidth+\"px\";var h=angle/(2*Math.PI);h=h<0?h+1:h;var s=radius/this.r;var hsv=util.RGBToHSV(this.color.r,this.color.g,this.color.b);hsv.h=h;hsv.s=s;var rgba=util.HSVToRGB(hsv.h,hsv.s,hsv.v);rgba[\"a\"]=this.color.a;this.color=rgba;this.initialColorDiv.style.backgroundColor=\"rgba(\"+this.initialColor.r+\",\"+this.initialColor.g+\",\"+this.initialColor.b+\",\"+this.initialColor.a+\")\";this.newColorDiv.style.backgroundColor=\"rgba(\"+this.color.r+\",\"+this.color.g+\",\"+this.color.b+\",\"+this.color.a+\")\"}}]);return ColorPicker}();exports[\"default\"]=ColorPicker},function(module,exports,__webpack_require__){\"use strict\";var moment=__webpack_require__(9);var util=__webpack_require__(2);var DataSet=__webpack_require__(11);var DataView=__webpack_require__(12);var Range=__webpack_require__(64);var Core=__webpack_require__(65);var TimeAxis=__webpack_require__(45);var CurrentTime=__webpack_require__(67);var CustomTime=__webpack_require__(46);var LineGraph=__webpack_require__(106);var printStyle=__webpack_require__(15).printStyle;var allOptions=__webpack_require__(113).allOptions;var configureOptions=__webpack_require__(113).configureOptions;var Configurator=__webpack_require__(71)[\"default\"];var Validator=__webpack_require__(15)[\"default\"];function Graph2d(container,items,groups,options){if(!(Array.isArray(groups)||groups instanceof DataSet||groups instanceof DataView)&&groups instanceof Object){var forthArgument=options;options=groups;groups=forthArgument}if(options&&options.throttleRedraw){console.warn('Graph2d option \"throttleRedraw\" is DEPRICATED and no longer supported. It will be removed in the next MAJOR release.')}var me=this;this.defaultOptions={start:null,end:null,autoResize:true,orientation:{axis:\"bottom\",item:\"bottom\"},moment:moment,width:null,height:null,maxHeight:null,minHeight:null};this.options=util.deepExtend({},this.defaultOptions);this._create(container);this.components=[];this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{toScreen:me._toScreen.bind(me),toGlobalScreen:me._toGlobalScreen.bind(me),toTime:me._toTime.bind(me),toGlobalTime:me._toGlobalTime.bind(me)}};this.range=new Range(this.body);this.components.push(this.range);this.body.range=this.range;this.timeAxis=new TimeAxis(this.body);this.components.push(this.timeAxis);this.currentTime=new CurrentTime(this.body);this.components.push(this.currentTime);this.linegraph=new LineGraph(this.body);this.components.push(this.linegraph);this.itemsData=null;this.groupsData=null;this.on(\"tap\",function(event){me.emit(\"click\",me.getEventProperties(event))});this.on(\"doubletap\",function(event){me.emit(\"doubleClick\",me.getEventProperties(event))});this.dom.root.oncontextmenu=function(event){me.emit(\"contextmenu\",me.getEventProperties(event))};if(options){this.setOptions(options)}if(groups){this.setGroups(groups)}if(items){this.setItems(items)}this._redraw()}Graph2d.prototype=new Core;Graph2d.prototype.setOptions=function(options){var errorFound=Validator.validate(options,allOptions);if(errorFound===true){console.log(\"%cErrors have been found in the supplied options object.\",printStyle)}Core.prototype.setOptions.call(this,options)};Graph2d.prototype.setItems=function(items){var initialLoad=this.itemsData==null;var newDataSet;if(!items){newDataSet=null}else if(items instanceof DataSet||items instanceof DataView){newDataSet=items}else{newDataSet=new DataSet(items,{type:{start:\"Date\",end:\"Date\"}})}this.itemsData=newDataSet;this.linegraph&&this.linegraph.setItems(newDataSet);if(initialLoad){if(this.options.start!=undefined||this.options.end!=undefined){var start=this.options.start!=undefined?this.options.start:null;var end=this.options.end!=undefined?this.options.end:null;this.setWindow(start,end,{animation:false})}else{this.fit({animation:false})}}};Graph2d.prototype.setGroups=function(groups){var newDataSet;if(!groups){newDataSet=null}else if(groups instanceof DataSet||groups instanceof DataView){newDataSet=groups}else{newDataSet=new DataSet(groups)}this.groupsData=newDataSet;this.linegraph.setGroups(newDataSet)};Graph2d.prototype.getLegend=function(groupId,width,height){if(width===undefined){width=15}if(height===undefined){height=15}if(this.linegraph.groups[groupId]!==undefined){return this.linegraph.groups[groupId].getLegend(width,height)}else{return\"cannot find group:'\"+groupId+\"'\"}};Graph2d.prototype.isGroupVisible=function(groupId){if(this.linegraph.groups[groupId]!==undefined){return this.linegraph.groups[groupId].visible&&(this.linegraph.options.groups.visibility[groupId]===undefined||this.linegraph.options.groups.visibility[groupId]==true)}else{return false}};Graph2d.prototype.getDataRange=function(){var min=null;var max=null;for(var groupId in this.linegraph.groups){if(this.linegraph.groups.hasOwnProperty(groupId)){if(this.linegraph.groups[groupId].visible==true){for(var i=0;i<this.linegraph.groups[groupId].itemsData.length;i++){var item=this.linegraph.groups[groupId].itemsData[i];var value=util.convert(item.x,\"Date\").valueOf();min=min==null?value:min>value?value:min;max=max==null?value:max<value?value:max}}}}return{min:min!=null?new Date(min):null,max:max!=null?new Date(max):null}};Graph2d.prototype.getEventProperties=function(event){var clientX=event.center?event.center.x:event.clientX;var clientY=event.center?event.center.y:event.clientY;var x=clientX-util.getAbsoluteLeft(this.dom.centerContainer);var y=clientY-util.getAbsoluteTop(this.dom.centerContainer);var time=this._toTime(x);var customTime=CustomTime.customTimeFromTarget(event);var element=util.getTarget(event);var what=null;if(util.hasParent(element,this.timeAxis.dom.foreground)){what=\"axis\"}else if(this.timeAxis2&&util.hasParent(element,this.timeAxis2.dom.foreground)){what=\"axis\"}else if(util.hasParent(element,this.linegraph.yAxisLeft.dom.frame)){what=\"data-axis\"}else if(util.hasParent(element,this.linegraph.yAxisRight.dom.frame)){what=\"data-axis\"}else if(util.hasParent(element,this.linegraph.legendLeft.dom.frame)){what=\"legend\"}else if(util.hasParent(element,this.linegraph.legendRight.dom.frame)){what=\"legend\"}else if(customTime!=null){what=\"custom-time\"}else if(util.hasParent(element,this.currentTime.bar)){what=\"current-time\"}else if(util.hasParent(element,this.dom.center)){what=\"background\"}var value=[];var yAxisLeft=this.linegraph.yAxisLeft;var yAxisRight=this.linegraph.yAxisRight;if(!yAxisLeft.hidden&&this.itemsData.length>0){value.push(yAxisLeft.screenToValue(y))}if(!yAxisRight.hidden&&this.itemsData.length>0){value.push(yAxisRight.screenToValue(y))}return{event:event,what:what,pageX:event.srcEvent?event.srcEvent.pageX:event.pageX,pageY:event.srcEvent?event.srcEvent.pageY:event.pageY,x:x,y:y,time:time,value:value}};Graph2d.prototype._createConfigurator=function(){return new Configurator(this,this.dom.container,configureOptions)};module.exports=Graph2d},function(module,exports,__webpack_require__){\"use strict\";exports.util=__webpack_require__(2);exports.DOMutil=__webpack_require__(14);exports.DataSet=__webpack_require__(11);exports.DataView=__webpack_require__(12);exports.Queue=__webpack_require__(43);exports.Network=__webpack_require__(182);exports.network={Images:__webpack_require__(116),dotparser:__webpack_require__(114),gephiParser:__webpack_require__(115),allOptions:__webpack_require__(122)};exports.network.convertDot=function(input){return exports.network.dotparser.DOTToGraph(input)};exports.network.convertGephi=function(input,options){return exports.network.gephiParser.parseGephi(input,options)};exports.moment=__webpack_require__(9);exports.Hammer=__webpack_require__(10);exports.keycharm=__webpack_require__(35)},function(module,exports,__webpack_require__){\"use strict\";__webpack_require__(183);var Emitter=__webpack_require__(44);var util=__webpack_require__(2);var dotparser=__webpack_require__(114);var gephiParser=__webpack_require__(115);var Activator=__webpack_require__(97);var locales=__webpack_require__(184);var Images=__webpack_require__(116)[\"default\"];var Groups=__webpack_require__(186)[\"default\"];var NodesHandler=__webpack_require__(187)[\"default\"];var EdgesHandler=__webpack_require__(214)[\"default\"];var PhysicsEngine=__webpack_require__(220)[\"default\"];var ClusterEngine=__webpack_require__(227)[\"default\"];var CanvasRenderer=__webpack_require__(229)[\"default\"];var Canvas=__webpack_require__(230)[\"default\"];var View=__webpack_require__(231)[\"default\"];var InteractionHandler=__webpack_require__(232)[\"default\"];var SelectionHandler=__webpack_require__(234)[\"default\"];var LayoutEngine=__webpack_require__(235)[\"default\"];var ManipulationSystem=__webpack_require__(237)[\"default\"];var Configurator=__webpack_require__(71)[\"default\"];var Validator=__webpack_require__(15)[\"default\"];var _require=__webpack_require__(15),printStyle=_require.printStyle;var _require2=__webpack_require__(122),allOptions=_require2.allOptions,configureOptions=_require2.configureOptions;var KamadaKawai=__webpack_require__(238)[\"default\"];function Network(container,data,options){var _this=this;if(!(this instanceof Network)){throw new SyntaxError(\"Constructor must be called with the new operator\")}this.options={};this.defaultOptions={locale:\"en\",locales:locales,clickToUse:false};util.extend(this.options,this.defaultOptions);this.body={container:container,nodes:{},nodeIndices:[],edges:{},edgeIndices:[],emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this),once:this.once.bind(this)},eventListeners:{onTap:function onTap(){},onTouch:function onTouch(){},onDoubleTap:function onDoubleTap(){},onHold:function onHold(){},onDragStart:function onDragStart(){},onDrag:function onDrag(){},onDragEnd:function onDragEnd(){},onMouseWheel:function onMouseWheel(){},onPinch:function onPinch(){},onMouseMove:function onMouseMove(){},onRelease:function onRelease(){},onContext:function onContext(){}},data:{nodes:null,edges:null},functions:{createNode:function createNode(){},createEdge:function createEdge(){},getPointer:function getPointer(){}},modules:{},view:{scale:1,translation:{x:0,y:0}}};this.bindEventListeners();this.images=new Images(function(){return _this.body.emitter.emit(\"_requestRedraw\")});this.groups=new Groups;this.canvas=new Canvas(this.body);this.selectionHandler=new SelectionHandler(this.body,this.canvas);this.interactionHandler=new InteractionHandler(this.body,this.canvas,this.selectionHandler);this.view=new View(this.body,this.canvas);this.renderer=new CanvasRenderer(this.body,this.canvas);this.physics=new PhysicsEngine(this.body);this.layoutEngine=new LayoutEngine(this.body);this.clustering=new ClusterEngine(this.body);this.manipulation=new ManipulationSystem(this.body,this.canvas,this.selectionHandler);this.nodesHandler=new NodesHandler(this.body,this.images,this.groups,this.layoutEngine);this.edgesHandler=new EdgesHandler(this.body,this.images,this.groups);this.body.modules[\"kamadaKawai\"]=new KamadaKawai(this.body,150,.05);this.body.modules[\"clustering\"]=this.clustering;this.canvas._create();this.setOptions(options);this.setData(data)}Emitter(Network.prototype);Network.prototype.setOptions=function(options){var _this2=this;if(options!==undefined){var errorFound=Validator.validate(options,allOptions);if(errorFound===true){console.log(\"%cErrors have been found in the supplied options object.\",printStyle)}var fields=[\"locale\",\"locales\",\"clickToUse\"];util.selectiveDeepExtend(fields,this.options,options);options=this.layoutEngine.setOptions(options.layout,options);this.canvas.setOptions(options);this.groups.setOptions(options.groups);this.nodesHandler.setOptions(options.nodes);this.edgesHandler.setOptions(options.edges);this.physics.setOptions(options.physics);this.manipulation.setOptions(options.manipulation,options,this.options);this.interactionHandler.setOptions(options.interaction);this.renderer.setOptions(options.interaction);this.selectionHandler.setOptions(options.interaction);if(options.groups!==undefined){this.body.emitter.emit(\"refreshNodes\")}if(\"configure\"in options){if(!this.configurator){this.configurator=new Configurator(this,this.body.container,configureOptions,this.canvas.pixelRatio)}this.configurator.setOptions(options.configure)}if(this.configurator&&this.configurator.options.enabled===true){var networkOptions={nodes:{},edges:{},layout:{},interaction:{},manipulation:{},physics:{},global:{}};util.deepExtend(networkOptions.nodes,this.nodesHandler.options);util.deepExtend(networkOptions.edges,this.edgesHandler.options);util.deepExtend(networkOptions.layout,this.layoutEngine.options);util.deepExtend(networkOptions.interaction,this.selectionHandler.options);util.deepExtend(networkOptions.interaction,this.renderer.options);util.deepExtend(networkOptions.interaction,this.interactionHandler.options);util.deepExtend(networkOptions.manipulation,this.manipulation.options);util.deepExtend(networkOptions.physics,this.physics.options);util.deepExtend(networkOptions.global,this.canvas.options);util.deepExtend(networkOptions.global,this.options);this.configurator.setModuleOptions(networkOptions)}if(options.clickToUse!==undefined){if(options.clickToUse===true){if(this.activator===undefined){this.activator=new Activator(this.canvas.frame);this.activator.on(\"change\",function(){_this2.body.emitter.emit(\"activate\")})}}else{if(this.activator!==undefined){this.activator.destroy();delete this.activator}this.body.emitter.emit(\"activate\")}}else{this.body.emitter.emit(\"activate\")}this.canvas.setSize();this.body.emitter.emit(\"startSimulation\")}};Network.prototype._updateVisibleIndices=function(){var nodes=this.body.nodes;var edges=this.body.edges;this.body.nodeIndices=[];this.body.edgeIndices=[];for(var nodeId in nodes){if(nodes.hasOwnProperty(nodeId)){if(!this.clustering._isClusteredNode(nodeId)&&nodes[nodeId].options.hidden===false){this.body.nodeIndices.push(nodes[nodeId].id)}}}for(var edgeId in edges){if(edges.hasOwnProperty(edgeId)){var edge=edges[edgeId];var fromNode=nodes[edge.fromId];var toNode=nodes[edge.toId];var edgeNodesPresent=fromNode!==undefined&&toNode!==undefined;var isVisible=!this.clustering._isClusteredEdge(edgeId)&&edge.options.hidden===false&&edgeNodesPresent&&fromNode.options.hidden===false&&toNode.options.hidden===false;if(isVisible){this.body.edgeIndices.push(edge.id)}}}};Network.prototype.bindEventListeners=function(){var _this3=this;this.body.emitter.on(\"_dataChanged\",function(){_this3.edgesHandler._updateState();_this3.body.emitter.emit(\"_dataUpdated\")});this.body.emitter.on(\"_dataUpdated\",function(){_this3.clustering._updateState();_this3._updateVisibleIndices();_this3._updateValueRange(_this3.body.nodes);_this3._updateValueRange(_this3.body.edges);_this3.body.emitter.emit(\"startSimulation\");_this3.body.emitter.emit(\"_requestRedraw\")})};Network.prototype.setData=function(data){this.body.emitter.emit(\"resetPhysics\");this.body.emitter.emit(\"_resetData\");this.selectionHandler.unselectAll();if(data&&data.dot&&(data.nodes||data.edges)){throw new SyntaxError('Data must contain either parameter \"dot\" or '+' parameter pair \"nodes\" and \"edges\", but not both.')}this.setOptions(data&&data.options);if(data&&data.dot){console.log(\"The dot property has been deprecated. Please use the static convertDot method to convert DOT into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertDot(dotString);\");var dotData=dotparser.DOTToGraph(data.dot);this.setData(dotData);return}else if(data&&data.gephi){console.log(\"The gephi property has been deprecated. Please use the static convertGephi method to convert gephi into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertGephi(gephiJson);\");var gephiData=gephiParser.parseGephi(data.gephi);this.setData(gephiData);return}else{this.nodesHandler.setData(data&&data.nodes,true);this.edgesHandler.setData(data&&data.edges,true)}this.body.emitter.emit(\"_dataChanged\");this.body.emitter.emit(\"_dataLoaded\");this.body.emitter.emit(\"initPhysics\")};Network.prototype.destroy=function(){this.body.emitter.emit(\"destroy\");this.body.emitter.off();this.off();delete this.groups;delete this.canvas;delete this.selectionHandler;delete this.interactionHandler;delete this.view;delete this.renderer;delete this.physics;delete this.layoutEngine;delete this.clustering;delete this.manipulation;delete this.nodesHandler;delete this.edgesHandler;delete this.configurator;delete this.images;for(var nodeId in this.body.nodes){if(!this.body.nodes.hasOwnProperty(nodeId))continue;delete this.body.nodes[nodeId]}for(var edgeId in this.body.edges){if(!this.body.edges.hasOwnProperty(edgeId))continue;delete this.body.edges[edgeId]}util.recursiveDOMDelete(this.body.container)};Network.prototype._updateValueRange=function(obj){var id;var valueMin=undefined;var valueMax=undefined;var valueTotal=0;for(id in obj){if(obj.hasOwnProperty(id)){var value=obj[id].getValue();if(value!==undefined){valueMin=valueMin===undefined?value:Math.min(value,valueMin);valueMax=valueMax===undefined?value:Math.max(value,valueMax);valueTotal+=value}}}if(valueMin!==undefined&&valueMax!==undefined){for(id in obj){if(obj.hasOwnProperty(id)){obj[id].setValueRange(valueMin,valueMax,valueTotal)}}}};Network.prototype.isActive=function(){return!this.activator||this.activator.active};Network.prototype.setSize=function(){return this.canvas.setSize.apply(this.canvas,arguments)};Network.prototype.canvasToDOM=function(){return this.canvas.canvasToDOM.apply(this.canvas,arguments)};Network.prototype.DOMtoCanvas=function(){return this.canvas.DOMtoCanvas.apply(this.canvas,arguments)};Network.prototype.findNode=function(){return this.clustering.findNode.apply(this.clustering,arguments)};Network.prototype.isCluster=function(){return this.clustering.isCluster.apply(this.clustering,arguments)};Network.prototype.openCluster=function(){return this.clustering.openCluster.apply(this.clustering,arguments)};Network.prototype.cluster=function(){return this.clustering.cluster.apply(this.clustering,arguments)};Network.prototype.getNodesInCluster=function(){return this.clustering.getNodesInCluster.apply(this.clustering,arguments)};Network.prototype.clusterByConnection=function(){return this.clustering.clusterByConnection.apply(this.clustering,arguments)};Network.prototype.clusterByHubsize=function(){return this.clustering.clusterByHubsize.apply(this.clustering,arguments)};Network.prototype.clusterOutliers=function(){return this.clustering.clusterOutliers.apply(this.clustering,arguments)};Network.prototype.getSeed=function(){return this.layoutEngine.getSeed.apply(this.layoutEngine,arguments)};Network.prototype.enableEditMode=function(){return this.manipulation.enableEditMode.apply(this.manipulation,arguments)};Network.prototype.disableEditMode=function(){return this.manipulation.disableEditMode.apply(this.manipulation,arguments)};Network.prototype.addNodeMode=function(){return this.manipulation.addNodeMode.apply(this.manipulation,arguments)};Network.prototype.editNode=function(){return this.manipulation.editNode.apply(this.manipulation,arguments)};Network.prototype.editNodeMode=function(){console.log(\"Deprecated: Please use editNode instead of editNodeMode.\");return this.manipulation.editNode.apply(this.manipulation,arguments)};Network.prototype.addEdgeMode=function(){return this.manipulation.addEdgeMode.apply(this.manipulation,arguments)};Network.prototype.editEdgeMode=function(){return this.manipulation.editEdgeMode.apply(this.manipulation,arguments)};Network.prototype.deleteSelected=function(){return this.manipulation.deleteSelected.apply(this.manipulation,arguments)};Network.prototype.getPositions=function(){return this.nodesHandler.getPositions.apply(this.nodesHandler,arguments)};Network.prototype.storePositions=function(){return this.nodesHandler.storePositions.apply(this.nodesHandler,arguments)};Network.prototype.moveNode=function(){return this.nodesHandler.moveNode.apply(this.nodesHandler,arguments)};Network.prototype.getBoundingBox=function(){return this.nodesHandler.getBoundingBox.apply(this.nodesHandler,arguments)};Network.prototype.getConnectedNodes=function(objectId){if(this.body.nodes[objectId]!==undefined){return this.nodesHandler.getConnectedNodes.apply(this.nodesHandler,arguments)}else{return this.edgesHandler.getConnectedNodes.apply(this.edgesHandler,arguments)}};Network.prototype.getConnectedEdges=function(){return this.nodesHandler.getConnectedEdges.apply(this.nodesHandler,arguments)};Network.prototype.startSimulation=function(){return this.physics.startSimulation.apply(this.physics,arguments)};Network.prototype.stopSimulation=function(){return this.physics.stopSimulation.apply(this.physics,arguments)};Network.prototype.stabilize=function(){return this.physics.stabilize.apply(this.physics,arguments)};Network.prototype.getSelection=function(){return this.selectionHandler.getSelection.apply(this.selectionHandler,arguments)};Network.prototype.setSelection=function(){return this.selectionHandler.setSelection.apply(this.selectionHandler,arguments)};Network.prototype.getSelectedNodes=function(){return this.selectionHandler.getSelectedNodes.apply(this.selectionHandler,arguments)};Network.prototype.getSelectedEdges=function(){return this.selectionHandler.getSelectedEdges.apply(this.selectionHandler,arguments)};Network.prototype.getNodeAt=function(){var node=this.selectionHandler.getNodeAt.apply(this.selectionHandler,arguments);if(node!==undefined&&node.id!==undefined){return node.id}return node};Network.prototype.getEdgeAt=function(){var edge=this.selectionHandler.getEdgeAt.apply(this.selectionHandler,arguments);if(edge!==undefined&&edge.id!==undefined){return edge.id}return edge};Network.prototype.selectNodes=function(){return this.selectionHandler.selectNodes.apply(this.selectionHandler,arguments)};Network.prototype.selectEdges=function(){return this.selectionHandler.selectEdges.apply(this.selectionHandler,arguments)};Network.prototype.unselectAll=function(){this.selectionHandler.unselectAll.apply(this.selectionHandler,arguments);this.redraw()};Network.prototype.redraw=function(){return this.renderer.redraw.apply(this.renderer,arguments)};Network.prototype.getScale=function(){return this.view.getScale.apply(this.view,arguments)};Network.prototype.getViewPosition=function(){return this.view.getViewPosition.apply(this.view,arguments)};Network.prototype.fit=function(){return this.view.fit.apply(this.view,arguments)};Network.prototype.moveTo=function(){return this.view.moveTo.apply(this.view,arguments)};Network.prototype.focus=function(){return this.view.focus.apply(this.view,arguments)};Network.prototype.releaseNode=function(){return this.view.releaseNode.apply(this.view,arguments)};Network.prototype.getOptionsFromConfigurator=function(){var options={};if(this.configurator){options=this.configurator.getOptions.apply(this.configurator)}return options};module.exports=Network},function(module,exports,__webpack_require__){\"use strict\";if(typeof CanvasRenderingContext2D!==\"undefined\"){CanvasRenderingContext2D.prototype.circle=function(x,y,r){this.beginPath();this.arc(x,y,r,0,2*Math.PI,false);this.closePath()};CanvasRenderingContext2D.prototype.square=function(x,y,r){this.beginPath();this.rect(x-r,y-r,r*2,r*2);this.closePath()};CanvasRenderingContext2D.prototype.triangle=function(x,y,r){this.beginPath();r*=1.15;y+=.275*r;var s=r*2;var s2=s/2;var ir=Math.sqrt(3)/6*s;var h=Math.sqrt(s*s-s2*s2);this.moveTo(x,y-(h-ir));this.lineTo(x+s2,y+ir);this.lineTo(x-s2,y+ir);this.lineTo(x,y-(h-ir));this.closePath()};CanvasRenderingContext2D.prototype.triangleDown=function(x,y,r){this.beginPath();r*=1.15;y-=.275*r;var s=r*2;var s2=s/2;var ir=Math.sqrt(3)/6*s;var h=Math.sqrt(s*s-s2*s2);this.moveTo(x,y+(h-ir));this.lineTo(x+s2,y-ir);this.lineTo(x-s2,y-ir);this.lineTo(x,y+(h-ir));this.closePath()};CanvasRenderingContext2D.prototype.star=function(x,y,r){this.beginPath();r*=.82;y+=.1*r;for(var n=0;n<10;n++){var radius=n%2===0?r*1.3:r*.5;this.lineTo(x+radius*Math.sin(n*2*Math.PI/10),y-radius*Math.cos(n*2*Math.PI/10))}this.closePath()};CanvasRenderingContext2D.prototype.diamond=function(x,y,r){this.beginPath();this.lineTo(x,y+r);this.lineTo(x+r,y);this.lineTo(x,y-r);this.lineTo(x-r,y);this.closePath()};CanvasRenderingContext2D.prototype.roundRect=function(x,y,w,h,r){var r2d=Math.PI/180;if(w-2*r<0){r=w/2}if(h-2*r<0){r=h/2}this.beginPath();this.moveTo(x+r,y);this.lineTo(x+w-r,y);this.arc(x+w-r,y+r,r,r2d*270,r2d*360,false);this.lineTo(x+w,y+h-r);this.arc(x+w-r,y+h-r,r,0,r2d*90,false);this.lineTo(x+r,y+h);this.arc(x+r,y+h-r,r,r2d*90,r2d*180,false);this.lineTo(x,y+r);this.arc(x+r,y+r,r,r2d*180,r2d*270,false);this.closePath()};CanvasRenderingContext2D.prototype.ellipse_vis=function(x,y,w,h){var kappa=.5522848,ox=w/2*kappa,oy=h/2*kappa,xe=x+w,ye=y+h,xm=x+w/2,ym=y+h/2;this.beginPath();this.moveTo(x,ym);this.bezierCurveTo(x,ym-oy,xm-ox,y,xm,y);this.bezierCurveTo(xm+ox,y,xe,ym-oy,xe,ym);this.bezierCurveTo(xe,ym+oy,xm+ox,ye,xm,ye);this.bezierCurveTo(xm-ox,ye,x,ym+oy,x,ym);this.closePath()};CanvasRenderingContext2D.prototype.database=function(x,y,w,h){var f=1/3;var wEllipse=w;var hEllipse=h*f;var kappa=.5522848,ox=wEllipse/2*kappa,oy=hEllipse/2*kappa,xe=x+wEllipse,ye=y+hEllipse,xm=x+wEllipse/2,ym=y+hEllipse/2,ymb=y+(h-hEllipse/2),yeb=y+h;this.beginPath();this.moveTo(xe,ym);this.bezierCurveTo(xe,ym+oy,xm+ox,ye,xm,ye);this.bezierCurveTo(xm-ox,ye,x,ym+oy,x,ym);this.bezierCurveTo(x,ym-oy,xm-ox,y,xm,y);this.bezierCurveTo(xm+ox,y,xe,ym-oy,xe,ym);this.lineTo(xe,ymb);this.bezierCurveTo(xe,ymb+oy,xm+ox,yeb,xm,yeb);this.bezierCurveTo(xm-ox,yeb,x,ymb+oy,x,ymb);this.lineTo(x,ym)};CanvasRenderingContext2D.prototype.dashedLine=function(x,y,x2,y2,pattern){this.beginPath();this.moveTo(x,y);var patternLength=pattern.length;var dx=x2-x;var dy=y2-y;var slope=dy/dx;var distRemaining=Math.sqrt(dx*dx+dy*dy);var patternIndex=0;var draw=true;var xStep=0;var dashLength=pattern[0];while(distRemaining>=.1){dashLength=pattern[patternIndex++%patternLength];if(dashLength>distRemaining){dashLength=distRemaining}xStep=Math.sqrt(dashLength*dashLength/(1+slope*slope));xStep=dx<0?-xStep:xStep;x+=xStep;y+=slope*xStep;if(draw===true){this.lineTo(x,y)}else{this.moveTo(x,y)}distRemaining-=dashLength;draw=!draw}};CanvasRenderingContext2D.prototype.hexagon=function(x,y,r){this.beginPath();var sides=6;var a=Math.PI*2/sides;this.moveTo(x+r,y);for(var i=1;i<sides;i++){this.lineTo(x+r*Math.cos(a*i),y+r*Math.sin(a*i))}this.closePath()}}},function(module,exports,__webpack_require__){\"use strict\";exports[\"en\"]={edit:\"Edit\",del:\"Delete selected\",back:\"Back\",addNode:\"Add Node\",addEdge:\"Add Edge\",editNode:\"Edit Node\",editEdge:\"Edit Edge\",addDescription:\"Click in an empty space to place a new node.\",edgeDescription:\"Click on a node and drag the edge to another node to connect them.\",editEdgeDescription:\"Click on the control points and drag them to a node to connect to it.\",createEdgeError:\"Cannot link edges to a cluster.\",deleteClusterError:\"Clusters cannot be deleted.\",editClusterError:\"Clusters cannot be edited.\"};exports[\"en_EN\"]=exports[\"en\"];exports[\"en_US\"]=exports[\"en\"];exports[\"de\"]={edit:\"Editieren\",del:\"Lösche Auswahl\",back:\"Zurück\",addNode:\"Knoten hinzufügen\",addEdge:\"Kante hinzufügen\",editNode:\"Knoten editieren\",editEdge:\"Kante editieren\",addDescription:\"Klicke auf eine freie Stelle, um einen neuen Knoten zu plazieren.\",edgeDescription:\"Klicke auf einen Knoten und ziehe die Kante zu einem anderen Knoten, um diese zu verbinden.\",editEdgeDescription:\"Klicke auf die Verbindungspunkte und ziehe diese auf einen Knoten, um sie zu verbinden.\",createEdgeError:\"Es ist nicht möglich, Kanten mit Clustern zu verbinden.\",deleteClusterError:\"Cluster können nicht gelöscht werden.\",editClusterError:\"Cluster können nicht editiert werden.\"};exports[\"de_DE\"]=exports[\"de\"];exports[\"es\"]={edit:\"Editar\",del:\"Eliminar selección\",back:\"Átras\",addNode:\"Añadir nodo\",addEdge:\"Añadir arista\",editNode:\"Editar nodo\",editEdge:\"Editar arista\",addDescription:\"Haga clic en un lugar vacío para colocar un nuevo nodo.\",edgeDescription:\"Haga clic en un nodo y arrastre la arista hacia otro nodo para conectarlos.\",editEdgeDescription:\"Haga clic en un punto de control y arrastrelo a un nodo para conectarlo.\",createEdgeError:\"No se puede conectar una arista a un grupo.\",deleteClusterError:\"No es posible eliminar grupos.\",editClusterError:\"No es posible editar grupos.\"};exports[\"es_ES\"]=exports[\"es\"];exports[\"it\"]={edit:\"Modifica\",del:\"Cancella la selezione\",back:\"Indietro\",addNode:\"Aggiungi un nodo\",addEdge:\"Aggiungi un vertice\",editNode:\"Modifica il nodo\",editEdge:\"Modifica il vertice\",addDescription:\"Clicca per aggiungere un nuovo nodo\",edgeDescription:\"Clicca su un nodo e trascinalo ad un altro nodo per connetterli.\",editEdgeDescription:\"Clicca sui Punti di controllo e trascinali ad un nodo per connetterli.\",createEdgeError:\"Non si possono collegare vertici ad un cluster\",deleteClusterError:\"I cluster non possono essere cancellati\",editClusterError:\"I clusters non possono essere modificati.\"};exports[\"it_IT\"]=exports[\"it\"];exports[\"nl\"]={edit:\"Wijzigen\",del:\"Selectie verwijderen\",\nback:\"Terug\",addNode:\"Node toevoegen\",addEdge:\"Link toevoegen\",editNode:\"Node wijzigen\",editEdge:\"Link wijzigen\",addDescription:\"Klik op een leeg gebied om een nieuwe node te maken.\",edgeDescription:\"Klik op een node en sleep de link naar een andere node om ze te verbinden.\",editEdgeDescription:\"Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.\",createEdgeError:\"Kan geen link maken naar een cluster.\",deleteClusterError:\"Clusters kunnen niet worden verwijderd.\",editClusterError:\"Clusters kunnen niet worden aangepast.\"};exports[\"nl_NL\"]=exports[\"nl\"];exports[\"nl_BE\"]=exports[\"nl\"];exports[\"pt-br\"]={edit:\"Editar\",del:\"Remover selecionado\",back:\"Voltar\",addNode:\"Adicionar nó\",addEdge:\"Adicionar aresta\",editNode:\"Editar nó\",editEdge:\"Editar aresta\",addDescription:\"Clique em um espaço em branco para adicionar um novo nó\",edgeDescription:\"Clique em um nó e arraste a aresta até outro nó para conectá-los\",editEdgeDescription:\"Clique nos pontos de controle e os arraste para um nó para conectá-los\",createEdgeError:\"Não foi possível linkar arestas a um cluster.\",deleteClusterError:\"Clusters não puderam ser removidos.\",editClusterError:\"Clusters não puderam ser editados.\"};exports[\"pt-BR\"]=exports[\"pt-br\"];exports[\"pt_BR\"]=exports[\"pt-br\"];exports[\"pt_br\"]=exports[\"pt-br\"];exports[\"ru\"]={edit:\"Редактировать\",del:\"Удалить выбранное\",back:\"Назад\",addNode:\"Добавить узел\",addEdge:\"Добавить ребро\",editNode:\"Редактировать узел\",editEdge:\"Редактировать ребро\",addDescription:\"Кликните в свободное место, чтобы добавить новый узел.\",edgeDescription:\"Кликните на узел и протяните ребро к другому узлу, чтобы соединить их.\",editEdgeDescription:\"Кликните на контрольные точки и перетащите их в узел, чтобы подключиться к нему.\",createEdgeError:\"Невозможно соединить ребра в кластер.\",deleteClusterError:\"Кластеры не могут быть удалены\",editClusterError:\"Кластеры недоступны для редактирования.\"};exports[\"ru_RU\"]=exports[\"ru\"];exports[\"cn\"]={edit:\"编辑\",del:\"删除选定\",back:\"返回\",addNode:\"添加节点\",addEdge:\"添加连接线\",editNode:\"编辑节点\",editEdge:\"编辑连接线\",addDescription:\"单击空白处放置新节点。\",edgeDescription:\"单击某个节点并将该连接线拖动到另一个节点以连接它们。\",editEdgeDescription:\"单击控制节点并将它们拖到节点上连接。\",createEdgeError:\"无法将连接线连接到群集。\",deleteClusterError:\"无法删除群集。\",editClusterError:\"无法编辑群集。\"};exports[\"zh_CN\"]=exports[\"cn\"]},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var CachedImage=function(){function CachedImage(){(0,_classCallCheck3[\"default\"])(this,CachedImage);this.NUM_ITERATIONS=4;this.image=new Image;this.canvas=document.createElement(\"canvas\")}(0,_createClass3[\"default\"])(CachedImage,[{key:\"init\",value:function init(){if(this.initialized())return;this.src=this.image.src;var w=this.image.width;var h=this.image.height;this.width=w;this.height=h;var h2=Math.floor(h/2);var h4=Math.floor(h/4);var h8=Math.floor(h/8);var h16=Math.floor(h/16);var w2=Math.floor(w/2);var w4=Math.floor(w/4);var w8=Math.floor(w/8);var w16=Math.floor(w/16);this.canvas.width=3*w4;this.canvas.height=h2;this.coordinates=[[0,0,w2,h2],[w2,0,w4,h4],[w2,h4,w8,h8],[5*w8,h4,w16,h16]];this._fillMipMap()}},{key:\"initialized\",value:function initialized(){return this.coordinates!==undefined}},{key:\"_fillMipMap\",value:function _fillMipMap(){var ctx=this.canvas.getContext(\"2d\");var to=this.coordinates[0];ctx.drawImage(this.image,to[0],to[1],to[2],to[3]);for(var iterations=1;iterations<this.NUM_ITERATIONS;iterations++){var from=this.coordinates[iterations-1];var _to=this.coordinates[iterations];ctx.drawImage(this.canvas,from[0],from[1],from[2],from[3],_to[0],_to[1],_to[2],_to[3])}}},{key:\"drawImageAtPosition\",value:function drawImageAtPosition(ctx,factor,left,top,width,height){if(!this.initialized())return;if(factor>2){factor*=.5;var iterations=0;while(factor>2&&iterations<this.NUM_ITERATIONS){factor*=.5;iterations+=1}if(iterations>=this.NUM_ITERATIONS){iterations=this.NUM_ITERATIONS-1}var from=this.coordinates[iterations];ctx.drawImage(this.canvas,from[0],from[1],from[2],from[3],left,top,width,height)}else{ctx.drawImage(this.image,left,top,width,height)}}}]);return CachedImage}();exports[\"default\"]=CachedImage},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var Groups=function(){function Groups(){(0,_classCallCheck3[\"default\"])(this,Groups);this.clear();this.defaultIndex=0;this.groupsArray=[];this.groupIndex=0;this.defaultGroups=[{border:\"#2B7CE9\",background:\"#97C2FC\",highlight:{border:\"#2B7CE9\",background:\"#D2E5FF\"},hover:{border:\"#2B7CE9\",background:\"#D2E5FF\"}},{border:\"#FFA500\",background:\"#FFFF00\",highlight:{border:\"#FFA500\",background:\"#FFFFA3\"},hover:{border:\"#FFA500\",background:\"#FFFFA3\"}},{border:\"#FA0A10\",background:\"#FB7E81\",highlight:{border:\"#FA0A10\",background:\"#FFAFB1\"},hover:{border:\"#FA0A10\",background:\"#FFAFB1\"}},{border:\"#41A906\",background:\"#7BE141\",highlight:{border:\"#41A906\",background:\"#A1EC76\"},hover:{border:\"#41A906\",background:\"#A1EC76\"}},{border:\"#E129F0\",background:\"#EB7DF4\",highlight:{border:\"#E129F0\",background:\"#F0B3F5\"},hover:{border:\"#E129F0\",background:\"#F0B3F5\"}},{border:\"#7C29F0\",background:\"#AD85E4\",highlight:{border:\"#7C29F0\",background:\"#D3BDF0\"},hover:{border:\"#7C29F0\",background:\"#D3BDF0\"}},{border:\"#C37F00\",background:\"#FFA807\",highlight:{border:\"#C37F00\",background:\"#FFCA66\"},hover:{border:\"#C37F00\",background:\"#FFCA66\"}},{border:\"#4220FB\",background:\"#6E6EFD\",highlight:{border:\"#4220FB\",background:\"#9B9BFD\"},hover:{border:\"#4220FB\",background:\"#9B9BFD\"}},{border:\"#FD5A77\",background:\"#FFC0CB\",highlight:{border:\"#FD5A77\",background:\"#FFD1D9\"},hover:{border:\"#FD5A77\",background:\"#FFD1D9\"}},{border:\"#4AD63A\",background:\"#C2FABC\",highlight:{border:\"#4AD63A\",background:\"#E6FFE3\"},hover:{border:\"#4AD63A\",background:\"#E6FFE3\"}},{border:\"#990000\",background:\"#EE0000\",highlight:{border:\"#BB0000\",background:\"#FF3333\"},hover:{border:\"#BB0000\",background:\"#FF3333\"}},{border:\"#FF6000\",background:\"#FF6000\",highlight:{border:\"#FF6000\",background:\"#FF6000\"},hover:{border:\"#FF6000\",background:\"#FF6000\"}},{border:\"#97C2FC\",background:\"#2B7CE9\",highlight:{border:\"#D2E5FF\",background:\"#2B7CE9\"},hover:{border:\"#D2E5FF\",background:\"#2B7CE9\"}},{border:\"#399605\",background:\"#255C03\",highlight:{border:\"#399605\",background:\"#255C03\"},hover:{border:\"#399605\",background:\"#255C03\"}},{border:\"#B70054\",background:\"#FF007E\",highlight:{border:\"#B70054\",background:\"#FF007E\"},hover:{border:\"#B70054\",background:\"#FF007E\"}},{border:\"#AD85E4\",background:\"#7C29F0\",highlight:{border:\"#D3BDF0\",background:\"#7C29F0\"},hover:{border:\"#D3BDF0\",background:\"#7C29F0\"}},{border:\"#4557FA\",background:\"#000EA1\",highlight:{border:\"#6E6EFD\",background:\"#000EA1\"},hover:{border:\"#6E6EFD\",background:\"#000EA1\"}},{border:\"#FFC0CB\",background:\"#FD5A77\",highlight:{border:\"#FFD1D9\",background:\"#FD5A77\"},hover:{border:\"#FFD1D9\",background:\"#FD5A77\"}},{border:\"#C2FABC\",background:\"#74D66A\",highlight:{border:\"#E6FFE3\",background:\"#74D66A\"},hover:{border:\"#E6FFE3\",background:\"#74D66A\"}},{border:\"#EE0000\",background:\"#990000\",highlight:{border:\"#FF3333\",background:\"#BB0000\"},hover:{border:\"#FF3333\",background:\"#BB0000\"}}];this.options={};this.defaultOptions={useDefaultGroups:true};util.extend(this.options,this.defaultOptions)}(0,_createClass3[\"default\"])(Groups,[{key:\"setOptions\",value:function setOptions(options){var optionFields=[\"useDefaultGroups\"];if(options!==undefined){for(var groupName in options){if(options.hasOwnProperty(groupName)){if(optionFields.indexOf(groupName)===-1){var group=options[groupName];this.add(groupName,group)}}}}}},{key:\"clear\",value:function clear(){this.groups={};this.groupsArray=[]}},{key:\"get\",value:function get(groupname){var shouldCreate=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;var group=this.groups[groupname];if(group===undefined&&shouldCreate){if(this.options.useDefaultGroups===false&&this.groupsArray.length>0){var index=this.groupIndex%this.groupsArray.length;this.groupIndex++;group={};group.color=this.groups[this.groupsArray[index]];this.groups[groupname]=group}else{var _index=this.defaultIndex%this.defaultGroups.length;this.defaultIndex++;group={};group.color=this.defaultGroups[_index];this.groups[groupname]=group}}return group}},{key:\"add\",value:function add(groupName,style){this.groups[groupName]=style;this.groupsArray.push(groupName);return style}}]);return Groups}();exports[\"default\"]=Groups},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var DataSet=__webpack_require__(11);var DataView=__webpack_require__(12);var Node=__webpack_require__(47)[\"default\"];var NodesHandler=function(){function NodesHandler(body,images,groups,layoutEngine){var _this=this;(0,_classCallCheck3[\"default\"])(this,NodesHandler);this.body=body;this.images=images;this.groups=groups;this.layoutEngine=layoutEngine;this.body.functions.createNode=this.create.bind(this);this.nodesListeners={add:function add(event,params){_this.add(params.items)},update:function update(event,params){_this.update(params.items,params.data,params.oldData)},remove:function remove(event,params){_this.remove(params.items)}};this.defaultOptions={borderWidth:1,borderWidthSelected:2,brokenImage:undefined,color:{border:\"#2B7CE9\",background:\"#97C2FC\",highlight:{border:\"#2B7CE9\",background:\"#D2E5FF\"},hover:{border:\"#2B7CE9\",background:\"#D2E5FF\"}},fixed:{x:false,y:false},font:{color:\"#343434\",size:14,face:\"arial\",background:\"none\",strokeWidth:0,strokeColor:\"#ffffff\",align:\"center\",vadjust:0,multi:false,bold:{mod:\"bold\"},boldital:{mod:\"bold italic\"},ital:{mod:\"italic\"},mono:{mod:\"\",size:15,face:\"monospace\",vadjust:2}},group:undefined,hidden:false,icon:{face:\"FontAwesome\",code:undefined,size:50,color:\"#2B7CE9\"},image:undefined,label:undefined,labelHighlightBold:true,level:undefined,margin:{top:5,right:5,bottom:5,left:5},mass:1,physics:true,scaling:{min:10,max:30,label:{enabled:false,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function customScalingFunction(min,max,total,value){if(max===min){return.5}else{var scale=1/(max-min);return Math.max(0,(value-min)*scale)}}},shadow:{enabled:false,color:\"rgba(0,0,0,0.5)\",size:10,x:5,y:5},shape:\"ellipse\",shapeProperties:{borderDashes:false,borderRadius:6,interpolation:true,useImageSize:false,useBorderWithImage:false},size:25,title:undefined,value:undefined,x:undefined,y:undefined};if(this.defaultOptions.mass<=0){throw\"Internal error: mass in defaultOptions of NodesHandler may not be zero or negative\"}this.options=util.bridgeObject(this.defaultOptions);this.bindEventListeners()}(0,_createClass3[\"default\"])(NodesHandler,[{key:\"bindEventListeners\",value:function bindEventListeners(){var _this2=this;this.body.emitter.on(\"refreshNodes\",this.refresh.bind(this));this.body.emitter.on(\"refresh\",this.refresh.bind(this));this.body.emitter.on(\"destroy\",function(){util.forEach(_this2.nodesListeners,function(callback,event){if(_this2.body.data.nodes)_this2.body.data.nodes.off(event,callback)});delete _this2.body.functions.createNode;delete _this2.nodesListeners.add;delete _this2.nodesListeners.update;delete _this2.nodesListeners.remove;delete _this2.nodesListeners})}},{key:\"setOptions\",value:function setOptions(options){if(options!==undefined){Node.parseOptions(this.options,options);if(options.shape!==undefined){for(var nodeId in this.body.nodes){if(this.body.nodes.hasOwnProperty(nodeId)){this.body.nodes[nodeId].updateShape()}}}if(options.font!==undefined){for(var _nodeId in this.body.nodes){if(this.body.nodes.hasOwnProperty(_nodeId)){this.body.nodes[_nodeId].updateLabelModule();this.body.nodes[_nodeId].needsRefresh()}}}if(options.size!==undefined){for(var _nodeId2 in this.body.nodes){if(this.body.nodes.hasOwnProperty(_nodeId2)){this.body.nodes[_nodeId2].needsRefresh()}}}if(options.hidden!==undefined||options.physics!==undefined){this.body.emitter.emit(\"_dataChanged\")}}}},{key:\"setData\",value:function setData(nodes){var doNotEmit=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var oldNodesData=this.body.data.nodes;if(nodes instanceof DataSet||nodes instanceof DataView){this.body.data.nodes=nodes}else if(Array.isArray(nodes)){this.body.data.nodes=new DataSet;this.body.data.nodes.add(nodes)}else if(!nodes){this.body.data.nodes=new DataSet}else{throw new TypeError(\"Array or DataSet expected\")}if(oldNodesData){util.forEach(this.nodesListeners,function(callback,event){oldNodesData.off(event,callback)})}this.body.nodes={};if(this.body.data.nodes){var me=this;util.forEach(this.nodesListeners,function(callback,event){me.body.data.nodes.on(event,callback)});var ids=this.body.data.nodes.getIds();this.add(ids,true)}if(doNotEmit===false){this.body.emitter.emit(\"_dataChanged\")}}},{key:\"add\",value:function add(ids){var doNotEmit=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var id=void 0;var newNodes=[];for(var i=0;i<ids.length;i++){id=ids[i];var properties=this.body.data.nodes.get(id);var node=this.create(properties);newNodes.push(node);this.body.nodes[id]=node}this.layoutEngine.positionInitially(newNodes);if(doNotEmit===false){this.body.emitter.emit(\"_dataChanged\")}}},{key:\"update\",value:function update(ids,changedData,oldData){var nodes=this.body.nodes;var dataChanged=false;for(var i=0;i<ids.length;i++){var id=ids[i];var node=nodes[id];var data=changedData[i];if(node!==undefined){if(node.setOptions(data)){dataChanged=true}}else{dataChanged=true;node=this.create(data);nodes[id]=node}}if(!dataChanged&&oldData!==undefined){dataChanged=changedData.some(function(newValue,index){var oldValue=oldData[index];return oldValue&&oldValue.level!==newValue.level})}if(dataChanged===true){this.body.emitter.emit(\"_dataChanged\")}else{this.body.emitter.emit(\"_dataUpdated\")}}},{key:\"remove\",value:function remove(ids){var nodes=this.body.nodes;for(var i=0;i<ids.length;i++){var id=ids[i];delete nodes[id]}this.body.emitter.emit(\"_dataChanged\")}},{key:\"create\",value:function create(properties){var constructorClass=arguments.length>1&&arguments[1]!==undefined?arguments[1]:Node;return new constructorClass(properties,this.body,this.images,this.groups,this.options,this.defaultOptions)}},{key:\"refresh\",value:function refresh(){var _this3=this;var clearPositions=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;util.forEach(this.body.nodes,function(node,nodeId){var data=_this3.body.data.nodes.get(nodeId);if(data!==undefined){if(clearPositions===true){node.setOptions({x:null,y:null})}node.setOptions({fixed:false});node.setOptions(data)}})}},{key:\"getPositions\",value:function getPositions(ids){var dataArray={};if(ids!==undefined){if(Array.isArray(ids)===true){for(var i=0;i<ids.length;i++){if(this.body.nodes[ids[i]]!==undefined){var node=this.body.nodes[ids[i]];dataArray[ids[i]]={x:Math.round(node.x),y:Math.round(node.y)}}}}else{if(this.body.nodes[ids]!==undefined){var _node=this.body.nodes[ids];dataArray[ids]={x:Math.round(_node.x),y:Math.round(_node.y)}}}}else{for(var _i=0;_i<this.body.nodeIndices.length;_i++){var _node2=this.body.nodes[this.body.nodeIndices[_i]];dataArray[this.body.nodeIndices[_i]]={x:Math.round(_node2.x),y:Math.round(_node2.y)}}}return dataArray}},{key:\"storePositions\",value:function storePositions(){var dataArray=[];var dataset=this.body.data.nodes.getDataSet();for(var nodeId in dataset._data){if(dataset._data.hasOwnProperty(nodeId)){var node=this.body.nodes[nodeId];if(dataset._data[nodeId].x!=Math.round(node.x)||dataset._data[nodeId].y!=Math.round(node.y)){dataArray.push({id:node.id,x:Math.round(node.x),y:Math.round(node.y)})}}}dataset.update(dataArray)}},{key:\"getBoundingBox\",value:function getBoundingBox(nodeId){if(this.body.nodes[nodeId]!==undefined){return this.body.nodes[nodeId].shape.boundingBox}}},{key:\"getConnectedNodes\",value:function getConnectedNodes(nodeId,direction){var nodeList=[];if(this.body.nodes[nodeId]!==undefined){var node=this.body.nodes[nodeId];var nodeObj={};for(var i=0;i<node.edges.length;i++){var edge=node.edges[i];if(direction!==\"to\"&&edge.toId==node.id){if(nodeObj[edge.fromId]===undefined){nodeList.push(edge.fromId);nodeObj[edge.fromId]=true}}else if(direction!==\"from\"&&edge.fromId==node.id){if(nodeObj[edge.toId]===undefined){nodeList.push(edge.toId);nodeObj[edge.toId]=true}}}}return nodeList}},{key:\"getConnectedEdges\",value:function getConnectedEdges(nodeId){var edgeList=[];if(this.body.nodes[nodeId]!==undefined){var node=this.body.nodes[nodeId];for(var i=0;i<node.edges.length;i++){edgeList.push(node.edges[i].id)}}else{console.log(\"NodeId provided for getConnectedEdges does not exist. Provided: \",nodeId)}return edgeList}},{key:\"moveNode\",value:function moveNode(nodeId,x,y){var _this4=this;if(this.body.nodes[nodeId]!==undefined){this.body.nodes[nodeId].x=Number(x);this.body.nodes[nodeId].y=Number(y);setTimeout(function(){_this4.body.emitter.emit(\"startSimulation\")},0)}else{console.log(\"Node id supplied to moveNode does not exist. Provided: \",nodeId)}}}]);return NodesHandler}();exports[\"default\"]=NodesHandler},function(module,exports,__webpack_require__){module.exports={default:__webpack_require__(189),__esModule:true}},function(module,exports,__webpack_require__){__webpack_require__(49);__webpack_require__(60);module.exports=__webpack_require__(190)},function(module,exports,__webpack_require__){var classof=__webpack_require__(86);var ITERATOR=__webpack_require__(13)(\"iterator\");var Iterators=__webpack_require__(31);module.exports=__webpack_require__(7).isIterable=function(it){var O=Object(it);return O[ITERATOR]!==undefined||\"@@iterator\"in O||Iterators.hasOwnProperty(classof(O))}},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var LabelAccumulator=__webpack_require__(192)[\"default\"];var ComponentUtil=__webpack_require__(48)[\"default\"];var LabelSplitter=function(){function LabelSplitter(ctx,parent,selected,hover){var _this=this;(0,_classCallCheck3[\"default\"])(this,LabelSplitter);this.ctx=ctx;this.parent=parent;var textWidth=function textWidth(text,mod){if(text===undefined)return 0;var values=_this.parent.getFormattingValues(ctx,selected,hover,mod);var width=0;if(text!==\"\"){var measure=_this.ctx.measureText(text);width=measure.width}return{width:width,values:values}};this.lines=new LabelAccumulator(textWidth)}(0,_createClass3[\"default\"])(LabelSplitter,[{key:\"process\",value:function process(text){if(!ComponentUtil.isValidLabel(text)){return this.lines.finalize()}var font=this.parent.fontOptions;text=text.replace(/\\r\\n/g,\"\\n\");text=text.replace(/\\r/g,\"\\n\");var nlLines=String(text).split(\"\\n\");var lineCount=nlLines.length;if(font.multi){for(var i=0;i<lineCount;i++){var blocks=this.splitBlocks(nlLines[i],font.multi);if(blocks===undefined)continue;if(blocks.length===0){this.lines.newLine(\"\");continue}if(font.maxWdt>0){for(var j=0;j<blocks.length;j++){var mod=blocks[j].mod;var _text=blocks[j].text;this.splitStringIntoLines(_text,mod,true)}}else{for(var _j=0;_j<blocks.length;_j++){var _mod=blocks[_j].mod;var _text2=blocks[_j].text;this.lines.append(_text2,_mod)}}this.lines.newLine()}}else{if(font.maxWdt>0){for(var _i=0;_i<lineCount;_i++){this.splitStringIntoLines(nlLines[_i])}}else{for(var _i2=0;_i2<lineCount;_i2++){this.lines.newLine(nlLines[_i2])}}}return this.lines.finalize()}},{key:\"decodeMarkupSystem\",value:function decodeMarkupSystem(markupSystem){var system=\"none\";if(markupSystem===\"markdown\"||markupSystem===\"md\"){system=\"markdown\"}else if(markupSystem===true||markupSystem===\"html\"){system=\"html\"}return system}},{key:\"splitHtmlBlocks\",value:function splitHtmlBlocks(text){var blocks=[];var s={bold:false,ital:false,mono:false,spacing:false,position:0,buffer:\"\",modStack:[]};s.mod=function(){return this.modStack.length===0?\"normal\":this.modStack[0]};s.modName=function(){if(this.modStack.length===0)return\"normal\";else if(this.modStack[0]===\"mono\")return\"mono\";else{if(s.bold&&s.ital){return\"boldital\"}else if(s.bold){return\"bold\"}else if(s.ital){return\"ital\"}}};s.emitBlock=function(){var override=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;if(this.spacing){this.add(\" \");this.spacing=false}if(this.buffer.length>0){blocks.push({text:this.buffer,mod:this.modName()});this.buffer=\"\"}};s.add=function(text){if(text===\" \"){s.spacing=true}if(s.spacing){this.buffer+=\" \";this.spacing=false}if(text!=\" \"){this.buffer+=text}};while(s.position<text.length){var ch=text.charAt(s.position);if(/[ \\t]/.test(ch)){if(!s.mono){s.spacing=true}else{s.add(ch)}}else if(/</.test(ch)){if(!s.mono&&!s.bold&&/<b>/.test(text.substr(s.position,3))){s.emitBlock();s.bold=true;s.modStack.unshift(\"bold\");s.position+=2}else if(!s.mono&&!s.ital&&/<i>/.test(text.substr(s.position,3))){s.emitBlock();s.ital=true;s.modStack.unshift(\"ital\");s.position+=2}else if(!s.mono&&/<code>/.test(text.substr(s.position,6))){s.emitBlock();s.mono=true;s.modStack.unshift(\"mono\");s.position+=5}else if(!s.mono&&s.mod()===\"bold\"&&/<\\/b>/.test(text.substr(s.position,4))){s.emitBlock();s.bold=false;s.modStack.shift();s.position+=3}else if(!s.mono&&s.mod()===\"ital\"&&/<\\/i>/.test(text.substr(s.position,4))){s.emitBlock();s.ital=false;s.modStack.shift();s.position+=3}else if(s.mod()===\"mono\"&&/<\\/code>/.test(text.substr(s.position,7))){s.emitBlock();s.mono=false;s.modStack.shift();s.position+=6}else{s.add(ch)}}else if(/&/.test(ch)){if(/</.test(text.substr(s.position,4))){s.add(\"<\");s.position+=3}else if(/&/.test(text.substr(s.position,5))){s.add(\"&\");s.position+=4}else{s.add(\"&\")}}else{s.add(ch)}s.position++}s.emitBlock();return blocks}},{key:\"splitMarkdownBlocks\",value:function splitMarkdownBlocks(text){var blocks=[];var s={bold:false,ital:false,mono:false,beginable:true,spacing:false,position:0,buffer:\"\",modStack:[]};s.mod=function(){return this.modStack.length===0?\"normal\":this.modStack[0]};s.modName=function(){if(this.modStack.length===0)return\"normal\";else if(this.modStack[0]===\"mono\")return\"mono\";else{if(s.bold&&s.ital){return\"boldital\"}else if(s.bold){return\"bold\"}else if(s.ital){return\"ital\"}}};s.emitBlock=function(){var override=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;if(this.spacing){this.add(\" \");this.spacing=false}if(this.buffer.length>0){blocks.push({text:this.buffer,mod:this.modName()});this.buffer=\"\"}};s.add=function(text){if(text===\" \"){s.spacing=true}if(s.spacing){this.buffer+=\" \";this.spacing=false}if(text!=\" \"){this.buffer+=text}};while(s.position<text.length){var ch=text.charAt(s.position);if(/[ \\t]/.test(ch)){if(!s.mono){s.spacing=true}else{s.add(ch)}s.beginable=true}else if(/\\\\/.test(ch)){if(s.position<text.length+1){s.position++;ch=text.charAt(s.position);if(/ \\t/.test(ch)){s.spacing=true}else{s.add(ch);s.beginable=false}}}else if(!s.mono&&!s.bold&&(s.beginable||s.spacing)&&/\\*/.test(ch)){s.emitBlock();s.bold=true;s.modStack.unshift(\"bold\")}else if(!s.mono&&!s.ital&&(s.beginable||s.spacing)&&/\\_/.test(ch)){s.emitBlock();s.ital=true;s.modStack.unshift(\"ital\")}else if(!s.mono&&(s.beginable||s.spacing)&&/`/.test(ch)){s.emitBlock();s.mono=true;s.modStack.unshift(\"mono\")}else if(!s.mono&&s.mod()===\"bold\"&&/\\*/.test(ch)){if(s.position===text.length-1||/[.,_` \\t\\n]/.test(text.charAt(s.position+1))){s.emitBlock();s.bold=false;s.modStack.shift()}else{s.add(ch)}}else if(!s.mono&&s.mod()===\"ital\"&&/\\_/.test(ch)){if(s.position===text.length-1||/[.,*` \\t\\n]/.test(text.charAt(s.position+1))){s.emitBlock();s.ital=false;s.modStack.shift()}else{s.add(ch)}}else if(s.mono&&s.mod()===\"mono\"&&/`/.test(ch)){if(s.position===text.length-1||/[.,*_ \\t\\n]/.test(text.charAt(s.position+1))){s.emitBlock();s.mono=false;s.modStack.shift()}else{s.add(ch)}}else{s.add(ch);s.beginable=false}s.position++}s.emitBlock();return blocks}},{key:\"splitBlocks\",value:function splitBlocks(text,markupSystem){var system=this.decodeMarkupSystem(markupSystem);if(system===\"none\"){return[{text:text,mod:\"normal\"}]}else if(system===\"markdown\"){return this.splitMarkdownBlocks(text)}else if(system===\"html\"){return this.splitHtmlBlocks(text)}}},{key:\"overMaxWidth\",value:function overMaxWidth(text){var width=this.ctx.measureText(text).width;return this.lines.curWidth()+width>this.parent.fontOptions.maxWdt}},{key:\"getLongestFit\",value:function getLongestFit(words){var text=\"\";var w=0;while(w<words.length){var pre=text===\"\"?\"\":\" \";var newText=text+pre+words[w];if(this.overMaxWidth(newText))break;text=newText;w++}return w}},{key:\"getLongestFitWord\",value:function getLongestFitWord(words){var w=0;while(w<words.length){if(this.overMaxWidth(words.slice(0,w)))break;w++}return w}},{key:\"splitStringIntoLines\",value:function splitStringIntoLines(str){var mod=arguments.length>1&&arguments[1]!==undefined?arguments[1]:\"normal\";var appendLast=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;str=str.replace(/^( +)/g,\"$1\\r\");str=str.replace(/([^\\r][^ ]*)( +)/g,\"$1\\r$2\\r\");var words=str.split(\"\\r\");while(words.length>0){var w=this.getLongestFit(words);if(w===0){var word=words[0];var x=this.getLongestFitWord(word);this.lines.newLine(word.slice(0,x),mod);words[0]=word.slice(x)}else{var newW=w;if(words[w-1]===\" \"){w--}else if(words[newW]===\" \"){newW++}var text=words.slice(0,w).join(\"\");if(w==words.length&&appendLast){this.lines.append(text,mod)}else{this.lines.newLine(text,mod)}words=words.slice(newW)}}}}]);return LabelSplitter}();exports[\"default\"]=LabelSplitter},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _assign=__webpack_require__(90);var _assign2=_interopRequireDefault(_assign);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var LabelAccumulator=function(){function LabelAccumulator(measureText){(0,_classCallCheck3[\"default\"])(this,LabelAccumulator);this.measureText=measureText;this.current=0;this.width=0;this.height=0;this.lines=[]}(0,_createClass3[\"default\"])(LabelAccumulator,[{key:\"_add\",value:function _add(l,text){var mod=arguments.length>2&&arguments[2]!==undefined?arguments[2]:\"normal\";if(this.lines[l]===undefined){this.lines[l]={width:0,height:0,blocks:[]}}var tmpText=text;if(text===undefined||text===\"\")tmpText=\" \";var result=this.measureText(tmpText,mod);var block=(0,_assign2[\"default\"])({},result.values);block.text=text;block.width=result.width;block.mod=mod;if(text===undefined||text===\"\"){block.width=0}this.lines[l].blocks.push(block);this.lines[l].width+=block.width}},{key:\"curWidth\",value:function curWidth(){var line=this.lines[this.current];if(line===undefined)return 0;return line.width}},{key:\"append\",value:function append(text){var mod=arguments.length>1&&arguments[1]!==undefined?arguments[1]:\"normal\";this._add(this.current,text,mod)}},{key:\"newLine\",value:function newLine(text){var mod=arguments.length>1&&arguments[1]!==undefined?arguments[1]:\"normal\";this._add(this.current,text,mod);this.current++}},{key:\"determineLineHeights\",value:function determineLineHeights(){for(var k=0;k<this.lines.length;k++){var line=this.lines[k];var height=0;if(line.blocks!==undefined){for(var l=0;l<line.blocks.length;l++){var block=line.blocks[l];if(height<block.height){height=block.height}}}line.height=height}}},{key:\"determineLabelSize\",value:function determineLabelSize(){var width=0;var height=0;for(var k=0;k<this.lines.length;k++){var line=this.lines[k];if(line.width>width){width=line.width}height+=line.height}this.width=width;this.height=height}},{key:\"removeEmptyBlocks\",value:function removeEmptyBlocks(){var tmpLines=[];for(var k=0;k<this.lines.length;k++){var line=this.lines[k];if(line.blocks.length===0)continue;if(k===this.lines.length-1){if(line.width===0)continue}var tmpLine={};(0,_assign2[\"default\"])(tmpLine,line);tmpLine.blocks=[];var firstEmptyBlock=void 0;var tmpBlocks=[];for(var l=0;l<line.blocks.length;l++){var block=line.blocks[l];if(block.width!==0){tmpBlocks.push(block)}else{if(firstEmptyBlock===undefined){firstEmptyBlock=block}}}if(tmpBlocks.length===0&&firstEmptyBlock!==undefined){tmpBlocks.push(firstEmptyBlock)}tmpLine.blocks=tmpBlocks;tmpLines.push(tmpLine)}return tmpLines}},{key:\"finalize\",value:function finalize(){this.determineLineHeights();this.determineLabelSize();var tmpLines=this.removeEmptyBlocks();return{width:this.width,height:this.height,lines:tmpLines}}}]);return LabelAccumulator}();exports[\"default\"]=LabelAccumulator},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _NodeBase2=__webpack_require__(23);var _NodeBase3=_interopRequireDefault(_NodeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Box=function(_NodeBase){(0,_inherits3[\"default\"])(Box,_NodeBase);function Box(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,Box);var _this=(0,_possibleConstructorReturn3[\"default\"])(this,(Box.__proto__||(0,_getPrototypeOf2[\"default\"])(Box)).call(this,options,body,labelModule));_this._setMargins(labelModule);return _this}(0,_createClass3[\"default\"])(Box,[{key:\"resize\",value:function resize(ctx){var selected=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this.selected;var hover=arguments.length>2&&arguments[2]!==undefined?arguments[2]:this.hover;if(this.needsRefresh(selected,hover)){var dimensions=this.getDimensionsFromLabel(ctx,selected,hover);this.width=dimensions.width+this.margin.right+this.margin.left;this.height=dimensions.height+this.margin.top+this.margin.bottom;this.radius=this.width/2}}},{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this.resize(ctx,selected,hover);this.left=x-this.width/2;this.top=y-this.height/2;this.initContextForDraw(ctx,values);ctx.roundRect(this.left,this.top,this.width,this.height,values.borderRadius);this.performFill(ctx,values);this.updateBoundingBox(x,y,ctx,selected,hover);this.labelModule.draw(ctx,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,selected,hover)}},{key:\"updateBoundingBox\",value:function updateBoundingBox(x,y,ctx,selected,hover){this._updateBoundingBox(x,y,ctx,selected,hover)\n;var borderRadius=this.options.shapeProperties.borderRadius;this._addBoundingBoxMargin(borderRadius)}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){this.resize(ctx);var borderWidth=this.options.borderWidth;return Math.min(Math.abs(this.width/2/Math.cos(angle)),Math.abs(this.height/2/Math.sin(angle)))+borderWidth}}]);return Box}(_NodeBase3[\"default\"]);exports[\"default\"]=Box},function(module,exports,__webpack_require__){__webpack_require__(195);module.exports=__webpack_require__(7).Object.getPrototypeOf},function(module,exports,__webpack_require__){var toObject=__webpack_require__(41);var $getPrototypeOf=__webpack_require__(85);__webpack_require__(87)(\"getPrototypeOf\",function(){return function getPrototypeOf(it){return $getPrototypeOf(toObject(it))}})},function(module,exports,__webpack_require__){module.exports={default:__webpack_require__(197),__esModule:true}},function(module,exports,__webpack_require__){__webpack_require__(198);module.exports=__webpack_require__(7).Object.setPrototypeOf},function(module,exports,__webpack_require__){var $export=__webpack_require__(17);$export($export.S,\"Object\",{setPrototypeOf:__webpack_require__(199).set})},function(module,exports,__webpack_require__){var isObject=__webpack_require__(32);var anObject=__webpack_require__(27);var check=function(O,proto){anObject(O);if(!isObject(proto)&&proto!==null)throw TypeError(proto+\": can't set as prototype!\")};module.exports={set:Object.setPrototypeOf||(\"__proto__\"in{}?function(test,buggy,set){try{set=__webpack_require__(80)(Function.call,__webpack_require__(89).f(Object.prototype,\"__proto__\").set,2);set(test,[]);buggy=!(test instanceof Array)}catch(e){buggy=true}return function setPrototypeOf(O,proto){check(O,proto);if(buggy)O.__proto__=proto;else set(O,proto);return O}}({},false):undefined),check:check}},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _CircleImageBase2=__webpack_require__(73);var _CircleImageBase3=_interopRequireDefault(_CircleImageBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Circle=function(_CircleImageBase){(0,_inherits3[\"default\"])(Circle,_CircleImageBase);function Circle(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,Circle);var _this=(0,_possibleConstructorReturn3[\"default\"])(this,(Circle.__proto__||(0,_getPrototypeOf2[\"default\"])(Circle)).call(this,options,body,labelModule));_this._setMargins(labelModule);return _this}(0,_createClass3[\"default\"])(Circle,[{key:\"resize\",value:function resize(ctx){var selected=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this.selected;var hover=arguments.length>2&&arguments[2]!==undefined?arguments[2]:this.hover;if(this.needsRefresh(selected,hover)){var dimensions=this.getDimensionsFromLabel(ctx,selected,hover);var diameter=Math.max(dimensions.width+this.margin.right+this.margin.left,dimensions.height+this.margin.top+this.margin.bottom);this.options.size=diameter/2;this.width=diameter;this.height=diameter;this.radius=this.width/2}}},{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this.resize(ctx,selected,hover);this.left=x-this.width/2;this.top=y-this.height/2;this._drawRawCircle(ctx,x,y,values);this.updateBoundingBox(x,y);this.labelModule.draw(ctx,this.left+this.textSize.width/2+this.margin.left,y,selected,hover)}},{key:\"updateBoundingBox\",value:function updateBoundingBox(x,y){this.boundingBox.top=y-this.options.size;this.boundingBox.left=x-this.options.size;this.boundingBox.right=x+this.options.size;this.boundingBox.bottom=y+this.options.size}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){this.resize(ctx);return this.width*.5}}]);return Circle}(_CircleImageBase3[\"default\"]);exports[\"default\"]=Circle},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _CircleImageBase2=__webpack_require__(73);var _CircleImageBase3=_interopRequireDefault(_CircleImageBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var CircularImage=function(_CircleImageBase){(0,_inherits3[\"default\"])(CircularImage,_CircleImageBase);function CircularImage(options,body,labelModule,imageObj,imageObjAlt){(0,_classCallCheck3[\"default\"])(this,CircularImage);var _this=(0,_possibleConstructorReturn3[\"default\"])(this,(CircularImage.__proto__||(0,_getPrototypeOf2[\"default\"])(CircularImage)).call(this,options,body,labelModule));_this.setImages(imageObj,imageObjAlt);return _this}(0,_createClass3[\"default\"])(CircularImage,[{key:\"resize\",value:function resize(ctx){var selected=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this.selected;var hover=arguments.length>2&&arguments[2]!==undefined?arguments[2]:this.hover;var imageAbsent=this.imageObj.src===undefined||this.imageObj.width===undefined||this.imageObj.height===undefined;if(imageAbsent){var diameter=this.options.size*2;this.width=diameter;this.height=diameter;this.radius=.5*this.width;return}if(this.needsRefresh(selected,hover)){this._resizeImage()}}},{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this.switchImages(selected);this.resize();this.left=x-this.width/2;this.top=y-this.height/2;this._drawRawCircle(ctx,x,y,values);ctx.save();ctx.clip();this._drawImageAtPosition(ctx,values);ctx.restore();this._drawImageLabel(ctx,x,y,selected,hover);this.updateBoundingBox(x,y)}},{key:\"updateBoundingBox\",value:function updateBoundingBox(x,y){this.boundingBox.top=y-this.options.size;this.boundingBox.left=x-this.options.size;this.boundingBox.right=x+this.options.size;this.boundingBox.bottom=y+this.options.size;this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left);this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width);this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset)}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){this.resize(ctx);return this.width*.5}}]);return CircularImage}(_CircleImageBase3[\"default\"]);exports[\"default\"]=CircularImage},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _NodeBase2=__webpack_require__(23);var _NodeBase3=_interopRequireDefault(_NodeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Database=function(_NodeBase){(0,_inherits3[\"default\"])(Database,_NodeBase);function Database(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,Database);var _this=(0,_possibleConstructorReturn3[\"default\"])(this,(Database.__proto__||(0,_getPrototypeOf2[\"default\"])(Database)).call(this,options,body,labelModule));_this._setMargins(labelModule);return _this}(0,_createClass3[\"default\"])(Database,[{key:\"resize\",value:function resize(ctx,selected,hover){if(this.needsRefresh(selected,hover)){var dimensions=this.getDimensionsFromLabel(ctx,selected,hover);var size=dimensions.width+this.margin.right+this.margin.left;this.width=size;this.height=size;this.radius=this.width/2}}},{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this.resize(ctx,selected,hover);this.left=x-this.width/2;this.top=y-this.height/2;this.initContextForDraw(ctx,values);ctx.database(x-this.width/2,y-this.height/2,this.width,this.height);this.performFill(ctx,values);this.updateBoundingBox(x,y,ctx,selected,hover);this.labelModule.draw(ctx,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,selected,hover)}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){return this._distanceToBorder(ctx,angle)}}]);return Database}(_NodeBase3[\"default\"]);exports[\"default\"]=Database},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _ShapeBase2=__webpack_require__(24);var _ShapeBase3=_interopRequireDefault(_ShapeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Diamond=function(_ShapeBase){(0,_inherits3[\"default\"])(Diamond,_ShapeBase);function Diamond(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,Diamond);return(0,_possibleConstructorReturn3[\"default\"])(this,(Diamond.__proto__||(0,_getPrototypeOf2[\"default\"])(Diamond)).call(this,options,body,labelModule))}(0,_createClass3[\"default\"])(Diamond,[{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this._drawShape(ctx,\"diamond\",4,x,y,selected,hover,values)}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){return this._distanceToBorder(ctx,angle)}}]);return Diamond}(_ShapeBase3[\"default\"]);exports[\"default\"]=Diamond},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _ShapeBase2=__webpack_require__(24);var _ShapeBase3=_interopRequireDefault(_ShapeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Dot=function(_ShapeBase){(0,_inherits3[\"default\"])(Dot,_ShapeBase);function Dot(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,Dot);return(0,_possibleConstructorReturn3[\"default\"])(this,(Dot.__proto__||(0,_getPrototypeOf2[\"default\"])(Dot)).call(this,options,body,labelModule))}(0,_createClass3[\"default\"])(Dot,[{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this._drawShape(ctx,\"circle\",2,x,y,selected,hover,values)}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){this.resize(ctx);return this.options.size}}]);return Dot}(_ShapeBase3[\"default\"]);exports[\"default\"]=Dot},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _NodeBase2=__webpack_require__(23);var _NodeBase3=_interopRequireDefault(_NodeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Ellipse=function(_NodeBase){(0,_inherits3[\"default\"])(Ellipse,_NodeBase);function Ellipse(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,Ellipse);return(0,_possibleConstructorReturn3[\"default\"])(this,(Ellipse.__proto__||(0,_getPrototypeOf2[\"default\"])(Ellipse)).call(this,options,body,labelModule))}(0,_createClass3[\"default\"])(Ellipse,[{key:\"resize\",value:function resize(ctx){var selected=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this.selected;var hover=arguments.length>2&&arguments[2]!==undefined?arguments[2]:this.hover;if(this.needsRefresh(selected,hover)){var dimensions=this.getDimensionsFromLabel(ctx,selected,hover);this.height=dimensions.height*2;this.width=dimensions.width+dimensions.height;this.radius=.5*this.width}}},{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this.resize(ctx,selected,hover);this.left=x-this.width*.5;this.top=y-this.height*.5;this.initContextForDraw(ctx,values);ctx.ellipse_vis(this.left,this.top,this.width,this.height);this.performFill(ctx,values);this.updateBoundingBox(x,y,ctx,selected,hover);this.labelModule.draw(ctx,x,y,selected,hover)}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){this.resize(ctx);var a=this.width*.5;var b=this.height*.5;var w=Math.sin(angle)*a;var h=Math.cos(angle)*b;return a*b/Math.sqrt(w*w+h*h)}}]);return Ellipse}(_NodeBase3[\"default\"]);exports[\"default\"]=Ellipse},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _NodeBase2=__webpack_require__(23);var _NodeBase3=_interopRequireDefault(_NodeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Icon=function(_NodeBase){(0,_inherits3[\"default\"])(Icon,_NodeBase);function Icon(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,Icon);var _this=(0,_possibleConstructorReturn3[\"default\"])(this,(Icon.__proto__||(0,_getPrototypeOf2[\"default\"])(Icon)).call(this,options,body,labelModule));_this._setMargins(labelModule);return _this}(0,_createClass3[\"default\"])(Icon,[{key:\"resize\",value:function resize(ctx,selected,hover){if(this.needsRefresh(selected,hover)){this.iconSize={width:Number(this.options.icon.size),height:Number(this.options.icon.size)};this.width=this.iconSize.width+this.margin.right+this.margin.left;this.height=this.iconSize.height+this.margin.top+this.margin.bottom;this.radius=.5*this.width}}},{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this.resize(ctx,selected,hover);this.options.icon.size=this.options.icon.size||50;this.left=x-this.width/2;this.top=y-this.height/2;this._icon(ctx,x,y,selected,hover,values);if(this.options.label!==undefined){var iconTextSpacing=5;this.labelModule.draw(ctx,this.left+this.iconSize.width/2+this.margin.left,y+this.height/2+iconTextSpacing,selected)}this.updateBoundingBox(x,y)}},{key:\"updateBoundingBox\",value:function updateBoundingBox(x,y){this.boundingBox.top=y-this.options.icon.size*.5;this.boundingBox.left=x-this.options.icon.size*.5;this.boundingBox.right=x+this.options.icon.size*.5;this.boundingBox.bottom=y+this.options.icon.size*.5;if(this.options.label!==undefined&&this.labelModule.size.width>0){var iconTextSpacing=5;this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left);this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width);this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height+iconTextSpacing)}}},{key:\"_icon\",value:function _icon(ctx,x,y,selected,hover,values){var iconSize=Number(this.options.icon.size);if(this.options.icon.code!==undefined){ctx.font=(selected?\"bold \":\"\")+iconSize+\"px \"+this.options.icon.face;ctx.fillStyle=this.options.icon.color||\"black\";ctx.textAlign=\"center\";ctx.textBaseline=\"middle\";this.enableShadow(ctx,values);ctx.fillText(this.options.icon.code,x,y);this.disableShadow(ctx,values)}else{console.error(\"When using the icon shape, you need to define the code in the icon options object. This can be done per node or globally.\")}}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){return this._distanceToBorder(ctx,angle)}}]);return Icon}(_NodeBase3[\"default\"]);exports[\"default\"]=Icon},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _CircleImageBase2=__webpack_require__(73);var _CircleImageBase3=_interopRequireDefault(_CircleImageBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Image=function(_CircleImageBase){(0,_inherits3[\"default\"])(Image,_CircleImageBase);function Image(options,body,labelModule,imageObj,imageObjAlt){(0,_classCallCheck3[\"default\"])(this,Image);var _this=(0,_possibleConstructorReturn3[\"default\"])(this,(Image.__proto__||(0,_getPrototypeOf2[\"default\"])(Image)).call(this,options,body,labelModule));_this.setImages(imageObj,imageObjAlt);return _this}(0,_createClass3[\"default\"])(Image,[{key:\"resize\",value:function resize(ctx){var selected=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this.selected;var hover=arguments.length>2&&arguments[2]!==undefined?arguments[2]:this.hover;var imageAbsent=this.imageObj.src===undefined||this.imageObj.width===undefined||this.imageObj.height===undefined;if(imageAbsent){var side=this.options.size*2;this.width=side;this.height=side;return}if(this.needsRefresh(selected,hover)){this._resizeImage()}}},{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this.switchImages(selected);this.resize();this.left=x-this.width/2;this.top=y-this.height/2;if(this.options.shapeProperties.useBorderWithImage===true){var neutralborderWidth=this.options.borderWidth;var selectionLineWidth=this.options.borderWidthSelected||2*this.options.borderWidth;var borderWidth=(selected?selectionLineWidth:neutralborderWidth)/this.body.view.scale;ctx.lineWidth=Math.min(this.width,borderWidth);ctx.beginPath();ctx.strokeStyle=selected?this.options.color.highlight.border:hover?this.options.color.hover.border:this.options.color.border;ctx.fillStyle=selected?this.options.color.highlight.background:hover?this.options.color.hover.background:this.options.color.background;ctx.rect(this.left-.5*ctx.lineWidth,this.top-.5*ctx.lineWidth,this.width+ctx.lineWidth,this.height+ctx.lineWidth);ctx.fill();this.performStroke(ctx,values);ctx.closePath()}this._drawImageAtPosition(ctx,values);this._drawImageLabel(ctx,x,y,selected,hover);this.updateBoundingBox(x,y)}},{key:\"updateBoundingBox\",value:function updateBoundingBox(x,y){this.resize();this._updateBoundingBox(x,y);if(this.options.label!==undefined&&this.labelModule.size.width>0){this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left);this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width);this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset)}}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){return this._distanceToBorder(ctx,angle)}}]);return Image}(_CircleImageBase3[\"default\"]);exports[\"default\"]=Image},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _ShapeBase2=__webpack_require__(24);var _ShapeBase3=_interopRequireDefault(_ShapeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Square=function(_ShapeBase){(0,_inherits3[\"default\"])(Square,_ShapeBase);function Square(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,Square);return(0,_possibleConstructorReturn3[\"default\"])(this,(Square.__proto__||(0,_getPrototypeOf2[\"default\"])(Square)).call(this,options,body,labelModule))}(0,_createClass3[\"default\"])(Square,[{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this._drawShape(ctx,\"square\",2,x,y,selected,hover,values)}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){return this._distanceToBorder(ctx,angle)}}]);return Square}(_ShapeBase3[\"default\"]);exports[\"default\"]=Square},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _ShapeBase2=__webpack_require__(24);var _ShapeBase3=_interopRequireDefault(_ShapeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Hexagon=function(_ShapeBase){(0,_inherits3[\"default\"])(Hexagon,_ShapeBase);function Hexagon(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,Hexagon);return(0,_possibleConstructorReturn3[\"default\"])(this,(Hexagon.__proto__||(0,_getPrototypeOf2[\"default\"])(Hexagon)).call(this,options,body,labelModule))}(0,_createClass3[\"default\"])(Hexagon,[{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this._drawShape(ctx,\"hexagon\",4,x,y,selected,hover,values)}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){return this._distanceToBorder(ctx,angle)}}]);return Hexagon}(_ShapeBase3[\"default\"]);exports[\"default\"]=Hexagon},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _ShapeBase2=__webpack_require__(24);var _ShapeBase3=_interopRequireDefault(_ShapeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Star=function(_ShapeBase){(0,_inherits3[\"default\"])(Star,_ShapeBase);function Star(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,Star);return(0,_possibleConstructorReturn3[\"default\"])(this,(Star.__proto__||(0,_getPrototypeOf2[\"default\"])(Star)).call(this,options,body,labelModule))}(0,_createClass3[\"default\"])(Star,[{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this._drawShape(ctx,\"star\",4,x,y,selected,hover,values)}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){return this._distanceToBorder(ctx,angle)}}]);return Star}(_ShapeBase3[\"default\"]);exports[\"default\"]=Star},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _NodeBase2=__webpack_require__(23);var _NodeBase3=_interopRequireDefault(_NodeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Text=function(_NodeBase){(0,_inherits3[\"default\"])(Text,_NodeBase);function Text(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,Text);var _this=(0,_possibleConstructorReturn3[\"default\"])(this,(Text.__proto__||(0,_getPrototypeOf2[\"default\"])(Text)).call(this,options,body,labelModule));_this._setMargins(labelModule);return _this}(0,_createClass3[\"default\"])(Text,[{key:\"resize\",value:function resize(ctx,selected,hover){if(this.needsRefresh(selected,hover)){this.textSize=this.labelModule.getTextSize(ctx,selected,hover);this.width=this.textSize.width+this.margin.right+this.margin.left;this.height=this.textSize.height+this.margin.top+this.margin.bottom;this.radius=.5*this.width}}},{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this.resize(ctx,selected,hover);this.left=x-this.width/2;this.top=y-this.height/2;this.enableShadow(ctx,values);this.labelModule.draw(ctx,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,selected,hover);this.disableShadow(ctx,values);this.updateBoundingBox(x,y,ctx,selected,hover)}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){return this._distanceToBorder(ctx,angle)}}]);return Text}(_NodeBase3[\"default\"]);exports[\"default\"]=Text},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _ShapeBase2=__webpack_require__(24);var _ShapeBase3=_interopRequireDefault(_ShapeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Triangle=function(_ShapeBase){(0,_inherits3[\"default\"])(Triangle,_ShapeBase);function Triangle(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,Triangle);return(0,_possibleConstructorReturn3[\"default\"])(this,(Triangle.__proto__||(0,_getPrototypeOf2[\"default\"])(Triangle)).call(this,options,body,labelModule))}(0,_createClass3[\"default\"])(Triangle,[{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this._drawShape(ctx,\"triangle\",3,x,y,selected,hover,values)}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){return this._distanceToBorder(ctx,angle)}}]);return Triangle}(_ShapeBase3[\"default\"]);exports[\"default\"]=Triangle},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _ShapeBase2=__webpack_require__(24);var _ShapeBase3=_interopRequireDefault(_ShapeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var TriangleDown=function(_ShapeBase){(0,_inherits3[\"default\"])(TriangleDown,_ShapeBase);function TriangleDown(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,TriangleDown);return(0,_possibleConstructorReturn3[\"default\"])(this,(TriangleDown.__proto__||(0,_getPrototypeOf2[\"default\"])(TriangleDown)).call(this,options,body,labelModule))}(0,_createClass3[\"default\"])(TriangleDown,[{key:\"draw\",value:function draw(ctx,x,y,selected,hover,values){this._drawShape(ctx,\"triangleDown\",3,x,y,selected,hover,values)}},{key:\"distanceToBorder\",value:function distanceToBorder(ctx,angle){return this._distanceToBorder(ctx,angle)}}]);return TriangleDown}(_ShapeBase3[\"default\"]);exports[\"default\"]=TriangleDown},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var DataSet=__webpack_require__(11);var DataView=__webpack_require__(12);var Edge=__webpack_require__(74)[\"default\"];var EdgesHandler=function(){function EdgesHandler(body,images,groups){var _this=this;(0,_classCallCheck3[\"default\"])(this,EdgesHandler);this.body=body;this.images=images;this.groups=groups;this.body.functions.createEdge=this.create.bind(this);this.edgesListeners={add:function add(event,params){_this.add(params.items)},update:function update(event,params){_this.update(params.items)},remove:function remove(event,params){_this.remove(params.items)}};this.options={};this.defaultOptions={arrows:{to:{enabled:false,\nscaleFactor:1,type:\"arrow\"},middle:{enabled:false,scaleFactor:1,type:\"arrow\"},from:{enabled:false,scaleFactor:1,type:\"arrow\"}},arrowStrikethrough:true,color:{color:\"#848484\",highlight:\"#848484\",hover:\"#848484\",inherit:\"from\",opacity:1},dashes:false,font:{color:\"#343434\",size:14,face:\"arial\",background:\"none\",strokeWidth:2,strokeColor:\"#ffffff\",align:\"horizontal\",multi:false,vadjust:0,bold:{mod:\"bold\"},boldital:{mod:\"bold italic\"},ital:{mod:\"italic\"},mono:{mod:\"\",size:15,face:\"courier new\",vadjust:2}},hidden:false,hoverWidth:1.5,label:undefined,labelHighlightBold:true,length:undefined,physics:true,scaling:{min:1,max:15,label:{enabled:true,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function customScalingFunction(min,max,total,value){if(max===min){return.5}else{var scale=1/(max-min);return Math.max(0,(value-min)*scale)}}},selectionWidth:1.5,selfReferenceSize:20,shadow:{enabled:false,color:\"rgba(0,0,0,0.5)\",size:10,x:5,y:5},smooth:{enabled:true,type:\"dynamic\",forceDirection:\"none\",roundness:.5},title:undefined,width:1,value:undefined};util.deepExtend(this.options,this.defaultOptions);this.bindEventListeners()}(0,_createClass3[\"default\"])(EdgesHandler,[{key:\"bindEventListeners\",value:function bindEventListeners(){var _this2=this;this.body.emitter.on(\"_forceDisableDynamicCurves\",function(type){var emit=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;if(type===\"dynamic\"){type=\"continuous\"}var dataChanged=false;for(var edgeId in _this2.body.edges){if(_this2.body.edges.hasOwnProperty(edgeId)){var edge=_this2.body.edges[edgeId];var edgeData=_this2.body.data.edges._data[edgeId];if(edgeData!==undefined){var smoothOptions=edgeData.smooth;if(smoothOptions!==undefined){if(smoothOptions.enabled===true&&smoothOptions.type===\"dynamic\"){if(type===undefined){edge.setOptions({smooth:false})}else{edge.setOptions({smooth:{type:type}})}dataChanged=true}}}}}if(emit===true&&dataChanged===true){_this2.body.emitter.emit(\"_dataChanged\")}});this.body.emitter.on(\"_dataUpdated\",function(){_this2.reconnectEdges()});this.body.emitter.on(\"refreshEdges\",this.refresh.bind(this));this.body.emitter.on(\"refresh\",this.refresh.bind(this));this.body.emitter.on(\"destroy\",function(){util.forEach(_this2.edgesListeners,function(callback,event){if(_this2.body.data.edges)_this2.body.data.edges.off(event,callback)});delete _this2.body.functions.createEdge;delete _this2.edgesListeners.add;delete _this2.edgesListeners.update;delete _this2.edgesListeners.remove;delete _this2.edgesListeners})}},{key:\"setOptions\",value:function setOptions(options){if(options!==undefined){Edge.parseOptions(this.options,options,true,this.defaultOptions,true);var dataChanged=false;if(options.smooth!==undefined){for(var edgeId in this.body.edges){if(this.body.edges.hasOwnProperty(edgeId)){dataChanged=this.body.edges[edgeId].updateEdgeType()||dataChanged}}}if(options.font!==undefined){for(var _edgeId in this.body.edges){if(this.body.edges.hasOwnProperty(_edgeId)){this.body.edges[_edgeId].updateLabelModule()}}}if(options.hidden!==undefined||options.physics!==undefined||dataChanged===true){this.body.emitter.emit(\"_dataChanged\")}}}},{key:\"setData\",value:function setData(edges){var _this3=this;var doNotEmit=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var oldEdgesData=this.body.data.edges;if(edges instanceof DataSet||edges instanceof DataView){this.body.data.edges=edges}else if(Array.isArray(edges)){this.body.data.edges=new DataSet;this.body.data.edges.add(edges)}else if(!edges){this.body.data.edges=new DataSet}else{throw new TypeError(\"Array or DataSet expected\")}if(oldEdgesData){util.forEach(this.edgesListeners,function(callback,event){oldEdgesData.off(event,callback)})}this.body.edges={};if(this.body.data.edges){util.forEach(this.edgesListeners,function(callback,event){_this3.body.data.edges.on(event,callback)});var ids=this.body.data.edges.getIds();this.add(ids,true)}this.body.emitter.emit(\"_adjustEdgesForHierarchicalLayout\");if(doNotEmit===false){this.body.emitter.emit(\"_dataChanged\")}}},{key:\"add\",value:function add(ids){var doNotEmit=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var edges=this.body.edges;var edgesData=this.body.data.edges;for(var i=0;i<ids.length;i++){var id=ids[i];var oldEdge=edges[id];if(oldEdge){oldEdge.disconnect()}var data=edgesData.get(id,{showInternalIds:true});edges[id]=this.create(data)}this.body.emitter.emit(\"_adjustEdgesForHierarchicalLayout\");if(doNotEmit===false){this.body.emitter.emit(\"_dataChanged\")}}},{key:\"update\",value:function update(ids){var edges=this.body.edges;var edgesData=this.body.data.edges;var dataChanged=false;for(var i=0;i<ids.length;i++){var id=ids[i];var data=edgesData.get(id);var edge=edges[id];if(edge!==undefined){edge.disconnect();dataChanged=edge.setOptions(data)||dataChanged;edge.connect()}else{this.body.edges[id]=this.create(data);dataChanged=true}}if(dataChanged===true){this.body.emitter.emit(\"_adjustEdgesForHierarchicalLayout\");this.body.emitter.emit(\"_dataChanged\")}else{this.body.emitter.emit(\"_dataUpdated\")}}},{key:\"remove\",value:function remove(ids){var emit=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;if(ids.length===0)return;var edges=this.body.edges;util.forEach(ids,function(id){var edge=edges[id];if(edge!==undefined){edge.remove()}});if(emit){this.body.emitter.emit(\"_dataChanged\")}}},{key:\"refresh\",value:function refresh(){var _this4=this;util.forEach(this.body.edges,function(edge,edgeId){var data=_this4.body.data.edges._data[edgeId];if(data!==undefined){edge.setOptions(data)}})}},{key:\"create\",value:function create(properties){return new Edge(properties,this.body,this.options,this.defaultOptions)}},{key:\"reconnectEdges\",value:function reconnectEdges(){var id;var nodes=this.body.nodes;var edges=this.body.edges;for(id in nodes){if(nodes.hasOwnProperty(id)){nodes[id].edges=[]}}for(id in edges){if(edges.hasOwnProperty(id)){var edge=edges[id];edge.from=null;edge.to=null;edge.connect()}}}},{key:\"getConnectedNodes\",value:function getConnectedNodes(edgeId){var nodeList=[];if(this.body.edges[edgeId]!==undefined){var edge=this.body.edges[edgeId];if(edge.fromId!==undefined){nodeList.push(edge.fromId)}if(edge.toId!==undefined){nodeList.push(edge.toId)}}return nodeList}},{key:\"_updateState\",value:function _updateState(){this._addMissingEdges();this._removeInvalidEdges()}},{key:\"_removeInvalidEdges\",value:function _removeInvalidEdges(){var _this5=this;var edgesToDelete=[];util.forEach(this.body.edges,function(edge,id){var toNode=_this5.body.nodes[edge.toId];var fromNode=_this5.body.nodes[edge.fromId];if(toNode!==undefined&&toNode.isCluster===true||fromNode!==undefined&&fromNode.isCluster===true){return}if(toNode===undefined||fromNode===undefined){edgesToDelete.push(id)}});this.remove(edgesToDelete,false)}},{key:\"_addMissingEdges\",value:function _addMissingEdges(){var edges=this.body.edges;var edgesData=this.body.data.edges;var addIds=[];edgesData.forEach(function(edgeData,edgeId){var edge=edges[edgeId];if(edge===undefined){addIds.push(edgeId)}});this.add(addIds,true)}}]);return EdgesHandler}();exports[\"default\"]=EdgesHandler},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _slicedToArray2=__webpack_require__(30);var _slicedToArray3=_interopRequireDefault(_slicedToArray2);var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _CubicBezierEdgeBase2=__webpack_require__(216);var _CubicBezierEdgeBase3=_interopRequireDefault(_CubicBezierEdgeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var CubicBezierEdge=function(_CubicBezierEdgeBase){(0,_inherits3[\"default\"])(CubicBezierEdge,_CubicBezierEdgeBase);function CubicBezierEdge(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,CubicBezierEdge);return(0,_possibleConstructorReturn3[\"default\"])(this,(CubicBezierEdge.__proto__||(0,_getPrototypeOf2[\"default\"])(CubicBezierEdge)).call(this,options,body,labelModule))}(0,_createClass3[\"default\"])(CubicBezierEdge,[{key:\"_line\",value:function _line(ctx,values,viaNodes){var via1=viaNodes[0];var via2=viaNodes[1];this._bezierCurve(ctx,values,via1,via2)}},{key:\"_getViaCoordinates\",value:function _getViaCoordinates(){var dx=this.from.x-this.to.x;var dy=this.from.y-this.to.y;var x1=void 0,y1=void 0,x2=void 0,y2=void 0;var roundness=this.options.smooth.roundness;if((Math.abs(dx)>Math.abs(dy)||this.options.smooth.forceDirection===true||this.options.smooth.forceDirection===\"horizontal\")&&this.options.smooth.forceDirection!==\"vertical\"){y1=this.from.y;y2=this.to.y;x1=this.from.x-roundness*dx;x2=this.to.x+roundness*dx}else{y1=this.from.y-roundness*dy;y2=this.to.y+roundness*dy;x1=this.from.x;x2=this.to.x}return[{x:x1,y:y1},{x:x2,y:y2}]}},{key:\"getViaNode\",value:function getViaNode(){return this._getViaCoordinates()}},{key:\"_findBorderPosition\",value:function _findBorderPosition(nearNode,ctx){return this._findBorderPositionBezier(nearNode,ctx)}},{key:\"_getDistanceToEdge\",value:function _getDistanceToEdge(x1,y1,x2,y2,x3,y3){var _ref=arguments.length>6&&arguments[6]!==undefined?arguments[6]:this._getViaCoordinates(),_ref2=(0,_slicedToArray3[\"default\"])(_ref,2),via1=_ref2[0],via2=_ref2[1];return this._getDistanceToBezierEdge(x1,y1,x2,y2,x3,y3,via1,via2)}},{key:\"getPoint\",value:function getPoint(percentage){var _ref3=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this._getViaCoordinates(),_ref4=(0,_slicedToArray3[\"default\"])(_ref3,2),via1=_ref4[0],via2=_ref4[1];var t=percentage;var vec=[];vec[0]=Math.pow(1-t,3);vec[1]=3*t*Math.pow(1-t,2);vec[2]=3*Math.pow(t,2)*(1-t);vec[3]=Math.pow(t,3);var x=vec[0]*this.fromPoint.x+vec[1]*via1.x+vec[2]*via2.x+vec[3]*this.toPoint.x;var y=vec[0]*this.fromPoint.y+vec[1]*via1.y+vec[2]*via2.y+vec[3]*this.toPoint.y;return{x:x,y:y}}}]);return CubicBezierEdge}(_CubicBezierEdgeBase3[\"default\"]);exports[\"default\"]=CubicBezierEdge},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _BezierEdgeBase2=__webpack_require__(75);var _BezierEdgeBase3=_interopRequireDefault(_BezierEdgeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var CubicBezierEdgeBase=function(_BezierEdgeBase){(0,_inherits3[\"default\"])(CubicBezierEdgeBase,_BezierEdgeBase);function CubicBezierEdgeBase(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,CubicBezierEdgeBase);return(0,_possibleConstructorReturn3[\"default\"])(this,(CubicBezierEdgeBase.__proto__||(0,_getPrototypeOf2[\"default\"])(CubicBezierEdgeBase)).call(this,options,body,labelModule))}(0,_createClass3[\"default\"])(CubicBezierEdgeBase,[{key:\"_getDistanceToBezierEdge\",value:function _getDistanceToBezierEdge(x1,y1,x2,y2,x3,y3,via1,via2){var minDistance=1e9;var distance=void 0;var i=void 0,t=void 0,x=void 0,y=void 0;var lastX=x1;var lastY=y1;var vec=[0,0,0,0];for(i=1;i<10;i++){t=.1*i;vec[0]=Math.pow(1-t,3);vec[1]=3*t*Math.pow(1-t,2);vec[2]=3*Math.pow(t,2)*(1-t);vec[3]=Math.pow(t,3);x=vec[0]*x1+vec[1]*via1.x+vec[2]*via2.x+vec[3]*x2;y=vec[0]*y1+vec[1]*via1.y+vec[2]*via2.y+vec[3]*y2;if(i>0){distance=this._getDistanceToLine(lastX,lastY,x,y,x3,y3);minDistance=distance<minDistance?distance:minDistance}lastX=x;lastY=y}return minDistance}}]);return CubicBezierEdgeBase}(_BezierEdgeBase3[\"default\"]);exports[\"default\"]=CubicBezierEdgeBase},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _slicedToArray2=__webpack_require__(30);var _slicedToArray3=_interopRequireDefault(_slicedToArray2);var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _BezierEdgeBase2=__webpack_require__(75);var _BezierEdgeBase3=_interopRequireDefault(_BezierEdgeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var BezierEdgeDynamic=function(_BezierEdgeBase){(0,_inherits3[\"default\"])(BezierEdgeDynamic,_BezierEdgeBase);function BezierEdgeDynamic(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,BezierEdgeDynamic);var _this=(0,_possibleConstructorReturn3[\"default\"])(this,(BezierEdgeDynamic.__proto__||(0,_getPrototypeOf2[\"default\"])(BezierEdgeDynamic)).call(this,options,body,labelModule));_this._boundFunction=function(){_this.positionBezierNode()};_this.body.emitter.on(\"_repositionBezierNodes\",_this._boundFunction);return _this}(0,_createClass3[\"default\"])(BezierEdgeDynamic,[{key:\"setOptions\",value:function setOptions(options){var physicsChange=false;if(this.options.physics!==options.physics){physicsChange=true}this.options=options;this.id=this.options.id;this.from=this.body.nodes[this.options.from];this.to=this.body.nodes[this.options.to];this.setupSupportNode();this.connect();if(physicsChange===true){this.via.setOptions({physics:this.options.physics});this.positionBezierNode()}}},{key:\"connect\",value:function connect(){this.from=this.body.nodes[this.options.from];this.to=this.body.nodes[this.options.to];if(this.from===undefined||this.to===undefined||this.options.physics===false){this.via.setOptions({physics:false})}else{if(this.from.id===this.to.id){this.via.setOptions({physics:false})}else{this.via.setOptions({physics:true})}}}},{key:\"cleanup\",value:function cleanup(){this.body.emitter.off(\"_repositionBezierNodes\",this._boundFunction);if(this.via!==undefined){delete this.body.nodes[this.via.id];this.via=undefined;return true}return false}},{key:\"setupSupportNode\",value:function setupSupportNode(){if(this.via===undefined){var nodeId=\"edgeId:\"+this.id;var node=this.body.functions.createNode({id:nodeId,shape:\"circle\",physics:true,hidden:true});this.body.nodes[nodeId]=node;this.via=node;this.via.parentEdgeId=this.id;this.positionBezierNode()}}},{key:\"positionBezierNode\",value:function positionBezierNode(){if(this.via!==undefined&&this.from!==undefined&&this.to!==undefined){this.via.x=.5*(this.from.x+this.to.x);this.via.y=.5*(this.from.y+this.to.y)}else if(this.via!==undefined){this.via.x=0;this.via.y=0}}},{key:\"_line\",value:function _line(ctx,values,viaNode){this._bezierCurve(ctx,values,viaNode)}},{key:\"getViaNode\",value:function getViaNode(){return this.via}},{key:\"getPoint\",value:function getPoint(percentage){var viaNode=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this.via;var t=percentage;var x=void 0,y=void 0;if(this.from===this.to){var _getCircleData=this._getCircleData(this.from),_getCircleData2=(0,_slicedToArray3[\"default\"])(_getCircleData,3),cx=_getCircleData2[0],cy=_getCircleData2[1],cr=_getCircleData2[2];var a=2*Math.PI*(1-t);x=cx+cr*Math.sin(a);y=cy+cr-cr*(1-Math.cos(a))}else{x=Math.pow(1-t,2)*this.fromPoint.x+2*t*(1-t)*viaNode.x+Math.pow(t,2)*this.toPoint.x;y=Math.pow(1-t,2)*this.fromPoint.y+2*t*(1-t)*viaNode.y+Math.pow(t,2)*this.toPoint.y}return{x:x,y:y}}},{key:\"_findBorderPosition\",value:function _findBorderPosition(nearNode,ctx){return this._findBorderPositionBezier(nearNode,ctx,this.via)}},{key:\"_getDistanceToEdge\",value:function _getDistanceToEdge(x1,y1,x2,y2,x3,y3){return this._getDistanceToBezierEdge(x1,y1,x2,y2,x3,y3,this.via)}}]);return BezierEdgeDynamic}(_BezierEdgeBase3[\"default\"]);exports[\"default\"]=BezierEdgeDynamic},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _BezierEdgeBase2=__webpack_require__(75);var _BezierEdgeBase3=_interopRequireDefault(_BezierEdgeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var BezierEdgeStatic=function(_BezierEdgeBase){(0,_inherits3[\"default\"])(BezierEdgeStatic,_BezierEdgeBase);function BezierEdgeStatic(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,BezierEdgeStatic);return(0,_possibleConstructorReturn3[\"default\"])(this,(BezierEdgeStatic.__proto__||(0,_getPrototypeOf2[\"default\"])(BezierEdgeStatic)).call(this,options,body,labelModule))}(0,_createClass3[\"default\"])(BezierEdgeStatic,[{key:\"_line\",value:function _line(ctx,values,viaNode){this._bezierCurve(ctx,values,viaNode)}},{key:\"getViaNode\",value:function getViaNode(){return this._getViaCoordinates()}},{key:\"_getViaCoordinates\",value:function _getViaCoordinates(){var xVia=undefined;var yVia=undefined;var factor=this.options.smooth.roundness;var type=this.options.smooth.type;var dx=Math.abs(this.from.x-this.to.x);var dy=Math.abs(this.from.y-this.to.y);if(type===\"discrete\"||type===\"diagonalCross\"){var stepX=void 0;var stepY=void 0;if(dx<=dy){stepX=stepY=factor*dy}else{stepX=stepY=factor*dx}if(this.from.x>this.to.x)stepX=-stepX;if(this.from.y>=this.to.y)stepY=-stepY;xVia=this.from.x+stepX;yVia=this.from.y+stepY;if(type===\"discrete\"){if(dx<=dy){xVia=dx<factor*dy?this.from.x:xVia}else{yVia=dy<factor*dx?this.from.y:yVia}}}else if(type===\"straightCross\"){var _stepX=(1-factor)*dx;var _stepY=(1-factor)*dy;if(dx<=dy){_stepX=0;if(this.from.y<this.to.y)_stepY=-_stepY}else{if(this.from.x<this.to.x)_stepX=-_stepX;_stepY=0}xVia=this.to.x+_stepX;yVia=this.to.y+_stepY}else if(type===\"horizontal\"){var _stepX2=(1-factor)*dx;if(this.from.x<this.to.x)_stepX2=-_stepX2;xVia=this.to.x+_stepX2;yVia=this.from.y}else if(type===\"vertical\"){var _stepY2=(1-factor)*dy;if(this.from.y<this.to.y)_stepY2=-_stepY2;xVia=this.from.x;yVia=this.to.y+_stepY2}else if(type===\"curvedCW\"){dx=this.to.x-this.from.x;dy=this.from.y-this.to.y;var radius=Math.sqrt(dx*dx+dy*dy);var pi=Math.PI;var originalAngle=Math.atan2(dy,dx);var myAngle=(originalAngle+(factor*.5+.5)*pi)%(2*pi);xVia=this.from.x+(factor*.5+.5)*radius*Math.sin(myAngle);yVia=this.from.y+(factor*.5+.5)*radius*Math.cos(myAngle)}else if(type===\"curvedCCW\"){dx=this.to.x-this.from.x;dy=this.from.y-this.to.y;var _radius=Math.sqrt(dx*dx+dy*dy);var _pi=Math.PI;var _originalAngle=Math.atan2(dy,dx);var _myAngle=(_originalAngle+(-factor*.5+.5)*_pi)%(2*_pi);xVia=this.from.x+(factor*.5+.5)*_radius*Math.sin(_myAngle);yVia=this.from.y+(factor*.5+.5)*_radius*Math.cos(_myAngle)}else{var _stepX3=void 0;var _stepY3=void 0;if(dx<=dy){_stepX3=_stepY3=factor*dy}else{_stepX3=_stepY3=factor*dx}if(this.from.x>this.to.x)_stepX3=-_stepX3;if(this.from.y>=this.to.y)_stepY3=-_stepY3;xVia=this.from.x+_stepX3;yVia=this.from.y+_stepY3;if(dx<=dy){if(this.from.x<=this.to.x){xVia=this.to.x<xVia?this.to.x:xVia}else{xVia=this.to.x>xVia?this.to.x:xVia}}else{if(this.from.y>=this.to.y){yVia=this.to.y>yVia?this.to.y:yVia}else{yVia=this.to.y<yVia?this.to.y:yVia}}}return{x:xVia,y:yVia}}},{key:\"_findBorderPosition\",value:function _findBorderPosition(nearNode,ctx){var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};return this._findBorderPositionBezier(nearNode,ctx,options.via)}},{key:\"_getDistanceToEdge\",value:function _getDistanceToEdge(x1,y1,x2,y2,x3,y3){var viaNode=arguments.length>6&&arguments[6]!==undefined?arguments[6]:this._getViaCoordinates();return this._getDistanceToBezierEdge(x1,y1,x2,y2,x3,y3,viaNode)}},{key:\"getPoint\",value:function getPoint(percentage){var viaNode=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this._getViaCoordinates();var t=percentage;var x=Math.pow(1-t,2)*this.fromPoint.x+2*t*(1-t)*viaNode.x+Math.pow(t,2)*this.toPoint.x;var y=Math.pow(1-t,2)*this.fromPoint.y+2*t*(1-t)*viaNode.y+Math.pow(t,2)*this.toPoint.y;return{x:x,y:y}}}]);return BezierEdgeStatic}(_BezierEdgeBase3[\"default\"]);exports[\"default\"]=BezierEdgeStatic},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _EdgeBase2=__webpack_require__(118);var _EdgeBase3=_interopRequireDefault(_EdgeBase2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var StraightEdge=function(_EdgeBase){(0,_inherits3[\"default\"])(StraightEdge,_EdgeBase);function StraightEdge(options,body,labelModule){(0,_classCallCheck3[\"default\"])(this,StraightEdge);return(0,_possibleConstructorReturn3[\"default\"])(this,(StraightEdge.__proto__||(0,_getPrototypeOf2[\"default\"])(StraightEdge)).call(this,options,body,labelModule))}(0,_createClass3[\"default\"])(StraightEdge,[{key:\"_line\",value:function _line(ctx,values){ctx.beginPath();ctx.moveTo(this.fromPoint.x,this.fromPoint.y);ctx.lineTo(this.toPoint.x,this.toPoint.y);this.enableShadow(ctx,values);ctx.stroke();this.disableShadow(ctx,values)}},{key:\"getViaNode\",value:function getViaNode(){return undefined}},{key:\"getPoint\",value:function getPoint(percentage){return{x:(1-percentage)*this.fromPoint.x+percentage*this.toPoint.x,y:(1-percentage)*this.fromPoint.y+percentage*this.toPoint.y}}},{key:\"_findBorderPosition\",value:function _findBorderPosition(nearNode,ctx){var node1=this.to;var node2=this.from;if(nearNode.id===this.from.id){node1=this.from;node2=this.to}var angle=Math.atan2(node1.y-node2.y,node1.x-node2.x);var dx=node1.x-node2.x;var dy=node1.y-node2.y;var edgeSegmentLength=Math.sqrt(dx*dx+dy*dy);var toBorderDist=nearNode.distanceToBorder(ctx,angle);var toBorderPoint=(edgeSegmentLength-toBorderDist)/edgeSegmentLength;var borderPos={};borderPos.x=(1-toBorderPoint)*node2.x+toBorderPoint*node1.x;borderPos.y=(1-toBorderPoint)*node2.y+toBorderPoint*node1.y;return borderPos}},{key:\"_getDistanceToEdge\",value:function _getDistanceToEdge(x1,y1,x2,y2,x3,y3){return this._getDistanceToLine(x1,y1,x2,y2,x3,y3)}}]);return StraightEdge}(_EdgeBase3[\"default\"]);exports[\"default\"]=StraightEdge},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _keys=__webpack_require__(8);var _keys2=_interopRequireDefault(_keys);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var BarnesHutSolver=__webpack_require__(120)[\"default\"];var Repulsion=__webpack_require__(221)[\"default\"];var HierarchicalRepulsion=__webpack_require__(222)[\"default\"];var SpringSolver=__webpack_require__(223)[\"default\"];var HierarchicalSpringSolver=__webpack_require__(224)[\"default\"];var CentralGravitySolver=__webpack_require__(121)[\"default\"];var ForceAtlas2BasedRepulsionSolver=__webpack_require__(225)[\"default\"];var ForceAtlas2BasedCentralGravitySolver=__webpack_require__(226)[\"default\"];var util=__webpack_require__(2);var EndPoints=__webpack_require__(119)[\"default\"];var PhysicsEngine=function(){function PhysicsEngine(body){(0,_classCallCheck3[\"default\"])(this,PhysicsEngine);this.body=body;this.physicsBody={physicsNodeIndices:[],physicsEdgeIndices:[],forces:{},velocities:{}};this.physicsEnabled=true;this.simulationInterval=1e3/60;this.requiresTimeout=true;this.previousStates={};this.referenceState={};this.freezeCache={};this.renderTimer=undefined;this.adaptiveTimestep=false;this.adaptiveTimestepEnabled=false;this.adaptiveCounter=0;this.adaptiveInterval=3;this.stabilized=false;this.startedStabilization=false;this.stabilizationIterations=0;this.ready=false;this.options={};this.defaultOptions={enabled:true,barnesHut:{theta:.5,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09,avoidOverlap:0},forceAtlas2Based:{theta:.5,gravitationalConstant:-50,centralGravity:.01,springConstant:.08,springLength:100,damping:.4,avoidOverlap:0},repulsion:{centralGravity:.2,springLength:200,springConstant:.05,nodeDistance:100,damping:.09,avoidOverlap:0},hierarchicalRepulsion:{centralGravity:0,springLength:100,springConstant:.01,nodeDistance:120,damping:.09},maxVelocity:50,minVelocity:.75,solver:\"barnesHut\",stabilization:{enabled:true,iterations:1e3,updateInterval:50,onlyDynamicEdges:false,fit:true},timestep:.5,adaptiveTimestep:true};util.extend(this.options,this.defaultOptions);this.timestep=.5;this.layoutFailed=false;this.bindEventListeners()}(0,_createClass3[\"default\"])(PhysicsEngine,[{key:\"bindEventListeners\",value:function bindEventListeners(){var _this=this;this.body.emitter.on(\"initPhysics\",function(){_this.initPhysics()});this.body.emitter.on(\"_layoutFailed\",function(){_this.layoutFailed=true});this.body.emitter.on(\"resetPhysics\",function(){_this.stopSimulation();_this.ready=false});this.body.emitter.on(\"disablePhysics\",function(){_this.physicsEnabled=false;_this.stopSimulation()});this.body.emitter.on(\"restorePhysics\",function(){_this.setOptions(_this.options);if(_this.ready===true){_this.startSimulation()}});this.body.emitter.on(\"startSimulation\",function(){if(_this.ready===true){_this.startSimulation()}});this.body.emitter.on(\"stopSimulation\",function(){_this.stopSimulation()});this.body.emitter.on(\"destroy\",function(){_this.stopSimulation(false);_this.body.emitter.off()});this.body.emitter.on(\"_dataChanged\",function(){_this.updatePhysicsData()})}},{key:\"setOptions\",value:function setOptions(options){if(options!==undefined){if(options===false){this.options.enabled=false;this.physicsEnabled=false;this.stopSimulation()}else if(options===true){this.options.enabled=true;this.physicsEnabled=true;this.startSimulation()}else{this.physicsEnabled=true;util.selectiveNotDeepExtend([\"stabilization\"],this.options,options);util.mergeOptions(this.options,options,\"stabilization\");if(options.enabled===undefined){this.options.enabled=true}if(this.options.enabled===false){this.physicsEnabled=false;this.stopSimulation()}this.timestep=this.options.timestep}}this.init()}},{key:\"init\",value:function init(){var options;if(this.options.solver===\"forceAtlas2Based\"){options=this.options.forceAtlas2Based;this.nodesSolver=new ForceAtlas2BasedRepulsionSolver(this.body,this.physicsBody,options);this.edgesSolver=new SpringSolver(this.body,this.physicsBody,options);this.gravitySolver=new ForceAtlas2BasedCentralGravitySolver(this.body,this.physicsBody,options)}else if(this.options.solver===\"repulsion\"){options=this.options.repulsion;this.nodesSolver=new Repulsion(this.body,this.physicsBody,options);this.edgesSolver=new SpringSolver(this.body,this.physicsBody,options);this.gravitySolver=new CentralGravitySolver(this.body,this.physicsBody,options)}else if(this.options.solver===\"hierarchicalRepulsion\"){options=this.options.hierarchicalRepulsion;this.nodesSolver=new HierarchicalRepulsion(this.body,this.physicsBody,options);this.edgesSolver=new HierarchicalSpringSolver(this.body,this.physicsBody,options);this.gravitySolver=new CentralGravitySolver(this.body,this.physicsBody,options)}else{options=this.options.barnesHut;this.nodesSolver=new BarnesHutSolver(this.body,this.physicsBody,options);this.edgesSolver=new SpringSolver(this.body,this.physicsBody,options);this.gravitySolver=new CentralGravitySolver(this.body,this.physicsBody,options)}this.modelOptions=options}},{key:\"initPhysics\",value:function initPhysics(){if(this.physicsEnabled===true&&this.options.enabled===true){if(this.options.stabilization.enabled===true){this.stabilize()}else{this.stabilized=false;this.ready=true;this.body.emitter.emit(\"fit\",{},this.layoutFailed);this.startSimulation()}}else{this.ready=true;this.body.emitter.emit(\"fit\")}}},{key:\"startSimulation\",value:function startSimulation(){if(this.physicsEnabled===true&&this.options.enabled===true){this.stabilized=false;this.adaptiveTimestep=false;this.body.emitter.emit(\"_resizeNodes\");if(this.viewFunction===undefined){this.viewFunction=this.simulationStep.bind(this);this.body.emitter.on(\"initRedraw\",this.viewFunction);this.body.emitter.emit(\"_startRendering\")}}else{this.body.emitter.emit(\"_redraw\")}}},{key:\"stopSimulation\",value:function stopSimulation(){var emit=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;this.stabilized=true;if(emit===true){this._emitStabilized()}if(this.viewFunction!==undefined){this.body.emitter.off(\"initRedraw\",this.viewFunction);this.viewFunction=undefined;if(emit===true){this.body.emitter.emit(\"_stopRendering\")}}}},{key:\"simulationStep\",value:function simulationStep(){var startTime=Date.now();this.physicsTick();var physicsTime=Date.now()-startTime;if((physicsTime<.4*this.simulationInterval||this.runDoubleSpeed===true)&&this.stabilized===false){this.physicsTick();this.runDoubleSpeed=true}if(this.stabilized===true){this.stopSimulation()}}},{key:\"_emitStabilized\",value:function _emitStabilized(){var _this2=this;var amountOfIterations=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.stabilizationIterations;if(this.stabilizationIterations>1||this.startedStabilization===true){setTimeout(function(){_this2.body.emitter.emit(\"stabilized\",{iterations:amountOfIterations});_this2.startedStabilization=false;_this2.stabilizationIterations=0},0)}}},{key:\"physicsStep\",value:function physicsStep(){this.gravitySolver.solve();this.nodesSolver.solve();this.edgesSolver.solve();this.moveNodes()}},{key:\"adjustTimeStep\",value:function adjustTimeStep(){var factor=1.2;if(this._evaluateStepQuality()===true){this.timestep=factor*this.timestep}else{if(this.timestep/factor<this.options.timestep){this.timestep=this.options.timestep}else{this.adaptiveCounter=-1;this.timestep=Math.max(this.options.timestep,this.timestep/factor)}}}},{key:\"physicsTick\",value:function physicsTick(){this._startStabilizing();if(this.stabilized===true)return;if(this.adaptiveTimestep===true&&this.adaptiveTimestepEnabled===true){var doAdaptive=this.adaptiveCounter%this.adaptiveInterval===0;if(doAdaptive){this.timestep=2*this.timestep;this.physicsStep();this.revert();this.timestep=.5*this.timestep;this.physicsStep();this.physicsStep();this.adjustTimeStep()}else{this.physicsStep()}this.adaptiveCounter+=1}else{this.timestep=this.options.timestep;this.physicsStep()}\nif(this.stabilized===true)this.revert();this.stabilizationIterations++}},{key:\"updatePhysicsData\",value:function updatePhysicsData(){this.physicsBody.forces={};this.physicsBody.physicsNodeIndices=[];this.physicsBody.physicsEdgeIndices=[];var nodes=this.body.nodes;var edges=this.body.edges;for(var nodeId in nodes){if(nodes.hasOwnProperty(nodeId)){if(nodes[nodeId].options.physics===true){this.physicsBody.physicsNodeIndices.push(nodes[nodeId].id)}}}for(var edgeId in edges){if(edges.hasOwnProperty(edgeId)){if(edges[edgeId].options.physics===true){this.physicsBody.physicsEdgeIndices.push(edges[edgeId].id)}}}for(var i=0;i<this.physicsBody.physicsNodeIndices.length;i++){var _nodeId=this.physicsBody.physicsNodeIndices[i];this.physicsBody.forces[_nodeId]={x:0,y:0};if(this.physicsBody.velocities[_nodeId]===undefined){this.physicsBody.velocities[_nodeId]={x:0,y:0}}}for(var _nodeId2 in this.physicsBody.velocities){if(nodes[_nodeId2]===undefined){delete this.physicsBody.velocities[_nodeId2]}}}},{key:\"revert\",value:function revert(){var nodeIds=(0,_keys2[\"default\"])(this.previousStates);var nodes=this.body.nodes;var velocities=this.physicsBody.velocities;this.referenceState={};for(var i=0;i<nodeIds.length;i++){var nodeId=nodeIds[i];if(nodes[nodeId]!==undefined){if(nodes[nodeId].options.physics===true){this.referenceState[nodeId]={positions:{x:nodes[nodeId].x,y:nodes[nodeId].y}};velocities[nodeId].x=this.previousStates[nodeId].vx;velocities[nodeId].y=this.previousStates[nodeId].vy;nodes[nodeId].x=this.previousStates[nodeId].x;nodes[nodeId].y=this.previousStates[nodeId].y}}else{delete this.previousStates[nodeId]}}}},{key:\"_evaluateStepQuality\",value:function _evaluateStepQuality(){var dx=void 0,dy=void 0,dpos=void 0;var nodes=this.body.nodes;var reference=this.referenceState;var posThreshold=.3;for(var nodeId in this.referenceState){if(this.referenceState.hasOwnProperty(nodeId)&&nodes[nodeId]!==undefined){dx=nodes[nodeId].x-reference[nodeId].positions.x;dy=nodes[nodeId].y-reference[nodeId].positions.y;dpos=Math.sqrt(Math.pow(dx,2)+Math.pow(dy,2));if(dpos>posThreshold){return false}}}return true}},{key:\"moveNodes\",value:function moveNodes(){var nodeIndices=this.physicsBody.physicsNodeIndices;var maxNodeVelocity=0;var averageNodeVelocity=0;var velocityAdaptiveThreshold=5;for(var i=0;i<nodeIndices.length;i++){var nodeId=nodeIndices[i];var nodeVelocity=this._performStep(nodeId);maxNodeVelocity=Math.max(maxNodeVelocity,nodeVelocity);averageNodeVelocity+=nodeVelocity}this.adaptiveTimestepEnabled=averageNodeVelocity/nodeIndices.length<velocityAdaptiveThreshold;this.stabilized=maxNodeVelocity<this.options.minVelocity}},{key:\"calculateComponentVelocity\",value:function calculateComponentVelocity(v,f,m){var df=this.modelOptions.damping*v;var a=(f-df)/m;v+=a*this.timestep;var maxV=this.options.maxVelocity||1e9;if(Math.abs(v)>maxV){v=v>0?maxV:-maxV}return v}},{key:\"_performStep\",value:function _performStep(nodeId){var node=this.body.nodes[nodeId];var force=this.physicsBody.forces[nodeId];var velocity=this.physicsBody.velocities[nodeId];this.previousStates[nodeId]={x:node.x,y:node.y,vx:velocity.x,vy:velocity.y};if(node.options.fixed.x===false){velocity.x=this.calculateComponentVelocity(velocity.x,force.x,node.options.mass);node.x+=velocity.x*this.timestep}else{force.x=0;velocity.x=0}if(node.options.fixed.y===false){velocity.y=this.calculateComponentVelocity(velocity.y,force.y,node.options.mass);node.y+=velocity.y*this.timestep}else{force.y=0;velocity.y=0}var totalVelocity=Math.sqrt(Math.pow(velocity.x,2)+Math.pow(velocity.y,2));return totalVelocity}},{key:\"_freezeNodes\",value:function _freezeNodes(){var nodes=this.body.nodes;for(var id in nodes){if(nodes.hasOwnProperty(id)){if(nodes[id].x&&nodes[id].y){var fixed=nodes[id].options.fixed;this.freezeCache[id]={x:fixed.x,y:fixed.y};fixed.x=true;fixed.y=true}}}}},{key:\"_restoreFrozenNodes\",value:function _restoreFrozenNodes(){var nodes=this.body.nodes;for(var id in nodes){if(nodes.hasOwnProperty(id)){if(this.freezeCache[id]!==undefined){nodes[id].options.fixed.x=this.freezeCache[id].x;nodes[id].options.fixed.y=this.freezeCache[id].y}}}this.freezeCache={}}},{key:\"stabilize\",value:function stabilize(){var _this3=this;var iterations=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.options.stabilization.iterations;if(typeof iterations!==\"number\"){iterations=this.options.stabilization.iterations;console.log(\"The stabilize method needs a numeric amount of iterations. Switching to default: \",iterations)}if(this.physicsBody.physicsNodeIndices.length===0){this.ready=true;return}this.adaptiveTimestep=true&&this.options.adaptiveTimestep;this.body.emitter.emit(\"_resizeNodes\");this.stopSimulation();this.stabilized=false;this.body.emitter.emit(\"_blockRedraw\");this.targetIterations=iterations;if(this.options.stabilization.onlyDynamicEdges===true){this._freezeNodes()}this.stabilizationIterations=0;setTimeout(function(){return _this3._stabilizationBatch()},0)}},{key:\"_startStabilizing\",value:function _startStabilizing(){if(this.startedStabilization===true)return false;this.body.emitter.emit(\"startStabilizing\");this.startedStabilization=true;return true}},{key:\"_stabilizationBatch\",value:function _stabilizationBatch(){var _this4=this;var running=function running(){return _this4.stabilized===false&&_this4.stabilizationIterations<_this4.targetIterations};var sendProgress=function sendProgress(){_this4.body.emitter.emit(\"stabilizationProgress\",{iterations:_this4.stabilizationIterations,total:_this4.targetIterations})};if(this._startStabilizing()){sendProgress()}var count=0;while(running()&&count<this.options.stabilization.updateInterval){this.physicsTick();count++}sendProgress();if(running()){setTimeout(this._stabilizationBatch.bind(this),0)}else{this._finalizeStabilization()}}},{key:\"_finalizeStabilization\",value:function _finalizeStabilization(){this.body.emitter.emit(\"_allowRedraw\");if(this.options.stabilization.fit===true){this.body.emitter.emit(\"fit\")}if(this.options.stabilization.onlyDynamicEdges===true){this._restoreFrozenNodes()}this.body.emitter.emit(\"stabilizationIterationsDone\");this.body.emitter.emit(\"_requestRedraw\");if(this.stabilized===true){this._emitStabilized()}else{this.startSimulation()}this.ready=true}},{key:\"_drawForces\",value:function _drawForces(ctx){for(var i=0;i<this.physicsBody.physicsNodeIndices.length;i++){var index=this.physicsBody.physicsNodeIndices[i];var node=this.body.nodes[index];var force=this.physicsBody.forces[index];var factor=20;var colorFactor=.03;var forceSize=Math.sqrt(Math.pow(force.x,2)+Math.pow(force.x,2));var size=Math.min(Math.max(5,forceSize),15);var arrowSize=3*size;var color=util.HSVToHex((180-Math.min(1,Math.max(0,colorFactor*forceSize))*180)/360,1,1);var point={x:node.x+factor*force.x,y:node.y+factor*force.y};ctx.lineWidth=size;ctx.strokeStyle=color;ctx.beginPath();ctx.moveTo(node.x,node.y);ctx.lineTo(point.x,point.y);ctx.stroke();var angle=Math.atan2(force.y,force.x);ctx.fillStyle=color;EndPoints.draw(ctx,{type:\"arrow\",point:point,angle:angle,length:arrowSize});ctx.fill()}}}]);return PhysicsEngine}();exports[\"default\"]=PhysicsEngine},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var RepulsionSolver=function(){function RepulsionSolver(body,physicsBody,options){(0,_classCallCheck3[\"default\"])(this,RepulsionSolver);this.body=body;this.physicsBody=physicsBody;this.setOptions(options)}(0,_createClass3[\"default\"])(RepulsionSolver,[{key:\"setOptions\",value:function setOptions(options){this.options=options}},{key:\"solve\",value:function solve(){var dx,dy,distance,fx,fy,repulsingForce,node1,node2;var nodes=this.body.nodes;var nodeIndices=this.physicsBody.physicsNodeIndices;var forces=this.physicsBody.forces;var nodeDistance=this.options.nodeDistance;var a=-2/3/nodeDistance;var b=4/3;for(var i=0;i<nodeIndices.length-1;i++){node1=nodes[nodeIndices[i]];for(var j=i+1;j<nodeIndices.length;j++){node2=nodes[nodeIndices[j]];dx=node2.x-node1.x;dy=node2.y-node1.y;distance=Math.sqrt(dx*dx+dy*dy);if(distance===0){distance=.1*Math.random();dx=distance}if(distance<2*nodeDistance){if(distance<.5*nodeDistance){repulsingForce=1}else{repulsingForce=a*distance+b}repulsingForce=repulsingForce/distance;fx=dx*repulsingForce;fy=dy*repulsingForce;forces[node1.id].x-=fx;forces[node1.id].y-=fy;forces[node2.id].x+=fx;forces[node2.id].y+=fy}}}}}]);return RepulsionSolver}();exports[\"default\"]=RepulsionSolver},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var HierarchicalRepulsionSolver=function(){function HierarchicalRepulsionSolver(body,physicsBody,options){(0,_classCallCheck3[\"default\"])(this,HierarchicalRepulsionSolver);this.body=body;this.physicsBody=physicsBody;this.setOptions(options)}(0,_createClass3[\"default\"])(HierarchicalRepulsionSolver,[{key:\"setOptions\",value:function setOptions(options){this.options=options}},{key:\"solve\",value:function solve(){var dx,dy,distance,fx,fy,repulsingForce,node1,node2,i,j;var nodes=this.body.nodes;var nodeIndices=this.physicsBody.physicsNodeIndices;var forces=this.physicsBody.forces;var nodeDistance=this.options.nodeDistance;for(i=0;i<nodeIndices.length-1;i++){node1=nodes[nodeIndices[i]];for(j=i+1;j<nodeIndices.length;j++){node2=nodes[nodeIndices[j]];if(node1.level===node2.level){dx=node2.x-node1.x;dy=node2.y-node1.y;distance=Math.sqrt(dx*dx+dy*dy);var steepness=.05;if(distance<nodeDistance){repulsingForce=-Math.pow(steepness*distance,2)+Math.pow(steepness*nodeDistance,2)}else{repulsingForce=0}if(distance===0){distance=.01}else{repulsingForce=repulsingForce/distance}fx=dx*repulsingForce;fy=dy*repulsingForce;forces[node1.id].x-=fx;forces[node1.id].y-=fy;forces[node2.id].x+=fx;forces[node2.id].y+=fy}}}}}]);return HierarchicalRepulsionSolver}();exports[\"default\"]=HierarchicalRepulsionSolver},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var SpringSolver=function(){function SpringSolver(body,physicsBody,options){(0,_classCallCheck3[\"default\"])(this,SpringSolver);this.body=body;this.physicsBody=physicsBody;this.setOptions(options)}(0,_createClass3[\"default\"])(SpringSolver,[{key:\"setOptions\",value:function setOptions(options){this.options=options}},{key:\"solve\",value:function solve(){var edgeLength=void 0,edge=void 0;var edgeIndices=this.physicsBody.physicsEdgeIndices;var edges=this.body.edges;var node1=void 0,node2=void 0,node3=void 0;for(var i=0;i<edgeIndices.length;i++){edge=edges[edgeIndices[i]];if(edge.connected===true&&edge.toId!==edge.fromId){if(this.body.nodes[edge.toId]!==undefined&&this.body.nodes[edge.fromId]!==undefined){if(edge.edgeType.via!==undefined){edgeLength=edge.options.length===undefined?this.options.springLength:edge.options.length;node1=edge.to;node2=edge.edgeType.via;node3=edge.from;this._calculateSpringForce(node1,node2,.5*edgeLength);this._calculateSpringForce(node2,node3,.5*edgeLength)}else{edgeLength=edge.options.length===undefined?this.options.springLength*1.5:edge.options.length;this._calculateSpringForce(edge.from,edge.to,edgeLength)}}}}}},{key:\"_calculateSpringForce\",value:function _calculateSpringForce(node1,node2,edgeLength){var dx=node1.x-node2.x;var dy=node1.y-node2.y;var distance=Math.max(Math.sqrt(dx*dx+dy*dy),.01);var springForce=this.options.springConstant*(edgeLength-distance)/distance;var fx=dx*springForce;var fy=dy*springForce;if(this.physicsBody.forces[node1.id]!==undefined){this.physicsBody.forces[node1.id].x+=fx;this.physicsBody.forces[node1.id].y+=fy}if(this.physicsBody.forces[node2.id]!==undefined){this.physicsBody.forces[node2.id].x-=fx;this.physicsBody.forces[node2.id].y-=fy}}}]);return SpringSolver}();exports[\"default\"]=SpringSolver},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var HierarchicalSpringSolver=function(){function HierarchicalSpringSolver(body,physicsBody,options){(0,_classCallCheck3[\"default\"])(this,HierarchicalSpringSolver);this.body=body;this.physicsBody=physicsBody;this.setOptions(options)}(0,_createClass3[\"default\"])(HierarchicalSpringSolver,[{key:\"setOptions\",value:function setOptions(options){this.options=options}},{key:\"solve\",value:function solve(){var edgeLength,edge;var dx,dy,fx,fy,springForce,distance;var edges=this.body.edges;var factor=.5;var edgeIndices=this.physicsBody.physicsEdgeIndices;var nodeIndices=this.physicsBody.physicsNodeIndices;var forces=this.physicsBody.forces;for(var i=0;i<nodeIndices.length;i++){var nodeId=nodeIndices[i];forces[nodeId].springFx=0;forces[nodeId].springFy=0}for(var _i=0;_i<edgeIndices.length;_i++){edge=edges[edgeIndices[_i]];if(edge.connected===true){edgeLength=edge.options.length===undefined?this.options.springLength:edge.options.length;dx=edge.from.x-edge.to.x;dy=edge.from.y-edge.to.y;distance=Math.sqrt(dx*dx+dy*dy);distance=distance===0?.01:distance;springForce=this.options.springConstant*(edgeLength-distance)/distance;fx=dx*springForce;fy=dy*springForce;if(edge.to.level!=edge.from.level){if(forces[edge.toId]!==undefined){forces[edge.toId].springFx-=fx;forces[edge.toId].springFy-=fy}if(forces[edge.fromId]!==undefined){forces[edge.fromId].springFx+=fx;forces[edge.fromId].springFy+=fy}}else{if(forces[edge.toId]!==undefined){forces[edge.toId].x-=factor*fx;forces[edge.toId].y-=factor*fy}if(forces[edge.fromId]!==undefined){forces[edge.fromId].x+=factor*fx;forces[edge.fromId].y+=factor*fy}}}}springForce=1;var springFx,springFy;for(var _i2=0;_i2<nodeIndices.length;_i2++){var _nodeId=nodeIndices[_i2];springFx=Math.min(springForce,Math.max(-springForce,forces[_nodeId].springFx));springFy=Math.min(springForce,Math.max(-springForce,forces[_nodeId].springFy));forces[_nodeId].x+=springFx;forces[_nodeId].y+=springFy}var totalFx=0;var totalFy=0;for(var _i3=0;_i3<nodeIndices.length;_i3++){var _nodeId2=nodeIndices[_i3];totalFx+=forces[_nodeId2].x;totalFy+=forces[_nodeId2].y}var correctionFx=totalFx/nodeIndices.length;var correctionFy=totalFy/nodeIndices.length;for(var _i4=0;_i4<nodeIndices.length;_i4++){var _nodeId3=nodeIndices[_i4];forces[_nodeId3].x-=correctionFx;forces[_nodeId3].y-=correctionFy}}}]);return HierarchicalSpringSolver}();exports[\"default\"]=HierarchicalSpringSolver},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _BarnesHutSolver2=__webpack_require__(120);var _BarnesHutSolver3=_interopRequireDefault(_BarnesHutSolver2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var ForceAtlas2BasedRepulsionSolver=function(_BarnesHutSolver){(0,_inherits3[\"default\"])(ForceAtlas2BasedRepulsionSolver,_BarnesHutSolver);function ForceAtlas2BasedRepulsionSolver(body,physicsBody,options){(0,_classCallCheck3[\"default\"])(this,ForceAtlas2BasedRepulsionSolver);return(0,_possibleConstructorReturn3[\"default\"])(this,(ForceAtlas2BasedRepulsionSolver.__proto__||(0,_getPrototypeOf2[\"default\"])(ForceAtlas2BasedRepulsionSolver)).call(this,body,physicsBody,options))}(0,_createClass3[\"default\"])(ForceAtlas2BasedRepulsionSolver,[{key:\"_calculateForces\",value:function _calculateForces(distance,dx,dy,node,parentBranch){if(distance===0){distance=.1*Math.random();dx=distance}if(this.overlapAvoidanceFactor<1&&node.shape.radius){distance=Math.max(.1+this.overlapAvoidanceFactor*node.shape.radius,distance-node.shape.radius)}var degree=node.edges.length+1;var gravityForce=this.options.gravitationalConstant*parentBranch.mass*node.options.mass*degree/Math.pow(distance,2);var fx=dx*gravityForce;var fy=dy*gravityForce;this.physicsBody.forces[node.id].x+=fx;this.physicsBody.forces[node.id].y+=fy}}]);return ForceAtlas2BasedRepulsionSolver}(_BarnesHutSolver3[\"default\"]);exports[\"default\"]=ForceAtlas2BasedRepulsionSolver},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _CentralGravitySolver2=__webpack_require__(121);var _CentralGravitySolver3=_interopRequireDefault(_CentralGravitySolver2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var ForceAtlas2BasedCentralGravitySolver=function(_CentralGravitySolver){(0,_inherits3[\"default\"])(ForceAtlas2BasedCentralGravitySolver,_CentralGravitySolver);function ForceAtlas2BasedCentralGravitySolver(body,physicsBody,options){(0,_classCallCheck3[\"default\"])(this,ForceAtlas2BasedCentralGravitySolver);return(0,_possibleConstructorReturn3[\"default\"])(this,(ForceAtlas2BasedCentralGravitySolver.__proto__||(0,_getPrototypeOf2[\"default\"])(ForceAtlas2BasedCentralGravitySolver)).call(this,body,physicsBody,options))}(0,_createClass3[\"default\"])(ForceAtlas2BasedCentralGravitySolver,[{key:\"_calculateForces\",value:function _calculateForces(distance,dx,dy,forces,node){if(distance>0){var degree=node.edges.length+1;var gravityForce=this.options.centralGravity*degree*node.options.mass;forces[node.id].x=dx*gravityForce;forces[node.id].y=dy*gravityForce}}}]);return ForceAtlas2BasedCentralGravitySolver}(_CentralGravitySolver3[\"default\"]);exports[\"default\"]=ForceAtlas2BasedCentralGravitySolver},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _keys=__webpack_require__(8);var _keys2=_interopRequireDefault(_keys);var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var NetworkUtil=__webpack_require__(76)[\"default\"];var Cluster=__webpack_require__(228)[\"default\"];var Edge=__webpack_require__(74)[\"default\"];var Node=__webpack_require__(47)[\"default\"];var ClusterEngine=function(){function ClusterEngine(body){var _this=this;(0,_classCallCheck3[\"default\"])(this,ClusterEngine);this.body=body;this.clusteredNodes={};this.clusteredEdges={};this.options={};this.defaultOptions={};util.extend(this.options,this.defaultOptions);this.body.emitter.on(\"_resetData\",function(){_this.clusteredNodes={};_this.clusteredEdges={}})}(0,_createClass3[\"default\"])(ClusterEngine,[{key:\"clusterByHubsize\",value:function clusterByHubsize(hubsize,options){if(hubsize===undefined){hubsize=this._getHubSize()}else if((typeof hubsize===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(hubsize))===\"object\"){options=this._checkOptions(hubsize);hubsize=this._getHubSize()}var nodesToCluster=[];for(var i=0;i<this.body.nodeIndices.length;i++){var node=this.body.nodes[this.body.nodeIndices[i]];if(node.edges.length>=hubsize){nodesToCluster.push(node.id)}}for(var _i=0;_i<nodesToCluster.length;_i++){this.clusterByConnection(nodesToCluster[_i],options,true)}this.body.emitter.emit(\"_dataChanged\")}},{key:\"cluster\",value:function cluster(){var _this2=this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var refreshData=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;if(options.joinCondition===undefined){throw new Error(\"Cannot call clusterByNodeData without a joinCondition function in the options.\")}options=this._checkOptions(options);var childNodesObj={};var childEdgesObj={};util.forEach(this.body.nodes,function(node,nodeId){var clonedOptions=NetworkUtil.cloneOptions(node);if(options.joinCondition(clonedOptions)===true){childNodesObj[nodeId]=node;util.forEach(node.edges,function(edge){if(_this2.clusteredEdges[edge.id]===undefined){childEdgesObj[edge.id]=edge}})}});this._cluster(childNodesObj,childEdgesObj,options,refreshData)}},{key:\"clusterByEdgeCount\",value:function clusterByEdgeCount(edgeCount,options){var _this3=this;var refreshData=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;options=this._checkOptions(options);var clusters=[];var usedNodes={};var edge=void 0,edges=void 0,relevantEdgeCount=void 0;var _loop=function _loop(i){var childNodesObj={};var childEdgesObj={};var nodeId=_this3.body.nodeIndices[i];var node=_this3.body.nodes[nodeId];if(usedNodes[nodeId]===undefined){relevantEdgeCount=0;edges=[];for(var j=0;j<node.edges.length;j++){edge=node.edges[j];if(_this3.clusteredEdges[edge.id]===undefined){if(edge.toId!==edge.fromId){relevantEdgeCount++}edges.push(edge)}}if(relevantEdgeCount===edgeCount){checkJoinCondition=function checkJoinCondition(node){if(options.joinCondition===undefined||options.joinCondition===null){return true}var clonedOptions=NetworkUtil.cloneOptions(node);return options.joinCondition(clonedOptions)};var gatheringSuccessful=true;for(var _j=0;_j<edges.length;_j++){edge=edges[_j];var childNodeId=_this3._getConnectedId(edge,nodeId);if(checkJoinCondition(node)){childEdgesObj[edge.id]=edge;childNodesObj[nodeId]=node;childNodesObj[childNodeId]=_this3.body.nodes[childNodeId];usedNodes[nodeId]=true}else{gatheringSuccessful=false;break}}if((0,_keys2[\"default\"])(childNodesObj).length>0&&(0,_keys2[\"default\"])(childEdgesObj).length>0&&gatheringSuccessful===true){findClusterData=function findClusterData(){for(var n=0;n<clusters.length;++n){for(var m in childNodesObj){if(clusters[n].nodes[m]!==undefined){return clusters[n]}}}return undefined};foundCluster=findClusterData();if(foundCluster!==undefined){for(var m in childNodesObj){if(foundCluster.nodes[m]===undefined){foundCluster.nodes[m]=childNodesObj[m]}}for(var _m in childEdgesObj){if(foundCluster.edges[_m]===undefined){foundCluster.edges[_m]=childEdgesObj[_m]}}}else{clusters.push({nodes:childNodesObj,edges:childEdgesObj})}}}}};for(var i=0;i<this.body.nodeIndices.length;i++){var checkJoinCondition;var findClusterData;var foundCluster;_loop(i)}for(var i=0;i<clusters.length;i++){this._cluster(clusters[i].nodes,clusters[i].edges,options,false)}if(refreshData===true){this.body.emitter.emit(\"_dataChanged\")}}},{key:\"clusterOutliers\",value:function clusterOutliers(options){var refreshData=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;this.clusterByEdgeCount(1,options,refreshData)}},{key:\"clusterBridges\",value:function clusterBridges(options){var refreshData=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;this.clusterByEdgeCount(2,options,refreshData)}},{key:\"clusterByConnection\",value:function clusterByConnection(nodeId,options){var refreshData=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;if(nodeId===undefined){throw new Error(\"No nodeId supplied to clusterByConnection!\")}if(this.body.nodes[nodeId]===undefined){throw new Error(\"The nodeId given to clusterByConnection does not exist!\")}var node=this.body.nodes[nodeId];options=this._checkOptions(options,node);if(options.clusterNodeProperties.x===undefined){options.clusterNodeProperties.x=node.x}if(options.clusterNodeProperties.y===undefined){options.clusterNodeProperties.y=node.y}if(options.clusterNodeProperties.fixed===undefined){options.clusterNodeProperties.fixed={};options.clusterNodeProperties.fixed.x=node.options.fixed.x;options.clusterNodeProperties.fixed.y=node.options.fixed.y}var childNodesObj={};var childEdgesObj={};var parentNodeId=node.id;var parentClonedOptions=NetworkUtil.cloneOptions(node);childNodesObj[parentNodeId]=node;for(var i=0;i<node.edges.length;i++){var edge=node.edges[i];if(this.clusteredEdges[edge.id]===undefined){var childNodeId=this._getConnectedId(edge,parentNodeId);if(this.clusteredNodes[childNodeId]===undefined){if(childNodeId!==parentNodeId){if(options.joinCondition===undefined){childEdgesObj[edge.id]=edge;childNodesObj[childNodeId]=this.body.nodes[childNodeId]}else{var childClonedOptions=NetworkUtil.cloneOptions(this.body.nodes[childNodeId]);if(options.joinCondition(parentClonedOptions,childClonedOptions)===true){childEdgesObj[edge.id]=edge;childNodesObj[childNodeId]=this.body.nodes[childNodeId]}}}else{childEdgesObj[edge.id]=edge}}}}var childNodeIDs=(0,_keys2[\"default\"])(childNodesObj).map(function(childNode){return childNodesObj[childNode].id});for(childNode in childNodesObj){if(!childNodesObj.hasOwnProperty(childNode))continue;var childNode=childNodesObj[childNode];for(var y=0;y<childNode.edges.length;y++){var childEdge=childNode.edges[y];if(childNodeIDs.indexOf(this._getConnectedId(childEdge,childNode.id))>-1){childEdgesObj[childEdge.id]=childEdge}}}this._cluster(childNodesObj,childEdgesObj,options,refreshData)}},{key:\"_createClusterEdges\",value:function _createClusterEdges(childNodesObj,childEdgesObj,clusterNodeProperties,clusterEdgeProperties){var edge=void 0,childNodeId=void 0,childNode=void 0,toId=void 0,fromId=void 0,otherNodeId=void 0;var childKeys=(0,_keys2[\"default\"])(childNodesObj);var createEdges=[];for(var i=0;i<childKeys.length;i++){childNodeId=childKeys[i];childNode=childNodesObj[childNodeId];for(var j=0;j<childNode.edges.length;j++){edge=childNode.edges[j];if(this.clusteredEdges[edge.id]===undefined){if(edge.toId==edge.fromId){childEdgesObj[edge.id]=edge}else{if(edge.toId==childNodeId){toId=clusterNodeProperties.id;fromId=edge.fromId;otherNodeId=fromId}else{toId=edge.toId;fromId=clusterNodeProperties.id;otherNodeId=toId}}if(childNodesObj[otherNodeId]===undefined){createEdges.push({edge:edge,fromId:fromId,toId:toId})}}}}var newEdges=[];var getNewEdge=function getNewEdge(createdEdge){for(var _j2=0;_j2<newEdges.length;_j2++){var newEdge=newEdges[_j2];var matchToDirection=createdEdge.fromId===newEdge.fromId&&createdEdge.toId===newEdge.toId;var matchFromDirection=createdEdge.fromId===newEdge.toId&&createdEdge.toId===newEdge.fromId;if(matchToDirection||matchFromDirection){return newEdge}}return null};for(var _j3=0;_j3<createEdges.length;_j3++){var createdEdge=createEdges[_j3];var _edge=createdEdge.edge;var newEdge=getNewEdge(createdEdge);if(newEdge===null){newEdge=this._createClusteredEdge(createdEdge.fromId,createdEdge.toId,_edge,clusterEdgeProperties);newEdges.push(newEdge)}else{newEdge.clusteringEdgeReplacingIds.push(_edge.id)}this.body.edges[_edge.id].edgeReplacedById=newEdge.id;this._backupEdgeOptions(_edge);_edge.setOptions({physics:false})}}},{key:\"_checkOptions\",value:function _checkOptions(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};if(options.clusterEdgeProperties===undefined){options.clusterEdgeProperties={}}if(options.clusterNodeProperties===undefined){options.clusterNodeProperties={}}return options}},{key:\"_cluster\",value:function _cluster(childNodesObj,childEdgesObj,options){var refreshData=arguments.length>3&&arguments[3]!==undefined?arguments[3]:true;var tmpNodesToRemove=[];for(var _nodeId in childNodesObj){if(childNodesObj.hasOwnProperty(_nodeId)){if(this.clusteredNodes[_nodeId]!==undefined){tmpNodesToRemove.push(_nodeId)}}}for(var n=0;n<tmpNodesToRemove.length;++n){delete childNodesObj[tmpNodesToRemove[n]]}if((0,_keys2[\"default\"])(childNodesObj).length==0){return}if((0,_keys2[\"default\"])(childNodesObj).length==1&&options.clusterNodeProperties.allowSingleNodeCluster!=true){return}var clusterNodeProperties=util.deepExtend({},options.clusterNodeProperties);if(options.processProperties!==undefined){var childNodesOptions=[];for(var _nodeId2 in childNodesObj){if(childNodesObj.hasOwnProperty(_nodeId2)){var clonedOptions=NetworkUtil.cloneOptions(childNodesObj[_nodeId2]);childNodesOptions.push(clonedOptions)}}var childEdgesOptions=[];for(var edgeId in childEdgesObj){if(childEdgesObj.hasOwnProperty(edgeId)){if(edgeId.substr(0,12)!==\"clusterEdge:\"){var _clonedOptions=NetworkUtil.cloneOptions(childEdgesObj[edgeId],\"edge\");childEdgesOptions.push(_clonedOptions)}}}clusterNodeProperties=options.processProperties(clusterNodeProperties,childNodesOptions,childEdgesOptions);if(!clusterNodeProperties){throw new Error(\"The processProperties function does not return properties!\")}}if(clusterNodeProperties.id===undefined){clusterNodeProperties.id=\"cluster:\"+util.randomUUID()}var clusterId=clusterNodeProperties.id;if(clusterNodeProperties.label===undefined){clusterNodeProperties.label=\"cluster\"}var pos=undefined;if(clusterNodeProperties.x===undefined){pos=this._getClusterPosition(childNodesObj);clusterNodeProperties.x=pos.x}if(clusterNodeProperties.y===undefined){if(pos===undefined){pos=this._getClusterPosition(childNodesObj)}clusterNodeProperties.y=pos.y}clusterNodeProperties.id=clusterId;var clusterNode=this.body.functions.createNode(clusterNodeProperties,Cluster);clusterNode.containedNodes=childNodesObj;clusterNode.containedEdges=childEdgesObj;clusterNode.clusterEdgeProperties=options.clusterEdgeProperties;this.body.nodes[clusterNodeProperties.id]=clusterNode;this._clusterEdges(childNodesObj,childEdgesObj,clusterNodeProperties,options.clusterEdgeProperties);clusterNodeProperties.id=undefined;if(refreshData===true){this.body.emitter.emit(\"_dataChanged\")}}},{key:\"_backupEdgeOptions\",value:function _backupEdgeOptions(edge){if(this.clusteredEdges[edge.id]===undefined){this.clusteredEdges[edge.id]={physics:edge.options.physics}}}},{key:\"_restoreEdge\",value:function _restoreEdge(edge){var originalOptions=this.clusteredEdges[edge.id];if(originalOptions!==undefined){edge.setOptions({physics:originalOptions.physics});delete this.clusteredEdges[edge.id]}}},{key:\"isCluster\",value:function isCluster(nodeId){if(this.body.nodes[nodeId]!==undefined){return this.body.nodes[nodeId].isCluster===true}else{console.log(\"Node does not exist.\");return false}}},{key:\"_getClusterPosition\",value:function _getClusterPosition(childNodesObj){var childKeys=(0,_keys2[\"default\"])(childNodesObj);var minX=childNodesObj[childKeys[0]].x;var maxX=childNodesObj[childKeys[0]].x;var minY=childNodesObj[childKeys[0]].y;var maxY=childNodesObj[childKeys[0]].y;var node=void 0;for(var i=1;i<childKeys.length;i++){node=childNodesObj[childKeys[i]];minX=node.x<minX?node.x:minX;maxX=node.x>maxX?node.x:maxX\n;minY=node.y<minY?node.y:minY;maxY=node.y>maxY?node.y:maxY}return{x:.5*(minX+maxX),y:.5*(minY+maxY)}}},{key:\"openCluster\",value:function openCluster(clusterNodeId,options){var refreshData=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;if(clusterNodeId===undefined){throw new Error(\"No clusterNodeId supplied to openCluster.\")}var clusterNode=this.body.nodes[clusterNodeId];if(clusterNode===undefined){throw new Error(\"The clusterNodeId supplied to openCluster does not exist.\")}if(clusterNode.isCluster!==true||clusterNode.containedNodes===undefined||clusterNode.containedEdges===undefined){throw new Error(\"The node:\"+clusterNodeId+\" is not a valid cluster.\")}var stack=this.findNode(clusterNodeId);var parentIndex=stack.indexOf(clusterNodeId)-1;if(parentIndex>=0){var parentClusterNodeId=stack[parentIndex];var parentClusterNode=this.body.nodes[parentClusterNodeId];parentClusterNode._openChildCluster(clusterNodeId);delete this.body.nodes[clusterNodeId];if(refreshData===true){this.body.emitter.emit(\"_dataChanged\")}return}var containedNodes=clusterNode.containedNodes;var containedEdges=clusterNode.containedEdges;if(options!==undefined&&options.releaseFunction!==undefined&&typeof options.releaseFunction===\"function\"){var positions={};var clusterPosition={x:clusterNode.x,y:clusterNode.y};for(var _nodeId3 in containedNodes){if(containedNodes.hasOwnProperty(_nodeId3)){var containedNode=this.body.nodes[_nodeId3];positions[_nodeId3]={x:containedNode.x,y:containedNode.y}}}var newPositions=options.releaseFunction(clusterPosition,positions);for(var _nodeId4 in containedNodes){if(containedNodes.hasOwnProperty(_nodeId4)){var _containedNode=this.body.nodes[_nodeId4];if(newPositions[_nodeId4]!==undefined){_containedNode.x=newPositions[_nodeId4].x===undefined?clusterNode.x:newPositions[_nodeId4].x;_containedNode.y=newPositions[_nodeId4].y===undefined?clusterNode.y:newPositions[_nodeId4].y}}}}else{util.forEach(containedNodes,function(containedNode){if(containedNode.options.fixed.x===false){containedNode.x=clusterNode.x}if(containedNode.options.fixed.y===false){containedNode.y=clusterNode.y}})}for(var _nodeId5 in containedNodes){if(containedNodes.hasOwnProperty(_nodeId5)){var _containedNode2=this.body.nodes[_nodeId5];_containedNode2.vx=clusterNode.vx;_containedNode2.vy=clusterNode.vy;_containedNode2.setOptions({physics:true});delete this.clusteredNodes[_nodeId5]}}var edgesToBeDeleted=[];for(var i=0;i<clusterNode.edges.length;i++){edgesToBeDeleted.push(clusterNode.edges[i])}for(var _i2=0;_i2<edgesToBeDeleted.length;_i2++){var edge=edgesToBeDeleted[_i2];var otherNodeId=this._getConnectedId(edge,clusterNodeId);var otherNode=this.clusteredNodes[otherNodeId];for(var j=0;j<edge.clusteringEdgeReplacingIds.length;j++){var transferId=edge.clusteringEdgeReplacingIds[j];var transferEdge=this.body.edges[transferId];if(transferEdge===undefined)continue;if(otherNode!==undefined){var otherCluster=this.body.nodes[otherNode.clusterId];otherCluster.containedEdges[transferEdge.id]=transferEdge;delete containedEdges[transferEdge.id];var fromId=transferEdge.fromId;var toId=transferEdge.toId;if(transferEdge.toId==otherNodeId){toId=otherNode.clusterId}else{fromId=otherNode.clusterId}this._createClusteredEdge(fromId,toId,transferEdge,otherCluster.clusterEdgeProperties,{hidden:false,physics:true})}else{this._restoreEdge(transferEdge)}}edge.remove()}for(var edgeId in containedEdges){if(containedEdges.hasOwnProperty(edgeId)){this._restoreEdge(containedEdges[edgeId])}}delete this.body.nodes[clusterNodeId];if(refreshData===true){this.body.emitter.emit(\"_dataChanged\")}}},{key:\"getNodesInCluster\",value:function getNodesInCluster(clusterId){var nodesArray=[];if(this.isCluster(clusterId)===true){var containedNodes=this.body.nodes[clusterId].containedNodes;for(var _nodeId6 in containedNodes){if(containedNodes.hasOwnProperty(_nodeId6)){nodesArray.push(this.body.nodes[_nodeId6].id)}}}return nodesArray}},{key:\"findNode\",value:function findNode(nodeId){var stack=[];var max=100;var counter=0;var node=void 0;while(this.clusteredNodes[nodeId]!==undefined&&counter<max){node=this.body.nodes[nodeId];if(node===undefined)return[];stack.push(node.id);nodeId=this.clusteredNodes[nodeId].clusterId;counter++}node=this.body.nodes[nodeId];if(node===undefined)return[];stack.push(node.id);stack.reverse();return stack}},{key:\"updateClusteredNode\",value:function updateClusteredNode(clusteredNodeId,newOptions){if(clusteredNodeId===undefined){throw new Error(\"No clusteredNodeId supplied to updateClusteredNode.\")}if(newOptions===undefined){throw new Error(\"No newOptions supplied to updateClusteredNode.\")}if(this.body.nodes[clusteredNodeId]===undefined){throw new Error(\"The clusteredNodeId supplied to updateClusteredNode does not exist.\")}this.body.nodes[clusteredNodeId].setOptions(newOptions);this.body.emitter.emit(\"_dataChanged\")}},{key:\"updateEdge\",value:function updateEdge(startEdgeId,newOptions){if(startEdgeId===undefined){throw new Error(\"No startEdgeId supplied to updateEdge.\")}if(newOptions===undefined){throw new Error(\"No newOptions supplied to updateEdge.\")}if(this.body.edges[startEdgeId]===undefined){throw new Error(\"The startEdgeId supplied to updateEdge does not exist.\")}var allEdgeIds=this.getClusteredEdges(startEdgeId);for(var i=0;i<allEdgeIds.length;i++){var edge=this.body.edges[allEdgeIds[i]];edge.setOptions(newOptions)}this.body.emitter.emit(\"_dataChanged\")}},{key:\"getClusteredEdges\",value:function getClusteredEdges(edgeId){var stack=[];var max=100;var counter=0;while(edgeId!==undefined&&this.body.edges[edgeId]!==undefined&&counter<max){stack.push(this.body.edges[edgeId].id);edgeId=this.body.edges[edgeId].edgeReplacedById;counter++}stack.reverse();return stack}},{key:\"getBaseEdge\",value:function getBaseEdge(clusteredEdgeId){return this.getBaseEdges(clusteredEdgeId)[0]}},{key:\"getBaseEdges\",value:function getBaseEdges(clusteredEdgeId){var IdsToHandle=[clusteredEdgeId];var doneIds=[];var foundIds=[];var max=100;var counter=0;while(IdsToHandle.length>0&&counter<max){var nextId=IdsToHandle.pop();if(nextId===undefined)continue;var nextEdge=this.body.edges[nextId];if(nextEdge===undefined)continue;counter++;var replacingIds=nextEdge.clusteringEdgeReplacingIds;if(replacingIds===undefined){foundIds.push(nextId)}else{for(var i=0;i<replacingIds.length;++i){var replacingId=replacingIds[i];if(IdsToHandle.indexOf(replacingIds)!==-1||doneIds.indexOf(replacingIds)!==-1){continue}IdsToHandle.push(replacingId)}}doneIds.push(nextId)}return foundIds}},{key:\"_getConnectedId\",value:function _getConnectedId(edge,nodeId){if(edge.toId!=nodeId){return edge.toId}else if(edge.fromId!=nodeId){return edge.fromId}else{return edge.fromId}}},{key:\"_getHubSize\",value:function _getHubSize(){var average=0;var averageSquared=0;var hubCounter=0;var largestHub=0;for(var i=0;i<this.body.nodeIndices.length;i++){var _node=this.body.nodes[this.body.nodeIndices[i]];if(_node.edges.length>largestHub){largestHub=_node.edges.length}average+=_node.edges.length;averageSquared+=Math.pow(_node.edges.length,2);hubCounter+=1}average=average/hubCounter;averageSquared=averageSquared/hubCounter;var variance=averageSquared-Math.pow(average,2);var standardDeviation=Math.sqrt(variance);var hubThreshold=Math.floor(average+2*standardDeviation);if(hubThreshold>largestHub){hubThreshold=largestHub}return hubThreshold}},{key:\"_createClusteredEdge\",value:function _createClusteredEdge(fromId,toId,baseEdge,clusterEdgeProperties,extraOptions){var clonedOptions=NetworkUtil.cloneOptions(baseEdge,\"edge\");util.deepExtend(clonedOptions,clusterEdgeProperties);clonedOptions.from=fromId;clonedOptions.to=toId;clonedOptions.id=\"clusterEdge:\"+util.randomUUID();if(extraOptions!==undefined){util.deepExtend(clonedOptions,extraOptions)}var newEdge=this.body.functions.createEdge(clonedOptions);newEdge.clusteringEdgeReplacingIds=[baseEdge.id];newEdge.connect();this.body.edges[newEdge.id]=newEdge;return newEdge}},{key:\"_clusterEdges\",value:function _clusterEdges(childNodes,childEdges,clusterNode,clusterEdgeProperties){if(childEdges instanceof Edge){var edge=childEdges;var obj={};obj[edge.id]=edge;childEdges=obj}if(childNodes instanceof Node){var _node2=childNodes;var _obj={};_obj[_node2.id]=_node2;childNodes=_obj}if(clusterNode===undefined||clusterNode===null){throw new Error(\"_clusterEdges: parameter clusterNode required\")}if(clusterEdgeProperties===undefined){clusterEdgeProperties=clusterNode.clusterEdgeProperties}this._createClusterEdges(childNodes,childEdges,clusterNode,clusterEdgeProperties);for(var edgeId in childEdges){if(childEdges.hasOwnProperty(edgeId)){if(this.body.edges[edgeId]!==undefined){var _edge2=this.body.edges[edgeId];this._backupEdgeOptions(_edge2);_edge2.setOptions({physics:false})}}}for(var _nodeId7 in childNodes){if(childNodes.hasOwnProperty(_nodeId7)){this.clusteredNodes[_nodeId7]={clusterId:clusterNode.id,node:this.body.nodes[_nodeId7]};this.body.nodes[_nodeId7].setOptions({physics:false})}}}},{key:\"_getClusterNodeForNode\",value:function _getClusterNodeForNode(nodeId){if(nodeId===undefined)return undefined;var clusteredNode=this.clusteredNodes[nodeId];if(clusteredNode===undefined)return undefined;var clusterId=clusteredNode.clusterId;if(clusterId===undefined)return undefined;return this.body.nodes[clusterId]}},{key:\"_filter\",value:function _filter(arr,callback){var ret=[];util.forEach(arr,function(item){if(callback(item)){ret.push(item)}});return ret}},{key:\"_updateState\",value:function _updateState(){var _this4=this;var nodeId=void 0;var deletedNodeIds=[];var deletedEdgeIds=[];var eachClusterNode=function eachClusterNode(callback){util.forEach(_this4.body.nodes,function(node){if(node.isCluster===true){callback(node)}})};for(nodeId in this.clusteredNodes){if(!this.clusteredNodes.hasOwnProperty(nodeId))continue;var _node3=this.body.nodes[nodeId];if(_node3===undefined){deletedNodeIds.push(nodeId)}}eachClusterNode(function(clusterNode){for(var n=0;n<deletedNodeIds.length;n++){delete clusterNode.containedNodes[deletedNodeIds[n]]}});for(var n=0;n<deletedNodeIds.length;n++){delete this.clusteredNodes[deletedNodeIds[n]]}util.forEach(this.clusteredEdges,function(edgeId){var edge=_this4.body.edges[edgeId];if(edge===undefined||!edge.endPointsValid()){deletedEdgeIds.push(edgeId)}});eachClusterNode(function(clusterNode){util.forEach(clusterNode.containedEdges,function(edge,edgeId){if(!edge.endPointsValid()&&deletedEdgeIds.indexOf(edgeId)===-1){deletedEdgeIds.push(edgeId)}})});util.forEach(this.body.edges,function(edge,edgeId){var isValid=true;var replacedIds=edge.clusteringEdgeReplacingIds;if(replacedIds!==undefined){var numValid=0;util.forEach(replacedIds,function(containedEdgeId){var containedEdge=_this4.body.edges[containedEdgeId];if(containedEdge!==undefined&&containedEdge.endPointsValid()){numValid+=1}});isValid=numValid>0}if(!edge.endPointsValid()||!isValid){deletedEdgeIds.push(edgeId)}});eachClusterNode(function(clusterNode){util.forEach(deletedEdgeIds,function(deletedEdgeId){delete clusterNode.containedEdges[deletedEdgeId];util.forEach(clusterNode.edges,function(edge,m){if(edge.id===deletedEdgeId){clusterNode.edges[m]=null;return}edge.clusteringEdgeReplacingIds=_this4._filter(edge.clusteringEdgeReplacingIds,function(id){return deletedEdgeIds.indexOf(id)===-1})});clusterNode.edges=_this4._filter(clusterNode.edges,function(item){return item!==null})})});util.forEach(deletedEdgeIds,function(edgeId){delete _this4.clusteredEdges[edgeId]});util.forEach(deletedEdgeIds,function(edgeId){delete _this4.body.edges[edgeId]});var ids=(0,_keys2[\"default\"])(this.body.edges);util.forEach(ids,function(edgeId){var edge=_this4.body.edges[edgeId];var shouldBeClustered=_this4._isClusteredNode(edge.fromId)||_this4._isClusteredNode(edge.toId);if(shouldBeClustered===_this4._isClusteredEdge(edge.id)){return}if(shouldBeClustered){var clusterFrom=_this4._getClusterNodeForNode(edge.fromId);if(clusterFrom!==undefined){_this4._clusterEdges(_this4.body.nodes[edge.fromId],edge,clusterFrom)}var clusterTo=_this4._getClusterNodeForNode(edge.toId);if(clusterTo!==undefined){_this4._clusterEdges(_this4.body.nodes[edge.toId],edge,clusterTo)}}else{throw new Error(\"remove edge from clustering not implemented!\")}});var changed=false;var continueLoop=true;var _loop2=function _loop2(){var clustersToOpen=[];eachClusterNode(function(clusterNode){var numNodes=(0,_keys2[\"default\"])(clusterNode.containedNodes).length;var allowSingle=clusterNode.options.allowSingleNodeCluster===true;if(allowSingle&&numNodes<1||!allowSingle&&numNodes<2){clustersToOpen.push(clusterNode.id)}});for(var _n=0;_n<clustersToOpen.length;++_n){_this4.openCluster(clustersToOpen[_n],{},false)}continueLoop=clustersToOpen.length>0;changed=changed||continueLoop};while(continueLoop){_loop2()}if(changed){this._updateState()}}},{key:\"_isClusteredNode\",value:function _isClusteredNode(nodeId){return this.clusteredNodes[nodeId]!==undefined}},{key:\"_isClusteredEdge\",value:function _isClusteredEdge(edgeId){return this.clusteredEdges[edgeId]!==undefined}}]);return ClusterEngine}();exports[\"default\"]=ClusterEngine},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var Node=__webpack_require__(47)[\"default\"];var Cluster=function(_Node){(0,_inherits3[\"default\"])(Cluster,_Node);function Cluster(options,body,imagelist,grouplist,globalOptions,defaultOptions){(0,_classCallCheck3[\"default\"])(this,Cluster);var _this=(0,_possibleConstructorReturn3[\"default\"])(this,(Cluster.__proto__||(0,_getPrototypeOf2[\"default\"])(Cluster)).call(this,options,body,imagelist,grouplist,globalOptions,defaultOptions));_this.isCluster=true;_this.containedNodes={};_this.containedEdges={};return _this}(0,_createClass3[\"default\"])(Cluster,[{key:\"_openChildCluster\",value:function _openChildCluster(childClusterId){var _this2=this;var childCluster=this.body.nodes[childClusterId];if(this.containedNodes[childClusterId]===undefined){throw new Error(\"node with id: \"+childClusterId+\" not in current cluster\")}if(!childCluster.isCluster){throw new Error(\"node with id: \"+childClusterId+\" is not a cluster\")}delete this.containedNodes[childClusterId];util.forEach(childCluster.edges,function(edge){delete _this2.containedEdges[edge.id]});util.forEach(childCluster.containedNodes,function(node,nodeId){_this2.containedNodes[nodeId]=node});childCluster.containedNodes={};util.forEach(childCluster.containedEdges,function(edge,edgeId){_this2.containedEdges[edgeId]=edge});childCluster.containedEdges={};util.forEach(childCluster.edges,function(clusterEdge){util.forEach(_this2.edges,function(parentClusterEdge){var index=parentClusterEdge.clusteringEdgeReplacingIds.indexOf(clusterEdge.id);if(index===-1)return;util.forEach(clusterEdge.clusteringEdgeReplacingIds,function(srcId){parentClusterEdge.clusteringEdgeReplacingIds.push(srcId);_this2.body.edges[srcId].edgeReplacedById=parentClusterEdge.id});parentClusterEdge.clusteringEdgeReplacingIds.splice(index,1)})});childCluster.edges=[]}}]);return Cluster}(Node);exports[\"default\"]=Cluster},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _initRequestAnimationFrame(){var func;if(window!==undefined){func=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame}if(func===undefined){window.requestAnimationFrame=function(callback){callback()}}else{window.requestAnimationFrame=func}}var util=__webpack_require__(2);var CanvasRenderer=function(){function CanvasRenderer(body,canvas){(0,_classCallCheck3[\"default\"])(this,CanvasRenderer);_initRequestAnimationFrame();this.body=body;this.canvas=canvas;this.redrawRequested=false;this.renderTimer=undefined;this.requiresTimeout=true;this.renderingActive=false;this.renderRequests=0;this.allowRedraw=true;this.dragging=false;this.options={};this.defaultOptions={hideEdgesOnDrag:false,hideNodesOnDrag:false};util.extend(this.options,this.defaultOptions);this._determineBrowserMethod();this.bindEventListeners()}(0,_createClass3[\"default\"])(CanvasRenderer,[{key:\"bindEventListeners\",value:function bindEventListeners(){var _this=this;this.body.emitter.on(\"dragStart\",function(){_this.dragging=true});this.body.emitter.on(\"dragEnd\",function(){_this.dragging=false});this.body.emitter.on(\"_resizeNodes\",function(){_this._resizeNodes()});this.body.emitter.on(\"_redraw\",function(){if(_this.renderingActive===false){_this._redraw()}});this.body.emitter.on(\"_blockRedraw\",function(){_this.allowRedraw=false});this.body.emitter.on(\"_allowRedraw\",function(){_this.allowRedraw=true;_this.redrawRequested=false});this.body.emitter.on(\"_requestRedraw\",this._requestRedraw.bind(this));this.body.emitter.on(\"_startRendering\",function(){_this.renderRequests+=1;_this.renderingActive=true;_this._startRendering()});this.body.emitter.on(\"_stopRendering\",function(){_this.renderRequests-=1;_this.renderingActive=_this.renderRequests>0;_this.renderTimer=undefined});this.body.emitter.on(\"destroy\",function(){_this.renderRequests=0;_this.allowRedraw=false;_this.renderingActive=false;if(_this.requiresTimeout===true){clearTimeout(_this.renderTimer)}else{window.cancelAnimationFrame(_this.renderTimer)}_this.body.emitter.off()})}},{key:\"setOptions\",value:function setOptions(options){if(options!==undefined){var fields=[\"hideEdgesOnDrag\",\"hideNodesOnDrag\"];util.selectiveDeepExtend(fields,this.options,options)}}},{key:\"_requestNextFrame\",value:function _requestNextFrame(callback,delay){if(typeof window===\"undefined\")return;var timer=void 0;var myWindow=window;if(this.requiresTimeout===true){timer=myWindow.setTimeout(callback,delay)}else{if(myWindow.requestAnimationFrame){timer=myWindow.requestAnimationFrame(callback)}}return timer}},{key:\"_startRendering\",value:function _startRendering(){if(this.renderingActive===true){if(this.renderTimer===undefined){this.renderTimer=this._requestNextFrame(this._renderStep.bind(this),this.simulationInterval)}}}},{key:\"_renderStep\",value:function _renderStep(){if(this.renderingActive===true){this.renderTimer=undefined;if(this.requiresTimeout===true){this._startRendering()}this._redraw();if(this.requiresTimeout===false){this._startRendering()}}}},{key:\"redraw\",value:function redraw(){this.body.emitter.emit(\"setSize\");this._redraw()}},{key:\"_requestRedraw\",value:function _requestRedraw(){var _this2=this;if(this.redrawRequested!==true&&this.renderingActive===false&&this.allowRedraw===true){this.redrawRequested=true;this._requestNextFrame(function(){_this2._redraw(false)},0)}}},{key:\"_redraw\",value:function _redraw(){var hidden=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;if(this.allowRedraw===true){this.body.emitter.emit(\"initRedraw\");this.redrawRequested=false;if(this.canvas.frame.canvas.width===0||this.canvas.frame.canvas.height===0){this.canvas.setSize()}this.canvas.setTransform();var ctx=this.canvas.getContext();var w=this.canvas.frame.canvas.clientWidth;var h=this.canvas.frame.canvas.clientHeight;ctx.clearRect(0,0,w,h);if(this.canvas.frame.clientWidth===0){return}ctx.save();ctx.translate(this.body.view.translation.x,this.body.view.translation.y);ctx.scale(this.body.view.scale,this.body.view.scale);ctx.beginPath();this.body.emitter.emit(\"beforeDrawing\",ctx);ctx.closePath();if(hidden===false){if(this.dragging===false||this.dragging===true&&this.options.hideEdgesOnDrag===false){this._drawEdges(ctx)}}if(this.dragging===false||this.dragging===true&&this.options.hideNodesOnDrag===false){this._drawNodes(ctx,hidden)}ctx.beginPath();this.body.emitter.emit(\"afterDrawing\",ctx);ctx.closePath();ctx.restore();if(hidden===true){ctx.clearRect(0,0,w,h)}}}},{key:\"_resizeNodes\",value:function _resizeNodes(){this.canvas.setTransform();var ctx=this.canvas.getContext();ctx.save();ctx.translate(this.body.view.translation.x,this.body.view.translation.y);ctx.scale(this.body.view.scale,this.body.view.scale);var nodes=this.body.nodes;var node=void 0;for(var nodeId in nodes){if(nodes.hasOwnProperty(nodeId)){node=nodes[nodeId];node.resize(ctx);node.updateBoundingBox(ctx,node.selected)}}ctx.restore()}},{key:\"_drawNodes\",value:function _drawNodes(ctx){var alwaysShow=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var nodes=this.body.nodes;var nodeIndices=this.body.nodeIndices;var node=void 0;var selected=[];var margin=20;var topLeft=this.canvas.DOMtoCanvas({x:-margin,y:-margin});var bottomRight=this.canvas.DOMtoCanvas({x:this.canvas.frame.canvas.clientWidth+margin,y:this.canvas.frame.canvas.clientHeight+margin});var viewableArea={top:topLeft.y,left:topLeft.x,bottom:bottomRight.y,right:bottomRight.x};for(var i=0;i<nodeIndices.length;i++){node=nodes[nodeIndices[i]];if(node.isSelected()){selected.push(nodeIndices[i])}else{if(alwaysShow===true){node.draw(ctx)}else if(node.isBoundingBoxOverlappingWith(viewableArea)===true){node.draw(ctx)}else{node.updateBoundingBox(ctx,node.selected)}}}for(var _i=0;_i<selected.length;_i++){node=nodes[selected[_i]];node.draw(ctx)}}},{key:\"_drawEdges\",value:function _drawEdges(ctx){var edges=this.body.edges;var edgeIndices=this.body.edgeIndices;var edge=void 0;for(var i=0;i<edgeIndices.length;i++){edge=edges[edgeIndices[i]];if(edge.connected===true){edge.draw(ctx)}}}},{key:\"_determineBrowserMethod\",value:function _determineBrowserMethod(){if(typeof window!==\"undefined\"){var browserType=navigator.userAgent.toLowerCase();this.requiresTimeout=false;if(browserType.indexOf(\"msie 9.0\")!=-1){this.requiresTimeout=true}else if(browserType.indexOf(\"safari\")!=-1){if(browserType.indexOf(\"chrome\")<=-1){this.requiresTimeout=true}}}else{this.requiresTimeout=true}}}]);return CanvasRenderer}();exports[\"default\"]=CanvasRenderer},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Hammer=__webpack_require__(10);var hammerUtil=__webpack_require__(37);var util=__webpack_require__(2);var Canvas=function(){function Canvas(body){(0,_classCallCheck3[\"default\"])(this,Canvas);this.body=body;this.pixelRatio=1;this.resizeTimer=undefined;this.resizeFunction=this._onResize.bind(this);this.cameraState={};this.initialized=false;this.canvasViewCenter={};this.options={};this.defaultOptions={autoResize:true,height:\"100%\",width:\"100%\"};util.extend(this.options,this.defaultOptions);this.bindEventListeners()}(0,_createClass3[\"default\"])(Canvas,[{key:\"bindEventListeners\",value:function bindEventListeners(){var _this=this;this.body.emitter.once(\"resize\",function(obj){if(obj.width!==0){_this.body.view.translation.x=obj.width*.5}if(obj.height!==0){_this.body.view.translation.y=obj.height*.5}});this.body.emitter.on(\"setSize\",this.setSize.bind(this));this.body.emitter.on(\"destroy\",function(){_this.hammerFrame.destroy();_this.hammer.destroy();_this._cleanUp()})}},{key:\"setOptions\",value:function setOptions(options){var _this2=this;if(options!==undefined){var fields=[\"width\",\"height\",\"autoResize\"];util.selectiveDeepExtend(fields,this.options,options)}if(this.options.autoResize===true){this._cleanUp();this.resizeTimer=setInterval(function(){var changed=_this2.setSize();if(changed===true){_this2.body.emitter.emit(\"_requestRedraw\")}},1e3);this.resizeFunction=this._onResize.bind(this);util.addEventListener(window,\"resize\",this.resizeFunction)}}},{key:\"_cleanUp\",value:function _cleanUp(){if(this.resizeTimer!==undefined){clearInterval(this.resizeTimer)}util.removeEventListener(window,\"resize\",this.resizeFunction);this.resizeFunction=undefined}},{key:\"_onResize\",value:function _onResize(){this.setSize();this.body.emitter.emit(\"_redraw\")}},{key:\"_getCameraState\",value:function _getCameraState(){var pixelRatio=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.pixelRatio;if(this.initialized===true){this.cameraState.previousWidth=this.frame.canvas.width/pixelRatio;this.cameraState.previousHeight=this.frame.canvas.height/pixelRatio;this.cameraState.scale=this.body.view.scale;this.cameraState.position=this.DOMtoCanvas({x:.5*this.frame.canvas.width/pixelRatio,y:.5*this.frame.canvas.height/pixelRatio})}}},{key:\"_setCameraState\",value:function _setCameraState(){if(this.cameraState.scale!==undefined&&this.frame.canvas.clientWidth!==0&&this.frame.canvas.clientHeight!==0&&this.pixelRatio!==0&&this.cameraState.previousWidth>0){var widthRatio=this.frame.canvas.width/this.pixelRatio/this.cameraState.previousWidth;var heightRatio=this.frame.canvas.height/this.pixelRatio/this.cameraState.previousHeight;var newScale=this.cameraState.scale;if(widthRatio!=1&&heightRatio!=1){newScale=this.cameraState.scale*.5*(widthRatio+heightRatio)}else if(widthRatio!=1){newScale=this.cameraState.scale*widthRatio}else if(heightRatio!=1){newScale=this.cameraState.scale*heightRatio}this.body.view.scale=newScale;var currentViewCenter=this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight});var distanceFromCenter={x:currentViewCenter.x-this.cameraState.position.x,y:currentViewCenter.y-this.cameraState.position.y};this.body.view.translation.x+=distanceFromCenter.x*this.body.view.scale;this.body.view.translation.y+=distanceFromCenter.y*this.body.view.scale}}},{key:\"_prepareValue\",value:function _prepareValue(value){if(typeof value===\"number\"){return value+\"px\"}else if(typeof value===\"string\"){if(value.indexOf(\"%\")!==-1||value.indexOf(\"px\")!==-1){return value}else if(value.indexOf(\"%\")===-1){return value+\"px\"}}throw new Error(\"Could not use the value supplied for width or height:\"+value)}},{key:\"_create\",value:function _create(){while(this.body.container.hasChildNodes()){this.body.container.removeChild(this.body.container.firstChild)}this.frame=document.createElement(\"div\");this.frame.className=\"vis-network\";this.frame.style.position=\"relative\";this.frame.style.overflow=\"hidden\";this.frame.tabIndex=900;this.frame.canvas=document.createElement(\"canvas\");this.frame.canvas.style.position=\"relative\";this.frame.appendChild(this.frame.canvas);if(!this.frame.canvas.getContext){var noCanvas=document.createElement(\"DIV\");noCanvas.style.color=\"red\";noCanvas.style.fontWeight=\"bold\";noCanvas.style.padding=\"10px\";noCanvas.innerHTML=\"Error: your browser does not support HTML canvas\";this.frame.canvas.appendChild(noCanvas)}else{this._setPixelRatio();this.setTransform()}this.body.container.appendChild(this.frame);this.body.view.scale=1;this.body.view.translation={x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight};this._bindHammer()}},{key:\"_bindHammer\",value:function _bindHammer(){var _this3=this;if(this.hammer!==undefined){this.hammer.destroy()}this.drag={};this.pinch={};this.hammer=new Hammer(this.frame.canvas);this.hammer.get(\"pinch\").set({enable:true});this.hammer.get(\"pan\").set({threshold:5,direction:Hammer.DIRECTION_ALL});hammerUtil.onTouch(this.hammer,function(event){_this3.body.eventListeners.onTouch(event)});this.hammer.on(\"tap\",function(event){_this3.body.eventListeners.onTap(event)});this.hammer.on(\"doubletap\",function(event){_this3.body.eventListeners.onDoubleTap(event)});this.hammer.on(\"press\",function(event){_this3.body.eventListeners.onHold(event)});this.hammer.on(\"panstart\",function(event){_this3.body.eventListeners.onDragStart(event)});this.hammer.on(\"panmove\",function(event){_this3.body.eventListeners.onDrag(event)});this.hammer.on(\"panend\",function(event){_this3.body.eventListeners.onDragEnd(event)});this.hammer.on(\"pinch\",function(event){_this3.body.eventListeners.onPinch(event)});this.frame.canvas.addEventListener(\"mousewheel\",function(event){_this3.body.eventListeners.onMouseWheel(event)});this.frame.canvas.addEventListener(\"DOMMouseScroll\",function(event){_this3.body.eventListeners.onMouseWheel(event)});this.frame.canvas.addEventListener(\"mousemove\",function(event){_this3.body.eventListeners.onMouseMove(event)});this.frame.canvas.addEventListener(\"contextmenu\",function(event){_this3.body.eventListeners.onContext(event)});this.hammerFrame=new Hammer(this.frame);hammerUtil.onRelease(this.hammerFrame,function(event){_this3.body.eventListeners.onRelease(event)})}},{key:\"setSize\",value:function setSize(){var width=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.options.width;var height=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this.options.height;width=this._prepareValue(width);height=this._prepareValue(height);var emitEvent=false;var oldWidth=this.frame.canvas.width;var oldHeight=this.frame.canvas.height;var previousRatio=this.pixelRatio;this._setPixelRatio();if(width!=this.options.width||height!=this.options.height||this.frame.style.width!=width||this.frame.style.height!=height){this._getCameraState(previousRatio);this.frame.style.width=width;this.frame.style.height=height;this.frame.canvas.style.width=\"100%\";this.frame.canvas.style.height=\"100%\";this.frame.canvas.width=Math.round(this.frame.canvas.clientWidth*this.pixelRatio);this.frame.canvas.height=Math.round(this.frame.canvas.clientHeight*this.pixelRatio);this.options.width=width;this.options.height=height;this.canvasViewCenter={x:.5*this.frame.clientWidth,y:.5*this.frame.clientHeight};emitEvent=true}else{var newWidth=Math.round(this.frame.canvas.clientWidth*this.pixelRatio);var newHeight=Math.round(this.frame.canvas.clientHeight*this.pixelRatio);if(this.frame.canvas.width!==newWidth||this.frame.canvas.height!==newHeight){this._getCameraState(previousRatio)}if(this.frame.canvas.width!==newWidth){this.frame.canvas.width=newWidth;emitEvent=true}if(this.frame.canvas.height!==newHeight){this.frame.canvas.height=newHeight;emitEvent=true}}if(emitEvent===true){this.body.emitter.emit(\"resize\",{width:Math.round(this.frame.canvas.width/this.pixelRatio),height:Math.round(this.frame.canvas.height/this.pixelRatio),oldWidth:Math.round(oldWidth/this.pixelRatio),oldHeight:Math.round(oldHeight/this.pixelRatio)});this._setCameraState()}this.initialized=true;return emitEvent}},{key:\"getContext\",value:function getContext(){return this.frame.canvas.getContext(\"2d\")}},{key:\"_determinePixelRatio\",value:function _determinePixelRatio(){var ctx=this.getContext();if(ctx===undefined){throw new Error(\"Could not get canvax context\")}var numerator=1;if(typeof window!==\"undefined\"){numerator=window.devicePixelRatio||1}var denominator=ctx.webkitBackingStorePixelRatio||ctx.mozBackingStorePixelRatio||ctx.msBackingStorePixelRatio||ctx.oBackingStorePixelRatio||ctx.backingStorePixelRatio||1;return numerator/denominator}},{key:\"_setPixelRatio\",value:function _setPixelRatio(){this.pixelRatio=this._determinePixelRatio()}},{key:\"setTransform\",value:function setTransform(){var ctx=this.getContext();if(ctx===undefined){throw new Error(\"Could not get canvax context\")}ctx.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}},{key:\"_XconvertDOMtoCanvas\",value:function _XconvertDOMtoCanvas(x){return(x-this.body.view.translation.x)/this.body.view.scale}},{\nkey:\"_XconvertCanvasToDOM\",value:function _XconvertCanvasToDOM(x){return x*this.body.view.scale+this.body.view.translation.x}},{key:\"_YconvertDOMtoCanvas\",value:function _YconvertDOMtoCanvas(y){return(y-this.body.view.translation.y)/this.body.view.scale}},{key:\"_YconvertCanvasToDOM\",value:function _YconvertCanvasToDOM(y){return y*this.body.view.scale+this.body.view.translation.y}},{key:\"canvasToDOM\",value:function canvasToDOM(pos){return{x:this._XconvertCanvasToDOM(pos.x),y:this._YconvertCanvasToDOM(pos.y)}}},{key:\"DOMtoCanvas\",value:function DOMtoCanvas(pos){return{x:this._XconvertDOMtoCanvas(pos.x),y:this._YconvertDOMtoCanvas(pos.y)}}}]);return Canvas}();exports[\"default\"]=Canvas},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var NetworkUtil=__webpack_require__(76)[\"default\"];var View=function(){function View(body,canvas){var _this=this;(0,_classCallCheck3[\"default\"])(this,View);this.body=body;this.canvas=canvas;this.animationSpeed=1/this.renderRefreshRate;this.animationEasingFunction=\"easeInOutQuint\";this.easingTime=0;this.sourceScale=0;this.targetScale=0;this.sourceTranslation=0;this.targetTranslation=0;this.lockedOnNodeId=undefined;this.lockedOnNodeOffset=undefined;this.touchTime=0;this.viewFunction=undefined;this.body.emitter.on(\"fit\",this.fit.bind(this));this.body.emitter.on(\"animationFinished\",function(){_this.body.emitter.emit(\"_stopRendering\")});this.body.emitter.on(\"unlockNode\",this.releaseNode.bind(this))}(0,_createClass3[\"default\"])(View,[{key:\"setOptions\",value:function setOptions(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};this.options=options}},{key:\"fit\",value:function fit(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{nodes:[]};var initialZoom=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var range=void 0;var zoomLevel=void 0;if(options.nodes===undefined||options.nodes.length===0){options.nodes=this.body.nodeIndices}if(initialZoom===true){var positionDefined=0;for(var nodeId in this.body.nodes){if(this.body.nodes.hasOwnProperty(nodeId)){var node=this.body.nodes[nodeId];if(node.predefinedPosition===true){positionDefined+=1}}}if(positionDefined>.5*this.body.nodeIndices.length){this.fit(options,false);return}range=NetworkUtil.getRange(this.body.nodes,options.nodes);var numberOfNodes=this.body.nodeIndices.length;zoomLevel=12.662/(numberOfNodes+7.4147)+.0964822;var factor=Math.min(this.canvas.frame.canvas.clientWidth/600,this.canvas.frame.canvas.clientHeight/600);zoomLevel*=factor}else{this.body.emitter.emit(\"_resizeNodes\");range=NetworkUtil.getRange(this.body.nodes,options.nodes);var xDistance=Math.abs(range.maxX-range.minX)*1.1;var yDistance=Math.abs(range.maxY-range.minY)*1.1;var xZoomLevel=this.canvas.frame.canvas.clientWidth/xDistance;var yZoomLevel=this.canvas.frame.canvas.clientHeight/yDistance;zoomLevel=xZoomLevel<=yZoomLevel?xZoomLevel:yZoomLevel}if(zoomLevel>1){zoomLevel=1}else if(zoomLevel===0){zoomLevel=1}var center=NetworkUtil.findCenter(range);var animationOptions={position:center,scale:zoomLevel,animation:options.animation};this.moveTo(animationOptions)}},{key:\"focus\",value:function focus(nodeId){var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};if(this.body.nodes[nodeId]!==undefined){var nodePosition={x:this.body.nodes[nodeId].x,y:this.body.nodes[nodeId].y};options.position=nodePosition;options.lockedOnNode=nodeId;this.moveTo(options)}else{console.log(\"Node: \"+nodeId+\" cannot be found.\")}}},{key:\"moveTo\",value:function moveTo(options){if(options===undefined){options={};return}if(options.offset===undefined){options.offset={x:0,y:0}}if(options.offset.x===undefined){options.offset.x=0}if(options.offset.y===undefined){options.offset.y=0}if(options.scale===undefined){options.scale=this.body.view.scale}if(options.position===undefined){options.position=this.getViewPosition()}if(options.animation===undefined){options.animation={duration:0}}if(options.animation===false){options.animation={duration:0}}if(options.animation===true){options.animation={}}if(options.animation.duration===undefined){options.animation.duration=1e3}if(options.animation.easingFunction===undefined){options.animation.easingFunction=\"easeInOutQuad\"}this.animateView(options)}},{key:\"animateView\",value:function animateView(options){if(options===undefined){return}this.animationEasingFunction=options.animation.easingFunction;this.releaseNode();if(options.locked===true){this.lockedOnNodeId=options.lockedOnNode;this.lockedOnNodeOffset=options.offset}if(this.easingTime!=0){this._transitionRedraw(true)}this.sourceScale=this.body.view.scale;this.sourceTranslation=this.body.view.translation;this.targetScale=options.scale;this.body.view.scale=this.targetScale;var viewCenter=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight});var distanceFromCenter={x:viewCenter.x-options.position.x,y:viewCenter.y-options.position.y};this.targetTranslation={x:this.sourceTranslation.x+distanceFromCenter.x*this.targetScale+options.offset.x,y:this.sourceTranslation.y+distanceFromCenter.y*this.targetScale+options.offset.y};if(options.animation.duration===0){if(this.lockedOnNodeId!=undefined){this.viewFunction=this._lockedRedraw.bind(this);this.body.emitter.on(\"initRedraw\",this.viewFunction)}else{this.body.view.scale=this.targetScale;this.body.view.translation=this.targetTranslation;this.body.emitter.emit(\"_requestRedraw\")}}else{this.animationSpeed=1/(60*options.animation.duration*.001)||1/60;this.animationEasingFunction=options.animation.easingFunction;this.viewFunction=this._transitionRedraw.bind(this);this.body.emitter.on(\"initRedraw\",this.viewFunction);this.body.emitter.emit(\"_startRendering\")}}},{key:\"_lockedRedraw\",value:function _lockedRedraw(){var nodePosition={x:this.body.nodes[this.lockedOnNodeId].x,y:this.body.nodes[this.lockedOnNodeId].y};var viewCenter=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight});var distanceFromCenter={x:viewCenter.x-nodePosition.x,y:viewCenter.y-nodePosition.y};var sourceTranslation=this.body.view.translation;var targetTranslation={x:sourceTranslation.x+distanceFromCenter.x*this.body.view.scale+this.lockedOnNodeOffset.x,y:sourceTranslation.y+distanceFromCenter.y*this.body.view.scale+this.lockedOnNodeOffset.y};this.body.view.translation=targetTranslation}},{key:\"releaseNode\",value:function releaseNode(){if(this.lockedOnNodeId!==undefined&&this.viewFunction!==undefined){this.body.emitter.off(\"initRedraw\",this.viewFunction);this.lockedOnNodeId=undefined;this.lockedOnNodeOffset=undefined}}},{key:\"_transitionRedraw\",value:function _transitionRedraw(){var finished=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;this.easingTime+=this.animationSpeed;this.easingTime=finished===true?1:this.easingTime;var progress=util.easingFunctions[this.animationEasingFunction](this.easingTime);this.body.view.scale=this.sourceScale+(this.targetScale-this.sourceScale)*progress;this.body.view.translation={x:this.sourceTranslation.x+(this.targetTranslation.x-this.sourceTranslation.x)*progress,y:this.sourceTranslation.y+(this.targetTranslation.y-this.sourceTranslation.y)*progress};if(this.easingTime>=1){this.body.emitter.off(\"initRedraw\",this.viewFunction);this.easingTime=0;if(this.lockedOnNodeId!=undefined){this.viewFunction=this._lockedRedraw.bind(this);this.body.emitter.on(\"initRedraw\",this.viewFunction)}this.body.emitter.emit(\"animationFinished\")}}},{key:\"getScale\",value:function getScale(){return this.body.view.scale}},{key:\"getViewPosition\",value:function getViewPosition(){return this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight})}}]);return View}();exports[\"default\"]=View},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var NavigationHandler=__webpack_require__(233)[\"default\"];var Popup=__webpack_require__(104)[\"default\"];var InteractionHandler=function(){function InteractionHandler(body,canvas,selectionHandler){(0,_classCallCheck3[\"default\"])(this,InteractionHandler);this.body=body;this.canvas=canvas;this.selectionHandler=selectionHandler;this.navigationHandler=new NavigationHandler(body,canvas);this.body.eventListeners.onTap=this.onTap.bind(this);this.body.eventListeners.onTouch=this.onTouch.bind(this);this.body.eventListeners.onDoubleTap=this.onDoubleTap.bind(this);this.body.eventListeners.onHold=this.onHold.bind(this);this.body.eventListeners.onDragStart=this.onDragStart.bind(this);this.body.eventListeners.onDrag=this.onDrag.bind(this);this.body.eventListeners.onDragEnd=this.onDragEnd.bind(this);this.body.eventListeners.onMouseWheel=this.onMouseWheel.bind(this);this.body.eventListeners.onPinch=this.onPinch.bind(this);this.body.eventListeners.onMouseMove=this.onMouseMove.bind(this);this.body.eventListeners.onRelease=this.onRelease.bind(this);this.body.eventListeners.onContext=this.onContext.bind(this);this.touchTime=0;this.drag={};this.pinch={};this.popup=undefined;this.popupObj=undefined;this.popupTimer=undefined;this.body.functions.getPointer=this.getPointer.bind(this);this.options={};this.defaultOptions={dragNodes:true,dragView:true,hover:false,keyboard:{enabled:false,speed:{x:10,y:10,zoom:.02},bindToWindow:true},navigationButtons:false,tooltipDelay:300,zoomView:true};util.extend(this.options,this.defaultOptions);this.bindEventListeners()}(0,_createClass3[\"default\"])(InteractionHandler,[{key:\"bindEventListeners\",value:function bindEventListeners(){var _this=this;this.body.emitter.on(\"destroy\",function(){clearTimeout(_this.popupTimer);delete _this.body.functions.getPointer})}},{key:\"setOptions\",value:function setOptions(options){if(options!==undefined){var fields=[\"hideEdgesOnDrag\",\"hideNodesOnDrag\",\"keyboard\",\"multiselect\",\"selectable\",\"selectConnectedEdges\"];util.selectiveNotDeepExtend(fields,this.options,options);util.mergeOptions(this.options,options,\"keyboard\");if(options.tooltip){util.extend(this.options.tooltip,options.tooltip);if(options.tooltip.color){this.options.tooltip.color=util.parseColor(options.tooltip.color)}}}this.navigationHandler.setOptions(this.options)}},{key:\"getPointer\",value:function getPointer(touch){return{x:touch.x-util.getAbsoluteLeft(this.canvas.frame.canvas),y:touch.y-util.getAbsoluteTop(this.canvas.frame.canvas)}}},{key:\"onTouch\",value:function onTouch(event){if((new Date).valueOf()-this.touchTime>50){this.drag.pointer=this.getPointer(event.center);this.drag.pinched=false;this.pinch.scale=this.body.view.scale;this.touchTime=(new Date).valueOf()}}},{key:\"onTap\",value:function onTap(event){var pointer=this.getPointer(event.center);var multiselect=this.selectionHandler.options.multiselect&&(event.changedPointers[0].ctrlKey||event.changedPointers[0].metaKey);this.checkSelectionChanges(pointer,event,multiselect);this.selectionHandler._generateClickEvent(\"click\",event,pointer)}},{key:\"onDoubleTap\",value:function onDoubleTap(event){var pointer=this.getPointer(event.center);this.selectionHandler._generateClickEvent(\"doubleClick\",event,pointer)}},{key:\"onHold\",value:function onHold(event){var pointer=this.getPointer(event.center);var multiselect=this.selectionHandler.options.multiselect;this.checkSelectionChanges(pointer,event,multiselect);this.selectionHandler._generateClickEvent(\"click\",event,pointer);this.selectionHandler._generateClickEvent(\"hold\",event,pointer)}},{key:\"onRelease\",value:function onRelease(event){if((new Date).valueOf()-this.touchTime>10){var pointer=this.getPointer(event.center);this.selectionHandler._generateClickEvent(\"release\",event,pointer);this.touchTime=(new Date).valueOf()}}},{key:\"onContext\",value:function onContext(event){var pointer=this.getPointer({x:event.clientX,y:event.clientY});this.selectionHandler._generateClickEvent(\"oncontext\",event,pointer)}},{key:\"checkSelectionChanges\",value:function checkSelectionChanges(pointer,event){var add=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var previousSelection=this.selectionHandler.getSelection();var selected=false;if(add===true){selected=this.selectionHandler.selectAdditionalOnPoint(pointer)}else{selected=this.selectionHandler.selectOnPoint(pointer)}var currentSelection=this.selectionHandler.getSelection();var deselectedItems=this._determineDifference(previousSelection,currentSelection);var selectedItems=this._determineDifference(currentSelection,previousSelection);if(deselectedItems.edges.length>0){this.selectionHandler._generateClickEvent(\"deselectEdge\",event,pointer,previousSelection);selected=true}if(deselectedItems.nodes.length>0){this.selectionHandler._generateClickEvent(\"deselectNode\",event,pointer,previousSelection);selected=true}if(selectedItems.nodes.length>0){this.selectionHandler._generateClickEvent(\"selectNode\",event,pointer);selected=true}if(selectedItems.edges.length>0){this.selectionHandler._generateClickEvent(\"selectEdge\",event,pointer);selected=true}if(selected===true){this.selectionHandler._generateClickEvent(\"select\",event,pointer)}}},{key:\"_determineDifference\",value:function _determineDifference(firstSet,secondSet){var arrayDiff=function arrayDiff(firstArr,secondArr){var result=[];for(var i=0;i<firstArr.length;i++){var value=firstArr[i];if(secondArr.indexOf(value)===-1){result.push(value)}}return result};return{nodes:arrayDiff(firstSet.nodes,secondSet.nodes),edges:arrayDiff(firstSet.edges,secondSet.edges)}}},{key:\"onDragStart\",value:function onDragStart(event){if(this.drag.pointer===undefined){this.onTouch(event)}var node=this.selectionHandler.getNodeAt(this.drag.pointer);this.drag.dragging=true;this.drag.selection=[];this.drag.translation=util.extend({},this.body.view.translation);this.drag.nodeId=undefined;if(node!==undefined&&this.options.dragNodes===true){this.drag.nodeId=node.id;if(node.isSelected()===false){this.selectionHandler.unselectAll();this.selectionHandler.selectObject(node)}this.selectionHandler._generateClickEvent(\"dragStart\",event,this.drag.pointer);var selection=this.selectionHandler.selectionObj.nodes;for(var nodeId in selection){if(selection.hasOwnProperty(nodeId)){var object=selection[nodeId];var s={id:object.id,node:object,x:object.x,y:object.y,xFixed:object.options.fixed.x,yFixed:object.options.fixed.y};object.options.fixed.x=true;object.options.fixed.y=true;this.drag.selection.push(s)}}}else{this.selectionHandler._generateClickEvent(\"dragStart\",event,this.drag.pointer,undefined,true)}}},{key:\"onDrag\",value:function onDrag(event){var _this2=this;if(this.drag.pinched===true){return}this.body.emitter.emit(\"unlockNode\");var pointer=this.getPointer(event.center);var selection=this.drag.selection;if(selection&&selection.length&&this.options.dragNodes===true){this.selectionHandler._generateClickEvent(\"dragging\",event,pointer);var deltaX=pointer.x-this.drag.pointer.x;var deltaY=pointer.y-this.drag.pointer.y;selection.forEach(function(selection){var node=selection.node;if(selection.xFixed===false){node.x=_this2.canvas._XconvertDOMtoCanvas(_this2.canvas._XconvertCanvasToDOM(selection.x)+deltaX)}if(selection.yFixed===false){node.y=_this2.canvas._YconvertDOMtoCanvas(_this2.canvas._YconvertCanvasToDOM(selection.y)+deltaY)}});this.body.emitter.emit(\"startSimulation\")}else{if(this.options.dragView===true){this.selectionHandler._generateClickEvent(\"dragging\",event,pointer,undefined,true);if(this.drag.pointer===undefined){this.onDragStart(event);return}var diffX=pointer.x-this.drag.pointer.x;var diffY=pointer.y-this.drag.pointer.y;this.body.view.translation={x:this.drag.translation.x+diffX,y:this.drag.translation.y+diffY};this.body.emitter.emit(\"_requestRedraw\")}}}},{key:\"onDragEnd\",value:function onDragEnd(event){this.drag.dragging=false;var selection=this.drag.selection;if(selection&&selection.length){selection.forEach(function(s){s.node.options.fixed.x=s.xFixed;s.node.options.fixed.y=s.yFixed});this.selectionHandler._generateClickEvent(\"dragEnd\",event,this.getPointer(event.center));this.body.emitter.emit(\"startSimulation\")}else{this.selectionHandler._generateClickEvent(\"dragEnd\",event,this.getPointer(event.center),undefined,true);this.body.emitter.emit(\"_requestRedraw\")}}},{key:\"onPinch\",value:function onPinch(event){var pointer=this.getPointer(event.center);this.drag.pinched=true;if(this.pinch[\"scale\"]===undefined){this.pinch.scale=1}var scale=this.pinch.scale*event.scale;this.zoom(scale,pointer)}},{key:\"zoom\",value:function zoom(scale,pointer){if(this.options.zoomView===true){var scaleOld=this.body.view.scale;if(scale<1e-5){scale=1e-5}if(scale>10){scale=10}var preScaleDragPointer=undefined;if(this.drag!==undefined){if(this.drag.dragging===true){preScaleDragPointer=this.canvas.DOMtoCanvas(this.drag.pointer)}}var translation=this.body.view.translation;var scaleFrac=scale/scaleOld;var tx=(1-scaleFrac)*pointer.x+translation.x*scaleFrac;var ty=(1-scaleFrac)*pointer.y+translation.y*scaleFrac;this.body.view.scale=scale;this.body.view.translation={x:tx,y:ty};if(preScaleDragPointer!=undefined){var postScaleDragPointer=this.canvas.canvasToDOM(preScaleDragPointer);this.drag.pointer.x=postScaleDragPointer.x;this.drag.pointer.y=postScaleDragPointer.y}this.body.emitter.emit(\"_requestRedraw\");if(scaleOld<scale){this.body.emitter.emit(\"zoom\",{direction:\"+\",scale:this.body.view.scale,pointer:pointer})}else{this.body.emitter.emit(\"zoom\",{direction:\"-\",scale:this.body.view.scale,pointer:pointer})}}}},{key:\"onMouseWheel\",value:function onMouseWheel(event){if(this.options.zoomView===true){var delta=0;if(event.wheelDelta){delta=event.wheelDelta/120}else if(event.detail){delta=-event.detail/3}if(delta!==0){var scale=this.body.view.scale;var zoom=delta/10;if(delta<0){zoom=zoom/(1-zoom)}scale*=1+zoom;var pointer=this.getPointer({x:event.clientX,y:event.clientY});this.zoom(scale,pointer)}event.preventDefault()}}},{key:\"onMouseMove\",value:function onMouseMove(event){var _this3=this;var pointer=this.getPointer({x:event.clientX,y:event.clientY});var popupVisible=false;if(this.popup!==undefined){if(this.popup.hidden===false){this._checkHidePopup(pointer)}if(this.popup.hidden===false){popupVisible=true;this.popup.setPosition(pointer.x+3,pointer.y-5);this.popup.show()}}if(this.options.keyboard.bindToWindow===false&&this.options.keyboard.enabled===true){this.canvas.frame.focus()}if(popupVisible===false){if(this.popupTimer!==undefined){clearInterval(this.popupTimer);this.popupTimer=undefined}if(!this.drag.dragging){this.popupTimer=setTimeout(function(){return _this3._checkShowPopup(pointer)},this.options.tooltipDelay)}}if(this.options.hover===true){this.selectionHandler.hoverObject(event,pointer)}}},{key:\"_checkShowPopup\",value:function _checkShowPopup(pointer){var x=this.canvas._XconvertDOMtoCanvas(pointer.x);var y=this.canvas._YconvertDOMtoCanvas(pointer.y);var pointerObj={left:x,top:y,right:x,bottom:y};var previousPopupObjId=this.popupObj===undefined?undefined:this.popupObj.id;var nodeUnderCursor=false;var popupType=\"node\";if(this.popupObj===undefined){var nodeIndices=this.body.nodeIndices;var nodes=this.body.nodes;var node=void 0;var overlappingNodes=[];for(var i=0;i<nodeIndices.length;i++){node=nodes[nodeIndices[i]];if(node.isOverlappingWith(pointerObj)===true){if(node.getTitle()!==undefined){overlappingNodes.push(nodeIndices[i])}}}if(overlappingNodes.length>0){this.popupObj=nodes[overlappingNodes[overlappingNodes.length-1]];nodeUnderCursor=true}}if(this.popupObj===undefined&&nodeUnderCursor===false){var edgeIndices=this.body.edgeIndices;var edges=this.body.edges;var edge=void 0;var overlappingEdges=[];for(var _i=0;_i<edgeIndices.length;_i++){edge=edges[edgeIndices[_i]];if(edge.isOverlappingWith(pointerObj)===true){if(edge.connected===true&&edge.getTitle()!==undefined){overlappingEdges.push(edgeIndices[_i])}}}if(overlappingEdges.length>0){this.popupObj=edges[overlappingEdges[overlappingEdges.length-1]];popupType=\"edge\"}}if(this.popupObj!==undefined){if(this.popupObj.id!==previousPopupObjId){if(this.popup===undefined){this.popup=new Popup(this.canvas.frame)}this.popup.popupTargetType=popupType;this.popup.popupTargetId=this.popupObj.id;this.popup.setPosition(pointer.x+3,pointer.y-5);this.popup.setText(this.popupObj.getTitle());this.popup.show();this.body.emitter.emit(\"showPopup\",this.popupObj.id)}}else{if(this.popup!==undefined){this.popup.hide();this.body.emitter.emit(\"hidePopup\")}}}},{key:\"_checkHidePopup\",value:function _checkHidePopup(pointer){var pointerObj=this.selectionHandler._pointerToPositionObject(pointer);var stillOnObj=false;if(this.popup.popupTargetType===\"node\"){if(this.body.nodes[this.popup.popupTargetId]!==undefined){stillOnObj=this.body.nodes[this.popup.popupTargetId].isOverlappingWith(pointerObj);if(stillOnObj===true){var overNode=this.selectionHandler.getNodeAt(pointer);stillOnObj=overNode===undefined?false:overNode.id===this.popup.popupTargetId}}}else{if(this.selectionHandler.getNodeAt(pointer)===undefined){if(this.body.edges[this.popup.popupTargetId]!==undefined){stillOnObj=this.body.edges[this.popup.popupTargetId].isOverlappingWith(pointerObj)}}}if(stillOnObj===false){this.popupObj=undefined;this.popup.hide();this.body.emitter.emit(\"hidePopup\")}}}]);return InteractionHandler}();exports[\"default\"]=InteractionHandler},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Hammer=__webpack_require__(10);var hammerUtil=__webpack_require__(37);var keycharm=__webpack_require__(35);var NavigationHandler=function(){function NavigationHandler(body,canvas){var _this=this;(0,_classCallCheck3[\"default\"])(this,NavigationHandler);this.body=body;this.canvas=canvas;this.iconsCreated=false;this.navigationHammers=[];this.boundFunctions={};this.touchTime=0;this.activated=false;this.body.emitter.on(\"activate\",function(){_this.activated=true;_this.configureKeyboardBindings()});this.body.emitter.on(\"deactivate\",function(){_this.activated=false;_this.configureKeyboardBindings()});this.body.emitter.on(\"destroy\",function(){if(_this.keycharm!==undefined){_this.keycharm.destroy()}});this.options={}}(0,_createClass3[\"default\"])(NavigationHandler,[{key:\"setOptions\",value:function setOptions(options){if(options!==undefined){this.options=options;this.create()}}},{key:\"create\",value:function create(){if(this.options.navigationButtons===true){if(this.iconsCreated===false){this.loadNavigationElements()}}else if(this.iconsCreated===true){this.cleanNavigation()}this.configureKeyboardBindings()}},{key:\"cleanNavigation\",value:function cleanNavigation(){if(this.navigationHammers.length!=0){for(var i=0;i<this.navigationHammers.length;i++){this.navigationHammers[i].destroy()}this.navigationHammers=[]}if(this.navigationDOM&&this.navigationDOM[\"wrapper\"]&&this.navigationDOM[\"wrapper\"].parentNode){this.navigationDOM[\"wrapper\"].parentNode.removeChild(this.navigationDOM[\"wrapper\"])}this.iconsCreated=false}},{key:\"loadNavigationElements\",value:function loadNavigationElements(){var _this2=this;this.cleanNavigation();this.navigationDOM={};var navigationDivs=[\"up\",\"down\",\"left\",\"right\",\"zoomIn\",\"zoomOut\",\"zoomExtends\"];var navigationDivActions=[\"_moveUp\",\"_moveDown\",\"_moveLeft\",\"_moveRight\",\"_zoomIn\",\"_zoomOut\",\"_fit\"];this.navigationDOM[\"wrapper\"]=document.createElement(\"div\");this.navigationDOM[\"wrapper\"].className=\"vis-navigation\";this.canvas.frame.appendChild(this.navigationDOM[\"wrapper\"]);for(var i=0;i<navigationDivs.length;i++){this.navigationDOM[navigationDivs[i]]=document.createElement(\"div\");this.navigationDOM[navigationDivs[i]].className=\"vis-button vis-\"+navigationDivs[i];this.navigationDOM[\"wrapper\"].appendChild(this.navigationDOM[navigationDivs[i]]);var hammer=new Hammer(this.navigationDOM[navigationDivs[i]]);if(navigationDivActions[i]===\"_fit\"){hammerUtil.onTouch(hammer,this._fit.bind(this))}else{hammerUtil.onTouch(hammer,this.bindToRedraw.bind(this,navigationDivActions[i]))}this.navigationHammers.push(hammer)}var hammerFrame=new Hammer(this.canvas.frame);hammerUtil.onRelease(hammerFrame,function(){_this2._stopMovement()});this.navigationHammers.push(hammerFrame);this.iconsCreated=true}},{key:\"bindToRedraw\",value:function bindToRedraw(action){if(this.boundFunctions[action]===undefined){this.boundFunctions[action]=this[action].bind(this);this.body.emitter.on(\"initRedraw\",this.boundFunctions[action]);this.body.emitter.emit(\"_startRendering\")}}},{key:\"unbindFromRedraw\",value:function unbindFromRedraw(action){if(this.boundFunctions[action]!==undefined){this.body.emitter.off(\"initRedraw\",this.boundFunctions[action]);this.body.emitter.emit(\"_stopRendering\");delete this.boundFunctions[action]}}},{key:\"_fit\",value:function _fit(){if((new Date).valueOf()-this.touchTime>700){this.body.emitter.emit(\"fit\",{duration:700});this.touchTime=(new Date).valueOf()}}},{key:\"_stopMovement\",value:function _stopMovement(){for(var boundAction in this.boundFunctions){if(this.boundFunctions.hasOwnProperty(boundAction)){this.body.emitter.off(\"initRedraw\",this.boundFunctions[boundAction]);this.body.emitter.emit(\"_stopRendering\")}}this.boundFunctions={}}},{key:\"_moveUp\",value:function _moveUp(){this.body.view.translation.y+=this.options.keyboard.speed.y}},{key:\"_moveDown\",value:function _moveDown(){this.body.view.translation.y-=this.options.keyboard.speed.y}},{key:\"_moveLeft\",value:function _moveLeft(){this.body.view.translation.x+=this.options.keyboard.speed.x}},{key:\"_moveRight\",value:function _moveRight(){this.body.view.translation.x-=this.options.keyboard.speed.x}},{key:\"_zoomIn\",value:function _zoomIn(){var scaleOld=this.body.view.scale;var scale=this.body.view.scale*(1+this.options.keyboard.speed.zoom);var translation=this.body.view.translation;var scaleFrac=scale/scaleOld;var tx=(1-scaleFrac)*this.canvas.canvasViewCenter.x+translation.x*scaleFrac;var ty=(1-scaleFrac)*this.canvas.canvasViewCenter.y+translation.y*scaleFrac;this.body.view.scale=scale;this.body.view.translation={x:tx,y:ty};this.body.emitter.emit(\"zoom\",{direction:\"+\",scale:this.body.view.scale,pointer:null})}},{key:\"_zoomOut\",value:function _zoomOut(){var scaleOld=this.body.view.scale;var scale=this.body.view.scale/(1+this.options.keyboard.speed.zoom);var translation=this.body.view.translation;var scaleFrac=scale/scaleOld;var tx=(1-scaleFrac)*this.canvas.canvasViewCenter.x+translation.x*scaleFrac;var ty=(1-scaleFrac)*this.canvas.canvasViewCenter.y+translation.y*scaleFrac;this.body.view.scale=scale;this.body.view.translation={x:tx,y:ty};this.body.emitter.emit(\"zoom\",{direction:\"-\",scale:this.body.view.scale,pointer:null})}},{key:\"configureKeyboardBindings\",value:function configureKeyboardBindings(){var _this3=this;if(this.keycharm!==undefined){this.keycharm.destroy()}if(this.options.keyboard.enabled===true){if(this.options.keyboard.bindToWindow===true){this.keycharm=keycharm({container:window,preventDefault:true})}else{this.keycharm=keycharm({container:this.canvas.frame,preventDefault:true})}this.keycharm.reset();if(this.activated===true){this.keycharm.bind(\"up\",function(){_this3.bindToRedraw(\"_moveUp\")},\"keydown\");this.keycharm.bind(\"down\",function(){_this3.bindToRedraw(\"_moveDown\")},\"keydown\");this.keycharm.bind(\"left\",function(){_this3.bindToRedraw(\"_moveLeft\")},\"keydown\");this.keycharm.bind(\"right\",function(){_this3.bindToRedraw(\"_moveRight\")},\"keydown\");this.keycharm.bind(\"=\",function(){_this3.bindToRedraw(\"_zoomIn\")},\"keydown\");this.keycharm.bind(\"num+\",function(){_this3.bindToRedraw(\"_zoomIn\")},\"keydown\");this.keycharm.bind(\"num-\",function(){_this3.bindToRedraw(\"_zoomOut\")},\"keydown\");this.keycharm.bind(\"-\",function(){_this3.bindToRedraw(\"_zoomOut\")},\"keydown\");this.keycharm.bind(\"[\",function(){_this3.bindToRedraw(\"_zoomOut\")},\"keydown\");this.keycharm.bind(\"]\",function(){_this3.bindToRedraw(\"_zoomIn\")},\"keydown\");this.keycharm.bind(\"pageup\",function(){_this3.bindToRedraw(\"_zoomIn\")},\"keydown\");this.keycharm.bind(\"pagedown\",function(){_this3.bindToRedraw(\"_zoomOut\")},\"keydown\");this.keycharm.bind(\"up\",function(){_this3.unbindFromRedraw(\"_moveUp\")},\"keyup\");this.keycharm.bind(\"down\",function(){_this3.unbindFromRedraw(\"_moveDown\")},\"keyup\");this.keycharm.bind(\"left\",function(){_this3.unbindFromRedraw(\"_moveLeft\")},\"keyup\");this.keycharm.bind(\"right\",function(){_this3.unbindFromRedraw(\"_moveRight\")},\"keyup\");this.keycharm.bind(\"=\",function(){_this3.unbindFromRedraw(\"_zoomIn\")},\"keyup\");this.keycharm.bind(\"num+\",function(){_this3.unbindFromRedraw(\"_zoomIn\")},\"keyup\");this.keycharm.bind(\"num-\",function(){_this3.unbindFromRedraw(\"_zoomOut\")},\"keyup\");this.keycharm.bind(\"-\",function(){_this3.unbindFromRedraw(\"_zoomOut\")},\"keyup\");this.keycharm.bind(\"[\",function(){_this3.unbindFromRedraw(\"_zoomOut\")},\"keyup\");this.keycharm.bind(\"]\",function(){_this3.unbindFromRedraw(\"_zoomIn\")},\"keyup\");this.keycharm.bind(\"pageup\",function(){_this3.unbindFromRedraw(\"_zoomIn\")},\"keyup\");this.keycharm.bind(\"pagedown\",function(){_this3.unbindFromRedraw(\"_zoomOut\")},\"keyup\")}}}}]);return NavigationHandler}();exports[\"default\"]=NavigationHandler},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var Node=__webpack_require__(47)[\"default\"];var Edge=__webpack_require__(74)[\"default\"];var util=__webpack_require__(2);var SelectionHandler=function(){function SelectionHandler(body,canvas){var _this=this;(0,_classCallCheck3[\"default\"])(this,SelectionHandler);this.body=body;this.canvas=canvas;this.selectionObj={nodes:[],edges:[]};this.hoverObj={nodes:{},edges:{}};this.options={};this.defaultOptions={multiselect:false,selectable:true,selectConnectedEdges:true,hoverConnectedEdges:true};util.extend(this.options,this.defaultOptions);this.body.emitter.on(\"_dataChanged\",function(){_this.updateSelection()})}(0,_createClass3[\"default\"])(SelectionHandler,[{key:\"setOptions\",value:function setOptions(options){if(options!==undefined){var fields=[\"multiselect\",\"hoverConnectedEdges\",\"selectable\",\"selectConnectedEdges\"];util.selectiveDeepExtend(fields,this.options,options)}}},{key:\"selectOnPoint\",value:function selectOnPoint(pointer){var selected=false;if(this.options.selectable===true){var obj=this.getNodeAt(pointer)||this.getEdgeAt(pointer);this.unselectAll();if(obj!==undefined){selected=this.selectObject(obj)}this.body.emitter.emit(\"_requestRedraw\")}return selected}},{key:\"selectAdditionalOnPoint\",value:function selectAdditionalOnPoint(pointer){var selectionChanged=false;if(this.options.selectable===true){var obj=this.getNodeAt(pointer)||this.getEdgeAt(pointer);if(obj!==undefined){selectionChanged=true;if(obj.isSelected()===true){this.deselectObject(obj)}else{this.selectObject(obj)}this.body.emitter.emit(\"_requestRedraw\")}}return selectionChanged}},{key:\"_initBaseEvent\",value:function _initBaseEvent(event,pointer){var properties={};properties[\"pointer\"]={DOM:{\nx:pointer.x,y:pointer.y},canvas:this.canvas.DOMtoCanvas(pointer)};properties[\"event\"]=event;return properties}},{key:\"_generateClickEvent\",value:function _generateClickEvent(eventType,event,pointer,oldSelection){var emptySelection=arguments.length>4&&arguments[4]!==undefined?arguments[4]:false;var properties=this._initBaseEvent(event,pointer);if(emptySelection===true){properties.nodes=[];properties.edges=[]}else{var tmp=this.getSelection();properties.nodes=tmp.nodes;properties.edges=tmp.edges}if(oldSelection!==undefined){properties[\"previousSelection\"]=oldSelection}if(eventType==\"click\"){properties.items=this.getClickedItems(pointer)}this.body.emitter.emit(eventType,properties)}},{key:\"selectObject\",value:function selectObject(obj){var highlightEdges=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this.options.selectConnectedEdges;if(obj!==undefined){if(obj instanceof Node){if(highlightEdges===true){this._selectConnectedEdges(obj)}}obj.select();this._addToSelection(obj);return true}return false}},{key:\"deselectObject\",value:function deselectObject(obj){if(obj.isSelected()===true){obj.selected=false;this._removeFromSelection(obj)}}},{key:\"_getAllNodesOverlappingWith\",value:function _getAllNodesOverlappingWith(object){var overlappingNodes=[];var nodes=this.body.nodes;for(var i=0;i<this.body.nodeIndices.length;i++){var nodeId=this.body.nodeIndices[i];if(nodes[nodeId].isOverlappingWith(object)){overlappingNodes.push(nodeId)}}return overlappingNodes}},{key:\"_pointerToPositionObject\",value:function _pointerToPositionObject(pointer){var canvasPos=this.canvas.DOMtoCanvas(pointer);return{left:canvasPos.x-1,top:canvasPos.y+1,right:canvasPos.x+1,bottom:canvasPos.y-1}}},{key:\"getNodeAt\",value:function getNodeAt(pointer){var returnNode=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;var positionObject=this._pointerToPositionObject(pointer);var overlappingNodes=this._getAllNodesOverlappingWith(positionObject);if(overlappingNodes.length>0){if(returnNode===true){return this.body.nodes[overlappingNodes[overlappingNodes.length-1]]}else{return overlappingNodes[overlappingNodes.length-1]}}else{return undefined}}},{key:\"_getEdgesOverlappingWith\",value:function _getEdgesOverlappingWith(object,overlappingEdges){var edges=this.body.edges;for(var i=0;i<this.body.edgeIndices.length;i++){var edgeId=this.body.edgeIndices[i];if(edges[edgeId].isOverlappingWith(object)){overlappingEdges.push(edgeId)}}}},{key:\"_getAllEdgesOverlappingWith\",value:function _getAllEdgesOverlappingWith(object){var overlappingEdges=[];this._getEdgesOverlappingWith(object,overlappingEdges);return overlappingEdges}},{key:\"getEdgeAt\",value:function getEdgeAt(pointer){var returnEdge=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;var canvasPos=this.canvas.DOMtoCanvas(pointer);var mindist=10;var overlappingEdge=null;var edges=this.body.edges;for(var i=0;i<this.body.edgeIndices.length;i++){var edgeId=this.body.edgeIndices[i];var edge=edges[edgeId];if(edge.connected){var xFrom=edge.from.x;var yFrom=edge.from.y;var xTo=edge.to.x;var yTo=edge.to.y;var dist=edge.edgeType.getDistanceToEdge(xFrom,yFrom,xTo,yTo,canvasPos.x,canvasPos.y);if(dist<mindist){overlappingEdge=edgeId;mindist=dist}}}if(overlappingEdge!==null){if(returnEdge===true){return this.body.edges[overlappingEdge]}else{return overlappingEdge}}else{return undefined}}},{key:\"_addToSelection\",value:function _addToSelection(obj){if(obj instanceof Node){this.selectionObj.nodes[obj.id]=obj}else{this.selectionObj.edges[obj.id]=obj}}},{key:\"_addToHover\",value:function _addToHover(obj){if(obj instanceof Node){this.hoverObj.nodes[obj.id]=obj}else{this.hoverObj.edges[obj.id]=obj}}},{key:\"_removeFromSelection\",value:function _removeFromSelection(obj){if(obj instanceof Node){delete this.selectionObj.nodes[obj.id];this._unselectConnectedEdges(obj)}else{delete this.selectionObj.edges[obj.id]}}},{key:\"unselectAll\",value:function unselectAll(){for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){this.selectionObj.nodes[nodeId].unselect()}}for(var edgeId in this.selectionObj.edges){if(this.selectionObj.edges.hasOwnProperty(edgeId)){this.selectionObj.edges[edgeId].unselect()}}this.selectionObj={nodes:{},edges:{}}}},{key:\"_getSelectedNodeCount\",value:function _getSelectedNodeCount(){var count=0;for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){count+=1}}return count}},{key:\"_getSelectedNode\",value:function _getSelectedNode(){for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){return this.selectionObj.nodes[nodeId]}}return undefined}},{key:\"_getSelectedEdge\",value:function _getSelectedEdge(){for(var edgeId in this.selectionObj.edges){if(this.selectionObj.edges.hasOwnProperty(edgeId)){return this.selectionObj.edges[edgeId]}}return undefined}},{key:\"_getSelectedEdgeCount\",value:function _getSelectedEdgeCount(){var count=0;for(var edgeId in this.selectionObj.edges){if(this.selectionObj.edges.hasOwnProperty(edgeId)){count+=1}}return count}},{key:\"_getSelectedObjectCount\",value:function _getSelectedObjectCount(){var count=0;for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){count+=1}}for(var edgeId in this.selectionObj.edges){if(this.selectionObj.edges.hasOwnProperty(edgeId)){count+=1}}return count}},{key:\"_selectionIsEmpty\",value:function _selectionIsEmpty(){for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){return false}}for(var edgeId in this.selectionObj.edges){if(this.selectionObj.edges.hasOwnProperty(edgeId)){return false}}return true}},{key:\"_clusterInSelection\",value:function _clusterInSelection(){for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){if(this.selectionObj.nodes[nodeId].clusterSize>1){return true}}}return false}},{key:\"_selectConnectedEdges\",value:function _selectConnectedEdges(node){for(var i=0;i<node.edges.length;i++){var edge=node.edges[i];edge.select();this._addToSelection(edge)}}},{key:\"_hoverConnectedEdges\",value:function _hoverConnectedEdges(node){for(var i=0;i<node.edges.length;i++){var edge=node.edges[i];edge.hover=true;this._addToHover(edge)}}},{key:\"_unselectConnectedEdges\",value:function _unselectConnectedEdges(node){for(var i=0;i<node.edges.length;i++){var edge=node.edges[i];edge.unselect();this._removeFromSelection(edge)}}},{key:\"emitBlurEvent\",value:function emitBlurEvent(event,pointer,object){var properties=this._initBaseEvent(event,pointer);if(object.hover===true){object.hover=false;if(object instanceof Node){properties.node=object.id;this.body.emitter.emit(\"blurNode\",properties)}else{properties.edge=object.id;this.body.emitter.emit(\"blurEdge\",properties)}}}},{key:\"emitHoverEvent\",value:function emitHoverEvent(event,pointer,object){var properties=this._initBaseEvent(event,pointer);var hoverChanged=false;if(object.hover===false){object.hover=true;this._addToHover(object);hoverChanged=true;if(object instanceof Node){properties.node=object.id;this.body.emitter.emit(\"hoverNode\",properties)}else{properties.edge=object.id;this.body.emitter.emit(\"hoverEdge\",properties)}}return hoverChanged}},{key:\"hoverObject\",value:function hoverObject(event,pointer){var object=this.getNodeAt(pointer);if(object===undefined){object=this.getEdgeAt(pointer)}var hoverChanged=false;for(var nodeId in this.hoverObj.nodes){if(this.hoverObj.nodes.hasOwnProperty(nodeId)){if(object===undefined||object instanceof Node&&object.id!=nodeId||object instanceof Edge){this.emitBlurEvent(event,pointer,this.hoverObj.nodes[nodeId]);delete this.hoverObj.nodes[nodeId];hoverChanged=true}}}for(var edgeId in this.hoverObj.edges){if(this.hoverObj.edges.hasOwnProperty(edgeId)){if(hoverChanged===true){this.hoverObj.edges[edgeId].hover=false;delete this.hoverObj.edges[edgeId]}else if(object===undefined||object instanceof Edge&&object.id!=edgeId||object instanceof Node&&!object.hover){this.emitBlurEvent(event,pointer,this.hoverObj.edges[edgeId]);delete this.hoverObj.edges[edgeId];hoverChanged=true}}}if(object!==undefined){hoverChanged=hoverChanged||this.emitHoverEvent(event,pointer,object);if(object instanceof Node&&this.options.hoverConnectedEdges===true){this._hoverConnectedEdges(object)}}if(hoverChanged===true){this.body.emitter.emit(\"_requestRedraw\")}}},{key:\"getSelection\",value:function getSelection(){var nodeIds=this.getSelectedNodes();var edgeIds=this.getSelectedEdges();return{nodes:nodeIds,edges:edgeIds}}},{key:\"getSelectedNodes\",value:function getSelectedNodes(){var idArray=[];if(this.options.selectable===true){for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){idArray.push(this.selectionObj.nodes[nodeId].id)}}}return idArray}},{key:\"getSelectedEdges\",value:function getSelectedEdges(){var idArray=[];if(this.options.selectable===true){for(var edgeId in this.selectionObj.edges){if(this.selectionObj.edges.hasOwnProperty(edgeId)){idArray.push(this.selectionObj.edges[edgeId].id)}}}return idArray}},{key:\"setSelection\",value:function setSelection(selection){var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var i=void 0,id=void 0;if(!selection||!selection.nodes&&!selection.edges)throw\"Selection must be an object with nodes and/or edges properties\";if(options.unselectAll||options.unselectAll===undefined){this.unselectAll()}if(selection.nodes){for(i=0;i<selection.nodes.length;i++){id=selection.nodes[i];var node=this.body.nodes[id];if(!node){throw new RangeError('Node with id \"'+id+'\" not found')}this.selectObject(node,options.highlightEdges)}}if(selection.edges){for(i=0;i<selection.edges.length;i++){id=selection.edges[i];var edge=this.body.edges[id];if(!edge){throw new RangeError('Edge with id \"'+id+'\" not found')}this.selectObject(edge)}}this.body.emitter.emit(\"_requestRedraw\")}},{key:\"selectNodes\",value:function selectNodes(selection){var highlightEdges=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;if(!selection||selection.length===undefined)throw\"Selection must be an array with ids\";this.setSelection({nodes:selection},{highlightEdges:highlightEdges})}},{key:\"selectEdges\",value:function selectEdges(selection){if(!selection||selection.length===undefined)throw\"Selection must be an array with ids\";this.setSelection({edges:selection})}},{key:\"updateSelection\",value:function updateSelection(){for(var nodeId in this.selectionObj.nodes){if(this.selectionObj.nodes.hasOwnProperty(nodeId)){if(!this.body.nodes.hasOwnProperty(nodeId)){delete this.selectionObj.nodes[nodeId]}}}for(var edgeId in this.selectionObj.edges){if(this.selectionObj.edges.hasOwnProperty(edgeId)){if(!this.body.edges.hasOwnProperty(edgeId)){delete this.selectionObj.edges[edgeId]}}}}},{key:\"getClickedItems\",value:function getClickedItems(pointer){var point=this.canvas.DOMtoCanvas(pointer);var items=[];var nodeIndices=this.body.nodeIndices;var nodes=this.body.nodes;for(var i=nodeIndices.length-1;i>=0;i--){var node=nodes[nodeIndices[i]];var ret=node.getItemsOnPoint(point);items.push.apply(items,ret)}var edgeIndices=this.body.edgeIndices;var edges=this.body.edges;for(var _i=edgeIndices.length-1;_i>=0;_i--){var edge=edges[edgeIndices[_i]];var _ret=edge.getItemsOnPoint(point);items.push.apply(items,_ret)}return items}}]);return SelectionHandler}();exports[\"default\"]=SelectionHandler},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _slicedToArray2=__webpack_require__(30);var _slicedToArray3=_interopRequireDefault(_slicedToArray2);var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);var _keys=__webpack_require__(8);var _keys2=_interopRequireDefault(_keys);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var NetworkUtil=__webpack_require__(76)[\"default\"];var _require=__webpack_require__(236),HorizontalStrategy=_require.HorizontalStrategy,VerticalStrategy=_require.VerticalStrategy;var HierarchicalStatus=function(){function HierarchicalStatus(){(0,_classCallCheck3[\"default\"])(this,HierarchicalStatus);this.childrenReference={};this.parentReference={};this.trees={};this.distributionOrdering={};this.levels={};this.distributionIndex={};this.isTree=false;this.treeIndex=-1}(0,_createClass3[\"default\"])(HierarchicalStatus,[{key:\"addRelation\",value:function addRelation(parentNodeId,childNodeId){if(this.childrenReference[parentNodeId]===undefined){this.childrenReference[parentNodeId]=[]}this.childrenReference[parentNodeId].push(childNodeId);if(this.parentReference[childNodeId]===undefined){this.parentReference[childNodeId]=[]}this.parentReference[childNodeId].push(parentNodeId)}},{key:\"checkIfTree\",value:function checkIfTree(){for(var i in this.parentReference){if(this.parentReference[i].length>1){this.isTree=false;return}}this.isTree=true}},{key:\"numTrees\",value:function numTrees(){return this.treeIndex+1}},{key:\"setTreeIndex\",value:function setTreeIndex(node,treeId){if(treeId===undefined)return;if(this.trees[node.id]===undefined){this.trees[node.id]=treeId;this.treeIndex=Math.max(treeId,this.treeIndex)}}},{key:\"ensureLevel\",value:function ensureLevel(nodeId){if(this.levels[nodeId]===undefined){this.levels[nodeId]=0}}},{key:\"getMaxLevel\",value:function getMaxLevel(nodeId){var _this=this;var accumulator={};var _getMaxLevel=function _getMaxLevel(nodeId){if(accumulator[nodeId]!==undefined){return accumulator[nodeId]}var level=_this.levels[nodeId];if(_this.childrenReference[nodeId]){var children=_this.childrenReference[nodeId];if(children.length>0){for(var i=0;i<children.length;i++){level=Math.max(level,_getMaxLevel(children[i]))}}}accumulator[nodeId]=level;return level};return _getMaxLevel(nodeId)}},{key:\"levelDownstream\",value:function levelDownstream(nodeA,nodeB){if(this.levels[nodeB.id]===undefined){if(this.levels[nodeA.id]===undefined){this.levels[nodeA.id]=0}this.levels[nodeB.id]=this.levels[nodeA.id]+1}}},{key:\"setMinLevelToZero\",value:function setMinLevelToZero(nodes){var minLevel=1e9;for(var nodeId in nodes){if(nodes.hasOwnProperty(nodeId)){if(this.levels[nodeId]!==undefined){minLevel=Math.min(this.levels[nodeId],minLevel)}}}for(var _nodeId in nodes){if(nodes.hasOwnProperty(_nodeId)){if(this.levels[_nodeId]!==undefined){this.levels[_nodeId]-=minLevel}}}}},{key:\"getTreeSize\",value:function getTreeSize(nodes,index){var min_x=1e9;var max_x=-1e9;var min_y=1e9;var max_y=-1e9;for(var nodeId in this.trees){if(this.trees.hasOwnProperty(nodeId)){if(this.trees[nodeId]===index){var node=nodes[nodeId];min_x=Math.min(node.x,min_x);max_x=Math.max(node.x,max_x);min_y=Math.min(node.y,min_y);max_y=Math.max(node.y,max_y)}}}return{min_x:min_x,max_x:max_x,min_y:min_y,max_y:max_y}}},{key:\"hasSameParent\",value:function hasSameParent(node1,node2){var parents1=this.parentReference[node1.id];var parents2=this.parentReference[node2.id];if(parents1===undefined||parents2===undefined){return false}for(var i=0;i<parents1.length;i++){for(var j=0;j<parents2.length;j++){if(parents1[i]==parents2[j]){return true}}}return false}},{key:\"inSameSubNetwork\",value:function inSameSubNetwork(node1,node2){return this.trees[node1.id]===this.trees[node2.id]}},{key:\"getLevels\",value:function getLevels(){return(0,_keys2[\"default\"])(this.distributionOrdering)}},{key:\"addToOrdering\",value:function addToOrdering(node,level){if(this.distributionOrdering[level]===undefined){this.distributionOrdering[level]=[]}var isPresent=false;var curLevel=this.distributionOrdering[level];for(var n in curLevel){if(curLevel[n]===node){isPresent=true;break}}if(!isPresent){this.distributionOrdering[level].push(node);this.distributionIndex[node.id]=this.distributionOrdering[level].length-1}}}]);return HierarchicalStatus}();var LayoutEngine=function(){function LayoutEngine(body){(0,_classCallCheck3[\"default\"])(this,LayoutEngine);this.body=body;this.initialRandomSeed=Math.round(Math.random()*1e6);this.randomSeed=this.initialRandomSeed;this.setPhysics=false;this.options={};this.optionsBackup={physics:{}};this.defaultOptions={randomSeed:undefined,improvedLayout:true,hierarchical:{enabled:false,levelSeparation:150,nodeSpacing:100,treeSpacing:200,blockShifting:true,edgeMinimization:true,parentCentralization:true,direction:\"UD\",sortMethod:\"hubsize\"}};util.extend(this.options,this.defaultOptions);this.bindEventListeners()}(0,_createClass3[\"default\"])(LayoutEngine,[{key:\"bindEventListeners\",value:function bindEventListeners(){var _this2=this;this.body.emitter.on(\"_dataChanged\",function(){_this2.setupHierarchicalLayout()});this.body.emitter.on(\"_dataLoaded\",function(){_this2.layoutNetwork()});this.body.emitter.on(\"_resetHierarchicalLayout\",function(){_this2.setupHierarchicalLayout()});this.body.emitter.on(\"_adjustEdgesForHierarchicalLayout\",function(){if(_this2.options.hierarchical.enabled!==true){return}var type=_this2.direction.curveType();_this2.body.emitter.emit(\"_forceDisableDynamicCurves\",type,false)})}},{key:\"setOptions\",value:function setOptions(options,allOptions){if(options!==undefined){var hierarchical=this.options.hierarchical;var prevHierarchicalState=hierarchical.enabled;util.selectiveDeepExtend([\"randomSeed\",\"improvedLayout\"],this.options,options);util.mergeOptions(this.options,options,\"hierarchical\");if(options.randomSeed!==undefined){this.initialRandomSeed=options.randomSeed}if(hierarchical.enabled===true){if(prevHierarchicalState===true){this.body.emitter.emit(\"refresh\",true)}if(hierarchical.direction===\"RL\"||hierarchical.direction===\"DU\"){if(hierarchical.levelSeparation>0){hierarchical.levelSeparation*=-1}}else{if(hierarchical.levelSeparation<0){hierarchical.levelSeparation*=-1}}this.setDirectionStrategy();this.body.emitter.emit(\"_resetHierarchicalLayout\");return this.adaptAllOptionsForHierarchicalLayout(allOptions)}else{if(prevHierarchicalState===true){this.body.emitter.emit(\"refresh\");return util.deepExtend(allOptions,this.optionsBackup)}}}return allOptions}},{key:\"adaptAllOptionsForHierarchicalLayout\",value:function adaptAllOptionsForHierarchicalLayout(allOptions){if(this.options.hierarchical.enabled===true){var backupPhysics=this.optionsBackup.physics;if(allOptions.physics===undefined||allOptions.physics===true){allOptions.physics={enabled:backupPhysics.enabled===undefined?true:backupPhysics.enabled,solver:\"hierarchicalRepulsion\"};backupPhysics.enabled=backupPhysics.enabled===undefined?true:backupPhysics.enabled;backupPhysics.solver=backupPhysics.solver||\"barnesHut\"}else if((0,_typeof3[\"default\"])(allOptions.physics)===\"object\"){backupPhysics.enabled=allOptions.physics.enabled===undefined?true:allOptions.physics.enabled;backupPhysics.solver=allOptions.physics.solver||\"barnesHut\";allOptions.physics.solver=\"hierarchicalRepulsion\"}else if(allOptions.physics!==false){backupPhysics.solver=\"barnesHut\";allOptions.physics={solver:\"hierarchicalRepulsion\"}}var type=this.direction.curveType();if(allOptions.edges===undefined){this.optionsBackup.edges={smooth:{enabled:true,type:\"dynamic\"}};allOptions.edges={smooth:false}}else if(allOptions.edges.smooth===undefined){this.optionsBackup.edges={smooth:{enabled:true,type:\"dynamic\"}};allOptions.edges.smooth=false}else{if(typeof allOptions.edges.smooth===\"boolean\"){this.optionsBackup.edges={smooth:allOptions.edges.smooth};allOptions.edges.smooth={enabled:allOptions.edges.smooth,type:type}}else{var smooth=allOptions.edges.smooth;if(smooth.type!==undefined&&smooth.type!==\"dynamic\"){type=smooth.type}this.optionsBackup.edges={smooth:smooth.enabled===undefined?true:smooth.enabled,type:smooth.type===undefined?\"dynamic\":smooth.type,roundness:smooth.roundness===undefined?.5:smooth.roundness,forceDirection:smooth.forceDirection===undefined?false:smooth.forceDirection};allOptions.edges.smooth={enabled:smooth.enabled===undefined?true:smooth.enabled,type:type,roundness:smooth.roundness===undefined?.5:smooth.roundness,forceDirection:smooth.forceDirection===undefined?false:smooth.forceDirection}}}this.body.emitter.emit(\"_forceDisableDynamicCurves\",type)}return allOptions}},{key:\"seededRandom\",value:function seededRandom(){var x=Math.sin(this.randomSeed++)*1e4;return x-Math.floor(x)}},{key:\"positionInitially\",value:function positionInitially(nodesArray){if(this.options.hierarchical.enabled!==true){this.randomSeed=this.initialRandomSeed;var radius=nodesArray.length+50;for(var i=0;i<nodesArray.length;i++){var node=nodesArray[i];var angle=2*Math.PI*this.seededRandom();if(node.x===undefined){node.x=radius*Math.cos(angle)}if(node.y===undefined){node.y=radius*Math.sin(angle)}}}}},{key:\"layoutNetwork\",value:function layoutNetwork(){if(this.options.hierarchical.enabled!==true&&this.options.improvedLayout===true){var indices=this.body.nodeIndices;var positionDefined=0;for(var i=0;i<indices.length;i++){var node=this.body.nodes[indices[i]];if(node.predefinedPosition===true){positionDefined+=1}}if(positionDefined<.5*indices.length){var MAX_LEVELS=10;var level=0;var clusterThreshold=150;var clusterOptions={clusterNodeProperties:{shape:\"ellipse\",label:\"\",group:\"\",font:{multi:false}},clusterEdgeProperties:{label:\"\",font:{multi:false},smooth:{enabled:false}}};if(indices.length>clusterThreshold){var startLength=indices.length;while(indices.length>clusterThreshold&&level<=MAX_LEVELS){level+=1;var before=indices.length;if(level%3===0){this.body.modules.clustering.clusterBridges(clusterOptions)}else{this.body.modules.clustering.clusterOutliers(clusterOptions)}var after=indices.length;if(before==after&&level%3!==0){this._declusterAll();this.body.emitter.emit(\"_layoutFailed\");console.info(\"This network could not be positioned by this version of the improved layout algorithm.\"+\" Please disable improvedLayout for better performance.\");return}}this.body.modules.kamadaKawai.setOptions({springLength:Math.max(150,2*startLength)})}if(level>MAX_LEVELS){console.info(\"The clustering didn't succeed within the amount of interations allowed,\"+\" progressing with partial result.\")}this.body.modules.kamadaKawai.solve(indices,this.body.edgeIndices,true);this._shiftToCenter();var offset=70;for(var _i=0;_i<indices.length;_i++){var _node=this.body.nodes[indices[_i]];if(_node.predefinedPosition===false){_node.x+=(.5-this.seededRandom())*offset;_node.y+=(.5-this.seededRandom())*offset}}this._declusterAll();this.body.emitter.emit(\"_repositionBezierNodes\")}}}},{key:\"_shiftToCenter\",value:function _shiftToCenter(){var range=NetworkUtil.getRangeCore(this.body.nodes,this.body.nodeIndices);var center=NetworkUtil.findCenter(range);for(var i=0;i<this.body.nodeIndices.length;i++){var node=this.body.nodes[this.body.nodeIndices[i]];node.x-=center.x;node.y-=center.y}}},{key:\"_declusterAll\",value:function _declusterAll(){var clustersPresent=true;while(clustersPresent===true){clustersPresent=false;for(var i=0;i<this.body.nodeIndices.length;i++){if(this.body.nodes[this.body.nodeIndices[i]].isCluster===true){clustersPresent=true;this.body.modules.clustering.openCluster(this.body.nodeIndices[i],{},false)}}if(clustersPresent===true){this.body.emitter.emit(\"_dataChanged\")}}}},{key:\"getSeed\",value:function getSeed(){return this.initialRandomSeed}},{key:\"setupHierarchicalLayout\",value:function setupHierarchicalLayout(){if(this.options.hierarchical.enabled===true&&this.body.nodeIndices.length>0){var node=void 0,nodeId=void 0;var definedLevel=false;var undefinedLevel=false;this.lastNodeOnLevel={};this.hierarchical=new HierarchicalStatus;for(nodeId in this.body.nodes){if(this.body.nodes.hasOwnProperty(nodeId)){node=this.body.nodes[nodeId];if(node.options.level!==undefined){definedLevel=true;this.hierarchical.levels[nodeId]=node.options.level}else{undefinedLevel=true}}}if(undefinedLevel===true&&definedLevel===true){throw new Error(\"To use the hierarchical layout, nodes require either no predefined levels\"+\" or levels have to be defined for all nodes.\")}else{if(undefinedLevel===true){var sortMethod=this.options.hierarchical.sortMethod;if(sortMethod===\"hubsize\"){this._determineLevelsByHubsize()}else if(sortMethod===\"directed\"){this._determineLevelsDirected()}else if(sortMethod===\"custom\"){this._determineLevelsCustomCallback()}}for(var _nodeId2 in this.body.nodes){if(this.body.nodes.hasOwnProperty(_nodeId2)){this.hierarchical.ensureLevel(_nodeId2)}}var distribution=this._getDistribution();this._generateMap();this._placeNodesByHierarchy(distribution);this._condenseHierarchy();this._shiftToCenter()}}}},{key:\"_condenseHierarchy\",value:function _condenseHierarchy(){var _this3=this;var stillShifting=false;var branches={};var shiftTrees=function shiftTrees(){var treeSizes=getTreeSizes();var shiftBy=0;for(var i=0;i<treeSizes.length-1;i++){var diff=treeSizes[i].max-treeSizes[i+1].min;shiftBy+=diff+_this3.options.hierarchical.treeSpacing;shiftTree(i+1,shiftBy)}};var shiftTree=function shiftTree(index,offset){var trees=_this3.hierarchical.trees;for(var nodeId in trees){if(trees.hasOwnProperty(nodeId)){if(trees[nodeId]===index){_this3.direction.shift(nodeId,offset)}}}};var getTreeSizes=function getTreeSizes(){var treeWidths=[];for(var i=0;i<_this3.hierarchical.numTrees();i++){treeWidths.push(_this3.direction.getTreeSize(i))}return treeWidths};var getBranchNodes=function getBranchNodes(source,map){if(map[source.id]){return}map[source.id]=true;if(_this3.hierarchical.childrenReference[source.id]){var children=_this3.hierarchical.childrenReference[source.id];if(children.length>0){for(var i=0;i<children.length;i++){getBranchNodes(_this3.body.nodes[children[i]],map)}}}};var getBranchBoundary=function getBranchBoundary(branchMap){var maxLevel=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1e9;var minSpace=1e9;var maxSpace=1e9;var min=1e9;var max=-1e9;for(var branchNode in branchMap){if(branchMap.hasOwnProperty(branchNode)){var node=_this3.body.nodes[branchNode];var level=_this3.hierarchical.levels[node.id];var position=_this3.direction.getPosition(node);var _getSpaceAroundNode2=_this3._getSpaceAroundNode(node,branchMap),_getSpaceAroundNode3=(0,_slicedToArray3[\"default\"])(_getSpaceAroundNode2,2),minSpaceNode=_getSpaceAroundNode3[0],maxSpaceNode=_getSpaceAroundNode3[1];minSpace=Math.min(minSpaceNode,minSpace);maxSpace=Math.min(maxSpaceNode,maxSpace);if(level<=maxLevel){min=Math.min(position,min);max=Math.max(position,max)}}}return[min,max,minSpace,maxSpace]};var getCollisionLevel=function getCollisionLevel(node1,node2){var maxLevel1=_this3.hierarchical.getMaxLevel(node1.id);var maxLevel2=_this3.hierarchical.getMaxLevel(node2.id);return Math.min(maxLevel1,maxLevel2)};var shiftElementsCloser=function shiftElementsCloser(callback,levels,centerParents){var hier=_this3.hierarchical;for(var i=0;i<levels.length;i++){var level=levels[i];var levelNodes=hier.distributionOrdering[level];if(levelNodes.length>1){for(var j=0;j<levelNodes.length-1;j++){var node1=levelNodes[j];var node2=levelNodes[j+1];if(hier.hasSameParent(node1,node2)&&hier.inSameSubNetwork(node1,node2)){callback(node1,node2,centerParents)}}}}};var branchShiftCallback=function branchShiftCallback(node1,node2){var centerParent=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var pos1=_this3.direction.getPosition(node1);var pos2=_this3.direction.getPosition(node2);var diffAbs=Math.abs(pos2-pos1);var nodeSpacing=_this3.options.hierarchical.nodeSpacing;if(diffAbs>nodeSpacing){var branchNodes1={};var branchNodes2={};getBranchNodes(node1,branchNodes1);getBranchNodes(node2,branchNodes2);var maxLevel=getCollisionLevel(node1,node2);var branchNodeBoundary1=getBranchBoundary(branchNodes1,maxLevel);var branchNodeBoundary2=getBranchBoundary(branchNodes2,maxLevel);var max1=branchNodeBoundary1[1];var min2=branchNodeBoundary2[0];var minSpace2=branchNodeBoundary2[2];var diffBranch=Math.abs(max1-min2);if(diffBranch>nodeSpacing){var offset=max1-min2+nodeSpacing;if(offset<-minSpace2+nodeSpacing){offset=-minSpace2+nodeSpacing}if(offset<0){_this3._shiftBlock(node2.id,offset);stillShifting=true;if(centerParent===true)_this3._centerParent(node2)}}}};var minimizeEdgeLength=function minimizeEdgeLength(iterations,node){var nodeId=node.id;var allEdges=node.edges;var nodeLevel=_this3.hierarchical.levels[node.id];var C2=_this3.options.hierarchical.levelSeparation*_this3.options.hierarchical.levelSeparation;var referenceNodes={};var aboveEdges=[];for(var i=0;i<allEdges.length;i++){var edge=allEdges[i];if(edge.toId!=edge.fromId){var otherNode=edge.toId==nodeId?edge.from:edge.to;referenceNodes[allEdges[i].id]=otherNode;if(_this3.hierarchical.levels[otherNode.id]<nodeLevel){aboveEdges.push(edge)}}}var getFx=function getFx(point,edges){var sum=0;for(var _i2=0;_i2<edges.length;_i2++){if(referenceNodes[edges[_i2].id]!==undefined){var a=_this3.direction.getPosition(referenceNodes[edges[_i2].id])-point;sum+=a/Math.sqrt(a*a+C2)}}return sum};var getDFx=function getDFx(point,edges){var sum=0;for(var _i3=0;_i3<edges.length;_i3++){if(referenceNodes[edges[_i3].id]!==undefined){var a=_this3.direction.getPosition(referenceNodes[edges[_i3].id])-point;sum-=C2*Math.pow(a*a+C2,-1.5)}}return sum};var getGuess=function getGuess(iterations,edges){var guess=_this3.direction.getPosition(node);var guessMap={};for(var _i4=0;_i4<iterations;_i4++){var fx=getFx(guess,edges);var dfx=getDFx(guess,edges);var limit=40;var ratio=Math.max(-limit,Math.min(limit,Math.round(fx/dfx)));guess=guess-ratio;if(guessMap[guess]!==undefined){break}guessMap[guess]=_i4}return guess};var moveBranch=function moveBranch(guess){var nodePosition=_this3.direction.getPosition(node);if(branches[node.id]===undefined){var branchNodes={};getBranchNodes(node,branchNodes);branches[node.id]=branchNodes}var branchBoundary=getBranchBoundary(branches[node.id]);var minSpaceBranch=branchBoundary[2];var maxSpaceBranch=branchBoundary[3];var diff=guess-nodePosition;var branchOffset=0;if(diff>0){branchOffset=Math.min(diff,maxSpaceBranch-_this3.options.hierarchical.nodeSpacing)}else if(diff<0){branchOffset=-Math.min(-diff,minSpaceBranch-_this3.options.hierarchical.nodeSpacing)}if(branchOffset!=0){_this3._shiftBlock(node.id,branchOffset);stillShifting=true}};var moveNode=function moveNode(guess){var nodePosition=_this3.direction.getPosition(node);var _getSpaceAroundNode4=_this3._getSpaceAroundNode(node),_getSpaceAroundNode5=(0,_slicedToArray3[\"default\"])(_getSpaceAroundNode4,2),minSpace=_getSpaceAroundNode5[0],maxSpace=_getSpaceAroundNode5[1];var diff=guess-nodePosition;var newPosition=nodePosition;if(diff>0){newPosition=Math.min(nodePosition+(maxSpace-_this3.options.hierarchical.nodeSpacing),guess)}else if(diff<0){newPosition=Math.max(nodePosition-(minSpace-_this3.options.hierarchical.nodeSpacing),guess)}if(newPosition!==nodePosition){_this3.direction.setPosition(node,newPosition);stillShifting=true}};var guess=getGuess(iterations,aboveEdges);moveBranch(guess);guess=getGuess(iterations,allEdges);moveNode(guess)};var minimizeEdgeLengthBottomUp=function minimizeEdgeLengthBottomUp(iterations){var levels=_this3.hierarchical.getLevels();levels=levels.reverse();for(var i=0;i<iterations;i++){stillShifting=false;for(var j=0;j<levels.length;j++){var level=levels[j];var levelNodes=_this3.hierarchical.distributionOrdering[level];for(var k=0;k<levelNodes.length;k++){minimizeEdgeLength(1e3,levelNodes[k])}}if(stillShifting!==true){break}}};var shiftBranchesCloserBottomUp=function shiftBranchesCloserBottomUp(iterations){var levels=_this3.hierarchical.getLevels();levels=levels.reverse();for(var i=0;i<iterations;i++){stillShifting=false;shiftElementsCloser(branchShiftCallback,levels,true);if(stillShifting!==true){break}}};var centerAllParents=function centerAllParents(){for(var nodeId in _this3.body.nodes){if(_this3.body.nodes.hasOwnProperty(nodeId))_this3._centerParent(_this3.body.nodes[nodeId])}};var centerAllParentsBottomUp=function centerAllParentsBottomUp(){var levels=_this3.hierarchical.getLevels()\n;levels=levels.reverse();for(var i=0;i<levels.length;i++){var level=levels[i];var levelNodes=_this3.hierarchical.distributionOrdering[level];for(var j=0;j<levelNodes.length;j++){_this3._centerParent(levelNodes[j])}}};if(this.options.hierarchical.blockShifting===true){shiftBranchesCloserBottomUp(5);centerAllParents()}if(this.options.hierarchical.edgeMinimization===true){minimizeEdgeLengthBottomUp(20)}if(this.options.hierarchical.parentCentralization===true){centerAllParentsBottomUp()}shiftTrees()}},{key:\"_getSpaceAroundNode\",value:function _getSpaceAroundNode(node,map){var useMap=true;if(map===undefined){useMap=false}var level=this.hierarchical.levels[node.id];if(level!==undefined){var index=this.hierarchical.distributionIndex[node.id];var position=this.direction.getPosition(node);var ordering=this.hierarchical.distributionOrdering[level];var minSpace=1e9;var maxSpace=1e9;if(index!==0){var prevNode=ordering[index-1];if(useMap===true&&map[prevNode.id]===undefined||useMap===false){var prevPos=this.direction.getPosition(prevNode);minSpace=position-prevPos}}if(index!=ordering.length-1){var nextNode=ordering[index+1];if(useMap===true&&map[nextNode.id]===undefined||useMap===false){var nextPos=this.direction.getPosition(nextNode);maxSpace=Math.min(maxSpace,nextPos-position)}}return[minSpace,maxSpace]}else{return[0,0]}}},{key:\"_centerParent\",value:function _centerParent(node){if(this.hierarchical.parentReference[node.id]){var parents=this.hierarchical.parentReference[node.id];for(var i=0;i<parents.length;i++){var parentId=parents[i];var parentNode=this.body.nodes[parentId];var children=this.hierarchical.childrenReference[parentId];if(children!==undefined){var newPosition=this._getCenterPosition(children);var position=this.direction.getPosition(parentNode);var _getSpaceAroundNode6=this._getSpaceAroundNode(parentNode),_getSpaceAroundNode7=(0,_slicedToArray3[\"default\"])(_getSpaceAroundNode6,2),minSpace=_getSpaceAroundNode7[0],maxSpace=_getSpaceAroundNode7[1];var diff=position-newPosition;if(diff<0&&Math.abs(diff)<maxSpace-this.options.hierarchical.nodeSpacing||diff>0&&Math.abs(diff)<minSpace-this.options.hierarchical.nodeSpacing){this.direction.setPosition(parentNode,newPosition)}}}}}},{key:\"_placeNodesByHierarchy\",value:function _placeNodesByHierarchy(distribution){this.positionedNodes={};for(var level in distribution){if(distribution.hasOwnProperty(level)){var nodeArray=(0,_keys2[\"default\"])(distribution[level]);nodeArray=this._indexArrayToNodes(nodeArray);this.direction.sort(nodeArray);var handledNodeCount=0;for(var i=0;i<nodeArray.length;i++){var node=nodeArray[i];if(this.positionedNodes[node.id]===undefined){var spacing=this.options.hierarchical.nodeSpacing;var pos=spacing*handledNodeCount;if(handledNodeCount>0){pos=this.direction.getPosition(nodeArray[i-1])+spacing}this.direction.setPosition(node,pos,level);this._validatePositionAndContinue(node,level,pos);handledNodeCount++}}}}}},{key:\"_placeBranchNodes\",value:function _placeBranchNodes(parentId,parentLevel){var childRef=this.hierarchical.childrenReference[parentId];if(childRef===undefined){return}var childNodes=[];for(var i=0;i<childRef.length;i++){childNodes.push(this.body.nodes[childRef[i]])}this.direction.sort(childNodes);for(var _i5=0;_i5<childNodes.length;_i5++){var childNode=childNodes[_i5];var childNodeLevel=this.hierarchical.levels[childNode.id];if(childNodeLevel>parentLevel&&this.positionedNodes[childNode.id]===undefined){var spacing=this.options.hierarchical.nodeSpacing;var pos=void 0;if(_i5===0){pos=this.direction.getPosition(this.body.nodes[parentId])}else{pos=this.direction.getPosition(childNodes[_i5-1])+spacing}this.direction.setPosition(childNode,pos,childNodeLevel);this._validatePositionAndContinue(childNode,childNodeLevel,pos)}else{return}}var center=this._getCenterPosition(childNodes);this.direction.setPosition(this.body.nodes[parentId],center,parentLevel)}},{key:\"_validatePositionAndContinue\",value:function _validatePositionAndContinue(node,level,pos){if(!this.hierarchical.isTree)return;if(this.lastNodeOnLevel[level]!==undefined){var previousPos=this.direction.getPosition(this.body.nodes[this.lastNodeOnLevel[level]]);if(pos-previousPos<this.options.hierarchical.nodeSpacing){var diff=previousPos+this.options.hierarchical.nodeSpacing-pos;var sharedParent=this._findCommonParent(this.lastNodeOnLevel[level],node.id);this._shiftBlock(sharedParent.withChild,diff)}}this.lastNodeOnLevel[level]=node.id;this.positionedNodes[node.id]=true;this._placeBranchNodes(node.id,level)}},{key:\"_indexArrayToNodes\",value:function _indexArrayToNodes(idArray){var array=[];for(var i=0;i<idArray.length;i++){array.push(this.body.nodes[idArray[i]])}return array}},{key:\"_getDistribution\",value:function _getDistribution(){var distribution={};var nodeId=void 0,node=void 0;for(nodeId in this.body.nodes){if(this.body.nodes.hasOwnProperty(nodeId)){node=this.body.nodes[nodeId];var level=this.hierarchical.levels[nodeId]===undefined?0:this.hierarchical.levels[nodeId];this.direction.fix(node,level);if(distribution[level]===undefined){distribution[level]={}}distribution[level][nodeId]=node}}return distribution}},{key:\"_getActiveEdges\",value:function _getActiveEdges(node){var _this4=this;var result=[];util.forEach(node.edges,function(edge){if(_this4.body.edgeIndices.indexOf(edge.id)!==-1){result.push(edge)}});return result}},{key:\"_getHubSizes\",value:function _getHubSizes(){var _this5=this;var hubSizes={};var nodeIds=this.body.nodeIndices;util.forEach(nodeIds,function(nodeId){var node=_this5.body.nodes[nodeId];var hubSize=_this5._getActiveEdges(node).length;hubSizes[hubSize]=true});var result=[];util.forEach(hubSizes,function(size){result.push(Number(size))});result.sort(function(a,b){return b-a});return result}},{key:\"_determineLevelsByHubsize\",value:function _determineLevelsByHubsize(){var _this6=this;var levelDownstream=function levelDownstream(nodeA,nodeB){_this6.hierarchical.levelDownstream(nodeA,nodeB)};var hubSizes=this._getHubSizes();var _loop=function _loop(i){var hubSize=hubSizes[i];if(hubSize===0)return\"break\";util.forEach(_this6.body.nodeIndices,function(nodeId){var node=_this6.body.nodes[nodeId];if(hubSize===_this6._getActiveEdges(node).length){_this6._crawlNetwork(levelDownstream,nodeId)}})};for(var i=0;i<hubSizes.length;++i){var _ret=_loop(i);if(_ret===\"break\")break}}},{key:\"_determineLevelsCustomCallback\",value:function _determineLevelsCustomCallback(){var _this7=this;var minLevel=1e5;var customCallback=function customCallback(nodeA,nodeB,edge){};var levelByDirection=function levelByDirection(nodeA,nodeB,edge){var levelA=_this7.hierarchical.levels[nodeA.id];if(levelA===undefined){levelA=_this7.hierarchical.levels[nodeA.id]=minLevel}var diff=customCallback(NetworkUtil.cloneOptions(nodeA,\"node\"),NetworkUtil.cloneOptions(nodeB,\"node\"),NetworkUtil.cloneOptions(edge,\"edge\"));_this7.hierarchical.levels[nodeB.id]=levelA+diff};this._crawlNetwork(levelByDirection);this.hierarchical.setMinLevelToZero(this.body.nodes)}},{key:\"_determineLevelsDirected\",value:function _determineLevelsDirected(){var _this8=this;var minLevel=1e4;var isBidirectional=function isBidirectional(edge){util.forEach(_this8.body.edges,function(otherEdge){if(otherEdge.toId===edge.fromId&&otherEdge.fromId===edge.toId){return true}});return false};var levelByDirection=function levelByDirection(nodeA,nodeB,edge){var levelA=_this8.hierarchical.levels[nodeA.id];var levelB=_this8.hierarchical.levels[nodeB.id];if(isBidirectional(edge)&&levelA!==undefined&&levelB!==undefined){return}if(levelA===undefined){levelA=_this8.hierarchical.levels[nodeA.id]=minLevel}if(edge.toId==nodeB.id){_this8.hierarchical.levels[nodeB.id]=levelA+1}else{_this8.hierarchical.levels[nodeB.id]=levelA-1}};this._crawlNetwork(levelByDirection);this.hierarchical.setMinLevelToZero(this.body.nodes)}},{key:\"_generateMap\",value:function _generateMap(){var _this9=this;var fillInRelations=function fillInRelations(parentNode,childNode){if(_this9.hierarchical.levels[childNode.id]>_this9.hierarchical.levels[parentNode.id]){_this9.hierarchical.addRelation(parentNode.id,childNode.id)}};this._crawlNetwork(fillInRelations);this.hierarchical.checkIfTree()}},{key:\"_crawlNetwork\",value:function _crawlNetwork(){var _this10=this;var callback=arguments.length>0&&arguments[0]!==undefined?arguments[0]:function(){};var startingNodeId=arguments[1];var progress={};var crawler=function crawler(node,tree){if(progress[node.id]===undefined){_this10.hierarchical.setTreeIndex(node,tree);progress[node.id]=true;var childNode=void 0;var edges=_this10._getActiveEdges(node);for(var i=0;i<edges.length;i++){var edge=edges[i];if(edge.connected===true){if(edge.toId==node.id){childNode=edge.from}else{childNode=edge.to}if(node.id!=childNode.id){callback(node,childNode,edge);crawler(childNode,tree)}}}}};if(startingNodeId===undefined){var treeIndex=0;for(var i=0;i<this.body.nodeIndices.length;i++){var nodeId=this.body.nodeIndices[i];if(progress[nodeId]===undefined){var node=this.body.nodes[nodeId];crawler(node,treeIndex);treeIndex+=1}}}else{var _node2=this.body.nodes[startingNodeId];if(_node2===undefined){console.error(\"Node not found:\",startingNodeId);return}crawler(_node2)}}},{key:\"_shiftBlock\",value:function _shiftBlock(parentId,diff){var _this11=this;var progress={};var shifter=function shifter(parentId){if(progress[parentId]){return}progress[parentId]=true;_this11.direction.shift(parentId,diff);var childRef=_this11.hierarchical.childrenReference[parentId];if(childRef!==undefined){for(var i=0;i<childRef.length;i++){shifter(childRef[i])}}};shifter(parentId)}},{key:\"_findCommonParent\",value:function _findCommonParent(childA,childB){var _this12=this;var parents={};var iterateParents=function iterateParents(parents,child){var parentRef=_this12.hierarchical.parentReference[child];if(parentRef!==undefined){for(var i=0;i<parentRef.length;i++){var parent=parentRef[i];parents[parent]=true;iterateParents(parents,parent)}}};var findParent=function findParent(parents,child){var parentRef=_this12.hierarchical.parentReference[child];if(parentRef!==undefined){for(var i=0;i<parentRef.length;i++){var parent=parentRef[i];if(parents[parent]!==undefined){return{foundParent:parent,withChild:child}}var branch=findParent(parents,parent);if(branch.foundParent!==null){return branch}}}return{foundParent:null,withChild:child}};iterateParents(parents,childA);return findParent(parents,childB)}},{key:\"setDirectionStrategy\",value:function setDirectionStrategy(){var isVertical=this.options.hierarchical.direction===\"UD\"||this.options.hierarchical.direction===\"DU\";if(isVertical){this.direction=new VerticalStrategy(this)}else{this.direction=new HorizontalStrategy(this)}}},{key:\"_getCenterPosition\",value:function _getCenterPosition(childNodes){var minPos=1e9;var maxPos=-1e9;for(var i=0;i<childNodes.length;i++){var childNode=void 0;if(childNodes[i].id!==undefined){childNode=childNodes[i]}else{var childNodeId=childNodes[i];childNode=this.body.nodes[childNodeId]}var position=this.direction.getPosition(childNode);minPos=Math.min(minPos,position);maxPos=Math.max(maxPos,position)}return.5*(minPos+maxPos)}}]);return LayoutEngine}();exports[\"default\"]=LayoutEngine},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});exports.VerticalStrategy=exports.HorizontalStrategy=undefined;var _getPrototypeOf=__webpack_require__(3);var _getPrototypeOf2=_interopRequireDefault(_getPrototypeOf);var _possibleConstructorReturn2=__webpack_require__(4);var _possibleConstructorReturn3=_interopRequireDefault(_possibleConstructorReturn2);var _inherits2=__webpack_require__(5);var _inherits3=_interopRequireDefault(_inherits2);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var DirectionInterface=function(){function DirectionInterface(){(0,_classCallCheck3[\"default\"])(this,DirectionInterface)}(0,_createClass3[\"default\"])(DirectionInterface,[{key:\"abstract\",value:function abstract(){throw new Error(\"Can't instantiate abstract class!\")}},{key:\"fake_use\",value:function fake_use(){}},{key:\"curveType\",value:function curveType(){return this.abstract()}},{key:\"getPosition\",value:function getPosition(node){this.fake_use(node);return this.abstract()}},{key:\"setPosition\",value:function setPosition(node,position){var level=arguments.length>2&&arguments[2]!==undefined?arguments[2]:undefined;this.fake_use(node,position,level);this.abstract()}},{key:\"getTreeSize\",value:function getTreeSize(index){this.fake_use(index);return this.abstract()}},{key:\"sort\",value:function sort(nodeArray){this.fake_use(nodeArray);this.abstract()}},{key:\"fix\",value:function fix(node,level){this.fake_use(node,level);this.abstract()}},{key:\"shift\",value:function shift(nodeId,diff){this.fake_use(nodeId,diff);this.abstract()}}]);return DirectionInterface}();var VerticalStrategy=function(_DirectionInterface){(0,_inherits3[\"default\"])(VerticalStrategy,_DirectionInterface);function VerticalStrategy(layout){(0,_classCallCheck3[\"default\"])(this,VerticalStrategy);var _this=(0,_possibleConstructorReturn3[\"default\"])(this,(VerticalStrategy.__proto__||(0,_getPrototypeOf2[\"default\"])(VerticalStrategy)).call(this));_this.layout=layout;return _this}(0,_createClass3[\"default\"])(VerticalStrategy,[{key:\"curveType\",value:function curveType(){return\"horizontal\"}},{key:\"getPosition\",value:function getPosition(node){return node.x}},{key:\"setPosition\",value:function setPosition(node,position){var level=arguments.length>2&&arguments[2]!==undefined?arguments[2]:undefined;if(level!==undefined){this.layout.hierarchical.addToOrdering(node,level)}node.x=position}},{key:\"getTreeSize\",value:function getTreeSize(index){var res=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,index);return{min:res.min_x,max:res.max_x}}},{key:\"sort\",value:function sort(nodeArray){nodeArray.sort(function(a,b){if(a.x===undefined||b.x===undefined)return 0;return a.x-b.x})}},{key:\"fix\",value:function fix(node,level){node.y=this.layout.options.hierarchical.levelSeparation*level;node.options.fixed.y=true}},{key:\"shift\",value:function shift(nodeId,diff){this.layout.body.nodes[nodeId].x+=diff}}]);return VerticalStrategy}(DirectionInterface);var HorizontalStrategy=function(_DirectionInterface2){(0,_inherits3[\"default\"])(HorizontalStrategy,_DirectionInterface2);function HorizontalStrategy(layout){(0,_classCallCheck3[\"default\"])(this,HorizontalStrategy);var _this2=(0,_possibleConstructorReturn3[\"default\"])(this,(HorizontalStrategy.__proto__||(0,_getPrototypeOf2[\"default\"])(HorizontalStrategy)).call(this));_this2.layout=layout;return _this2}(0,_createClass3[\"default\"])(HorizontalStrategy,[{key:\"curveType\",value:function curveType(){return\"vertical\"}},{key:\"getPosition\",value:function getPosition(node){return node.y}},{key:\"setPosition\",value:function setPosition(node,position){var level=arguments.length>2&&arguments[2]!==undefined?arguments[2]:undefined;if(level!==undefined){this.layout.hierarchical.addToOrdering(node,level)}node.y=position}},{key:\"getTreeSize\",value:function getTreeSize(index){var res=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,index);return{min:res.min_y,max:res.max_y}}},{key:\"sort\",value:function sort(nodeArray){nodeArray.sort(function(a,b){if(a.y===undefined||b.y===undefined)return 0;return a.y-b.y})}},{key:\"fix\",value:function fix(node,level){node.x=this.layout.options.hierarchical.levelSeparation*level;node.options.fixed.x=true}},{key:\"shift\",value:function shift(nodeId,diff){this.layout.body.nodes[nodeId].y+=diff}}]);return HorizontalStrategy}(DirectionInterface);exports.HorizontalStrategy=HorizontalStrategy;exports.VerticalStrategy=VerticalStrategy},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _keys=__webpack_require__(8);var _keys2=_interopRequireDefault(_keys);var _stringify=__webpack_require__(19);var _stringify2=_interopRequireDefault(_stringify);var _typeof2=__webpack_require__(6);var _typeof3=_interopRequireDefault(_typeof2);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var util=__webpack_require__(2);var Hammer=__webpack_require__(10);var hammerUtil=__webpack_require__(37);var ManipulationSystem=function(){function ManipulationSystem(body,canvas,selectionHandler){var _this=this;(0,_classCallCheck3[\"default\"])(this,ManipulationSystem);this.body=body;this.canvas=canvas;this.selectionHandler=selectionHandler;this.editMode=false;this.manipulationDiv=undefined;this.editModeDiv=undefined;this.closeDiv=undefined;this.manipulationHammers=[];this.temporaryUIFunctions={};this.temporaryEventFunctions=[];this.touchTime=0;this.temporaryIds={nodes:[],edges:[]};this.guiEnabled=false;this.inMode=false;this.selectedControlNode=undefined;this.options={};this.defaultOptions={enabled:false,initiallyActive:false,addNode:true,addEdge:true,editNode:undefined,editEdge:true,deleteNode:true,deleteEdge:true,controlNodeStyle:{shape:\"dot\",size:6,color:{background:\"#ff0000\",border:\"#3c3c3c\",highlight:{background:\"#07f968\",border:\"#3c3c3c\"}},borderWidth:2,borderWidthSelected:2}};util.extend(this.options,this.defaultOptions);this.body.emitter.on(\"destroy\",function(){_this._clean()});this.body.emitter.on(\"_dataChanged\",this._restore.bind(this));this.body.emitter.on(\"_resetData\",this._restore.bind(this))}(0,_createClass3[\"default\"])(ManipulationSystem,[{key:\"_restore\",value:function _restore(){if(this.inMode!==false){if(this.options.initiallyActive===true){this.enableEditMode()}else{this.disableEditMode()}}}},{key:\"setOptions\",value:function setOptions(options,allOptions,globalOptions){if(allOptions!==undefined){if(allOptions.locale!==undefined){this.options.locale=allOptions.locale}else{this.options.locale=globalOptions.locale}if(allOptions.locales!==undefined){this.options.locales=allOptions.locales}else{this.options.locales=globalOptions.locales}}if(options!==undefined){if(typeof options===\"boolean\"){this.options.enabled=options}else{this.options.enabled=true;util.deepExtend(this.options,options)}if(this.options.initiallyActive===true){this.editMode=true}this._setup()}}},{key:\"toggleEditMode\",value:function toggleEditMode(){if(this.editMode===true){this.disableEditMode()}else{this.enableEditMode()}}},{key:\"enableEditMode\",value:function enableEditMode(){this.editMode=true;this._clean();if(this.guiEnabled===true){this.manipulationDiv.style.display=\"block\";this.closeDiv.style.display=\"block\";this.editModeDiv.style.display=\"none\";this.showManipulatorToolbar()}}},{key:\"disableEditMode\",value:function disableEditMode(){this.editMode=false;this._clean();if(this.guiEnabled===true){this.manipulationDiv.style.display=\"none\";this.closeDiv.style.display=\"none\";this.editModeDiv.style.display=\"block\";this._createEditButton()}}},{key:\"showManipulatorToolbar\",value:function showManipulatorToolbar(){this._clean();this.manipulationDOM={};if(this.guiEnabled===true){this.editMode=true;this.manipulationDiv.style.display=\"block\";this.closeDiv.style.display=\"block\";var selectedNodeCount=this.selectionHandler._getSelectedNodeCount();var selectedEdgeCount=this.selectionHandler._getSelectedEdgeCount();var selectedTotalCount=selectedNodeCount+selectedEdgeCount;var locale=this.options.locales[this.options.locale];var needSeperator=false;if(this.options.addNode!==false){this._createAddNodeButton(locale);needSeperator=true}if(this.options.addEdge!==false){if(needSeperator===true){this._createSeperator(1)}else{needSeperator=true}this._createAddEdgeButton(locale)}if(selectedNodeCount===1&&typeof this.options.editNode===\"function\"){if(needSeperator===true){this._createSeperator(2)}else{needSeperator=true}this._createEditNodeButton(locale)}else if(selectedEdgeCount===1&&selectedNodeCount===0&&this.options.editEdge!==false){if(needSeperator===true){this._createSeperator(3)}else{needSeperator=true}this._createEditEdgeButton(locale)}if(selectedTotalCount!==0){if(selectedNodeCount>0&&this.options.deleteNode!==false){if(needSeperator===true){this._createSeperator(4)}this._createDeleteButton(locale)}else if(selectedNodeCount===0&&this.options.deleteEdge!==false){if(needSeperator===true){this._createSeperator(4)}this._createDeleteButton(locale)}}this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this));this._temporaryBindEvent(\"select\",this.showManipulatorToolbar.bind(this))}this.body.emitter.emit(\"_redraw\")}},{key:\"addNodeMode\",value:function addNodeMode(){if(this.editMode!==true){this.enableEditMode()}this._clean();this.inMode=\"addNode\";if(this.guiEnabled===true){var locale=this.options.locales[this.options.locale];this.manipulationDOM={};this._createBackButton(locale);this._createSeperator();this._createDescription(locale[\"addDescription\"]||this.options.locales[\"en\"][\"addDescription\"]);this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindEvent(\"click\",this._performAddNode.bind(this))}},{key:\"editNode\",value:function editNode(){var _this2=this;if(this.editMode!==true){this.enableEditMode()}this._clean();var node=this.selectionHandler._getSelectedNode();if(node!==undefined){this.inMode=\"editNode\";if(typeof this.options.editNode===\"function\"){if(node.isCluster!==true){var data=util.deepExtend({},node.options,false);data.x=node.x;data.y=node.y;if(this.options.editNode.length===2){this.options.editNode(data,function(finalizedData){if(finalizedData!==null&&finalizedData!==undefined&&_this2.inMode===\"editNode\"){_this2.body.data.nodes.getDataSet().update(finalizedData)}_this2.showManipulatorToolbar()})}else{throw new Error(\"The function for edit does not support two arguments (data, callback)\")}}else{alert(this.options.locales[this.options.locale][\"editClusterError\"]||this.options.locales[\"en\"][\"editClusterError\"])}}else{throw new Error(\"No function has been configured to handle the editing of nodes.\")}}else{this.showManipulatorToolbar()}}},{key:\"addEdgeMode\",value:function addEdgeMode(){if(this.editMode!==true){this.enableEditMode()}this._clean();this.inMode=\"addEdge\";if(this.guiEnabled===true){var locale=this.options.locales[this.options.locale];this.manipulationDOM={};this._createBackButton(locale);this._createSeperator();this._createDescription(locale[\"edgeDescription\"]||this.options.locales[\"en\"][\"edgeDescription\"]);this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindUI(\"onTouch\",this._handleConnect.bind(this));this._temporaryBindUI(\"onDragEnd\",this._finishConnect.bind(this));this._temporaryBindUI(\"onDrag\",this._dragControlNode.bind(this));this._temporaryBindUI(\"onRelease\",this._finishConnect.bind(this));this._temporaryBindUI(\"onDragStart\",this._dragStartEdge.bind(this));this._temporaryBindUI(\"onHold\",function(){})}},{key:\"editEdgeMode\",value:function editEdgeMode(){if(this.editMode!==true){this.enableEditMode()}this._clean();this.inMode=\"editEdge\";if((0,_typeof3[\"default\"])(this.options.editEdge)===\"object\"&&typeof this.options.editEdge.editWithoutDrag===\"function\"){this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0];if(this.edgeBeingEditedId!==undefined){var edge=this.body.edges[this.edgeBeingEditedId];this._performEditEdge(edge.from,edge.to);return}}if(this.guiEnabled===true){var locale=this.options.locales[this.options.locale];this.manipulationDOM={};this._createBackButton(locale);this._createSeperator();this._createDescription(locale[\"editEdgeDescription\"]||this.options.locales[\"en\"][\"editEdgeDescription\"]);this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0];if(this.edgeBeingEditedId!==undefined){var _edge=this.body.edges[this.edgeBeingEditedId];var controlNodeFrom=this._getNewTargetNode(_edge.from.x,_edge.from.y);var controlNodeTo=this._getNewTargetNode(_edge.to.x,_edge.to.y);this.temporaryIds.nodes.push(controlNodeFrom.id);this.temporaryIds.nodes.push(controlNodeTo.id);this.body.nodes[controlNodeFrom.id]=controlNodeFrom;this.body.nodeIndices.push(controlNodeFrom.id);this.body.nodes[controlNodeTo.id]=controlNodeTo;this.body.nodeIndices.push(controlNodeTo.id);this._temporaryBindUI(\"onTouch\",this._controlNodeTouch.bind(this));this._temporaryBindUI(\"onTap\",function(){});this._temporaryBindUI(\"onHold\",function(){});this._temporaryBindUI(\"onDragStart\",this._controlNodeDragStart.bind(this));this._temporaryBindUI(\"onDrag\",this._controlNodeDrag.bind(this));this._temporaryBindUI(\"onDragEnd\",this._controlNodeDragEnd.bind(this));this._temporaryBindUI(\"onMouseMove\",function(){});this._temporaryBindEvent(\"beforeDrawing\",function(ctx){var positions=_edge.edgeType.findBorderPositions(ctx);if(controlNodeFrom.selected===false){controlNodeFrom.x=positions.from.x;controlNodeFrom.y=positions.from.y}if(controlNodeTo.selected===false){controlNodeTo.x=positions.to.x;controlNodeTo.y=positions.to.y}});this.body.emitter.emit(\"_redraw\")}else{this.showManipulatorToolbar()}}},{key:\"deleteSelected\",value:function deleteSelected(){var _this3=this;if(this.editMode!==true){this.enableEditMode()}this._clean();this.inMode=\"delete\";var selectedNodes=this.selectionHandler.getSelectedNodes();var selectedEdges=this.selectionHandler.getSelectedEdges();var deleteFunction=undefined;if(selectedNodes.length>0){for(var i=0;i<selectedNodes.length;i++){if(this.body.nodes[selectedNodes[i]].isCluster===true){alert(this.options.locales[this.options.locale][\"deleteClusterError\"]||this.options.locales[\"en\"][\"deleteClusterError\"]);return}}if(typeof this.options.deleteNode===\"function\"){deleteFunction=this.options.deleteNode}}else if(selectedEdges.length>0){if(typeof this.options.deleteEdge===\"function\"){deleteFunction=this.options.deleteEdge}}if(typeof deleteFunction===\"function\"){var data={nodes:selectedNodes,edges:selectedEdges};if(deleteFunction.length===2){deleteFunction(data,function(finalizedData){if(finalizedData!==null&&finalizedData!==undefined&&_this3.inMode===\"delete\"){_this3.body.data.edges.getDataSet().remove(finalizedData.edges);_this3.body.data.nodes.getDataSet().remove(finalizedData.nodes);_this3.body.emitter.emit(\"startSimulation\");_this3.showManipulatorToolbar()}else{_this3.body.emitter.emit(\"startSimulation\");_this3.showManipulatorToolbar()}})}else{throw new Error(\"The function for delete does not support two arguments (data, callback)\")}}else{this.body.data.edges.getDataSet().remove(selectedEdges);this.body.data.nodes.getDataSet().remove(selectedNodes);this.body.emitter.emit(\"startSimulation\");this.showManipulatorToolbar()}}},{key:\"_setup\",value:function _setup(){if(this.options.enabled===true){this.guiEnabled=true;this._createWrappers();if(this.editMode===false){this._createEditButton()}else{this.showManipulatorToolbar()}}else{this._removeManipulationDOM();this.guiEnabled=false}}},{key:\"_createWrappers\",value:function _createWrappers(){if(this.manipulationDiv===undefined){this.manipulationDiv=document.createElement(\"div\");this.manipulationDiv.className=\"vis-manipulation\";if(this.editMode===true){this.manipulationDiv.style.display=\"block\"}else{this.manipulationDiv.style.display=\"none\"}this.canvas.frame.appendChild(this.manipulationDiv)}if(this.editModeDiv===undefined){this.editModeDiv=document.createElement(\"div\");this.editModeDiv.className=\"vis-edit-mode\";if(this.editMode===true){this.editModeDiv.style.display=\"none\"}else{this.editModeDiv.style.display=\"block\"}this.canvas.frame.appendChild(this.editModeDiv)}if(this.closeDiv===undefined){this.closeDiv=document.createElement(\"div\");this.closeDiv.className=\"vis-close\";this.closeDiv.style.display=this.manipulationDiv.style.display;this.canvas.frame.appendChild(this.closeDiv)}}},{key:\"_getNewTargetNode\",value:function _getNewTargetNode(x,y){var controlNodeStyle=util.deepExtend({},this.options.controlNodeStyle);controlNodeStyle.id=\"targetNode\"+util.randomUUID();controlNodeStyle.hidden=false;controlNodeStyle.physics=false;controlNodeStyle.x=x;controlNodeStyle.y=y;var node=this.body.functions.createNode(controlNodeStyle);node.shape.boundingBox={left:x,right:x,top:y,bottom:y};return node}},{key:\"_createEditButton\",value:function _createEditButton(){this._clean();this.manipulationDOM={};util.recursiveDOMDelete(this.editModeDiv);var locale=this.options.locales[this.options.locale];var button=this._createButton(\"editMode\",\"vis-button vis-edit vis-edit-mode\",locale[\"edit\"]||this.options.locales[\"en\"][\"edit\"]);this.editModeDiv.appendChild(button);this._bindHammerToDiv(button,this.toggleEditMode.bind(this))}},{key:\"_clean\",value:function _clean(){this.inMode=false;if(this.guiEnabled===true){util.recursiveDOMDelete(this.editModeDiv);util.recursiveDOMDelete(this.manipulationDiv);this._cleanManipulatorHammers()}this._cleanupTemporaryNodesAndEdges();this._unbindTemporaryUIs();this._unbindTemporaryEvents();this.body.emitter.emit(\"restorePhysics\")}},{key:\"_cleanManipulatorHammers\",value:function _cleanManipulatorHammers(){if(this.manipulationHammers.length!=0){for(var i=0;i<this.manipulationHammers.length;i++){this.manipulationHammers[i].destroy()}this.manipulationHammers=[]}}},{key:\"_removeManipulationDOM\",value:function _removeManipulationDOM(){this._clean();util.recursiveDOMDelete(this.manipulationDiv);util.recursiveDOMDelete(this.editModeDiv);util.recursiveDOMDelete(this.closeDiv);if(this.manipulationDiv){this.canvas.frame.removeChild(this.manipulationDiv)}if(this.editModeDiv){this.canvas.frame.removeChild(this.editModeDiv)}if(this.closeDiv){this.canvas.frame.removeChild(this.closeDiv)}this.manipulationDiv=undefined;this.editModeDiv=undefined;this.closeDiv=undefined}},{key:\"_createSeperator\",value:function _createSeperator(){var index=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1;this.manipulationDOM[\"seperatorLineDiv\"+index]=document.createElement(\"div\");this.manipulationDOM[\"seperatorLineDiv\"+index].className=\"vis-separator-line\";this.manipulationDiv.appendChild(this.manipulationDOM[\"seperatorLineDiv\"+index])}},{key:\"_createAddNodeButton\",value:function _createAddNodeButton(locale){var button=this._createButton(\"addNode\",\"vis-button vis-add\",locale[\"addNode\"]||this.options.locales[\"en\"][\"addNode\"]);this.manipulationDiv.appendChild(button);this._bindHammerToDiv(button,this.addNodeMode.bind(this))}},{key:\"_createAddEdgeButton\",value:function _createAddEdgeButton(locale){var button=this._createButton(\"addEdge\",\"vis-button vis-connect\",locale[\"addEdge\"]||this.options.locales[\"en\"][\"addEdge\"]);this.manipulationDiv.appendChild(button);this._bindHammerToDiv(button,this.addEdgeMode.bind(this))}},{key:\"_createEditNodeButton\",value:function _createEditNodeButton(locale){var button=this._createButton(\"editNode\",\"vis-button vis-edit\",locale[\"editNode\"]||this.options.locales[\"en\"][\"editNode\"]);this.manipulationDiv.appendChild(button);this._bindHammerToDiv(button,this.editNode.bind(this))}},{key:\"_createEditEdgeButton\",value:function _createEditEdgeButton(locale){var button=this._createButton(\"editEdge\",\"vis-button vis-edit\",locale[\"editEdge\"]||this.options.locales[\"en\"][\"editEdge\"]);this.manipulationDiv.appendChild(button);this._bindHammerToDiv(button,this.editEdgeMode.bind(this))}},{key:\"_createDeleteButton\",value:function _createDeleteButton(locale){var deleteBtnClass;if(this.options.rtl){deleteBtnClass=\"vis-button vis-delete-rtl\"}else{deleteBtnClass=\"vis-button vis-delete\"}var button=this._createButton(\"delete\",deleteBtnClass,locale[\"del\"]||this.options.locales[\"en\"][\"del\"]);this.manipulationDiv.appendChild(button);this._bindHammerToDiv(button,this.deleteSelected.bind(this))}},{key:\"_createBackButton\",value:function _createBackButton(locale){\nvar button=this._createButton(\"back\",\"vis-button vis-back\",locale[\"back\"]||this.options.locales[\"en\"][\"back\"]);this.manipulationDiv.appendChild(button);this._bindHammerToDiv(button,this.showManipulatorToolbar.bind(this))}},{key:\"_createButton\",value:function _createButton(id,className,label){var labelClassName=arguments.length>3&&arguments[3]!==undefined?arguments[3]:\"vis-label\";this.manipulationDOM[id+\"Div\"]=document.createElement(\"div\");this.manipulationDOM[id+\"Div\"].className=className;this.manipulationDOM[id+\"Label\"]=document.createElement(\"div\");this.manipulationDOM[id+\"Label\"].className=labelClassName;this.manipulationDOM[id+\"Label\"].innerHTML=label;this.manipulationDOM[id+\"Div\"].appendChild(this.manipulationDOM[id+\"Label\"]);return this.manipulationDOM[id+\"Div\"]}},{key:\"_createDescription\",value:function _createDescription(label){this.manipulationDiv.appendChild(this._createButton(\"description\",\"vis-button vis-none\",label))}},{key:\"_temporaryBindEvent\",value:function _temporaryBindEvent(event,newFunction){this.temporaryEventFunctions.push({event:event,boundFunction:newFunction});this.body.emitter.on(event,newFunction)}},{key:\"_temporaryBindUI\",value:function _temporaryBindUI(UIfunctionName,newFunction){if(this.body.eventListeners[UIfunctionName]!==undefined){this.temporaryUIFunctions[UIfunctionName]=this.body.eventListeners[UIfunctionName];this.body.eventListeners[UIfunctionName]=newFunction}else{throw new Error(\"This UI function does not exist. Typo? You tried: \"+UIfunctionName+\" possible are: \"+(0,_stringify2[\"default\"])((0,_keys2[\"default\"])(this.body.eventListeners)))}}},{key:\"_unbindTemporaryUIs\",value:function _unbindTemporaryUIs(){for(var functionName in this.temporaryUIFunctions){if(this.temporaryUIFunctions.hasOwnProperty(functionName)){this.body.eventListeners[functionName]=this.temporaryUIFunctions[functionName];delete this.temporaryUIFunctions[functionName]}}this.temporaryUIFunctions={}}},{key:\"_unbindTemporaryEvents\",value:function _unbindTemporaryEvents(){for(var i=0;i<this.temporaryEventFunctions.length;i++){var eventName=this.temporaryEventFunctions[i].event;var boundFunction=this.temporaryEventFunctions[i].boundFunction;this.body.emitter.off(eventName,boundFunction)}this.temporaryEventFunctions=[]}},{key:\"_bindHammerToDiv\",value:function _bindHammerToDiv(domElement,boundFunction){var hammer=new Hammer(domElement,{});hammerUtil.onTouch(hammer,boundFunction);this.manipulationHammers.push(hammer)}},{key:\"_cleanupTemporaryNodesAndEdges\",value:function _cleanupTemporaryNodesAndEdges(){for(var i=0;i<this.temporaryIds.edges.length;i++){this.body.edges[this.temporaryIds.edges[i]].disconnect();delete this.body.edges[this.temporaryIds.edges[i]];var indexTempEdge=this.body.edgeIndices.indexOf(this.temporaryIds.edges[i]);if(indexTempEdge!==-1){this.body.edgeIndices.splice(indexTempEdge,1)}}for(var _i=0;_i<this.temporaryIds.nodes.length;_i++){delete this.body.nodes[this.temporaryIds.nodes[_i]];var indexTempNode=this.body.nodeIndices.indexOf(this.temporaryIds.nodes[_i]);if(indexTempNode!==-1){this.body.nodeIndices.splice(indexTempNode,1)}}this.temporaryIds={nodes:[],edges:[]}}},{key:\"_controlNodeTouch\",value:function _controlNodeTouch(event){this.selectionHandler.unselectAll();this.lastTouch=this.body.functions.getPointer(event.center);this.lastTouch.translation=util.extend({},this.body.view.translation)}},{key:\"_controlNodeDragStart\",value:function _controlNodeDragStart(event){var pointer=this.lastTouch;var pointerObj=this.selectionHandler._pointerToPositionObject(pointer);var from=this.body.nodes[this.temporaryIds.nodes[0]];var to=this.body.nodes[this.temporaryIds.nodes[1]];var edge=this.body.edges[this.edgeBeingEditedId];this.selectedControlNode=undefined;var fromSelect=from.isOverlappingWith(pointerObj);var toSelect=to.isOverlappingWith(pointerObj);if(fromSelect===true){this.selectedControlNode=from;edge.edgeType.from=from}else if(toSelect===true){this.selectedControlNode=to;edge.edgeType.to=to}if(this.selectedControlNode!==undefined){this.selectionHandler.selectObject(this.selectedControlNode)}this.body.emitter.emit(\"_redraw\")}},{key:\"_controlNodeDrag\",value:function _controlNodeDrag(event){this.body.emitter.emit(\"disablePhysics\");var pointer=this.body.functions.getPointer(event.center);var pos=this.canvas.DOMtoCanvas(pointer);if(this.selectedControlNode!==undefined){this.selectedControlNode.x=pos.x;this.selectedControlNode.y=pos.y}else{var diffX=pointer.x-this.lastTouch.x;var diffY=pointer.y-this.lastTouch.y;this.body.view.translation={x:this.lastTouch.translation.x+diffX,y:this.lastTouch.translation.y+diffY}}this.body.emitter.emit(\"_redraw\")}},{key:\"_controlNodeDragEnd\",value:function _controlNodeDragEnd(event){var pointer=this.body.functions.getPointer(event.center);var pointerObj=this.selectionHandler._pointerToPositionObject(pointer);var edge=this.body.edges[this.edgeBeingEditedId];if(this.selectedControlNode===undefined){return}this.selectionHandler.unselectAll();var overlappingNodeIds=this.selectionHandler._getAllNodesOverlappingWith(pointerObj);var node=undefined;for(var i=overlappingNodeIds.length-1;i>=0;i--){if(overlappingNodeIds[i]!==this.selectedControlNode.id){node=this.body.nodes[overlappingNodeIds[i]];break}}if(node!==undefined&&this.selectedControlNode!==undefined){if(node.isCluster===true){alert(this.options.locales[this.options.locale][\"createEdgeError\"]||this.options.locales[\"en\"][\"createEdgeError\"])}else{var from=this.body.nodes[this.temporaryIds.nodes[0]];if(this.selectedControlNode.id===from.id){this._performEditEdge(node.id,edge.to.id)}else{this._performEditEdge(edge.from.id,node.id)}}}else{edge.updateEdgeType();this.body.emitter.emit(\"restorePhysics\")}this.body.emitter.emit(\"_redraw\")}},{key:\"_handleConnect\",value:function _handleConnect(event){if((new Date).valueOf()-this.touchTime>100){this.lastTouch=this.body.functions.getPointer(event.center);this.lastTouch.translation=util.extend({},this.body.view.translation);var pointer=this.lastTouch;var node=this.selectionHandler.getNodeAt(pointer);if(node!==undefined){if(node.isCluster===true){alert(this.options.locales[this.options.locale][\"createEdgeError\"]||this.options.locales[\"en\"][\"createEdgeError\"])}else{var targetNode=this._getNewTargetNode(node.x,node.y);this.body.nodes[targetNode.id]=targetNode;this.body.nodeIndices.push(targetNode.id);var connectionEdge=this.body.functions.createEdge({id:\"connectionEdge\"+util.randomUUID(),from:node.id,to:targetNode.id,physics:false,smooth:{enabled:true,type:\"continuous\",roundness:.5}});this.body.edges[connectionEdge.id]=connectionEdge;this.body.edgeIndices.push(connectionEdge.id);this.temporaryIds.nodes.push(targetNode.id);this.temporaryIds.edges.push(connectionEdge.id)}}this.touchTime=(new Date).valueOf()}}},{key:\"_dragControlNode\",value:function _dragControlNode(event){var pointer=this.body.functions.getPointer(event.center);if(this.temporaryIds.nodes[0]!==undefined){var targetNode=this.body.nodes[this.temporaryIds.nodes[0]];targetNode.x=this.canvas._XconvertDOMtoCanvas(pointer.x);targetNode.y=this.canvas._YconvertDOMtoCanvas(pointer.y);this.body.emitter.emit(\"_redraw\")}else{var diffX=pointer.x-this.lastTouch.x;var diffY=pointer.y-this.lastTouch.y;this.body.view.translation={x:this.lastTouch.translation.x+diffX,y:this.lastTouch.translation.y+diffY}}}},{key:\"_finishConnect\",value:function _finishConnect(event){var pointer=this.body.functions.getPointer(event.center);var pointerObj=this.selectionHandler._pointerToPositionObject(pointer);var connectFromId=undefined;if(this.temporaryIds.edges[0]!==undefined){connectFromId=this.body.edges[this.temporaryIds.edges[0]].fromId}var overlappingNodeIds=this.selectionHandler._getAllNodesOverlappingWith(pointerObj);var node=undefined;for(var i=overlappingNodeIds.length-1;i>=0;i--){if(this.temporaryIds.nodes.indexOf(overlappingNodeIds[i])===-1){node=this.body.nodes[overlappingNodeIds[i]];break}}this._cleanupTemporaryNodesAndEdges();if(node!==undefined){if(node.isCluster===true){alert(this.options.locales[this.options.locale][\"createEdgeError\"]||this.options.locales[\"en\"][\"createEdgeError\"])}else{if(this.body.nodes[connectFromId]!==undefined&&this.body.nodes[node.id]!==undefined){this._performAddEdge(connectFromId,node.id)}}}this.body.emitter.emit(\"_redraw\")}},{key:\"_dragStartEdge\",value:function _dragStartEdge(event){var pointer=this.lastTouch;this.selectionHandler._generateClickEvent(\"dragStart\",event,pointer,undefined,true)}},{key:\"_performAddNode\",value:function _performAddNode(clickData){var _this4=this;var defaultData={id:util.randomUUID(),x:clickData.pointer.canvas.x,y:clickData.pointer.canvas.y,label:\"new\"};if(typeof this.options.addNode===\"function\"){if(this.options.addNode.length===2){this.options.addNode(defaultData,function(finalizedData){if(finalizedData!==null&&finalizedData!==undefined&&_this4.inMode===\"addNode\"){_this4.body.data.nodes.getDataSet().add(finalizedData);_this4.showManipulatorToolbar()}})}else{this.showManipulatorToolbar();throw new Error(\"The function for add does not support two arguments (data,callback)\")}}else{this.body.data.nodes.getDataSet().add(defaultData);this.showManipulatorToolbar()}}},{key:\"_performAddEdge\",value:function _performAddEdge(sourceNodeId,targetNodeId){var _this5=this;var defaultData={from:sourceNodeId,to:targetNodeId};if(typeof this.options.addEdge===\"function\"){if(this.options.addEdge.length===2){this.options.addEdge(defaultData,function(finalizedData){if(finalizedData!==null&&finalizedData!==undefined&&_this5.inMode===\"addEdge\"){_this5.body.data.edges.getDataSet().add(finalizedData);_this5.selectionHandler.unselectAll();_this5.showManipulatorToolbar()}})}else{throw new Error(\"The function for connect does not support two arguments (data,callback)\")}}else{this.body.data.edges.getDataSet().add(defaultData);this.selectionHandler.unselectAll();this.showManipulatorToolbar()}}},{key:\"_performEditEdge\",value:function _performEditEdge(sourceNodeId,targetNodeId){var _this6=this;var defaultData={id:this.edgeBeingEditedId,from:sourceNodeId,to:targetNodeId,label:this.body.data.edges._data[this.edgeBeingEditedId].label};var eeFunct=this.options.editEdge;if((typeof eeFunct===\"undefined\"?\"undefined\":(0,_typeof3[\"default\"])(eeFunct))===\"object\"){eeFunct=eeFunct.editWithoutDrag}if(typeof eeFunct===\"function\"){if(eeFunct.length===2){eeFunct(defaultData,function(finalizedData){if(finalizedData===null||finalizedData===undefined||_this6.inMode!==\"editEdge\"){_this6.body.edges[defaultData.id].updateEdgeType();_this6.body.emitter.emit(\"_redraw\");_this6.showManipulatorToolbar()}else{_this6.body.data.edges.getDataSet().update(finalizedData);_this6.selectionHandler.unselectAll();_this6.showManipulatorToolbar()}})}else{throw new Error(\"The function for edit does not support two arguments (data, callback)\")}}else{this.body.data.edges.getDataSet().update(defaultData);this.selectionHandler.unselectAll();this.showManipulatorToolbar()}}}]);return ManipulationSystem}();exports[\"default\"]=ManipulationSystem},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _slicedToArray2=__webpack_require__(30);var _slicedToArray3=_interopRequireDefault(_slicedToArray2);var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);var _FloydWarshall=__webpack_require__(239);var _FloydWarshall2=_interopRequireDefault(_FloydWarshall);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var KamadaKawai=function(){function KamadaKawai(body,edgeLength,edgeStrength){(0,_classCallCheck3[\"default\"])(this,KamadaKawai);this.body=body;this.springLength=edgeLength;this.springConstant=edgeStrength;this.distanceSolver=new _FloydWarshall2[\"default\"]}(0,_createClass3[\"default\"])(KamadaKawai,[{key:\"setOptions\",value:function setOptions(options){if(options){if(options.springLength){this.springLength=options.springLength}if(options.springConstant){this.springConstant=options.springConstant}}}},{key:\"solve\",value:function solve(nodesArray,edgesArray){var ignoreClusters=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var D_matrix=this.distanceSolver.getDistances(this.body,nodesArray,edgesArray);this._createL_matrix(D_matrix);this._createK_matrix(D_matrix);this._createE_matrix();var threshold=.01;var innerThreshold=1;var iterations=0;var maxIterations=Math.max(1e3,Math.min(10*this.body.nodeIndices.length,6e3));var maxInnerIterations=5;var maxEnergy=1e9;var highE_nodeId=0,dE_dx=0,dE_dy=0,delta_m=0,subIterations=0;while(maxEnergy>threshold&&iterations<maxIterations){iterations+=1;var _getHighestEnergyNode2=this._getHighestEnergyNode(ignoreClusters);var _getHighestEnergyNode3=(0,_slicedToArray3[\"default\"])(_getHighestEnergyNode2,4);highE_nodeId=_getHighestEnergyNode3[0];maxEnergy=_getHighestEnergyNode3[1];dE_dx=_getHighestEnergyNode3[2];dE_dy=_getHighestEnergyNode3[3];delta_m=maxEnergy;subIterations=0;while(delta_m>innerThreshold&&subIterations<maxInnerIterations){subIterations+=1;this._moveNode(highE_nodeId,dE_dx,dE_dy);var _getEnergy2=this._getEnergy(highE_nodeId);var _getEnergy3=(0,_slicedToArray3[\"default\"])(_getEnergy2,3);delta_m=_getEnergy3[0];dE_dx=_getEnergy3[1];dE_dy=_getEnergy3[2]}}}},{key:\"_getHighestEnergyNode\",value:function _getHighestEnergyNode(ignoreClusters){var nodesArray=this.body.nodeIndices;var nodes=this.body.nodes;var maxEnergy=0;var maxEnergyNodeId=nodesArray[0];var dE_dx_max=0,dE_dy_max=0;for(var nodeIdx=0;nodeIdx<nodesArray.length;nodeIdx++){var m=nodesArray[nodeIdx];if(nodes[m].predefinedPosition===false||nodes[m].isCluster===true&&ignoreClusters===true||nodes[m].options.fixed.x===true||nodes[m].options.fixed.y===true){var _getEnergy4=this._getEnergy(m),_getEnergy5=(0,_slicedToArray3[\"default\"])(_getEnergy4,3),delta_m=_getEnergy5[0],dE_dx=_getEnergy5[1],dE_dy=_getEnergy5[2];if(maxEnergy<delta_m){maxEnergy=delta_m;maxEnergyNodeId=m;dE_dx_max=dE_dx;dE_dy_max=dE_dy}}}return[maxEnergyNodeId,maxEnergy,dE_dx_max,dE_dy_max]}},{key:\"_getEnergy\",value:function _getEnergy(m){var _E_sums$m=(0,_slicedToArray3[\"default\"])(this.E_sums[m],2),dE_dx=_E_sums$m[0],dE_dy=_E_sums$m[1];var delta_m=Math.sqrt(Math.pow(dE_dx,2)+Math.pow(dE_dy,2));return[delta_m,dE_dx,dE_dy]}},{key:\"_moveNode\",value:function _moveNode(m,dE_dx,dE_dy){var nodesArray=this.body.nodeIndices;var nodes=this.body.nodes;var d2E_dx2=0;var d2E_dxdy=0;var d2E_dy2=0;var x_m=nodes[m].x;var y_m=nodes[m].y;var km=this.K_matrix[m];var lm=this.L_matrix[m];for(var iIdx=0;iIdx<nodesArray.length;iIdx++){var i=nodesArray[iIdx];if(i!==m){var x_i=nodes[i].x;var y_i=nodes[i].y;var kmat=km[i];var lmat=lm[i];var denominator=1/Math.pow(Math.pow(x_m-x_i,2)+Math.pow(y_m-y_i,2),1.5);d2E_dx2+=kmat*(1-lmat*Math.pow(y_m-y_i,2)*denominator);d2E_dxdy+=kmat*(lmat*(x_m-x_i)*(y_m-y_i)*denominator);d2E_dy2+=kmat*(1-lmat*Math.pow(x_m-x_i,2)*denominator)}}var A=d2E_dx2,B=d2E_dxdy,C=dE_dx,D=d2E_dy2,E=dE_dy;var dy=(C/A+E/B)/(B/A-D/B);var dx=-(B*dy+C)/A;nodes[m].x+=dx;nodes[m].y+=dy;this._updateE_matrix(m)}},{key:\"_createL_matrix\",value:function _createL_matrix(D_matrix){var nodesArray=this.body.nodeIndices;var edgeLength=this.springLength;this.L_matrix=[];for(var i=0;i<nodesArray.length;i++){this.L_matrix[nodesArray[i]]={};for(var j=0;j<nodesArray.length;j++){this.L_matrix[nodesArray[i]][nodesArray[j]]=edgeLength*D_matrix[nodesArray[i]][nodesArray[j]]}}}},{key:\"_createK_matrix\",value:function _createK_matrix(D_matrix){var nodesArray=this.body.nodeIndices;var edgeStrength=this.springConstant;this.K_matrix=[];for(var i=0;i<nodesArray.length;i++){this.K_matrix[nodesArray[i]]={};for(var j=0;j<nodesArray.length;j++){this.K_matrix[nodesArray[i]][nodesArray[j]]=edgeStrength*Math.pow(D_matrix[nodesArray[i]][nodesArray[j]],-2)}}}},{key:\"_createE_matrix\",value:function _createE_matrix(){var nodesArray=this.body.nodeIndices;var nodes=this.body.nodes;this.E_matrix={};this.E_sums={};for(var mIdx=0;mIdx<nodesArray.length;mIdx++){this.E_matrix[nodesArray[mIdx]]=[]}for(var _mIdx=0;_mIdx<nodesArray.length;_mIdx++){var m=nodesArray[_mIdx];var x_m=nodes[m].x;var y_m=nodes[m].y;var dE_dx=0;var dE_dy=0;for(var iIdx=_mIdx;iIdx<nodesArray.length;iIdx++){var i=nodesArray[iIdx];if(i!==m){var x_i=nodes[i].x;var y_i=nodes[i].y;var denominator=1/Math.sqrt(Math.pow(x_m-x_i,2)+Math.pow(y_m-y_i,2));this.E_matrix[m][iIdx]=[this.K_matrix[m][i]*(x_m-x_i-this.L_matrix[m][i]*(x_m-x_i)*denominator),this.K_matrix[m][i]*(y_m-y_i-this.L_matrix[m][i]*(y_m-y_i)*denominator)];this.E_matrix[i][_mIdx]=this.E_matrix[m][iIdx];dE_dx+=this.E_matrix[m][iIdx][0];dE_dy+=this.E_matrix[m][iIdx][1]}}this.E_sums[m]=[dE_dx,dE_dy]}}},{key:\"_updateE_matrix\",value:function _updateE_matrix(m){var nodesArray=this.body.nodeIndices;var nodes=this.body.nodes;var colm=this.E_matrix[m];var kcolm=this.K_matrix[m];var lcolm=this.L_matrix[m];var x_m=nodes[m].x;var y_m=nodes[m].y;var dE_dx=0;var dE_dy=0;for(var iIdx=0;iIdx<nodesArray.length;iIdx++){var i=nodesArray[iIdx];if(i!==m){var cell=colm[iIdx];var oldDx=cell[0];var oldDy=cell[1];var x_i=nodes[i].x;var y_i=nodes[i].y;var denominator=1/Math.sqrt(Math.pow(x_m-x_i,2)+Math.pow(y_m-y_i,2));var dx=kcolm[i]*(x_m-x_i-lcolm[i]*(x_m-x_i)*denominator);var dy=kcolm[i]*(y_m-y_i-lcolm[i]*(y_m-y_i)*denominator);colm[iIdx]=[dx,dy];dE_dx+=dx;dE_dy+=dy;var sum=this.E_sums[i];sum[0]+=dx-oldDx;sum[1]+=dy-oldDy}}this.E_sums[m]=[dE_dx,dE_dy]}}]);return KamadaKawai}();exports[\"default\"]=KamadaKawai},function(module,exports,__webpack_require__){\"use strict\";Object.defineProperty(exports,\"__esModule\",{value:true});var _classCallCheck2=__webpack_require__(0);var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=__webpack_require__(1);var _createClass3=_interopRequireDefault(_createClass2);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var FloydWarshall=function(){function FloydWarshall(){(0,_classCallCheck3[\"default\"])(this,FloydWarshall)}(0,_createClass3[\"default\"])(FloydWarshall,[{key:\"getDistances\",value:function getDistances(body,nodesArray,edgesArray){var D_matrix={};var edges=body.edges;for(var i=0;i<nodesArray.length;i++){var node=nodesArray[i];var cell={};D_matrix[node]=cell;for(var j=0;j<nodesArray.length;j++){cell[nodesArray[j]]=i==j?0:1e9}}for(var _i=0;_i<edgesArray.length;_i++){var edge=edges[edgesArray[_i]];if(edge.connected===true&&D_matrix[edge.fromId]!==undefined&&D_matrix[edge.toId]!==undefined){D_matrix[edge.fromId][edge.toId]=1;D_matrix[edge.toId][edge.fromId]=1}}var nodeCount=nodesArray.length;for(var k=0;k<nodeCount;k++){var knode=nodesArray[k];var kcolm=D_matrix[knode];for(var _i2=0;_i2<nodeCount-1;_i2++){var inode=nodesArray[_i2];var icolm=D_matrix[inode];for(var _j=_i2+1;_j<nodeCount;_j++){var jnode=nodesArray[_j];var jcolm=D_matrix[jnode];var val=Math.min(icolm[jnode],icolm[knode]+kcolm[jnode]);icolm[jnode]=val;jcolm[inode]=val}}}return D_matrix}}]);return FloydWarshall}();exports[\"default\"]=FloydWarshall}])});\n",
"type": "application/javascript",
"module-type": "library"
}
}
}
{
"tiddlers": {
"$:/plugins/jd/mob/config": {
"created": "20171029115120346",
"creator": "JD",
"text": "<style>\n.tc-btn-invisible { text-align: left; }\n</style>\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##freshinstall\" text=\"yes\">\n<div class=\"jd-bq\">\n<p>\nThanks for installing this plugin! You can always find the latest updates <a target=\"blank\" href=\"http://j.d.simplemobile.tiddlyspot.com\">here</a>\n</p>\n<p>\nThis plugin options tiddler is also available at ''Control panel'' >> ''Appearance'' >> ''JD Mob''\n</p>\n<p>\n<$button>\n<<jdconfig freshinstall no>>\nClose message\n</$button>\n</p>\n</div>\n<br>\n<hr>\n<br>\n</$reveal>\nShow as:\n<$select tiddler=\"$:/plugins/jd/mob/config/config\" index=\"configtype\">\n<option value=\"list\">List</option>\n<option value=\"htabs\">Horizontal tabs</option>\n<option value=\"vtabs\">Vertical tabs</option>\n</$select>\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##configtype\" text=\"list\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/jd/config]]\"><$transclude/><hr></$list>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##configtype\" text=\"htabs\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/jd/config]!has[draft.of]]\" \"$:/plugins/jd/mob/config/barpresets\">>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##configtype\" text=\"vtabs\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/jd/config]!has[draft.of]]\" \"$:/plugins/jd/mob/config/barpresets\" \"$:/state/tab/JDconfig\" \"tc-vertical\">>\n</$reveal>",
"title": "$:/plugins/jd/mob/config",
"tags": "$:/tags/ControlPanel/Appearance",
"subtitle": "Configure JD mobile layout",
"modifier": "JD",
"modified": "20171122151014084",
"caption": "JD Mob"
},
"$:/plugins/jd/mob/config/fonts": {
"created": "20171031124255884",
"creator": "JD",
"text": "<style> .texte { width: calc(100% - 60px); } </style>\n\n<h2>Fonts and heights presets</h2>\n\n\n<$button class=\"tc-btn-invisible\">\n<<jdfont 38px 30px 38px 28px 20px>>\n<<jdconfig fontsize largest>>\n<<jdradbut fontsize largest>>\n</$button> Largest\n<br>\n<$button class=\"tc-btn-invisible\">\n<<jdfont 34px 26px 34px 24px 20px>>\n<<jdconfig fontsize larger>>\n<<jdradbut fontsize larger>>\n</$button> Larger\n<br>\n<$button class=\"tc-btn-invisible\">\n<<jdfont 30px 22px 30px 20px 20px>>\n<<jdconfig fontsize large>>\n<<jdradbut fontsize large>>\n</$button> Large\n<br>\n<$button class=\"tc-btn-invisible\">\n<<jdfont 26px 18px 26px 16px 20px>>\n<<jdconfig fontsize medium>>\n<<jdradbut fontsize medium>>\n</$button> Medium\n<br>\n<$button class=\"tc-btn-invisible\">\n<<jdfont 22px 14px 20px 12px 20px>>\n<<jdconfig fontsize small>>\n<<jdradbut fontsize small>>\n</$button> Small\n<br>\n<$button class=\"tc-btn-invisible\">\n<<jdfont 18px 10px 16px 8px 20px>>\n<<jdconfig fontsize smaller>>\n<<jdradbut fontsize smaller>>\n</$button> Smaller\n<br>\n<$button class=\"tc-btn-invisible\">\n<<jdfont>>\n<<jdconfig fontsize default>>\n<<jdradbut fontsize default>>\n</$button> TW5 default\n<br>\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/jd/mob/font/font-title\" caption=\"Title\" list-before=\"$:/temp/jd/mob/font/font-body\"/>\n<$action-setfield $tiddler=\"$:/temp/jd/mob/font/font-body\" caption=\"Body, text buttons\" list-after=\"$:/temp/jd/mob/font/font-title\"/>\n<$action-setfield $tiddler=\"$:/temp/jd/mob/font/lineheight\" caption=\"Lineheight\"/>\n<$action-setfield $tiddler=\"$:/temp/jd/mob/font/font-tab-button\" caption=\"Tab buttons\"/>\n<$action-setfield $tiddler=\"$:/temp/jd/mob/font/font-button\" caption=\"Image buttons\"/>\n<<jdconfig fontsize custom>>\n<<jdradbut fontsize custom>>\n</$button> Custom\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##fontsize\" text=\"custom\">\n\nInclude unit (''px'' or ''em'') when entering custom values\n\n<table style=\"width:100%\">\n<tr>\n<th style=\"width:40%\">Element</th>\n<th style=\"width:60%\">Adjust</th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/temp/jd/mob/font/]!suffix[sitetitle]]\">\n<tr>\n<td><$view field=\"caption\"/></td>\n<td><$edit-text tiddler={{!!title}} field=\"temp\" placeholder={{!!text}} class=\"texte\"/>\n<$reveal type=\"match\" state=!!temp text=\"\">\n<$button class=\"tc-btn-invisible\" style=\"color:grey; cursor:not-allowed;\">✓</$button>\n<$button class=\"tc-btn-invisible\" style=\"color:grey; cursor:not-allowed;\">✕</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=!!temp text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler={{!!title}} text={{!!temp}}/>\n<$action-setfield $tiddler={{!!title}} temp=\"\"/>✓</$button>\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler={{!!title}} temp=\"\"/>✕</$button>\n</$reveal>\n</td>\n</tr>\n</$list>\n</table>\n</$reveal>\n<br><br>",
"title": "$:/plugins/jd/mob/config/fonts",
"tags": "$:/tags/jd/config",
"modifier": "JD",
"modified": "20171120143104637",
"caption": "Fonts and heights"
},
"$:/plugins/jd/mob/readme": {
"created": "20171030143047925",
"creator": "JD",
"text": "This is a mobile layout that applies to narrow screens. It introduces the following:\n\n# A Topbar that can be any of the following:\n#* Hidden\n#* Titlebar (search, title, subtitle, menu)\n#* Mobbuttons bar\n#** Buttons tagged ''~$:/tags/jd/mobbutton''\n#* Searchbar\n#** Simple searchbar lists standard search results only\n#** Combined searchbar lists all search results (possibly slow on some devices)\n#* Control area containing ''Top Left Bar'', ''Page Control'', ''Mob-only'', and ''Top Right Bar'' buttons (in that order)\n#** ''Top Left Bar'' >> buttons tagged ''~$:/tags/TopLeftBar''\n#** ''Page control'' >> buttons tagged ''~$:/tags/PageControls''\n#** ''Mob-only'' >> other buttons tagged ''~$:/tags/jd/mobbutton''\n#** ''Top Right Bar'' >> buttons tagged ''~$:/tags/TopRightBar''\n#** Buttons you don't want to appear here should be tagged ''~$:/tags/jd/mobno'' \n\n# A Bottombar that can be any of the following:\n#* Hidden\n#* Mobbuttons bar\n#** Buttons tagged ''~$:/tags/jd/mobbutton''\n#* Control area containing ''Top Left Bar'', ''Page Control'', ''Mob-only'', and ''Top Right Bar'' buttons (in that order)\n#** ''Top Left Bar'' >> buttons tagged ''~$:/tags/TopLeftBar''\n#** ''Page control'' >> buttons tagged ''~$:/tags/PageControls''\n#** ''Mob-only'' >> other buttons tagged ''~$:/tags/jd/mobbutton''\n#** ''Top Right Bar'' >> buttons tagged ''~$:/tags/TopRightBar''\n#** Buttons you don't want to appear here should be tagged ''~$:/tags/jd/mobno'' \n\n//Note:// \n\nThis layout is tied to the ''Sidebar Breakpoint'' set at ''Control Panel'' >> ''Appearance'' >> ''Theme Tweaks''.\n\nThis layout is compatible with any core theme as of release date.\n\n<a target=\"blank\" href=\"http://j.d.simplemobile.tiddlyspot.com\">Project Homepage on Tiddlyspot</a>\n\n!! Version History\n\n!!! 2018-09-03 Release of version 1.0.4\n\n* Added ability to create tiddler out of search term via \"+\" button, or keyboard shortcut: \"ctrl+space\"\n\n[[Detailed changelog|http://j.d.simplemobile.tiddlyspot.com/#Changelog]]",
"title": "$:/plugins/jd/mob/readme",
"tags": "",
"modifier": "JD",
"modified": "20180903122259331"
},
"$:/plugins/jd/mob/config/config": {
"created": "20171109145547252",
"creator": "JD",
"text": "freshinstall: yes\ndefaultconfirm: cancel\nconfigtype: list\nfontsize: default\nscrollbars: show\nbarpreset: 4\nstoryfix: no\ntitlebaradjust: no\ntopbar: fixedsearch\ntopbarchoice: hide\nsearchbar: yes\nradbuttop: fixedsearch\nsearchbarchoice: simple\nbottombar: controls\nradbuttopfixedsearchops: hide\nradbuttopcontrolsops: hide\nradbuttopmobbuttonsops: hide\nradbuttoptitleops: hide\nbottombarcontrolsops: hide\nbottombarmobbuttonsops: hide\nbarpreset1ops: hide\nbarpreset2ops: hide\nbarpreset3ops: hide\nbarpreset4ops: hide\nsearchbutton: simple\nfocus: show",
"type": "application/x-tiddler-dictionary",
"title": "$:/plugins/jd/mob/config/config",
"modifier": "JD",
"modified": "20171122154523597"
},
"$:/plugins/jd/mob/config/topbar": {
"created": "20171028024424838",
"creator": "JD",
"text": "<h2>Topbar</h2>\n<$button class=tc-btn-invisible>\n<<setTopsearchbar>>\n<<tglSearch>>\n<<jdconfig searchbutton simple>>\n<<jdradbut radbuttop fixedsearch>>\n</$button> Fixed searchbar\n<<moreOps radbuttop fixedsearch searchbar>>\n<$button class=tc-btn-invisible>\n<<setTopcontrols>>\n<<tglSearch>>\n<<jdconfig searchbutton simple>>\n<<jdradbut radbuttop controls>>\n</$button> Controls\n<<moreOps radbuttop controls searchbutton>>\n<$button class=tc-btn-invisible>\n<<setTopmobbuttons>>\n<<tglSearch>>\n<<jdconfig searchbutton simple>>\n<<jdradbut radbuttop mobbuttons>>\n</$button> Mob buttons only\n<<moreOps radbuttop mobbuttons searchbutton>>\n<$button class=tc-btn-invisible>\n<<setToptitlebar>>\n<<tglSearch>>\n<<jdconfig searchbutton simple>>\n<<jdradbut radbuttop title>>\n</$button> Titlebar\n<<moreOps radbuttop title titlebar>>\n<$button class=tc-btn-invisible>\n<<setTophide>>\n<<jdradbut radbuttop hide>>\n</$button> Hidden\n<br>",
"title": "$:/plugins/jd/mob/config/topbar",
"modifier": "JD",
"modified": "20171122131221362",
"list-before": "$:/plugins/jd/mob/config/bottombar",
"caption": "Topbar style"
},
"$:/plugins/jd/mob/config/bottombar": {
"created": "20171110164302862",
"creator": "JD",
"text": "<h2>Bottombar</h2>\n<$button class=\"tc-btn-invisible\">\n<<setBottomcontrols>>\n<<jdradbut bottombar controls>>\n</$button> Controls\n<<moreOps bottombar controls searchbutton>>\n<$button class=\"tc-btn-invisible\">\n<<jdconfig bottombar mobbuttons>>\n<<jdradbut bottombar mobbuttons>>\n</$button> Mob buttons only\n<<moreOps bottombar mobbuttons searchbutton>>\n<$button class=\"tc-btn-invisible\">\n<<noBottom>>\n<<jdradbut bottombar hide>>\n</$button> Hidden\n<br>",
"title": "$:/plugins/jd/mob/config/bottombar",
"modifier": "JD",
"modified": "20171122131210851",
"list-after": "$:/plugins/jd/mob/config/topbar",
"caption": "Bottombar style"
},
"$:/plugins/jd/mob/config/barpresets": {
"created": "20171113033257223",
"creator": "JD",
"text": "<h2>Topbar and bottombar presets</h2>\n<$button class=\"tc-btn-invisible\">\n<<jdconfig barpreset 1>>\n<<setToptitlebar>>\n<<noBottom>>\n<<jdradbut barpreset 1>>\n</$button> ''Titlebar'' on top, hidden bottom\n<<moreOps barpreset 1 titlebar>>\n<$button class=\"tc-btn-invisible\">\n<<jdconfig barpreset 2>>\n<<setTopcontrols>>\n<<noBottom>>\n<<jdradbut barpreset 2>>\n</$button> ''Controls'' on top, hidden bottom\n<<moreOps barpreset 2 searchbutton>>\n<$button class=\"tc-btn-invisible\">\n<<jdconfig barpreset 3>>\n<<setTophide>>\n<<setBottomcontrols>>\n<<jdradbut barpreset 3>>\n</$button> Hidden top, ''Controls'' on bottom\n<<moreOps barpreset 3 searchbutton>>\n<$button class=\"tc-btn-invisible\">\n<<jdconfig barpreset 4>>\n<<setTopsearchbar>>\n<<setBottomcontrols>>\n<<jdradbut barpreset 4>>\n</$button> ''Searchbar'' on top, ''Controls'' on bottom\n<<moreOps barpreset 4 searchbar>>\n<$button class=\"tc-btn-invisible\">\n<<jdconfig barpreset 5>>\n<<jdradbut barpreset 5>>\n</$button> Custom topbar and bottombar\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##barpreset\" text=\"5\">\n{{$:/plugins/jd/mob/config/topbar}}\n{{$:/plugins/jd/mob/config/bottombar}}\n</$reveal>\n<br><br>",
"title": "$:/plugins/jd/mob/config/barpresets",
"tags": "$:/tags/jd/config",
"modifier": "JD",
"modified": "20171122154450000",
"caption": "Top and bottom bars"
},
"$:/plugins/jd/mob/template/topbar": {
"text": "<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##topbar\" text=\"fixedsearch\">\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##fixedsearch\" text=\"combined\">\n{{$:/plugins/jd/mob/template/combinedsearch}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##fixedsearch\" text=\"simple\">\n{{$:/plugins/jd/mob/template/simplesearch}}\n</$reveal>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##topbar\" text=\"controls\">\n<span class=\"jd-topbar\">\n{{$:/plugins/jd/mob/template/controls}}\n</span>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##topbar\" text=\"mobbuttons\">\n<span class=\"jd-topbar\">\n<div class=\"tc-page-controls\">\n{{$:/plugins/jd/mob/template/mobbuttons}}\n</div>\n</span>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##topbar\" text=\"title\">\n<span class=\"jd-topbar\">\n{{$:/plugins/jd/mob/template/titlebar}}\n</span>\n</$reveal>",
"title": "$:/plugins/jd/mob/template/topbar",
"tags": "$:/tags/PageTemplate",
"modifier": "JD",
"modified": "20171118170723817",
"fixedsearch": "{{$:/plugins/jd/mob/template/combinedsearch}}",
"creator": "JD",
"created": "20171018115714311"
},
"$:/plugins/jd/mob/template/titlebar": {
"created": "20171112032454483",
"creator": "JD",
"text": "<div class=\"jd-title-wrapper\">\n<span class=\"tc-site-title\"><$transclude tiddler=\"$:/SiteTitle\"/></span>\n<span class=\"tc-site-subtitle\"><$transclude tiddler=\"$:/SiteSubtitle\"/></span>\n</div>\n<div class=\"jd-title-controls\">\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##searchbutton\" text=\"simple\">\n{{$:/plugins/jd/mob/button/search}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##searchbutton\" text=\"combined\">\n{{$:/plugins/jd/mob/button/search}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##searchbutton\" text=\"core\">\n{{$:/core/ui/Buttons/advanced-search}}\n</$reveal>\n{{$:/core/ui/TopBar/menu}}\n</div>",
"title": "$:/plugins/jd/mob/template/titlebar",
"tags": "",
"modifier": "JD",
"modified": "20171122134204001"
},
"$:/plugins/jd/mob/template/controls": {
"created": "20171111135718973",
"creator": "JD",
"text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-page-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]!tag[$:/tags/jd/mobno]]\">\n<$transclude/>\n</$list>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]!tag[$:/tags/jd/mobno]]\" variable=\"listItem\">\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\">\n<$transclude tiddler=<<listItem>>/>\n</$reveal>\n</$list>\n{{$:/plugins/jd/mob/template/mobbuttons}}\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]!tag[$:/tags/jd/mobno]]\">\n<$transclude/>\n</$list>\n</div>",
"title": "$:/plugins/jd/mob/template/controls",
"tags": "",
"modifier": "JD",
"modified": "20171119140040863"
},
"$:/plugins/jd/mob/template/bottombar": {
"text": "<div class=\"jd-bottombar\">\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##bottombar\" text=\"controls\">\n{{$:/plugins/jd/mob/template/controls}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##bottombar\" text=\"mobbuttons\">\n<div class=\"tc-page-controls\">\n{{$:/plugins/jd/mob/template/mobbuttons}}\n</div>\n</$reveal>\n</div>",
"title": "$:/plugins/jd/mob/template/bottombar",
"tags": "$:/tags/PageTemplate",
"modifier": "JD",
"modified": "20171118170729880",
"creator": "JD",
"created": "20171115114644869"
},
"$:/plugins/jd/mob/template/mobbuttons": {
"text": "\\define config-mobtitle()\n$:/config/jd/mobbutton/visibility/$(listItem)$\n\\end\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/jd/mobbutton]!has[draft.of]]\" variable=\"listItem\">\n<$reveal type=\"nomatch\" state=<<config-mobtitle>> text=\"hide\">\n<$transclude tiddler=<<listItem>>/>\n</$reveal>\n</$list>",
"title": "$:/plugins/jd/mob/template/mobbuttons",
"tags": "",
"modifier": "JD",
"modified": "20171118161831963",
"creator": "JD",
"created": "20171118055005587"
},
"$:/plugins/jd/mob/config/mobbuttons": {
"created": "20171118051624478",
"creator": "JD",
"text": "\\define config-base() $:/config/jd/mobbutton/visibility/\n<h2>Mob buttons</h2>\n<p>Here are buttons tagged <b>~$:/tags/jd/mobbutton</b></p>\n<p>Choose which ones are displayed. Drag and drop to change the ordering</p>\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/jd/mobbutton\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n</$set>\n</$set>\n<br>",
"title": "$:/plugins/jd/mob/config/mobbuttons",
"tags": "$:/tags/jd/config",
"modifier": "JD",
"modified": "20171122150902808",
"caption": "Mob buttons"
},
"$:/plugins/jd/mob/button/config": {
"text": "<$button tooltip=\"Configure JD mobile layout\" class=\"tc-btn-invisible\">{{$:/core/images/theme-button}}<$action-sendmessage $message=\"tm-modal\" $param=\"$:/plugins/jd/mob/config\"/></$button>",
"title": "$:/plugins/jd/mob/button/config",
"tags": "$:/tags/jd/mobbutton",
"modifier": "JD",
"modified": "20171122114923959",
"description": "Configure JD mobile layout",
"creator": "JD",
"created": "20171117090228867",
"caption": "{{$:/core/images/theme-button}} configure JDmob"
},
"$:/plugins/jd/mob/stylesheet": {
"created": "20171016123229521",
"creator": "JD",
"text": "@media print\n{\n.tc-sidebar-scrollable,\n.jd-search,\n.jd-topbar,\n.jd-bottombar { display: none !important; }\n}\n\n/** CONFIG RADIO BUTTONS **/\n\n.radbutton, .radbuttoff { \n display: inline-block; \n height: 12px; \n width: 12px; \n border: 2px solid <<colour muted-foreground>>; \n -webkit-transition-duration: {{$:/config/AnimationDuration}}ms;\n -moz-transition-duration: {{$:/config/AnimationDuration}}ms;\n -ms-transition-duration: {{$:/config/AnimationDuration}}ms;\n -o-transition-duration: {{$:/config/AnimationDuration}}ms;\n transition-duration: {{$:/config/AnimationDuration}}ms;\n}\n\n.radbutton { background: <<colour primary>>; }\n.radbuttoff { background: <<colour muted-foreground>>; }\n.radbutton:hover, .radbuttoff:hover { \n border: 2px solid <<colour primary>>;\n background: <<colour primary>>; \n}\n\n.jd-bq {\n margin: 5px;\n padding: 5px;\n border: 1px solid <<colour tab-border>>;\n}\n\n.jd-bq, .radbutton, .radbuttoff {\n -webkit-border-radius: 6px;\n -moz-border-radius: 6px;\n -ms-border-radius: 6px;\n -o-border-radius: 6px;\n border-radius: 6px;\n}\n\n.jd-btn-txt {\n border: none;\n background: none;\n font-size: inherit;\n text-decoration: underline;\n padding: 0;\n margin: 0;\n}\n\n.jd-btn-txt:hover {\n text-decoration: none;\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { \n.jd-topbar, \n.jd-bottombar,\n.jd-search { display: none; }\n} \n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { \n\n.tc-topbar { display: none !important; } \n\n.tc-tags-wrapper { margin: 5px 0 !important; }\n\n\n/** NOTIFICATIONS **/\n\n.tc-notification {\n position: fixed; \n top: 60px !important;\n right: 10px !important;\n z-index: {{!!z-bar}} !important;\n}\n\n.tc-modal {\n top: 50px !important;\n left: 50px !important;\n right: 50px !important;\n}\n\n.tc-modal-body { max-height: calc(100vh - 200px) !important; }\n\n.tc-modal-wrapper,\n.tc-plugin-reload-warning { z-index: {{!!z-notif}} !important; }\n\n\n/** STORY RIVER **/\n\n.tc-story-river { \n margin: 0 !important;\n padding-top: 0 !important;\n}\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##storyfix\" text=\"no\">\n\n<$reveal type=\"nomatch\" state=\"$:/plugins/jd/mob/config/config##topbar\" text=\"hide\">\n\n@media print\n{\n.tc-story-river { margin-top: 0 !important; }\n}\n\n@media screen\n{\n.tc-story-river { margin-top: 50px !important; }\n}\n\n</$reveal>\n\n<$reveal type=\"nomatch\" state=\"$:/plugins/jd/mob/config/config##bottombar\" text=\"hide\">\n\n.tc-story-river { margin-bottom: 50px !important; }\n\n</$reveal>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##storyfix\" text=\"yes\">\n\n.tc-story-river { \n width: 100% !important;\n position: fixed !important;\n left: 0 !important;\n overflow-y: auto !important;\n}\n\n<$reveal type=\"nomatch\" state=\"$:/plugins/jd/mob/config/config##topbar\" text=\"hide\">\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##bottombar\" text=\"hide\">\n.tc-story-river { \n top: 50px !important;\n height: calc(100% - 50px) !important;\n}\n</$reveal>\n\n<$reveal type=\"nomatch\" state=\"$:/plugins/jd/mob/config/config##bottombar\" text=\"hide\">\n.tc-story-river { \n top: 50px !important; \n height: calc(100% - 100px) !important;\n}\n</$reveal>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##topbar\" text=\"hide\">\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##bottombar\" text=\"hide\">\n.tc-story-river { \n top: 0 !important; \n height: 100% !important;\n}\n</$reveal>\n\n<$reveal type=\"nomatch\" state=\"$:/plugins/jd/mob/config/config##bottombar\" text=\"hide\">\n.tc-story-river { \n top: 0 !important; \n height: calc(100% - 50px) !important;\n}\n</$reveal>\n\n</$reveal>\n\n</$reveal>\n\n.tc-tiddler-frame {\n margin-bottom: 2px !important;\n padding: 15px 10px;\n overflow: auto;\n}\n\n\n/** POPUPS AND DROPDOWNS INSIDE VIEW AREA **/\n\n.tc-drop-down,\n.tc-block-dropdown {\n position: fixed !important;\n top: 50% !important;\n left: 50% !important;\n text-align: left;\n white-space: normal !important;\n max-height: calc(100% - 160px) !important;\n min-width: calc(100% - 90px) !important;\n max-width: calc(100% - 60px) !important;\n -webkit-transform: translate(-50%, -50%) !important;\n -moz-transform: translate(-50%, -50%) !important;\n -ms-transform: translate(-50%, -50%) !important;\n -o-transform: translate(-50%, -50%) !important;\n transform: translate(-50%, -50%) !important;\n -webkit-box-shadow: 0 0 10px 5px rgba(0,0,0,0.5);\n -moz-box-shadow: 0 0 10px 5px rgba(0,0,0,0.5);\n -ms-box-shadow: 0 0 10px 5px rgba(0,0,0,0.5);\n -o-box-shadow: 0 0 10px 5px rgba(0,0,0,0.5);\n box-shadow: 0 0 10px 5px rgba(0,0,0,0.5);\n overflow: auto !important;\n z-index: {{!!z-dropdown}} !important;\n}\n\n.tc-menu-list-item {\n padding-left: 5px;\n text-indent: -5px;\n white-space: normal !important;\n word-wrap: break-word !important;\n -webkit-word-break: break-all !important;\n -moz-word-break: break-all !important;\n -ms-word-break: break-all !important;\n -o-word-break: break-all !important;\n word-break: break-all !important;\n}\n\n.tc-edit-type-dropdown { overflow: auto; }\n\n\n/** SCROLLBARS **/\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##scrollbars\" text=\"hide\">\n\nbody { \n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n\ndiv::-webkit-scrollbar,\n.tc-edit-type-dropdown::-webkit-scrollbar,\n.tc-block-dropdown::-webkit-scrollbar,\n.tc-drop-down::-webkit-scrollbar,\n.jd-search-results::-webkit-scrollbar,\n.tc-story-river::-webkit-scrollbar,\n.tc-sidebar-scrollable::-webkit-scrollbar {\n background: transparent;\n width: 0;\n}\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##scrollbars\" text=\"show\">\n\nbody { \n scrollbar-face-color: <<colour background>>;\n scrollbar-arrow-color: <<colour page-background>>;\n scrollbar-track-color: <<colour page-background>>;\n scrollbar-shadow-color: <<colour page-background>>;\n}\n\ndiv::-webkit-scrollbar,\n.tc-edit-type-dropdown::-webkit-scrollbar,\n.tc-block-dropdown::-webkit-scrollbar,\n.tc-drop-down::-webkit-scrollbar,\n.tc-story-river::-webkit-scrollbar,\n.tc-sidebar-scrollable::-webkit-scrollbar {\n background: <<colour background>>;\n width: 6px;\n -webkit-border-radius: 3px;\n border-radius: 3px;\n}\n\ndiv::-webkit-scrollbar-thumb,\n.tc-edit-type-dropdown::-webkit-scrollbar-thumb,\n.tc-block-dropdown::-webkit-scrollbar-thumb,\n.tc-drop-down::-webkit-scrollbar-thumb,\n.jd-search-results::-webkit-scrollbar,\n.tc-story-river::-webkit-scrollbar-thumb,\n.tc-sidebar-scrollable::-webkit-scrollbar-thumb {\n background: <<colour page-background>>; \n width: 6px;\n -webkit-border-radius: 3px;\n border-radius: 3px;\n}\n\n.jd-search-results::-webkit-scrollbar-thumb {\n background: <<colour primary>>;\n width: 6px;\n -webkit-border-radius: 3px;\n border-radius: 3px;\n}\n\n</$reveal>\n\n\n/** FOCUS **/\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##focus\" text=\"hide\">\ntextarea:focus, select:focus, button:focus, input:focus { outline: none; }\n</$reveal>\n\n\n/** TOPBAR & BOTTOMBAR **/\n\n.jd-topbar,\n.jd-bottombar {\n width: 100%;\n position: fixed;\n left: 0;\n background: <<colour page-background>>;\n overflow: hidden;\n z-index: {{!!z-bar}};\n}\n\n.jd-topbar { top: 0; height: 50px; }\n.jd-bottombar { bottom: 0; }\n\n\n/** SEARCH **/\n\n.jd-search { z-index: {{!!z-search}}; }\n\n.jd-search-results {\n background: <<colour page-background>>;\n width: 100%;\n position: fixed;\n top: 50px;\n left: 0;\n margin: 0;\n padding: 0 10px;\n overflow-y: auto;\n z-index: {{!!z-searchwrapper}};\n}\n\n<$reveal type=\"nomatch\" state=\"$:/plugins/jd/mob/config/config##bottombar\" text=\"hide\">\n.jd-search-results { max-height: calc(100% - 100px); }\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##bottombar\" text=\"hide\">\n.jd-search-results { max-height: calc(100% - 50px); }\n</$reveal>\n\n.jd-searchwrapper {\n background: <<colour page-background>>;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 50px;\n z-index: {{!!z-searchwrapper}};\n}\n\n.jd-searchbar {\n width: calc(100% - 20px);\n height: 30px; \n position: fixed;\n top: 0;\n left: 0;\n font-size: 16px !important;\n background: transparent !important;\n border: none;\n border-bottom: 2px solid<<colour primary>>;\n<$reveal state=\"$:/plugins/jd/mob/config/config##searchbarchoice\" type=\"match\" text=\"combined\">\n padding: 0 160px 0 10px;\n</$reveal>\n<$reveal state=\"$:/plugins/jd/mob/config/config##searchbarchoice\" type=\"match\" text=\"simple\">\n padding: 0 100px 0 10px;\n</$reveal>\n margin: 10px;\n}\n\n.jd-search-buttons {\n<$reveal state=\"$:/plugins/jd/mob/config/config##searchbarchoice\" type=\"match\" text=\"combined\">\n width: 160px; \n</$reveal>\n<$reveal state=\"$:/plugins/jd/mob/config/config##searchbarchoice\" type=\"match\" text=\"simple\">\n width: 100px; \n</$reveal>\n position: fixed; \n top: 12px;\n right: 0; \n background: <<colour page-background>>;\n border: transparent;\n margin-right: 20px; \n text-align: right;\n vertical-align: middle;\n}\n\n.jd-search-buttons {\n z-index: {{!!z-searchbuttons}};\n}\n\n.jd-search-buttons .tc-popup-keep,\n.jd-search-buttons .tc-btn-invisible {\n font-size: 18px;\n background: transparent;\n border: transparent;\n cursor: pointer;\n}\n\n.jd-search-buttons .tc-btn-invisible { margin-left: 8px; }\n\n\n/** CONTROLS **/\n\n.jd-title-controls {\n display: flex;\n justify-content: space-between;\n margin: 10px;\n}\n\n.jd-search-buttons button,\n.jd-title-controls button {\n fill: <<colour sidebar-controls-foreground>>;\n font-size: 1.6em;\n -webkit-transition-duration: {{$:/config/AnimationDuration}}ms;\n -moz-transition-duration: {{$:/config/AnimationDuration}}ms;\n -ms-transition-duration: {{$:/config/AnimationDuration}}ms;\n -o-transition-duration: {{$:/config/AnimationDuration}}ms;\n transition-duration: {{$:/config/AnimationDuration}}ms;\n}\n\n.jd-search-buttons button:hover,\n.jd-title-controls button:hover {\n fill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.jd-topbar .tc-page-controls,\n.jd-bottombar .tc-page-controls {\n display: flex;\n justify-content: space-between;\n height: 30px;\n margin: 10px;\n}\n\n.tc-page-controls button { margin: 0 !important;}\n\n\n/** TITLEBAR **/\n\n.jd-title-wrapper .tc-site-title,\n.jd-title-wrapper .tc-site-subtitle {\n position: absolute;\n left: 50%;\n text-align: center;\n -webkit-transform: translate(-50%, 50%);\n -moz-transform: translate(-50%, 50%);\n -ms-transform: translate(-50%, 50%);\n -o-transform: translate(-50%, 50%);\n transform: translate(-50%, 50%);\n}\n\n.jd-title-wrapper .tc-site-subtitle {\n width: calc(100% - 100px);\n}\n\n\n/** SIDEBAR LISTS **/\n\n.tc-sidebar-scrollable .tc-site-title,\n.tc-sidebar-scrollable .tc-site-subtitle,\n.tc-sidebar-scrollable .tc-page-controls,\n.tc-sidebar-scrollable .tc-search\n { display: none; }\n\n.tc-sidebar-header { padding: 0 !important; }\n\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"no\">\n.tc-sidebar-scrollable {\n background: <<colour background>>;\n width: 100%;\n position: fixed;\n left: 0; \n z-index: {{!!z-sidebar}};\n overflow: auto !important;\n}\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/sidebar\" text=\"no\">\n\n.tc-sidebar-scrollable { display:none; }\n\n.tc-tab-set { overflow-y: auto !important; }\n\n</$reveal>\n\n<$reveal type=\"nomatch\" state=\"$:/plugins/jd/mob/config/config##topbar\" text=\"hide\">\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##bottombar\" text=\"hide\">\n.tc-sidebar-scrollable { \n top: 50px !important;\n height: calc(100% - 50px) !important;\n}\n\n.tc-sidebar-scrollable .tc-tab-buttons { top: 50px; }\n</$reveal>\n\n<$reveal type=\"nomatch\" state=\"$:/plugins/jd/mob/config/config##bottombar\" text=\"hide\">\n.tc-sidebar-scrollable { \n top: 50px !important;\n height: calc(100% - 100px) !important;\n}\n\n.tc-sidebar-scrollable .tc-tab-buttons { top: 50px; }\n</$reveal>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##topbar\" text=\"hide\">\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##bottombar\" text=\"hide\">\n.tc-sidebar-scrollable { \n top: 0 !important;\n height: 100% !important;\n}\n</$reveal>\n\n<$reveal type=\"nomatch\" state=\"$:/plugins/jd/mob/config/config##bottombar\" text=\"hide\">\n.tc-sidebar-scrollable { \n top: 0 !important;\n height: calc(100% - 50px) !important;\n}\n</$reveal>\n\n</$reveal>\n\n\n/** SIDEBAR LISTS BUTTONS **/\n\n.tc-sidebar-scrollable .tc-tab-buttons { margin: 10px; }\n\n.tc-sidebar-scrollable .tc-tab-content { \n margin: 10px !important; \n border: 0 !important;\n}\n\n\n/** ADJUSTABLE FONTS AND HEIGHTS **/\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##titlebaradjust\" text=\"no\">\n.jd-title-wrapper .tc-site-title { top: -3px; font-size: 18px; }\n.jd-title-wrapper .tc-site-subtitle { top: 15px; font-size: 12px; }\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##titlebaradjust\" text=\"yes\">\n.jd-title-wrapper .tc-site-title { top: {{!!height-sitetitle}}; font-size: {{!!font-sitetitle}}; }\n.jd-title-wrapper .tc-site-subtitle { top: {{!!height-subsitetitle}}; font-size: {{!!font-subsitetitle}}; }\n</$reveal>\n\n<$reveal type=\"nomatch\" state=\"$:/plugins/jd/mob/config/config##fontsize\" text=\"default\">\n\n.tc-tiddler-view-frame h2.tc-title,\ninput.tc-titlebar.tc-edit-texteditor { \n font-size: {{!!font-title}} !important; \n}\n\n.tc-tiddler-view-frame .tc-subtitle { \n font-size: calc({{!!font-body}} - 4px) !important; \n}\n\nh1, h1 a { \n font-size: calc({{!!font-body}} + 6px) !important; \n}\n\nh2, h2 a { \n font-size: calc({{!!font-body}} + 4px) !important; \n}\n\nh3, h3 a { \n font-size: calc({{!!font-body}} + 2px) !important; \n}\n\nh4, a, li, table,\ninput, textarea, select,\n.tc-tiddler-preview-preview p,\n.tc-tiddler-view-frame p,\n.tc-modal p,\n.tc-btn-text,\n.jd-search-results,\n.tc-tab-content,\n.tc-modal-header h3 { \n font-size: {{!!font-body}} !important; \n line-height: {{!!lineheight}} !important;\n}\n\nbutton.tc-btn-invisible.tc-remove-tag-button,\n.tc-tag-label.tc-btn-invisible { \n font-size: calc({{!!font-body}} - 4px) !important; \n}\n\n.tc-tab-buttons button,\n.tc-tab-buttons.tc-vertical button,\n.tc-sidebar-scrollable .tc-tab-buttons button,\n.tc-sidebar-scrollable .tc-tab-buttons.tc-vertical button {\n font-size: {{!!font-tab-button}} !important;\n}\n\n.tc-btn-invisible,\n.tc-tiddler-controls button, \n.tc-tiddler-controls button svg, \n.tc-tiddler-controls button img,\n.tc-image-buttons,\n.tc-page-controls { \n font-size: {{!!font-button}} !important; \n}\n\n.tc-tiddler-controls button svg, \n.tc-tiddler-controls button img,\n.tc-image-buttons { \n height: {{!!font-button}} !important; \n width: {{!!font-button}} !important; \n}\n\n</$reveal>\n\n}",
"z-sidebar": "1500",
"z-searchwrapper": "2500",
"z-searchbuttons": "4100",
"z-search": "4000",
"z-notif": "9000",
"z-dropdown": "4000",
"z-bar": "2000",
"title": "$:/plugins/jd/mob/stylesheet",
"tags": "$:/tags/Stylesheet",
"modifier": "JD",
"modified": "20180903124046078",
"lineheight": "{{$:/temp/jd/mob/font/lineheight}}",
"height-subsitetitle": "{{$:/temp/jd/mob/font/height-subsitetitle}}",
"height-sitetitle": "{{$:/temp/jd/mob/font/height-sitetitle}}",
"font-title": "{{$:/temp/jd/mob/font/font-title}}",
"font-tab-button": "{{$:/temp/jd/mob/font/font-tab-button}}",
"font-subsitetitle": "{{$:/temp/jd/mob/font/font-subsitetitle}}",
"font-sitetitle": "{{$:/temp/jd/mob/font/font-sitetitle}}",
"font-button": "{{$:/temp/jd/mob/font/font-button}}",
"font-body": "{{$:/temp/jd/mob/font/font-body}}",
"list-after": "$:/themes/tiddlywiki/vanilla/base"
},
"$:/plugins/jd/mob/config/searchbutton": {
"created": "20171118142818660",
"creator": "JD",
"text": "<h3>Choose search button</h3>\n\n<$button class=\"tc-btn-invisible\">\n<<tglSearch show>>\n<$action-setfield $tiddler=\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search\" text=\"hide\"/>\n<<jdconfig searchbarchoice simple>>\n<<jdconfig searchbutton simple>>\n<<jdradbut searchbutton simple>>\n</$button> Toggle for simple searchbar\n<br>\n<$button class=\"tc-btn-invisible\">\n<<tglSearch show>>\n<$action-setfield $tiddler=\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search\" text=\"hide\"/>\n<<jdconfig searchbarchoice combined>>\n<<jdconfig searchbutton combined>>\n<<jdradbut searchbutton combined>>\n</$button> Toggle for combined searchbar\n<br>\n<$button class=\"tc-btn-invisible\">\n<<tglSearch hide>>\n<$action-setfield $tiddler=\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search\" text=\"show\"/>\n<<jdconfig searchbutton core>>\n<<jdradbut searchbutton core>>\n</$button> Button to core search\n<br>\n<$button class=\"tc-btn-invisible\">\n<<tglSearch hide>>\n<$action-setfield $tiddler=\"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search\" text=\"hide\"/>\n<<jdconfig searchbutton hide>>\n<<jdradbut searchbutton hide>>\n</$button> Hidden\n<br><br>",
"title": "$:/plugins/jd/mob/config/searchbutton",
"tags": "",
"modifier": "JD",
"modified": "20171122125953528",
"caption": "Choose search button"
},
"$:/plugins/jd/mob/config/titlebar": {
"created": "20171118171842911",
"creator": "JD",
"text": "<h3>Vertical position</h3>\n\n<$button class=tc-btn-invisible>\n<<jdconfig titlebaradjust no>>\n<<jdradbut titlebaradjust no>>\n</$button> Default\n<br>\n<$button class=tc-btn-invisible>\n<<jdconfig titlebaradjust yes>>\n<$action-setfield $tiddler=\"$:/temp/jd/mob/font/height-sitetitle\" caption=\"Site title vertical position\" text=\"-3px\" list-after=\"$:/temp/jd/mob/font/font-sitetitle\"/>\n<$action-setfield $tiddler=\"$:/temp/jd/mob/font/font-sitetitle\" caption=\"Site title font size\" text=\"18px\"/>\n<$action-setfield $tiddler=\"$:/temp/jd/mob/font/height-subsitetitle\" caption=\"Site subtitle vertical position\" text=\"15px\" list-after=\"$:/temp/jd/mob/font/font-subsitetitle\"/>\n<$action-setfield $tiddler=\"$:/temp/jd/mob/font/font-subsitetitle\" caption=\"Site subtitle font size\" text=\"12px\"/>\n<<jdradbut titlebaradjust yes>>\n</$button> Custom\n\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##titlebaradjust\" text=\"yes\">\n\nInclude unit (''px'' or ''em'') when entering custom values\n\n<table style=\"width:100%\">\n<tr>\n<th style=\"width:40%\">Element</th>\n<th style=\"width:60%\">Adjust</th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/temp/jd/mob/font/]suffix[sitetitle]]\">\n<tr>\n<td><$view field=\"caption\"/></td>\n<td><$edit-text tiddler={{!!title}} field=\"temp\" placeholder={{!!text}} class=\"texte\"/>\n<$reveal type=\"match\" state=!!temp text=\"\">\n<$button class=\"tc-btn-invisible\" style=\"color:grey; cursor:not-allowed;\">✓</$button>\n<$button class=\"tc-btn-invisible\" style=\"color:grey; cursor:not-allowed;\">✕</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=!!temp text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler={{!!title}} text={{!!temp}}/>\n<$action-setfield $tiddler={{!!title}} temp=\"\"/>✓</$button>\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler={{!!title}} temp=\"\"/>✕</$button>\n</$reveal>\n</td>\n</tr>\n</$list>\n</table>\n</$reveal>\n{{$:/plugins/jd/mob/config/searchbutton}}",
"title": "$:/plugins/jd/mob/config/titlebar",
"modifier": "JD",
"modified": "20171119072342630",
"caption": "Fonts and heights",
"tags": ""
},
"$:/plugins/jd/mob/config/searchbar": {
"created": "20171118171759396",
"creator": "JD",
"text": "<h3>Choose searchbar style</h3>\n\n<$button class=\"tc-btn-invisible\">\n<<tglSearch show>>\n<<jdconfig searchbarchoice combined>>\n<<jdconfig searchbutton combined>>\n<<jdradbut searchbutton combined>>\n</$button> Combined search\n<br>\n<$button class=\"tc-btn-invisible\">\n<<tglSearch show>>\n<<jdconfig searchbarchoice simple>>\n<<jdconfig searchbutton simple>>\n<<jdradbut searchbutton simple>>\n</$button> Simple search\n<p>\n<$checkbox tiddler=\"$:/config/jd/mobbutton/visibility/$:/plugins/jd/mob/button/search\" field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> Show search button at controls\n</p>",
"title": "$:/plugins/jd/mob/config/searchbar",
"tags": "",
"modifier": "JD",
"modified": "20171122123127279",
"caption": "Choose searchbar style"
},
"$:/plugins/jd/mob/macros": {
"created": "20171119044207910",
"creator": "JD",
"text": "\\define jdconf() $:/plugins/jd/mob/config/config\n\\define jdconfont() $:/temp/jd/mob/font/\n\\define jdconfig(config:\"\" choice:\"\")\n<$action-setfield $tiddler=<<jdconf>> $index=\"$config$\" $value=$choice$/>\n\\end\n\\define moreOps(config:\"\" choice:\"\" option:\"\")\n<$reveal type=\"match\" state=\"$(jdconf)$##$config$\" text=\"$choice$\">\n<$reveal type=\"nomatch\" state=\"$(jdconf)$##$config$$choice$ops\" text=\"show\">\n<$button class =\"jd-btn-txt\" set=\"$(jdconf)$##$config$$choice$ops\" setTo=\"show\"> Show options</$button>\n</$reveal>\n<$reveal type=\"match\" state=\"$(jdconf)$##$config$$choice$ops\" text=\"show\">\n<$button class =\"jd-btn-txt\" set=\"$(jdconf)$##$config$$choice$ops\" setTo=\"hide\"> Hide options</$button>\n<div class=\"jd-bq\">{{$:/plugins/jd/mob/config/$option$}}</div>\n</$reveal>\n</$reveal>\n<br>\n\\end\n\\define jdfont(font-title:\"\" font-body:\"\" lineheight:\"\" font-tab:\"\" font-button:\"\")\n<$action-setfield $tiddler=\"$(jdconfont)$font-title\" text=\"$font-title$\"/>\n<$action-setfield $tiddler=\"$(jdconfont)$font-body\" text=\"$font-body$\"/>\n<$action-setfield $tiddler=\"$(jdconfont)$lineheight\" text=\"$lineheight$\"/>\n<$action-setfield $tiddler=\"$(jdconfont)$font-tab-button\" text=\"$font-tab$\"/>\n<$action-setfield $tiddler=\"$(jdconfont)$font-button\" text=\"$font-button$\"/>\n\\end\n\\define jdradbut(config:\"\" choice:\"\")\n<$reveal type=\"match\" state=\"$(jdconf)$##$config$\" text=\"$choice$\"><div class=\"radbutton\"></div></$reveal>\n<$reveal type=\"nomatch\" state=\"$(jdconf)$##$config$\" text=\"$choice$\"><div class=\"radbuttoff\"></div></$reveal>\n\\end\n\\define tglSearch(choice:\"show\")\n<$action-setfield $tiddler=\"$:/config/jd/mobbutton/visibility/$:/plugins/jd/mob/button/search\" text=$choice$/>\n\\end\n\\define notPreset()\n<<jdconfig barpreset 0>>\n\\end\n\\define setTopsearchbar()\n<<jdconfig topbar fixedsearch>>\n<<jdconfig topbarchoice hide>>\n<<jdconfig searchbar yes>>\n<<jdconfig radbuttop fixedsearch>>\n\\end\n\\define setToptitlebar()\n<<jdconfig searchbar no>>\n<<jdconfig topbar title>>\n<<jdconfig topbarchoice title>>\n<<jdconfig radbuttop title>>\n\\end\n\\define setTopcontrols()\n<<jdconfig searchbar no>>\n<<jdconfig topbar controls>>\n<<jdconfig topbarchoice controls>>\n<<jdconfig radbuttop controls>>\n\\end\n\\define setTopmobbuttons()\n<<jdconfig searchbar no>>\n<<jdconfig topbar mobbuttons>>\n<<jdconfig topbarchoice mobbuttons>>\n<<jdconfig radbuttop mobbuttons>>\n\\end\n\\define setTophide()\n<<jdconfig searchbar no>>\n<<jdconfig topbar hide>>\n<<jdconfig topbarchoice hide>>\n<<jdconfig radbuttop hide>>\n\\end\n\\define noBottom()\n<<jdconfig bottombar hide>>\n\\end\n\\define setBottomcontrols()\n<<jdconfig bottombar controls>>\n\\end\n\\define setJDmobdefaults()\n<<tglSearch>>\n<<jdconfig freshinstall yes>>\n<<jdconfig configtype list>>\n<<jdfont>>\n<<jdconfig fontsize default>>\n<<jdconfig scrollbars show>>\n<<jdconfig focus show>>\n<<jdconfig storyfix no>>\n<<jdconfig titlebaradjust no>>\n<<jdconfig topbarchoice hide>>\n<<jdconfig searchbarchoice simple>>\n<<jdconfig searchbutton simple>>\n<<jdconfig barpreset 4>>\n<<setTopsearchbar>>\n<<setBottomcontrols>>\n<<jdconfig radbuttopfixedsearchops hide>>\n<<jdconfig radbuttopcontrolsops hide>>\n<<jdconfig radbuttopmobbuttonsops hide>>\n<<jdconfig radbuttoptitleops hide>>\n<<jdconfig bottombarcontrolsops hide>>\n<<jdconfig bottombarmobbuttonsops hide>>\n<<jdconfig barpreset1ops hide>>\n<<jdconfig barpreset2ops hide>>\n<<jdconfig barpreset3ops hide>>\n<<jdconfig barpreset4ops hide>>\n<$fieldmangler tiddler=\"$:/plugins/jd/mob/button/search\">\n<$action-sendmessage $message=\"tm-add-tag\" $param=\"$:/tags/jd/mobbutton\"/>\n</$fieldmangler>\n\\end",
"title": "$:/plugins/jd/mob/macros",
"tags": "$:/tags/Macro",
"modifier": "JD",
"modified": "20171122150921869"
},
"$:/plugins/jd/mob/button/search": {
"created": "20171122115403541",
"creator": "JD",
"text": "<$reveal type=\"nomatch\" state=\"$:/plugins/jd/mob/config/config##searchbar\" text=\"yes\">\n<$button class=\"tc-btn-invisible\" tooltip=\"Show searchbar\" set=\"$:/plugins/jd/mob/config/config##searchbar\" setTo=\"yes\">\n<<jdconfig topbar search>>\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##searchbar\" text=\"yes\">\n<$button class=\"tc-btn-invisible\" tooltip=\"Hide searchbar\" set=\"$:/plugins/jd/mob/config/config##searchbar\" setTo=\"no\">\n<<jdconfig topbar hide>>\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>",
"title": "$:/plugins/jd/mob/button/search",
"tags": "$:/tags/jd/mobbutton",
"modifier": "JD",
"modified": "20171122154523596",
"description": "Toggle searchbar visibility",
"caption": "{{$:/core/images/advanced-search-button}} search"
},
"$:/plugins/jd/mob/template/search": {
"created": "20171018115714311",
"creator": "JD",
"text": "\\define NewTidActions(searcharea)\n<$action-createtiddler $basetitle={{$searcharea$}} $savetitle=\"$:/temp/NewTidTitle\"/>\n<$action-sendmessage $message=\"tm-edit-tiddler\" $param={{$:/temp/NewTidTitle}}/>\n<$action-deletetiddler $tiddler=\"$:/temp/NewTidTitle\"/>\n<$action-setfield $tiddler=\"$searcharea$\" text=\"\"/>\n\\end\n\n\\define NewTidBtn(searcharea)\n<$button tooltip=\"Create new tiddler with this title\" class=\"tc-btn-invisible\" actions=<<NewTidActions \"$searcharea$\">>>\n{{$:/core/images/new-button}}\n</$button>\n\\end\n\n\\define lingo-base() $:/language/Search/\n<$reveal state=\"$:/plugins/jd/mob/config/config##searchbar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\" animate=\"yes\">\n\n<$reveal state=\"$:/plugins/jd/mob/config/config##searchbarchoice\" type=\"match\" text=\"simple\">\n<div class=\"jd-search\">\n<$keyboard class=\"jd-searchwrapper\" tag=\"div\" key=\"ctrl+space\" actions=<<NewTidActions \"$:/temp/search\">>>\n<$edit-text tiddler=\"$:/temp/search\" type=\"search\" tag=\"input\" placeholder={{$:/language/Search/Search}} class=\"jd-searchbar\"/>\n</$keyboard>\n<div class=\"jd-search-buttons\">\n<$list filter=\"[[$:/temp/search]!text[]]\" variable=\"statecheck\">\n<<NewTidBtn \"$:/temp/search\">>\n</$list>\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##radbuttop\" text=\"fixedsearch\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search}}/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$list filter=\"[[$:/temp/search]!text[]]\" variable=\"statecheck\">\n<$button class=\"tc-btn-invisible\" tooltip=\"Clear searchbar\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text=\"\"/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$list>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/plugins/jd/mob/config/config##radbuttop\" text=\"fixedsearch\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<<jdconfig searchbar no>>\n<<jdconfig topbar {{$:/plugins/jd/mob/config/config##topbarchoice}}>>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search}}/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\" tooltip=\"Clear and hide searchbar\">\n<<jdconfig searchbar no>>\n<<jdconfig topbar {{$:/plugins/jd/mob/config/config##topbarchoice}}>>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text=\"\"/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n<div class=\"jd-search-results\">\n<$list filter=\"[[$:/temp/search]!text[]]\" variable=\"statecheck\">\n<$scrollable fallthrough=\"no\" class=\"results\">\n<$set name=\"searchTiddler\" value=\"$:/temp/search\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n</$set>\n</$scrollable>\n</$list>\n</div>\n</div>\n</$reveal>\n\n<$reveal state=\"$:/plugins/jd/mob/config/config##searchbarchoice\" type=\"match\" text=\"combined\">\n<div class=\"jd-search\">\n<$keyboard class=\"jd-searchwrapper\" tag=\"div\" key=\"ctrl+space\" actions=<<NewTidActions \"$:/temp/advancedsearch\">>>\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" placeholder={{$:/language/Search/Search}} class=\"jd-searchbar\"/>\n</$linkcatcher>\n</$keyboard>\n<div class=\"jd-search-buttons\">\n<$list filter=\"[[$:/temp/advancedsearch]!text[]]\" variable=\"statecheck\">\n<<NewTidBtn \"$:/temp/advancedsearch\">>\n</$list>\n{{$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete}}\n{{$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown}}\n{{$:/core/ui/AdvancedSearch/Filter/FilterButtons/export}}\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##radbuttop\" text=\"fixedsearch\">\n{{$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear}} \n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/plugins/jd/mob/config/config##radbuttop\" text=\"fixedsearch\">\n<$button class=\"tc-btn-invisible\" tooltip=\"Clear and hide searchbar\">\n<<jdconfig searchbar no>>\n<<jdconfig topbar {{$:/plugins/jd/mob/config/config##topbarchoice}}>>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text=\"\"/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n<div class=\"jd-search-results\">\n<!--STANDARD-->\n<$list filter=\"[[$:/temp/advancedsearch]!text[]]\" variable=\"statecheck\">\n<br>\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"{{$:/language/Search/Search/TooShort}}\"\"\" variable=\"listItem\">\n<$set name=\"searchTiddler\" value=\"$:/temp/advancedsearch\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n</$set>\n</$list>\n</$list>\n<!--STANDARD-->\n<!--FILTER-->\n<$list filter=\"[[$:/temp/advancedsearch]!text[]]\" variable=\"statecheck\">\n<br><br>\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\nFilter search: <<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}} template=\"$:/core/ui/ListItemTemplate\"/>\n</$set>\n</$list>\n<!--FILTER-->\n<!--SYSTEM-->\n<$list filter=\"[[$:/temp/advancedsearch]!text[]]\" variable=\"statecheck\">\n<br>\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\nSystem search: <<lingo System/Matches>>\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</$set>\n</$list>\n</$list>\n<!--SYSTEM-->\n<!--SHADOWS-->\n<$list filter=\"[[$:/temp/advancedsearch]!text[]]\" variable=\"statecheck\">\n<br>\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\nShadows search: <<lingo Shadows/Matches>>\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</$set>\n</$list>\n</$list>\n<!--SHADOWS-->\n</div>\n</div>\n</$reveal>\n</$reveal>",
"title": "$:/plugins/jd/mob/template/search",
"tags": "$:/tags/PageTemplate",
"modifier": "JD",
"modified": "20180903123722931"
},
"$:/plugins/jd/mob/config/misc": {
"created": "20171122140327337",
"creator": "JD",
"text": "<h2>Miscellaneous</h2>\n<h3>Config button</h3>\n<$checkbox tiddler=\"$:/config/jd/mobbutton/visibility/$:/plugins/jd/mob/button/config\" field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> Show {{$:/core/images/theme-button}} button at ''Controls'' / ''Mobbuttons''\n<br><br>\n<hr>\n<h3>Scrollbars</h3>\n<$button class=\"tc-btn-invisible\">\n<<jdconfig scrollbars hide>>\n<<jdradbut scrollbars hide>>\n</$button> Invisible scrollbars\n<br>\n<$button class=\"tc-btn-invisible\">\n<<jdconfig scrollbars show>>\n<<jdradbut scrollbars show>>\n</$button> Visible scrollbars\n<br><br>\n<hr>\n<h3>Focus</h3>\n<p>Here we can hide the hightlight / outline on focused text inputs and buttons</p>\n<$button class=\"tc-btn-invisible\">\n<<jdconfig focus show>>\n<<jdradbut focus show>>\n</$button> Default\n<br>\n<$button class=\"tc-btn-invisible\">\n<<jdconfig focus hide>>\n<<jdradbut focus hide>>\n</$button> Hide focus\n<br><br>\n<hr>\n<h3>Story river</h3>\nHere we can try to stop the fist tiddler in the story river from scrolling past the topbar\n<br>\n''Side effects:''\n<br>\n<li>For ''classic'' and ''pop'' story view: tiddlers won't automatically scroll into view on link click</li>\n<li>Browser search bar won't automatically hide on scroll up (tested on Chrome for Android)</li>\n<br>\n<$button class=\"tc-btn-invisible\">\n<<jdconfig storyfix yes>>\n<<jdradbut storyfix yes>>\n</$button> Apply \n<br>\n<$button class=\"tc-btn-invisible\">\n<<jdconfig storyfix no>>\n<<jdradbut storyfix no>>\n</$button> Don't apply\n<br><br>\n<hr>\n<h3>Restore defaults</h3>\n<div class=\"jd-bq\">\n<p>\nTo reset to...\n</p>\n<p>\nDefault font size, Visible scrollbars, ''Simple searchbar'' on top, ''Controls'' on bottom, ''Simple searchbar button'' on controls, Story river hack not applied...\n</p>\n<p>\nClick:\n</p>\n<p>\n<$reveal type=\"nomatch\" state=\"$:/plugins/jd/mob/config/config##defaultconfirm\" text=\"confirm\">\n<$button class=\"jd-btn-txt\">\n<<jdconfig defaultconfirm confirm>>\nRestore defaults\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/plugins/jd/mob/config/config##defaultconfirm\" text=\"confirm\">\n<$button class=\"jd-btn-txt\">\n<<setJDmobdefaults>>\n<<jdconfig defaultconfirm cancel>>\nConfirm\n</$button>\n<$button class=\"jd-btn-txt\">\n<<jdconfig defaultconfirm cancel>>\nCancel\n</$button>\n</$reveal>\n</p>\n</div>\n<br>",
"title": "$:/plugins/jd/mob/config/misc",
"tags": "$:/tags/jd/config",
"modified": "20171122141012375",
"modifier": "JD",
"caption": "Miscellaneous"
}
}
}
freshinstall: no
defaultconfirm: cancel
configtype: htabs
fontsize: small
scrollbars: hide
barpreset: 2
storyfix: yes
titlebaradjust: no
topbar: controls
topbarchoice: controls
searchbar: no
radbuttop: controls
searchbarchoice: simple
bottombar: hide
radbuttopfixedsearchops: hide
radbuttopcontrolsops: hide
radbuttopmobbuttonsops: hide
radbuttoptitleops: hide
bottombarcontrolsops: hide
bottombarmobbuttonsops: hide
barpreset1ops: hide
barpreset2ops: show
barpreset3ops: hide
barpreset4ops: hide
searchbutton: simple
focus: show
fontsize: default
searchbutton: simple
searchbar: no
searchbarchoice: simple
{"tiddlers":{"$:/plugins/kookma/todolist/history":{"title":"$:/plugins/kookma/todolist/history","created":"20200331053532911","modified":"20200405054217219","tags":"","type":"text/vnd.tiddlywiki","text":"Full change log https://kookma.github.io/TW-???/#ChangeLog\n\n* ''1.2.1'' -- 2020.04.05 -- minor issue in drag and drop fixed\n* ''1.2.0'' -- 2020.04.03 -- new features, item reording using drag and drop\n* ''1.1.0'' -- 2020.03.31 -- bugs fixed, moved to new Thirdflow development platform\n* ''1.0.0'' -- 2019.07.22 -- first stable release\n"},"$:/plugins/kookma/todolist/images/archive.svg":{"title":"$:/plugins/kookma/todolist/images/archive.svg","created":"20190716095419117","modified":"20200331065952093","tags":"","type":"text/vnd.tiddlywiki","text":"<svg class=\"tc-image-file-archive tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 384 512\"><path d=\"M128.3 160v32h32v-32zm64-96h-32v32h32zm-64 32v32h32V96zm64 32h-32v32h32zm177.6-30.1L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h79.7v16h32V48H208v104c0 13.3 10.7 24 24 24h104zM194.2 265.7c-1.1-5.6-6-9.7-11.8-9.7h-22.1v-32h-32v32l-19.7 97.1C102 385.6 126.8 416 160 416c33.1 0 57.9-30.2 51.5-62.6zm-33.9 124.4c-17.9 0-32.4-12.1-32.4-27s14.5-27 32.4-27 32.4 12.1 32.4 27-14.5 27-32.4 27zm32-198.1h-32v32h32z\"/></svg>"},"$:/plugins/kookma/todolist/images/bug.svg":{"title":"$:/plugins/kookma/todolist/images/bug.svg","created":"20190714051837328","modified":"20200331065952099","type":"text/vnd.tiddlywiki","text":"<svg class=\"tc-image-bug tc-image-button\" width=\"1em\" height=\"1em\" viewBox=\"0 0 512 512\"><path d=\"M511.988 288.9c-.478 17.43-15.217 31.1-32.653 31.1H424v16c0 21.864-4.882 42.584-13.6 61.145l60.228 60.228c12.496 12.497 12.496 32.758 0 45.255-12.498 12.497-32.759 12.496-45.256 0l-54.736-54.736C345.886 467.965 314.351 480 280 480V236c0-6.627-5.373-12-12-12h-24c-6.627 0-12 5.373-12 12v244c-34.351 0-65.886-12.035-90.636-32.108l-54.736 54.736c-12.498 12.497-32.759 12.496-45.256 0-12.496-12.497-12.496-32.758 0-45.255l60.228-60.228C92.882 378.584 88 357.864 88 336v-16H32.666C15.23 320 .491 306.33.013 288.9-.484 270.816 14.028 256 32 256h56v-58.745l-46.628-46.628c-12.496-12.497-12.496-32.758 0-45.255 12.498-12.497 32.758-12.497 45.256 0L141.255 160h229.489l54.627-54.627c12.498-12.497 32.758-12.497 45.256 0 12.496 12.497 12.496 32.758 0 45.255L424 197.255V256h56c17.972 0 32.484 14.816 31.988 32.9zM257 0c-61.856 0-112 50.144-112 112h224C369 50.144 318.856 0 257 0z\"/></svg>"},"$:/plugins/kookma/todolist/images/bullhorn":{"title":"$:/plugins/kookma/todolist/images/bullhorn","caption":"bullhorn (Solid)","created":"20190721150354198","modified":"20200331065952107","type":"text/vnd.tiddlywiki","text":"<svg class=\"tc-image-bullhorn tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 576 512\"><path d=\"M576 240c0-23.63-12.95-44.04-32-55.12V32.01C544 23.26 537.02 0 512 0c-7.12 0-14.19 2.38-19.98 7.02l-85.03 68.03C364.28 109.19 310.66 128 256 128H64c-35.35 0-64 28.65-64 64v96c0 35.35 28.65 64 64 64h33.7c-1.39 10.48-2.18 21.14-2.18 32 0 39.77 9.26 77.35 25.56 110.94 5.19 10.69 16.52 17.06 28.4 17.06h74.28c26.05 0 41.69-29.84 25.9-50.56-16.4-21.52-26.15-48.36-26.15-77.44 0-11.11 1.62-21.79 4.41-32H256c54.66 0 108.28 18.81 150.98 52.95l85.03 68.03a32.023 32.023 0 0 0 19.98 7.02c24.92 0 32-22.78 32-32V295.13C563.05 284.04 576 263.63 576 240zm-96 141.42l-33.05-26.44C392.95 311.78 325.12 288 256 288v-96c69.12 0 136.95-23.78 190.95-66.98L480 98.58v282.84z\"/></svg>"},"$:/plugins/kookma/todolist/images/lightbulb":{"title":"$:/plugins/kookma/todolist/images/lightbulb","caption":"lightbulb (Regular)","created":"20190721150413950","modified":"20200331065952116","tags":"$:/tags/Image [[Font Awesome 5]] Regular","type":"text/vnd.tiddlywiki","text":"<svg class=\"tc-image-lightbulb tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 352 512\"><path d=\"M96.06 454.35c.01 6.29 1.87 12.45 5.36 17.69l17.09 25.69a31.99 31.99 0 0 0 26.64 14.28h61.71a31.99 31.99 0 0 0 26.64-14.28l17.09-25.69a31.989 31.989 0 0 0 5.36-17.69l.04-38.35H96.01l.05 38.35zM0 176c0 44.37 16.45 84.85 43.56 115.78 16.52 18.85 42.36 58.23 52.21 91.45.04.26.07.52.11.78h160.24c.04-.26.07-.51.11-.78 9.85-33.22 35.69-72.6 52.21-91.45C335.55 260.85 352 220.37 352 176 352 78.61 272.91-.3 175.45 0 73.44.31 0 82.97 0 176zm176-80c-44.11 0-80 35.89-80 80 0 8.84-7.16 16-16 16s-16-7.16-16-16c0-61.76 50.24-112 112-112 8.84 0 16 7.16 16 16s-7.16 16-16 16z\"/></svg>"},"$:/plugins/kookma/todolist/images/list-alt.svg":{"title":"$:/plugins/kookma/todolist/images/list-alt.svg","created":"20190716095433587","modified":"20200331065952123","tags":"","type":"text/vnd.tiddlywiki","text":"<svg class=\"tc-image-list-alt tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 512 512\"><path d=\"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zm-6 400H54a6 6 0 0 1-6-6V86a6 6 0 0 1 6-6h404a6 6 0 0 1 6 6v340a6 6 0 0 1-6 6zm-42-92v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm0-96v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm0-96v24c0 6.627-5.373 12-12 12H204c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h200c6.627 0 12 5.373 12 12zm-252 12c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36zm0 96c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36zm0 96c0 19.882-16.118 36-36 36s-36-16.118-36-36 16.118-36 36-36 36 16.118 36 36z\"/></svg>"},"$:/plugins/kookma/todolist/images/share-alt":{"title":"$:/plugins/kookma/todolist/images/share-alt","caption":"share-alt (Solid)","created":"20190721150321438","modified":"20200331065952131","type":"text/vnd.tiddlywiki","text":"<svg class=\"tc-image-share-alt tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 448 512\"><path d=\"M352 320c-22.608 0-43.387 7.819-59.79 20.895l-102.486-64.054a96.551 96.551 0 0 0 0-41.683l102.486-64.054C308.613 184.181 329.392 192 352 192c53.019 0 96-42.981 96-96S405.019 0 352 0s-96 42.981-96 96c0 7.158.79 14.13 2.276 20.841L155.79 180.895C139.387 167.819 118.608 160 96 160c-53.019 0-96 42.981-96 96s42.981 96 96 96c22.608 0 43.387-7.819 59.79-20.895l102.486 64.054A96.301 96.301 0 0 0 256 416c0 53.019 42.981 96 96 96s96-42.981 96-96-42.981-96-96-96z\"/></svg>"},"$:/plugins/kookma/todolist/images/times.svg":{"title":"$:/plugins/kookma/todolist/images/times.svg","created":"20190716033811299","modified":"20200331065952137","tags":"","type":"text/vnd.tiddlywiki","text":"<svg class=\"tc-image-times tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 352 512\"><path d=\"M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z\"/></svg>"},"$:/plugins/kookma/todolist/images/wrench.svg":{"title":"$:/plugins/kookma/todolist/images/wrench.svg","created":"20190714052925874","modified":"20200331065952142","tags":"","type":"text/vnd.tiddlywiki","text":"<svg class=\"tc-image-wrench tc-image-button\" width=\"1em\" height=\"1em\" viewBox=\"0 0 512 512\"><path d=\"M507.73 109.1c-2.24-9.03-13.54-12.09-20.12-5.51l-74.36 74.36-67.88-11.31-11.31-67.88 74.36-74.36c6.62-6.62 3.43-17.9-5.66-20.16-47.38-11.74-99.55.91-136.58 37.93-39.64 39.64-50.55 97.1-34.05 147.2L18.74 402.76c-24.99 24.99-24.99 65.51 0 90.5 24.99 24.99 65.51 24.99 90.5 0l213.21-213.21c50.12 16.71 107.47 5.68 147.37-34.22 37.07-37.07 49.7-89.32 37.91-136.73zM64 472c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"/></svg>"},"$:/plugins/kookma/todolist/license":{"title":"$:/plugins/kookma/todolist/license","created":"20200331053532912","modified":"20200331055909558","tags":"","type":"text/vnd.tiddlywiki","text":"Distributed under an MIT license.\n\nCopyright (c) 2019-2020 [[Mohammad Rahmani|https://github.com/kookma]]\n\n<<<\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n<<<"},"$:/plugins/kookma/todolist/macros/add-remove-list-item":{"title":"$:/plugins/kookma/todolist/macros/add-remove-list-item","created":"20190718081952856","modified":"20200402154453857","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define todolist-remove-item-from-list(targetTiddler, item)\n<$action-listops $tiddler=<<__targetTiddler__>> $field=\"list\" $subfilter=\"+[remove[$item$]]\"/>\n\\end\n\n\\define todolist-add-item-to-list(targetTiddler, item)\n<$action-listops $tiddler=<<__targetTiddler__>> $field=\"list\" $subfilter=\"[[$item$]]+[putfirst[]]\"/>\n\\end\n"},"$:/plugins/kookma/todolist/macros/add-task":{"title":"$:/plugins/kookma/todolist/macros/add-task","created":"20190715170540482","modified":"20200402122702989","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define todolist-input-task()\n<$keyboard key=\"escape\" actions=<<todolist-cancel-action>> >\n<$keyboard key=\"enter\" actions=<<todolist-add-task-action>> >\n<$edit-text \n tiddler=<<stateTiddler>> \n index=\"itemtext\" \n tag=\"input\"\n class=\"kk-todolist-input-textbox\"\n placeholder=\"add new item\"\n default=\"\" minHeight=\"1em\" focus=\"yes\"\n />\n</$keyboard> \n</$keyboard> \n\\end\n \n\\define todolist-add-task()\n<$button class=\"tc-btn-invisible\" tooltip=\"Add new item\">\n\t{{$:/core/images/new-button}}\n\t<<todolist-add-task-action>>\n</$button>\n\\end\n\n\\define todolist-add-task-action()\n <$list filter=\"[<stateTiddler>getindex[itemtext]!is[blank]]\" variable=ignor>\n\t<$set name=item value=<<now \"[UTC]YYYY0MM0DD0hh0mm0ssXXX\">> >\n\t<$action-setfield \n\t $tiddler=<<taskTiddler>>\n\t $index=<<item>>\n\t $value={{{ [<stateTiddler>getindex[itemtext]] }}}\n\t/>\n\t<$action-setfield $tiddler=<<statusTiddler>> $index=<<item>> $value=\"undone\"\t/>\n\t<$action-setfield $tiddler=<<priorityTiddler>> $index=<<item>> $value=\"none\"\t/>\n <$macrocall $name=\"todolist-add-item-to-list\" targetTiddler=<<taskTiddler>> item=<<item>> />\n\t</$set>\n\t<$action-setfield $tiddler=<<stateTiddler>> $index=\"itemtext\" $value=\"\"/>\n\t</$list>\n\\end\n\n\\define todolist-cancel-action()\n <$action-setfield $tiddler=<<stateTiddler>> $index=\"itemtext\" $value=\"\"/>\n\\end"},"$:/plugins/kookma/todolist/macros/archive-operations":{"title":"$:/plugins/kookma/todolist/macros/archive-operations","created":"20190719141644069","modified":"20200402120458856","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define todolist-list-archived-items(nameSpace:\"\")\n<$vars\n archiveTiddler=\"\"\"$nameSpace$/archive\"\"\"\n priorityTiddler=\"\"\"$nameSpace$/priority\"\"\"\n>\n<$list filter=\"[<archiveTiddler>indexes[]!sort[]]\" variable=\"item\">\n<div class=\"kk-todolist-row\">\n <div class=\"kk-todolist-delete\"><<todolist-delete-item>></div>\n\t<div class=\"kk-todolist-priority\"><<todolist-show-priority-level>></div>\n <div class=\"kk-todolist-desc\">\n\t<span class=\"kk-todolist-date\">\n\t<$view tiddler=<<item>> field=\"title\" format=\"date\" template=\"mmm 0DD, YYYY 0hh:0mm\"/></span>\n\t<$transclude tiddler=<<archiveTiddler>> index=<<item>>/>\n\t</div>\n</div>\n</$list>\n</$vars>\n\\end\n\n\\define todolist-show-priority-level()\n<$button class=\"tc-btn-invisible\" tooltip=\"Prority of archived items cannot be changed\">\n<$macrocall $name=\"disp-priority-badge\" color={{{[<priorityTiddler>getindex<item>]}}} />\n</$button>\n\\end\n\n\\define todolist-delete-item()\n<$button class=\"tc-btn-invisible\">\n{{$:/plugins/kookma/todolist/images/times.svg}}\n<$action-setfield $tiddler=<<archiveTiddler>> $index=<<item>> />\n<$action-setfield $tiddler=<<priorityTiddler>> $index=<<item>> />\n</$button>\n\\end\n\n\\define todolist-empty-archived-tiddler(nameSpace)\n<$vars\n archiveTiddler=\"\"\"$nameSpace$/archive\"\"\"\n priorityTiddler=\"\"\"$nameSpace$/priority\"\"\"\n>\n<$button class=\"tc-btn-invisible tc-tiddlylink\" tooltip=\"Empty archive\"> {{$:/core/images/delete-button}} Delete archive\n<$list filter=\"[<archiveTiddler>indexes[]!sort[]]\" variable=\"item\">\n <$action-setfield $tiddler=<<archiveTiddler>> $index=<<item>> />\n <$action-setfield $tiddler=<<priorityTiddler>> $index=<<item>> />\n</$list>\n</$button>\n</$vars>\n\\end\t "},"$:/plugins/kookma/todolist/macros/bulk-operation":{"title":"$:/plugins/kookma/todolist/macros/bulk-operation","created":"20190716083959795","modified":"20200403122124607","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define todolist-all-tasks-unfinished()\n<span style=\"font-size:smaller\">\n<$list filter=\"[<taskTiddler>indexes[]limit[1]]\" emptyMessage=\"You're all done\" variable=ignore>\n<$count filter=\"[<taskTiddler>indexes[]]\"/> ITEMS\n</$list>\n</span>\n\\end\n\n\\define todolist-mark-all-button()\n<$reveal type=\"nomatch\" stateTitle=<<stateTiddler>> stateIndex=\"markall\" text=\"yes\">\n<$button class=\"tc-btn-invisible\" tooltip=\"Mark all items as done\" setTitle=<<stateTiddler>> setIndex=\"markall\" setTo=\"yes\">\n{{$:/core/images/save-button}}\n<<tdl-done-all>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<stateTiddler>> stateIndex=\"markall\" text=\"yes\">\n<$button class=\"tc-btn-invisible\" tooltip=\"Mark all items as undone\" setTitle=<<stateTiddler>> setIndex=\"markall\" setTo=\"no\">\n{{$:/core/images/refresh-button}}\n<<tdl-undone-all>>\n</$button>\n</$reveal>\n\\end\n\n\\define tdl-done-all()\n<$list filter=\"[<taskTiddler>indexes[]]\" variable=\"item\">\n<$action-setfield \n$tiddler=<<doneTiddler>>\n$index=<<item>>\n$value={{{ [<taskTiddler>getindex<item>] }}}\n/>\n<$action-setfield \n$tiddler=<<statusTiddler>>\n$index=<<item>>\n$value=\"done\"\n/>\n<$macrocall $name=\"todolist-remove-item-from-list\" targetTiddler=<<taskTiddler>> item=<<item>> />\n<$action-setfield $tiddler=<<taskTiddler>> $index=<<item>> />\n</$list>\n\\end\n\n\\define tdl-undone-all()\n<$list filter=\"[<doneTiddler>indexes[]]\" variable=\"item\">\n<$action-setfield \n$tiddler=<<taskTiddler>>\n$index=<<item>>\n$value={{{ [<doneTiddler>getindex<item>] }}}\n/>\n<$action-setfield \n$tiddler=<<statusTiddler>>\n$index=<<item>>\n$value=\"undone\"\n/>\n<$macrocall $name=\"todolist-add-item-to-list\" targetTiddler=<<taskTiddler>> item=<<item>> />\n<$action-setfield $tiddler=<<doneTiddler>> $index=<<item>> />\n</$list>\n\\end\n\n\n\\define todolist-archive-completed-items()\n<$button class=\"tc-btn-invisible\" tooltip=\"Archive done items\">\n{{$:/plugins/kookma/todolist/images/archive.svg}}\n<$list filter=\"[<doneTiddler>indexes[]]\" variable=\"item\">\n<$action-setfield \n$tiddler=<<archiveTiddler>>\n$index=<<item>>\n$value={{{ [<doneTiddler>getindex<item>] }}}\n/>\n<$action-setfield $tiddler=<<statusTiddler>> $index=<<item>> />\n<$action-setfield $tiddler=<<doneTiddler>> $index=<<item>> />\n<$action-setfield $tiddler=<<stateTiddler>> $index=\"markall\" $value=\"no\"/>\n</$list>\n</$button>\n\\end\n\n\\define todolist-display-archived-items()\n<$button class=\"tc-btn-invisible\" tooltip=\"Display archived items\"> {{$:/plugins/kookma/todolist/images/list-alt.svg}}\n\n<$action-setfield \n$tiddler=\"$:/plugins/kookma/todolist/template/archive-list\"\ntitle=<<displayArchivedTiddler>> /> \n<$action-setfield $tiddler=<<displayArchivedTiddler>>\n$field=\"td-namespace\" $value=<<nameSpace>> />\n\n<$action-navigate $to=<<displayArchivedTiddler>> $scroll=\"yes\"/>\n</$button>\n\\end\t"},"$:/plugins/kookma/todolist/macros/category":{"title":"$:/plugins/kookma/todolist/macros/category","created":"20190714040123984","modified":"20200331184650454","tags":"$:/tags/Macro","type":"text/vnd.tiddlywiki","text":"\\define high(text) \n<span style=\"padding-left:3px;color:#cd5360;\">$text$</span>\n\\end\n\n\\define normal(text) \n<span style=\"color:#286da8;\">$text$</span>\n\\end\n\n\\define low(text) \n<span style=\"color:#b37d4e;\">$text$</span>\n\\end\n\n\\define fixme(text)\n<span class=\"kk-todolist-category-c1\">{{$:/plugins/kookma/todolist/images/wrench.svg}} $text$</span>\n\\end\n\n\\define bug(text)\n<span class=\"kk-todolist-category-c1\">{{$:/plugins/kookma/todolist/images/bug.svg}} $text$</span>\n\\end\n\n\\define horn(text)\n<span class=\"kk-todolist-category-c2\">{{$:/plugins/kookma/todolist/images/bullhorn}} $text$</span>\n\\end\n\n\\define tip(text)\n<span class=\"kk-todolist-category-c2\">{{$:/plugins/kookma/todolist/images/lightbulb}} $text$</span>\n\\end\n\n\\define share(text)\n<span class=\"kk-todolist-category-c2\">{{$:/plugins/kookma/todolist/images/share-alt}} $text$</span>\n\\end"},"$:/plugins/kookma/todolist/macros/confirm-delete":{"title":"$:/plugins/kookma/todolist/macros/confirm-delete","created":"20190721041511697","modified":"20200331172725431","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define todolist-confirm-delete(\nbtnLabel:\"Delete these tiddlers\", \nconfirmMessage:\"Are you sure you wish to delete\", \nstateTiddler:\"\", \ncountFilter:\"\", \nactionMacro:\"\")\n\n<$button class=\"tc-btn-invisible tc-tiddlylink\" tooltip=\"Empty archive\" popup=<<qualify \"\"\"$stateTiddler$\"\"\">> > {{$:/core/images/delete-button}} $btnLabel$\n</$button>\n\n<$reveal state=<<qualify \"\"\"$stateTiddler$\"\"\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<div class=\"tc-dropdown-item-plain\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter=<<__countFilter__>> />\"\"\">\n$confirmMessage$ <<resultCount>> tiddler(s)?\n</$set>\n</div>\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn-invisible tc-tiddlylink\" tooltip=\"Empty archive\"\nactions=<<__actionMacro__>> > \n{{$:/core/images/delete-button}} Delete all?\n</$button>\n</div>\n</div>\n</div>\n</$reveal>\n\\end"},"$:/plugins/kookma/todolist/macros/delete-task":{"title":"$:/plugins/kookma/todolist/macros/delete-task","created":"20190715170610146","modified":"20200402124703285","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define todolist-delete-task(dataTiddler)\n<$button class=\"tc-btn-invisible\">\n{{$:/plugins/kookma/todolist/images/times.svg}}\n<$action-setfield $tiddler=<<__dataTiddler__>> $index=<<item>> />\n<$action-setfield $tiddler=<<statusTiddler>> $index=<<item>> />\n<$action-setfield $tiddler=<<priorityTiddler>> $index=<<item>> />\n<!-- delete item from list field of task tiddler if it is an undone task! -->\n<$reveal type=\"match\" text=<<__dataTiddler__>> default=<<taskTiddler>> >\n<$macrocall $name=\"todolist-remove-item-from-list\" targetTiddler=<<taskTiddler>> item=<<item>> />\n</$reveal>\n</$button>\n\\end\n"},"$:/plugins/kookma/todolist/macros/done-task":{"title":"$:/plugins/kookma/todolist/macros/done-task","created":"20190715170633034","modified":"20200403094412340","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define todolist-done-task()\n<$checkbox \n tiddler=<<statusTiddler>> \n index=<<item>> \n checked=\"done\" \n unchecked=\"undone\" \n default=\"undone\"\n actions=<<tdl-done-actions>>\n>\n</$checkbox>\n\\end\n\n\\define tdl-done-actions()\n <$action-setfield \n $tiddler=<<doneTiddler>>\n $index=<<item>>\n $value={{{ [<taskTiddler>getindex<item>] }}}\n />\n<$macrocall $name=\"todolist-remove-item-from-list\" targetTiddler=<<taskTiddler>> item=<<item>> />\n<$action-setfield $tiddler=<<taskTiddler>> $index=<<item>> />\n\\end"},"$:/plugins/kookma/todolist/macros/draggable-list":{"title":"$:/plugins/kookma/todolist/macros/draggable-list","created":"20190718070116654","modified":"20200405054450296","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define draggable-list(targetTiddler)\n\\whitespace trim\n<$vars targetTiddler=<<__targetTiddler__>> >\n<span class=\"kk-todolist-draggable-list\">\n<$list filter=\"[list<targetTiddler>]\" variable=\"item\">\n<$droppable actions=<<droppable-actions>>>\n <div class=\"tc-droppable-placeholder kk-todolist-placeholder\"></div> \n <$draggable tiddler=<<item>> >\n <$transclude tiddler=\"$:/plugins/kookma/todolist/template/undone-task\" field=\"text\"/>\n </$draggable>\n</$droppable>\n</$list>\n<<disp-empty-placeholder>>\n</span>\n</$vars>\n\\end\n\n\\define droppable-actions()\n<!-- the $list checks to prvents drag items not listed in this Todolist -->\n<$list filter=\"[<targetTiddler>contains<actionTiddler>]\" variable=ignore>\n<$action-listops $tiddler=<<targetTiddler>> $field=\"list\" $subfilter=\"+[insertbefore:item<actionTiddler>]\"/>\n</$list>\n\\end\n\n\\define xxdisp-empty-placeholder()\n<$tiddler tiddler=\"\"><!-- an empty place holder-->\n<$droppable actions=<<droppable-actions>> tag=\"div\">\n<div style=\"height:0.5em;\"/>\n<div class=\"tc-droppable-placeholder kk-todolist-placeholder\"> </div>\n</$droppable>\n</$tiddler>\n\\end\n\n\n\\define disp-empty-placeholder()\n<$tiddler tiddler=\"\">\n<$droppable actions=<<droppable-actions>> tag=\"div\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder kk-todolist-placeholder\">\n \n</div>\n<div style=\"height:0.5em;\"/>\n</$droppable>\n</$tiddler>\n\\end"},"$:/plugins/kookma/todolist/macros/explore-internalTids":{"title":"$:/plugins/kookma/todolist/macros/explore-internalTids","created":"20190719143452217","modified":"20200401214333824","type":"text/vnd.tiddlywiki","text":"\\define todolist-fullbaseName() $(td-basePath)$$(baseName)$\n\n\\define todolist-explore-data-tiddlers()\n\n><b>Number of internal tiddlers found: <$count filter=\"[all[tiddlers+shadows]prefix<td-basePath>]\" /></b><br>\n><$macrocall $name=\"todolist-delete-all-tids\" filter=<<dataTids>> />\n\n<h2> Todo lists</h2>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<td-basePath>splitbefore[/]removesuffix[/]sort[]]\" variable=\"baseName\">\n\n<$set name=bsFilter value=\"[prefix<todolist-fullbaseName>sort[]]\">\n<h3><<todolist-delete-all-tids-baseName>> <<baseName>></h3>\n<blockquote>\n<$list filter=<<bsFilter>> variable=\"internalTid\" emptyMessage=\"//No internal data tiddlers is found!//\">\n<div class=\"kk-todolist-row\">\n<div class=\"kk-todolist-delete\"><$macrocall $name=\"todolist-delete-single-iternalTid\" /></div>\n<div class=\"kk-todolist-desc\"><$link to=<<internalTid>>><$view tiddler=<<internalTid>> field=\"title\"/></$link></div>\n</div>\n</$list>\n</blockquote>\n</$set>\n\n</$list>\n\n\\end\n\n\n\\define todolist-delete-single-iternalTid()\n<$button class=\"tc-btn-invisible tc-tiddlylink\">\n\t{{$:/plugins/kookma/todolist/images/times.svg}}\n\t<$action-deletetiddler $tiddler=<<internalTid>> />\n</$button>\n\\end\n\n\\define todolist-delete-all-tids-baseName()\n<$button class=\"tc-btn-invisible tc-tiddlylink\" tooltip=\"Delete all data tiddlers in this Todo list?\"> {{$:/core/images/delete-button}}\n <$action-deletetiddler $filter=<<bsFilter>> />\n</$button>\n\\end\n\n\\define todolist-delete-all-tids()\n<!-- uses confirm delete macro to notify user when delete all internal tiddlers -->\n<$macrocall $name=\"todolist-confirm-delete\" \nbtnLabel=\"Delete all interal tiddlers?\"\nstateTiddler=\"temp\"\ncountFilter=\"[all[tiddlers+shadows]prefix<td-basePath>]\"\nactionMacro=<<action-empty-archive>>\n/>\n\\end\n\\define action-empty-archive()\n<$action-deletetiddler $filter=\"[all[tiddlers+shadows]prefix<td-basePath>]\" />\n\\end\t \n"},"$:/plugins/kookma/todolist/macros/nondraggable-list":{"title":"$:/plugins/kookma/todolist/macros/nondraggable-list","created":"20200403105715811","modified":"20200403105734826","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define disp-list-in-edit-mode()\n<$list filter=\"[list<taskTiddler>]\" variable=\"item\">\n <$transclude tiddler=\"$:/plugins/kookma/todolist/template/undone-task\" field=\"text\"/>\n</$list>\n\\end"},"$:/plugins/kookma/todolist/macros/options":{"title":"$:/plugins/kookma/todolist/macros/options","created":"20190716075847899","modified":"20200403120956166","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define todolist-options-button()\n<$reveal type=\"nomatch\" stateTitle=<<stateTiddler>> stateIndex=\"option\" text=\"yes\">\n<$button class=\"tc-btn-invisible\" tooltip=\"Show options\" setTitle=<<stateTiddler>> setIndex=\"option\" setTo=\"yes\">\n{{$:/core/images/options-button}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<stateTiddler>> stateIndex=\"option\" text=\"yes\">\n<$button class=\"tc-btn-invisible\" tooltip=\"Hide options\" setTitle=<<stateTiddler>> setIndex=\"option\" setTo=\"no\">\n{{$:/core/images/options-button}}\n</$button>\n</$reveal>\n\\end\n\n\\define todolist-options-content()\n<$reveal type=\"match\" stateTitle=<<stateTiddler>> stateIndex=\"option\" text=\"yes\">\n<<todolist-mark-all-button>> <<todolist-archive-completed-items>> <<todolist-display-archived-items>> <<todolist-toggle-timestamp>> <<todolist-all-tasks-unfinished>>\n</$reveal>\n\\end\n\n"},"$:/plugins/kookma/todolist/macros/priority":{"title":"$:/plugins/kookma/todolist/macros/priority","created":"20190718170817837","modified":"20200402105643019","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define categoryColors()\n<$list filter=\"[[$:/plugins/kookma/todolist/settings/colors]indexes[]sortby{$:/plugins/kookma/todolist/settings/colors!!list}]\" variable=color>\n<<color>>\n</$list>\n\\end\n\n\\define todolist-set-priority()\n<$wikify name=colors text=<<categoryColors>> >\n<$macrocall $name=\"todolist-cycle-color\" arraySet=<<colors>> stateTiddler=<<priorityTiddler>> stateIndex=<<item>> />\n</$wikify>\n\\end\n\n\\define disp-priority-badge(color)\n<svg width=\"12\" height=\"12\" >\n<circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"grey\" fill=\"$color$\" />\n</svg>\n\\end\n\n\n\\define todolist-cycle-color(arraySet:\"\", stateTiddler:\"\", stateIndex:\"txt\")\n<$vars array=<<__arraySet__>> currentColor={{{[<__stateTiddler__>getindex<__stateIndex__>]}}} >\n<$button class=\"tc-btn-invisible\" tooltip=\"Set priority level\">\n <$macrocall $name=\"disp-priority-badge\" color=<<currentColor>> />\n <$set\n filter='[enlist<array>after<currentColor>]'\n name=NextItem\n emptyValue={{{[enlist<array>first[]]}}}\n >\n <$action-setfield\n $tiddler=<<__stateTiddler__>>\n $index=<<__stateIndex__>>\n $value=<<NextItem>> />\n </$set>\n </$button>\n</$vars>\t\n\\end"},"$:/plugins/kookma/todolist/macros/show-task":{"title":"$:/plugins/kookma/todolist/macros/show-task","created":"20190715170652239","modified":"20200403054629783","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define todolist-show-task()\n<$keyboard key=\"enter\" actions=<<tdl-kbd-action>> >\n<$list filter=\"[<stateTiddler>getindex[editview]match[edit]]\" \n emptyMessage=\"\"\"<$macrocall $name=\"view-task\" dataTiddler=<<taskTiddler>> />\"\"\" >\n<$edit-text \n tiddler=<<taskTiddler>>\n index=<<item>>\n tag=input\n class=\"kk-todolist-input-textbox\"\n />\n</$list>\n</$keyboard>\n\\end\n\n\\define tdl-kbd-action()\n<$action-setfield $tiddler=<<stateTiddler>> $index=\"editview\" $value=\"view\" />\n\\end\n\n\\define view-task(dataTiddler)\n<$transclude tiddler=<<__dataTiddler__>> index=<<item>>/>\n<$reveal type=\"match\" stateTitle=<<stateTiddler>> stateIndex=\"timestamp\" text=\"show\">\n<span class=\"kk-todolist-date\"> <$view tiddler=<<item>> field=\"title\" format=\"date\" template=\"mmm 0DD, YYYY 0hh:0mm\"/></span>\n</$reveal>\n\\end"},"$:/plugins/kookma/todolist/macros/toggle-edit-button":{"title":"$:/plugins/kookma/todolist/macros/toggle-edit-button","created":"20190715171733677","modified":"20200331172725488","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define todolist-toggle-edit-button()\n<$reveal type=\"nomatch\" stateTitle=<<stateTiddler>> stateIndex=\"editview\" text=\"edit\">\n<$button class=\"tc-btn-invisible\" setTitle=<<stateTiddler>> setIndex=\"editview\" setTo=\"edit\" tooltip=\"Edit items\">\n{{$:/core/images/edit-button}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<stateTiddler>> stateIndex=\"editview\" text=\"edit\">\n<$button class=\"tc-btn-invisible\" setTitle=<<stateTiddler>> setIndex=\"editview\" setTo=\"view\" tooltip=\"Save items\">\n{{$:/core/images/done-button}}\n</$button>\n</$reveal>\n\\end"},"$:/plugins/kookma/todolist/macros/toggle-timestamp":{"title":"$:/plugins/kookma/todolist/macros/toggle-timestamp","created":"20190722034557852","modified":"20200331172725496","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define todolist-toggle-timestamp()\n<$reveal type=\"nomatch\" stateTitle=<<stateTiddler>> stateIndex=\"timestamp\" text=\"show\">\n<$button class=\"tc-btn-invisible\" setTitle=<<stateTiddler>> setIndex=\"timestamp\" setTo=\"show\" tooltip=\"Show timestamp\">\n{{$:/core/images/timestamp-on}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<stateTiddler>> stateIndex=\"timestamp\" text=\"show\">\n<$button class=\"tc-btn-invisible\" setTitle=<<stateTiddler>> setIndex=\"timestamp\" setTo=\"hide\" tooltip=\"Hide timestamp\">\n{{$:/core/images/timestamp-off}}\n</$button>\n</$reveal>\n\\end"},"$:/plugins/kookma/todolist/macros/ui":{"title":"$:/plugins/kookma/todolist/macros/ui","created":"20190715170739310","modified":"20200405061046677","tags":"$:/tags/Macro","type":"text/vnd.tiddlywiki","text":"\\define td-basePath() $:/todolist/data/\n\n\\define todolist-ui(caption:\"A plain todolist\", width:\"100%\" base:\"base\")\n\\import [all[tiddlers+shadows]tag[$:/tags/Todolist/Macro]!has[draft.of]]\n\\whitespace trim\n\n<$vars \n nameSpace= \"$(td-basePath)$$base$\"\n stateTiddler= \"$(td-basePath)$$base$/state\"\n taskTiddler= \"$(td-basePath)$$base$/tasks\"\n doneTiddler= \"$(td-basePath)$$base$/done\"\n statusTiddler= \"$(td-basePath)$$base$/status\"\n priorityTiddler=\"$(td-basePath)$$base$/priority\"\n archiveTiddler= \"$(td-basePath)$$base$/archive\"\t\n displayArchivedTiddler=\"Todolist - Archived Items - $base$\"\n>\t\n<div class=\"kk-todolist-ui\" style=\"max-width:$width$;\">\n\n$caption$\n\n<div class=\"kk-todolist-header-ui\">\n<div class=\"kk-todolist-header-textbox\"><<todolist-input-task>></div>\n<div><<todolist-add-task>></div>\n<div><<todolist-toggle-edit-button>></div>\n<div><<todolist-options-button>></div>\n</div>\n<<todolist-options-content>>\n<!--\n<$list filter=\"[<taskTiddler>indexes[]!sort[]]\" variable=\"item\">\n<$transclude tiddler=\"$:/plugins/kookma/todolist/template/undone-task\" field=\"text\" />\n</$list>\n-->\n\n<!-- display undone items -->\n<$list filter=\"[<stateTiddler>getindex[editview]match[edit]]\" variable=ignore \n emptyMessage=\"\"\"<$macrocall $name=\"draggable-list\" targetTiddler=<<taskTiddler>> />\"\"\">\n\t <<disp-list-in-edit-mode>>\n</$list>\n\n<div style=\"height:0.2em\"/>\n\n<!-- display done items -->\n<$list filter=\"[<doneTiddler>indexes[]!nsort[]]\" variable=\"item\">\n<$transclude tiddler=\"$:/plugins/kookma/todolist/template/done-task\" field=\"text\" />\n</$list>\n</div>\n</$vars>\n\\end\n"},"$:/plugins/kookma/todolist/macros/undone-task":{"title":"$:/plugins/kookma/todolist/macros/undone-task","created":"20190715190405259","modified":"20200403094425309","tags":"$:/tags/Todolist/Macro","type":"text/vnd.tiddlywiki","text":"\\define todolist-undone-task()\n<$checkbox \ntiddler=<<statusTiddler>> \nindex=<<item>> \nchecked=\"done\" \nunchecked=\"undone\" \ndefault=\"undone\"\nuncheckactions=<<tdl-undone-actions>>\n>\n</$checkbox>\n\\end\n\n\\define tdl-undone-actions()\n<$action-setfield \n$tiddler=<<taskTiddler>>\n$index=<<item>>\n$value={{{ [<doneTiddler>getindex<item>] }}}\n/><\n<$macrocall $name=\"todolist-add-item-to-list\" targetTiddler=<<taskTiddler>> item=<<item>> />\n<$action-setfield $tiddler=<<doneTiddler>> $index=<<item>> />\n\\end\n"},"$:/plugins/kookma/todolist/readme":{"title":"$:/plugins/kookma/todolist/readme","created":"20200331053532913","modified":"20200403133906816","tags":"","type":"text/vnd.tiddlywiki","text":"; Todolist\nTodolist is a small pure wikitext plugin, contain all of the tasks that you need to complete on a given day. Todolist gives you the confidence that everything’s organized and accounted for, so you can make progress on the things that are important to you.\n\nYou can also make to-dos for major tasks like a project, a work assignment or an overall goal. Therefore, the overall purpose of creating a to-do is to remember tasks and prioritize them.\n\n\n;Code and demo\nFor learning plugin features, syntax, tutorial and examples see the plugin demo and code pages\n\n* Demo: https://kookma.github.io/TW-Todolist/\n* Code: https://github.com/kookma/TW-Todolist\n"},"$:/plugins/kookma/todolist/settings/colors":{"title":"$:/plugins/kookma/todolist/settings/colors","text":"limegreen:50\nyellow: 70\norange: 80\nred: 100\npink: 90\nturquoise:40\ndodgerblue:30\nnone:10","type":"application/x-tiddler-dictionary","created":"20200402092725933","list":"limegreen yellow orange red pink turquoise dodgerblue none","modified":"20200403064915453","tags":""},"$:/plugins/kookma/todolist/settings/internals":{"title":"$:/plugins/kookma/todolist/settings/internals","caption":"Todolist","created":"20190716171918410","modified":"20200401221146952","tags":"$:/tags/ControlPanel/SettingsTab","type":"text/vnd.tiddlywiki","text":"\\import $:/plugins/kookma/todolist/macros/explore-internalTids\n\n!! Explore Todolist internal tiddlers\n<<<\nTodolist plugin uses some internal data tiddlers to create and manage todo list. Each todolist uses several data tiddlers. It is recommended after deleting a todolist, delete all data tiddlers which are not in use.\n<<<\n\n<<todolist-explore-data-tiddlers>>\n\n\n"},"$:/plugins/kookma/todolist/styles/drag-drop":{"title":"$:/plugins/kookma/todolist/styles/drag-drop","text":"/* drag and drop elements */\n.kk-todolist-placeholder { \n\tposition:relative; \n\theight:0; \t\n\tborder:0 !important; \n\tborder-bottom:1px dotted grey !important; \n}\n\n.kk-todolist-draggable-list .tc-draggable { cursor: default !important; }\n","created":"20200402192425421","modified":"20200403112252654","tags":"$:/tags/Stylesheet","type":"text/css"},"$:/plugins/kookma/todolist/styles/main.css":{"title":"$:/plugins/kookma/todolist/styles/main.css","text":"/* Todolist main ui */\n.kk-todolist-ui{\n\tmin-width:320px; /* controls the minimum width of whole ui */\n}\n\n.kk-todolist-ui svg{\n\tfill:#aaaaaa;\n}\n\n\n.kk-todolist-ui button:hover svg {\n\tfill: #888888; \n}\n\n\n/* Todolist header ui */\n\n.kk-todolist-header-ui{\n\tdisplay: flex;\n\twidth: 100%;\n}\n.kk-todolist-header-ui > div{\n\tmargin: 2px;\n\tflex-grow:0;\t\n}\n.kk-todolist-header-ui .kk-todolist-header-textbox{\n\tflex-grow:1;\t\n}\n\n/* Todolist items ui */\n.kk-todolist-row{\n\tdisplay: flex;\t\n\twidth: 100%; /* for larg screen width> 960px*/\n\tflex-wrap: wrap;\n}\n\n.kk-todolist-row .kk-todolist-done,\n.kk-todolist-row .kk-todolist-priority,\n.kk-todolist-row .kk-todolist-delete {\n\tflex-grow:0; width:15px;\n}\n\n.kk-todolist-row .kk-todolist-desc{\n\tflex-grow:1; \n\twidth: calc(100% - 50px); \n\tpadding-left: 10px;\n\tpadding-right: 10px;\n}\n.kk-todolist-row .kk-todolist-delete {\n\topacity: 0.3;\n}\n\n.kk-todolist-row .kk-todolist-priority{\n\tmargin-right:5px;\n}\n.kk-todolist-row:hover {\n\tbackground-color: #f6f6f6;\n}\n.kk-todolist-row:hover .kk-todolist-delete {\n\topacity: 1;\n}","created":"20190716040116074","modified":"20200401084920801","tags":"$:/tags/Stylesheet","type":"text/css"},"$:/plugins/kookma/todolist/styles/other.css":{"title":"$:/plugins/kookma/todolist/styles/other.css","text":"/* completed item */\n\n.kk-todolist-item-done {\n\ttext-decoration: red line-through;\n\tfont-style: italic;\n}\n\n/* inputbox for add-task */\n.kk-todolist-input-textbox {\n\twidth:100%;\n\tpadding-left: 5px;\n\tborder: none;\n\tborder-bottom: 1px dotted grey;\n}\n\n.kk-todolist-input-textbox:focus {\n\toutline: none;\n\tborder-bottom: 1px solid #5778d8;\n\tbackground: transparent;\n}\n\n/* item timestamp */\n.kk-todolist-date {\n\tfont-size:0.8em;\n\tcolor:#c0c0c0;\n}\n\n/* Item categories */\n.kk-todolist-category-c1,\n.kk-todolist-category-c2 {\n\tpadding-right:3px;\n}\n\n.kk-todolist-category-c1 svg, \n.kk-todolist-category-c2 svg {\n\topacity:0.70;\n\tvertical-align: middle;\n\twidth: 1em;\n\theight: 1em;\n}\n\n.kk-todolist-category-c1 svg{\n\tfill:#8B0000;\n}\n\n.kk-todolist-category-c2 svg{\n\tfill:#006400;\n}","created":"20190715171940902","modified":"20200401084923039","tags":"$:/tags/Stylesheet","type":"text/css"},"$:/plugins/kookma/todolist/template/archive-list":{"title":"$:/plugins/kookma/todolist/template/archive-list","created":"20190716084402662","modified":"20200401214548455","tags":"","type":"text/vnd.tiddlywiki","text":"\\import $:/plugins/kookma/todolist/macros/archive-operations\n\\import $:/plugins/kookma/todolist/macros/priority\n\n!! Archive of completed (done) items\n\n<$macrocall $name=\"todolist-empty-archived-tiddler\" nameSpace={{!!td-namespace}} />\n\n> <$macrocall $name=\"todolist-list-archived-items\" nameSpace={{!!td-namespace}} />\n\n"},"$:/plugins/kookma/todolist/template/done-task":{"title":"$:/plugins/kookma/todolist/template/done-task","created":"20200402102928801","modified":"20200402103156109","tags":"","type":"text/vnd.tiddlywiki","text":"<div class=\"kk-todolist-row\">\n <div class=\"kk-todolist-done\"><<todolist-undone-task>></div>\n <div class=\"kk-todolist-desc\"><span class=\"kk-todolist-item-done\">\n\t<$macrocall $name=\"view-task\" dataTiddler=<<doneTiddler>> /></span></div>\n\t<div class=\"kk-todolist-priority\"><<todolist-set-priority>></div>\n <div class=\"kk-todolist-delete\"><$macrocall $name=\"todolist-delete-task\" dataTiddler=<<doneTiddler>>/></div>\n</div>\n"},"$:/plugins/kookma/todolist/template/undone-task":{"title":"$:/plugins/kookma/todolist/template/undone-task","created":"20200402103007259","modified":"20200402103542808","tags":"","type":"text/vnd.tiddlywiki","text":"<div class=\"kk-todolist-row\">\n\t<div class=\"kk-todolist-done\"><<todolist-done-task>></div>\n\t<div class=\"kk-todolist-desc\"><<todolist-show-task>></div>\n\t<div class=\"kk-todolist-priority\"><<todolist-set-priority>></div>\n\t<div class=\"kk-todolist-delete\"><$macrocall $name=\"todolist-delete-task\" dataTiddler=<<taskTiddler>>/></div>\n</div>"}}}
{
"tiddlers": {
"$:/config/EditTemplateFields/Visibility/shorttext": {
"title": "$:/config/EditTemplateFields/Visibility/shorttext",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/buttons/new-board": {
"title": "$:/plugins/reidgould/dpbd/buttons/new-board",
"tags": "$:/tags/PageControls",
"list-after": "$:/core/ui/Buttons/new-tiddler",
"caption": "{{$:/plugins/reidgould/dpbd/images/Dropboard}} New Board",
"description": "New Board",
"text": "<$button tooltip=\"New Board\" class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=\"New Board\" tags=\"\" text=\"\"\"<$transclude tiddler=\"$:/plugins/reidgould/dpbd/templates/view/Board\" mode=\"inline\" />\"\"\" />\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/plugins/reidgould/dpbd/images/Dropboard}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\">New Board</span>\n</$list>\n</$button>"
},
"$:/plugins/reidgould/dpbd/common/Macros": {
"tags": "$:/tags/Macro",
"title": "$:/plugins/reidgould/dpbd/common/Macros",
"text": "\\define EmptyString(strEmpty:\"\")\n$strEmpty$\n\\end\n\n\\define alert(alertText:\"\")\n <$action-createtiddler $basetitle=\"Alert\" component=\"Alert from $(currentTiddler)$\" tags=\"$:/tags/Alert\" text=\"$alertText$\" />\n\\end\n\n\\define action-Notify-NoActionDraggedOntoSame()\n <$action-sendmessage $message=\"tm-notify\" $param=\"$:/plugins/reidgould/dpbd/notifications/NoActionDraggedOntoSame\" />\n\\end\n\n\\define action-Notify-NoActionSearchList()\n <$action-sendmessage $message=\"tm-notify\" $param=\"$:/plugins/reidgould/dpbd/notifications/NoActionSearchList\" />\n\\end\n\n\\define action-Notify-shortidNotInstalled()\n <$action-sendmessage $message=\"tm-notify\" $param=\"$:/plugins/reidgould/dpbd/notifications/shortidNotInstalled\" />\n\\end\n\n\\define filter-BoardL2(board)\n[[$board$]] [[$board$]tagging[]]\n\\end\n\n\\define filter-BoardL3(board)\n[[$board$]] [[$board$]tagging[]] [[$board$]tagging[]tagging[]]\n\\end\n\n\\define filter-BoardL2_currentBoard()\n[<currentBoardTiddler>] [<currentBoardTiddler>tagging[]]\n\\end\n\n\\define filter-BoardL3_currentBoard()\n[<currentBoardTiddler>] [<currentBoardTiddler>tagging[]] [<currentBoardTiddler>tagging[]tagging[]]\n\\end\n\n\\define filter-Lists_currentBoard()\n[<currentBoardTiddler>tagging[]]\n\\end\n\n\n\n\n\\define List-StoryList()\n$(currentTiddler)$\n\\end\n\n\\define List-HistoryList()\n$(EmptyString)$\n\\end\n\n\\define tiddler-SearchListFilter-Stage()\n$:/plugins/reidgould/dpbd/state/$(currentBoardTiddler)$/searchListFilter/Stage\n\\end\n\n\\define tiddler-SearchListFilter-Live()\n$:/plugins/reidgould/dpbd/state/$(currentBoardTiddler)$/SearchListFilter/Live\n\\end\n\n\\define filter-SearchList()\n$(filter-SearchListText)$ -[[$(currentBoardTiddler)$]] -[[$(currentBoardTiddler)$]tagging[]] -[[$(currentBoardTiddler)$]tagging[]tagging[]] +[remove<list-TiddlersWithDrafts>] +[remove<list-TiddlersWithDraftsMain>] +[is[tiddler]]\n\\end\n\n\\define tiddler-UserFilter-Stage()\n$:/plugins/reidgould/dpbd/state/$(currentBoardTiddler)$/UserFilter/Stage\n\\end\n\n\\define tiddler-UserFilter-Live()\n$:/plugins/reidgould/dpbd/state/$(currentBoardTiddler)$/UserFilter/Live\n\\end\n\n\\define filter-currentList()\n[<currentListTiddler>tagging[]] +[remove<list-TiddlersWithDrafts>] +[remove<list-TiddlersWithDraftsMain>] $(filter-userText)$\n\\end\n\n\\define tiddler-Holding()\n$:/plugins/reidgould/dpbd/state/$(currentBoardTiddler)$/Holding\n\\end\n\\define HeldToolTip()\n$(currentHeldTiddler)$ — $(val-HeldShorttext)$\n\\end\n\n\\define tiddler-SideBar()\n$:/plugins/reidgould/dpbd/state/$(currentBoardTiddler)$/SideBar\n\\end\n\\define wikitext-SideBar-Content()\n <$tiddler tiddler=\"$(currentBoardTiddler)$\">\n <span class=\"dpbd-SB-Container_Reset-OIV-_ dpbd-SB-Reset-VO-_\">\n <$transclude tiddler=\"$:/plugins/reidgould/dpbd/templates/view/Board\" mode=\"inline\" />\n </span>\n </$tiddler>\n\\end\n\\define wikitext-SideBar-Button-Delete()\n <$button class=\"dpbd-CB_WI-Input-O-_ dpbd-CB_WI-Input_Button-OV-_\" actions=\"\"\"<$action-deletetiddler $tiddler=<<tiddler-SideBar>> />\"\"\" >\n <span class=\"_-_-img_inline-OV-_C\">{{$:/core/images/close-button}}</span>\n </$button>\n\\end\n\\define wikitext-SideBar-Button-Create()\n <$button class=\"dpbd-CB_WI-Input-O-_ dpbd-CB_WI-Input_Button-OV-_\" actions=\"\"\"\n <$action-createtiddler $basetitle=<<tiddler-SideBar>> tags=\"$:/tags/SideBar\" caption=<<currentBoardTiddler>> text=<<wikitext-SideBar-Content>> />\n <$action-deletefield $tiddler=<<currentBoardTiddler>> $field=\"dpbd-listwidth-em\" />\n <$action-setfield $tiddler=<<currentBoardTiddler>> $field=\"dpbd-listwidth-num\" $value=\"1\" />\n <$action-sendmessage $message=\"tm-close-tiddler\" $param=<<currentBoardTiddler>> />\n <$action-setfield $tiddler=\"$:/state/tab/sidebar--1835078512\" $field=\"text\" $value=<<tiddler-SideBar>> />\n \"\"\" >\n <span class=\"_-_-img_inline-OV-_C\">{{$:/core/images/new-button}}</span>\n </$button>\n\\end\n\n\\define tiddler-ListWidth-Stage()\n$:/plugins/reidgould/dpbd/state/$(currentBoardTiddler)$/ListWidth/Stage\n\\end\n\n\\define tiddler-BoardHeight-Stage()\n$:/plugins/reidgould/dpbd/state/$(currentBoardTiddler)$/BoardHeight/Stage\n\\end\n\n\\define tiddler-popupTagsState()\n$:/plugins/reidgould/dpbd/state/$(qualify)$/tagPopup\n\\end\n\n\\define tiddler-popupUserFilter()\n$:/plugins/reidgould/dpbd/state/$(qualify)$/UserFilterPopup\n\\end\n\n\\define tiddler-popupSearchList()\n$:/plugins/reidgould/dpbd/state/$(qualify)$/SearchListPopup\n\\end\n\n\\define tiddler-popupBoardHeight()\n$:/plugins/reidgould/dpbd/state/$(qualify)$/BoardHeightPopup\n\\end\n\n\\define tiddler-popupListWidth()\n$:/plugins/reidgould/dpbd/state/$(qualify)$/ListWidthPopup\n\\end\n\n\\define tiddler-New-SaveTitle()\n$:/plugins/reidgould/dpbd/state/NewTiddler\n\\end\n\n\\define style-TagColor()\nbackground-color: $(val-TagColor)$;\n\\end\n\n\\define style-IconColor()\nfill:$(foregroundColor)$;\n\\end\n\n\n\n\n\\define val-BoardHeight-Default()\n85vh\n\\end\n\\define style-BoardHeight()\nheight: $(val-BoardHeight)$;\n\\end\n\\define Val-ListTitle-Collapsed()\ncalc($(val-BoardHeight)$ - 12em)\n\\end\n\\define style-ListTitle-Collapsed()\nmax-width: $(value-ListTitle-Height)$;\n\\end\n\n\\define val-ListWidth-Num-Default()\n3\n\\end\n\\define val-ListWidth-Em-Default()\n%(EmptyString)%\n\\end\n\\define val-ListWidthMax-Default()\n9999em\n\\end\n\n\\define table-ListWidth-Num()\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16\n\\end\n\\define table-ListWidth-Pct()\n100 50 33.333 25 20 16.666 14.285 12.5 11.111 10 9.090 8.333 7.692 7.142 6.666 6.25\n\\end\n\\define table-ListWidth-Dec()\n1 0.5 0.333 0.25 0.2 0.166 0.142 0.125 0.111 0.1 0.090 0.083 0.076 0.071 0.066 0.062\n\\end\n\n\\define val-WidthPropVal-Pct()\ncalc($(val-ListWidth-Pct)$% - 0.5em)\n\\end\n\\define val-WidthPropVal-Em()\n$(val-ListWidth-Em)$em\n\\end\n\\define style-Flex-Em()\nflex: 0 0 $(val-ListWidth-Em)$em;\n\\end\n\\define style-Flex-Dec()\nflex: $(val-ListWidth-Dec)$ 0 0em;\n\\end\n\n\\define style-ListWidth()\nmin-width: $(val-listWidthMin)$; max-width: $(val-listWidthMax)$;\n\\end\n\n\n\n\n\\define action-ResetListToTagging(tiddler-ToReset)\n <!-- Assign a new list in which tiddler order is as discovered by the tagging operator. -->\n <!-- The order returned by the tagging operator is determined by list field, list-before and list-after fields, and adds other tiddlers with the tag to the end. -->\n <!-- Without this step, the insertbefore listop cannot work when the action tiddler is dragged onto a tiddler that is not in the list. -->\n <!-- The drawback is that tiddlers added to the list which are not also tagged by the list are eliminated. -->\n <!-- Also, when doing this operation frequently or on larger lists, we should watch to see if performance becomes a problem. -->\n <$set name=\"list-Tagging\" filter=\"[[$tiddler-ToReset$]tagging[]]\">\n <$action-setfield $tiddler=\"\"\"$tiddler-ToReset$\"\"\" $field=\"list\" $value=<<list-Tagging>> />\n </$set>\n\\end\n\n\\define action-DeleteHolding-IfHeldMatches(tiddler-Match)\n <$set name=\"tiddler-Held\" value={{{[<tiddler-Holding>get[text]] }}} >\n <$set name=\"action-DeleteHolding\" filter=\"[[$tiddler-Match$]] -[<tiddler-Held>]\"\n value=\"\"\n emptyValue=\"\"\"<$action-deletetiddler $tiddler=<<tiddler-Holding>> />\"\"\" >\n <<action-DeleteHolding>>\n </$set>\n </$set>\n\\end\n\n\\define action-RemoveTwoWay_OneFromMany(tiddler-ToRemove, filter-Target-ByDef)\n <$set name=\"list-Targets\" filter=<<$filter-Target-ByDef$>> >\n <!-- Remove tags from the one tiddler of all target Tiddlers. -->\n <$action-listops $tiddler=\"\"\"$tiddler-ToRemove$\"\"\" $tags=\"+[remove<list-Targets>]\" />\n <!-- Remove the one tiddler from lists of all target Tiddlers. -->\n <$list filter=<<list-Targets>> variable=\"eachList\">\n <$action-listops $tiddler=<<eachList>> $subfilter=\"-[[$tiddler-ToRemove$]]\" />\n </$list>\n </$set>\n </$set>\n\\end\n\n\\define action-RemoveTwoWay(tiddler-ToRemove, tiddler-Target)\n <!-- Remove the tiddler-ToRemove from this tiddler-Target -->\n <$action-listops $tiddler=\"\"\"$tiddler-Target$\"\"\" $subfilter=\"-[[$tiddler-ToRemove$]]\" />\n <!-- Remove this tag from the tiddler-ToRemove -->\n <$action-listops $tiddler=\"\"\"$tiddler-ToRemove$\"\"\" $tags=\"-[[$tiddler-Target$]]\"/>\n\\end\n\n\\define action-AddTwoWay(tiddler-Add, tiddler-Target, tiddler-Before)\n <$set name=\"tiddler-Before\" value=\"$tiddler-Before$\">\n <!-- Add the tiddler-Add to this tiddler-Target -->\n <$action-listops $tiddler=\"\"\"$tiddler-Target$\"\"\" $subfilter=\"+[insertbefore:tiddler-Before[$tiddler-Add$]]\" />\n <!-- Add this tag to the tiddler-Add -->\n <$action-listops $tiddler=\"\"\"$tiddler-Add$\"\"\" $tags=\"[[$tiddler-Target$]]\"/>\n </$set>\n\\end\n\n\\define action-InsertTwoWay(tiddler-Insert, tiddler-Before, tiddler-In, filter-UniqueAmong-byDef)\n <$macrocall $name=\"action-ResetListToTagging\" tiddler-ToReset=\"\"\"$tiddler-In$\"\"\" />\n <$macrocall $name=\"action-RemoveTwoWay_OneFromMany\" tiddler-ToRemove=\"\"\"$tiddler-Insert$\"\"\" filter-Target-ByDef=\"\"\"$filter-UniqueAmong-byDef$\"\"\" />\n <$macrocall $name=\"action-AddTwoWay\" tiddler-Add=\"\"\"$tiddler-Insert$\"\"\" tiddler-Target=\"\"\"$tiddler-In$\"\"\" tiddler-Before=\"\"\"$tiddler-Before$\"\"\" />\n\\end\n\n\\define action-InsertTwoWay-New(tiddler-Before, tiddler-In)\n <$vars val-shortid=<<shortid>> >\n <$list filter=\"[<val-shortid>] -[[]] +[count[]]\" variable=\"val-shortidInstalled\">\n <$list filter=\"[<val-shortidInstalled>prefix[0]]\">\n <$macrocall $name=\"action-InsertTwoWay-New-WithDefault\" tiddler-Before=\"\"\"$tiddler-Before$\"\"\" tiddler-In=\"\"\"$tiddler-In$\"\"\" />\n </$list>\n <$list filter=\"[<val-shortidInstalled>prefix[1]]\">\n <$macrocall $name=\"action-InsertTwoWay-New-WithID\" tiddler-Before=\"\"\"$tiddler-Before$\"\"\" tiddler-In=\"\"\"$tiddler-In$\"\"\" />\n </$list>\n </$list>\n </$vars>\n\\end\n\\define action-InsertTwoWay-New-WithDefault(tiddler-Before, tiddler-In)\n <$action-sendmessage $message=\"tm-new-tiddler\" navigateFromTitle=\"\"\"$tiddler-Before$\"\"\" tags=\"\"\"$tiddler-In$\"\"\" />\n <<action-Notify-shortidNotInstalled>>\n\\end\n\\define action-InsertTwoWay-New-WithID(tiddler-Before, tiddler-In)\n <$set name=\"tiddler-New\" value={{{ [<val-shortid>addprefix[tid/]] }}} >\n <$action-createtiddler $basetitle=<<tiddler-New>> />\n <$macrocall $name=\"action-ResetListToTagging\" tiddler-ToReset=\"\"\"$tiddler-In$\"\"\" />\n <$macrocall $name=\"action-AddTwoWay\" tiddler-Add=<<tiddler-New>> tiddler-Target=\"\"\"$tiddler-In$\"\"\" tiddler-Before=\"\"\"$tiddler-Before$\"\"\" />\n <$action-sendmessage $message=\"tm-edit-tiddler\" $param=<<tiddler-New>> />\n </$set>\n\\end\n\n\n\n\n\\define action-Droppable-List()\n <<action-CheckDragOfSearchList_List>>\n\\end\n\\define action-CheckDragOfSearchList_List()\n <!-- SEQUENCE AFTER action-Droppable-List -->\n <!-- If actionTiddler is tiddler-SearchListFilter-Live, notify with no action. -->\n <$set name=\"action-DiffOrSearchList\" filter=\"[<actionTiddler>] -[<tiddler-SearchListFilter-Live>]\"\n value=<<action-CheckNew_List>>\n emptyValue=<<action-Notify-NoActionSearchList>> >\n <<action-DiffOrSearchList>>\n </$set>\n\\end\n\\define action-CheckNew_List()\n <!-- SEQUENCE AFTER action-CheckDragOfSearchList_List -->\n <$set name=\"action-ExistingOrNew\" filter=\"[<actionTiddler>] -[[$:/plugins/reidgould/dpbd/action/newTiddler]]\"\n value=<<action-CheckSame_List>>\n emptyValue=\"\"\"<$macrocall $name=\"action-InsertTwoWay-New\" tiddler-Before=<<currentListTiddler>> tiddler-In=<<currentBoardTiddler>> />\"\"\" >\n <<action-ExistingOrNew>>\n </$set>\n\\end\n\\define action-CheckSame_List()\n <!-- SEQUENCE AFTER action-CheckNew_List -->\n <$set name=\"action-DiffOrSame\" filter=\"[<currentListTiddler>] -[<actionTiddler>]\"\n value=<<action-DropList>>\n emptyValue=<<action-Notify-NoActionDraggedOntoSame>> >\n <<action-DiffOrSame>>\n </$set>\n\\end\n\\define action-DropList()\n <!-- SEQUENCE AFTER action-CheckSame_List -->\n <$macrocall $name=\"action-DeleteHolding-IfHeldMatches\" tiddler-Match=<<actionTiddler>> />\n <$macrocall $name=\"action-InsertTwoWay\" tiddler-Insert=<<actionTiddler>> tiddler-Before=<<currentListTiddler>> tiddler-In=<<currentBoardTiddler>> filter-UniqueAmong-byDef=\"filter-BoardL2_currentBoard\" />\n\\end\n\n\\define action-Droppable-Card()\n <<action-CheckDragIntoSearchList>>\n\\end\n\\define action-CheckDragIntoSearchList()\n <!-- SEQUENCE AFTER action-Droppable-Card -->\n <!-- If currentListTiddler is tiddler-SearchListFilter-Live, notify with no action. -->\n <$set name=\"action-DiffOrSearchList\" filter=\"[<currentListTiddler>] -[<tiddler-SearchListFilter-Live>]\"\n value=<<action-CheckDragOfSearchList_Card>>\n emptyValue=<<action-Notify-NoActionSearchList>> >\n <<action-DiffOrSearchList>>\n </$set>\n\\end\n\\define action-CheckDragOfSearchList_Card()\n <!-- SEQUENCE AFTER action-CheckDragIntoSearchList -->\n <!-- If actionTiddler is tiddler-SearchListFilter-Live, notify with no action. -->\n <$set name=\"action-DiffOrSearchListIsAction\" filter=\"[<actionTiddler>] -[<tiddler-SearchListFilter-Live>]\"\n value=<<action-CheckNew_Card>>\n emptyValue=<<action-Notify-NoActionSearchList>> >\n <<action-DiffOrSearchListIsAction>>\n </$set>\n\\end\n\\define action-CheckNew_Card()\n <!-- SEQUENCE AFTER action-CheckDragOfSearchList_Card -->\n <$set name=\"action-ExistingOrNew\" filter=\"[<actionTiddler>] -[[$:/plugins/reidgould/dpbd/action/newTiddler]]\"\n value=\"\"\"<$macrocall $name=\"action-CheckDragIntoSelf\" />\"\"\"\n emptyValue=\"\"\"<$macrocall $name=\"action-InsertTwoWay-New\" tiddler-Before=<<currentCardTiddler>> tiddler-In=<<currentListTiddler>> />\"\"\" >\n <<action-ExistingOrNew>>\n </$set>\n\\end\n\\define action-CheckDragIntoSelf()\n <!-- SEQUENCE AFTER action-CheckNew_Card -->\n <$set name=\"action-DiffOrSelf\" filter=\"[<currentListTiddler>] -[<actionTiddler>]\"\n value=<<action-CheckSame_Card>>\n emptyValue=<<action-Notify-NoActionDraggedOntoSame>> >\n <<action-DiffOrSelf>>\n </$set>\n\\end\n\\define action-CheckSame_Card()\n <!-- SEQUENCE AFTER action-CheckDragIntoSelf -->\n <$set name=\"action-DiffOrSame\" filter=\"[<currentCardTiddler>] -[<actionTiddler>]\"\n value=<<action-DropCard>>\n emptyValue=<<action-Notify-NoActionDraggedOntoSame>> >\n <<action-DiffOrSame>>\n </$set>\n\\end\n\\define action-DropCard()\n <!-- SEQUENCE AFTER action-CheckSame_Card -->\n <$macrocall $name=\"action-DeleteHolding-IfHeldMatches\" tiddler-Match=<<actionTiddler>> />\n <$macrocall $name=\"action-InsertTwoWay\" tiddler-Insert=<<actionTiddler>>tiddler-Before=<<currentCardTiddler>> tiddler-In=<<currentListTiddler>> filter-UniqueAmong-byDef=\"filter-Lists_currentBoard\" />\n <!-- If action tiddler is in filter-Lists_currentBoard, remove it. Doing this instead of using filter-BoardL2_currentBoard in filter-UniqueAmong-byDef above avoids unnecessary rerendering of the board which causes loss of scroll position. -->\n <<action-ConditionalRemoveActionTidFromList>>\n\\end\n\\define action-ConditionalRemoveActionTidFromList()\n <!-- SEQUENCE AFTER action-DropCard -->\n <$set name=\"list-Tiddlers\" filter=\"$(filter-Lists_currentBoard)$\" >\n <$set name=\"action-DoRemove\" filter=\"[enlist<list-Tiddlers>] +[field:title<actionTiddler>]\"\n value=\"\"\"<$macrocall $name=\"action-RemoveTwoWay\" tiddler-ToRemove=<<actionTiddler>> tiddler-Target=<<currentBoardTiddler>> />\"\"\"\n emptyValue=\"\" >\n <<action-DoRemove>>\n </$set>\n </$set>\n\\end\n\n\\define action-RemoveFromBoard()\n <$macrocall $name=\"action-RemoveTwoWay_OneFromMany\" tiddler-ToRemove=<<actionTiddler>> filter-Target-ByDef=\"filter-BoardL2_currentBoard\" />\n\\end"
},
"$:/plugins/reidgould/dpbd/common/Stylesheet": {
"tags": "$:/tags/Stylesheet",
"title": "$:/plugins/reidgould/dpbd/common/Stylesheet",
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline hardlinebreaks html commentinline commentblock\n<!-- This rule set prevents unwanted interpretation of wikitext syntax inside a stylesheet or macro definition tiddler. -->\n<!-- Style html tag not not needed when tiddler has $:/tags/Stylesheet tag. This is preferable because it allows us to see the text when the tiddler is open, and also prevents styles without the tag from applying just because the tiddler is open on the page. -->\n\"\"\"\n\n/* ================================================================\n * ### class/id name format:\n * namespace-HINT_CONTEXT-class_or_id_name-HINT_RULE_TYPES-HINT_SELECTOR_OR_COMBINATOR\n * ================================================================\n * ### Hints for rule types.\n * _ - Identifier (No style properties.)\n * ----------------------------------------------------------------\n * ## Usage hints.\n * S - State (e.g. menu open or closed.)\n * P - Preference (A rule to isolate values intended to be overwritten. e.g. for themes.)\n * E - Extend (A rule intended to be extended by others not used directly.)\n * ----------------------------------------------------------------\n * ## Property hints.\n * B - Base (i.e. Global reset. May contain properties usually hinted at by other style types.)\n * O - Layout Outer\n * I - Layout Inner\n * V - Visual Appearance\n * T - Text\n * D - Dynamic (For pseudo selectors and media queries.)\n * Z - Transforms (And transitions.)\n * M - Miscellaneous\n * ================================================================\n * ### Hints for selector or combinator use.\n * ----------------------------------------------------------------\n * _ - Simple (There is a rule that applies to the element the class/id is used on.)\n * ----------------------------------------------------------------\n * ## Selector hints.\n * T - Type (There is a rule that applies when this class/id is used on a particular element type.)\n * S - Class or ID (There is a rule that applies when this class/id is used with another class/id.)\n * A - Attribute (There is a rule that applies when this class/id is used with an attribute selector.)\n * ----------------------------------------------------------------\n * ## Combinator hints. (Lower case hint indicates that this class/id is the descendant or sibling.)\n * N - Adjacent sibling (There is a rule that applies to an element that is the adjacent/next sibling after this class/id.)\n * L - General sibling (There is a rule that applies to an element that is a general/later sibling after this class/id.)\n * C - Child (There is a rule that applies to an element that is a child of this class/id.)\n * D - Descendant (There is a rule that applies to an element that is a descendant of this class/id.)\n * ================================================================\n**/\n\n\n\n\n/* ==== Board\n** ================================================================ */\n\n.dpbd-_-Board-OI-_ {\n /*-- Layout Outer --*/\n /* \"height\" set in style property on element */\n border-style: none dashed;\n border-width: 0 0.25em;\n border-color: <<color tab-divider>>;\n padding: 0.25em 0.5em 0em 0.5em;\n /*-- Layout Inner --*/\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-content: stretch;\n align-items: stretch;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-B-Row_Title-O-_ {\n /*-- Layout Outer --*/\n flex: 0 0 auto;\n padding: 0;\n margin: 0;\n}\n\n.dpbd-B-Row_Title_h2-O-_ {\n /*-- Layout Outer --*/\n margin: 0 0 0.25em 0;\n display: inline-block;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-B-Row_ControlBanner-OI-_ {\n /*-- Layout Outer --*/\n flex: 0 0 auto;\n padding: 0;\n /*-- Layout Inner --*/\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: space-between;\n align-content: flex-start;\n align-items: flex-start;\n overflow: hidden;\n margin: -0.125em -0.25em;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-B-Row_List-OI-_ {\n /*-- Layout Outer --*/\n flex: 1 1 0em;\n overflow: hidden;\n padding: 0;\n margin: 0.75em -0.25em;\n /*-- Layout Inner --*/\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-content: stretch;\n align-items: stretch;\n}\n\n.dpbd-B_RL-Container_List-OI-_ {\n /*-- Layout Outer --*/\n /* TODO: Remove this unnecessary workaround. */\n /* half pixel padding on each side eliminates a\n * horizontal scroll when content should fit perfectly. */\n padding: 0 0.5px;\n margin: 0.75em 0;\n flex: 1 1 0px;\n overflow: auto;\n /*-- Layout Inner --*/\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-content: stretch;\n align-items: stretch;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-B-Footer-OT-_ {\n /*-- Layout Outer --*/\n position: absolute;\n bottom: 0em;\n right: 1em;\n max-width: 100%;\n overflow: hidden;\n /*-- text --*/\n font-size: 0.75em;\n}\n\n.dpbd-B-EmptyMessage-OM-_ {\n /*-- Layout Outer --*/\n position: absolute;\n width: 100%;\n height: 100%;\n padding: 0.5em;\n /*-- miscellaneous --*/\n pointer-events: none;\n}\n\n\n/* ---- Control Banner\n** ---------------------------------------------------------------- */\n\n.dpbd-CB-Container_WidgetDrop-OI-_ {\n /*-- Layout Outer --*/\n flex: 0 1 auto;\n /*-- Layout Inner --*/\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-content: flex-start;\n align-items: flex-start;\n}\n\n.dpbd-CB-ContainerSub_WidgetDrop-OI-_ {\n /*-- Layout Outer --*/\n flex: 0 1 auto;\n /*-- Layout Inner --*/\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-content: flex-start;\n align-items: flex-start;\n}\n\n/* . . . . . . . . */\n\n.dpbd-CB-Container_WidgetInput-OI-_ {\n /*-- Layout Outer --*/\n flex: 0 1 auto;\n /*-- Layout Inner --*/\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-content: flex-start;\n align-items: flex-start;\n}\n\n.dpbd-CB-ContainerSub_WidgetInput-OI-_ {\n /*-- Layout Outer --*/\n flex: 0 1 auto;\n /*-- Layout Inner --*/\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-content: flex-start;\n align-items: flex-start;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-CB-Widget-O-_ {\n /*-- Layout Outer --*/\n flex: 0 0 auto;\n height: 3em;\n margin: 0.125em 0.25em;\n}\n\n/* -------/-------/-------/-------/-------/-------/-------/-------/ */\n\n\n/* ---- Control Banner - Drop Area Widget\n** ---------------------------------------------------------------- */\n\n.dpbd-CB-WidgetDrop-OI-_,\n.dpbd-CB-WidgetDrop-OI-_.dpbd-CB-WidgetDrop-OI-_.dpbd-CB-WidgetDrop-OI-_\n{\n /*-- Layout Outer --*/\n position: relative;\n width: 8em;\n padding: 0.5em 0.25em;\n /*-- Layout Inner --*/\n text-align: center;\n overflow: hidden;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-CB_WD-Droppable-OI-_ {\n /*-- Layout Outer --*/\n position: absolute;\n top: auto;\n left: 0;\n width: auto;\n height: auto;\n /*-- Layout Inner --*/\n padding: 0 0.25em;\n}\n\n.dpbd-CB_WD-p-OIT-_C,\n.dpbd-CB_WD-p-OIT-_C.dpbd-CB_WD-p-OIT-_C\n{\n /*-- Layout Outer --*/\n margin: 0;\n max-height: 2.125em;\n min-height: 2.125em;\n /*-- Layout Inner --*/\n overflow: hidden;\n /*-- Text --*/\n line-height: 1em;\n}\n\n.dpbd-CB_WD-p-OIT-_C > svg {\n /*-- Layout Outer --*/\n height: 2em;\n width: auto;\n float: left;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-CB_WD-Card-O-_,\n.dpbd-CB_WD-Card-O-_.dpbd-CB_WD-Card-O-_.dpbd-CB_WD-Card-O-_\n{\n /*-- Layout Outer --*/\n margin-top: -0.25em;\n padding: 0.125em 0.25em;\n min-height: 0;\n}\n\n.dpbd-CB_WD-HeldTitle-OT-_ {\n /*-- Layout Outer --*/\n display: inline-block;\n width: calc(100% - 2em);\n /*-- Text --*/\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* -------/-------/-------/-------/-------/-------/-------/-------/ */\n\n\n/* ---- Control Banner - Input Widget\n** ---------------------------------------------------------------- */\n\n.dpbd-CB-WidgetInput-O-_ {\n /*-- Layout Outer --*/\n width: auto;\n min-width: 1.5em;\n padding: 0\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-CB_WI-Label_p-OT-_,\n.dpbd-CB_WI-Label_p-OT-_.dpbd-CB_WI-Label_p-OT-_ {\n /*-- Layout Outer --*/\n display: block;\n min-height: 1.5em;\n max-height: 1.5em;\n margin: 0;\n /*-- Text --*/\n white-space: nowrap;\n line-height: 1em;\n}\n\n.dpbd-CB_WI-Input-O-_ {\n /*-- Layout Outer --*/\n display: block;\n width: 100%;\n}\n\n.dpbd-CB_WI-Input_Button-OV-_ {\n /*-- Layout Outer --*/\n padding: 0;\n min-height: 1.5em;\n max-height: 1.5em;\n /*-- Visual --*/\n fill: <<color button-foreground>>;\n}\n\n.dpbd-CB_WI-Input_Container_Checkbox-OTV-_ {\n /*-- Layout Outer --*/\n height: 1.5em;\n /*-- Text --*/\n text-align: center;\n line-height: 1.75em;\n /*-- Visual --*/\n background: whitesmoke;\n border-color: darkgray;\n border-style: solid;\n border-width: 1px;\n border-radius: 2px;\n}\n\n.dpbd-CB_WI-Input_Container_Checkbox-OTV-_ > label > input[type=\"checkbox\"] {\n height: 1em;\n width: 1em;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-CB_WI-Popup-OIV-_C,\n.dpbd-CB_WI-Popup-OIV-_C.dpbd-CB_WI-Popup-OIV-_C\n{\n /*-- Layout Outer --*/\n display: flex;\n /*-- Layout Inner --*/\n align-items: baseline;\n padding-left: 0.5em;\n padding-right: 0.5em;\n /*-- Visual --*/\n color: <<color sidebar-tab-foreground-selected>>;\n}\n\n.dpbd-CB_WI-Popup-OIV-_C.dpbd-CB_WI-Popup-OIV-_C > * > svg,\n.dpbd-CB_WI-Popup-OIV-_C.dpbd-CB_WI-Popup-OIV-_C > * > a\n{\n /*-- Visual --*/\n color: <<color sidebar-tab-foreground-selected>>;\n fill: <<color sidebar-tab-foreground-selected>>;\n}\n\n.dpbd-CB_WI_P-FlexC-O-_,\n.dpbd-CB_WI_P-FlexC-O-_.dpbd-CB_WI_P-FlexC-O-_\n{\n /*-- Layout Outer --*/\n display: initial;\n flex: 0 0 auto;\n width: auto;\n padding: 0;\n margin: 0 0.25em;\n}\n\n.dpbd-CB_WI_P-FlexE-O-_ {\n /*-- Layout Outer --*/\n display: initial;\n flex: 1 0 4em;\n width: auto;\n padding: 0;\n margin: 0 0.25em;\n}\n\n.dpbd-CB_WI_P-Button-OV-_,\n.dpbd-CB_WI_P-Button-OV-_.dpbd-CB_WI_P-Button-OV-_.dpbd-CB_WI_P-Button-OV-_\n{\n /*-- Layout Outer --*/\n padding-left: 0.25em;\n padding-right: 0.25em;\n /*-- Visual --*/\n color: <<color sidebar-tab-foreground-selected>>;\n fill: <<color sidebar-tab-foreground-selected>>;\n}\n\n.dpbd-CB_WI_P-Child_TextArea-O-_ {\n /*-- Layout Outer --*/\n width: 100%;\n}\n\n/* -------/-------/-------/-------/-------/-------/-------/-------/ */\n\n/* =======/=======/=======/=======/=======/=======/=======/=======/ */\n\n\n\n\n/* ==== List\n** ================================================================ */\n\n.dpbd-_-List-OI-_ {\n /*-- Layout Outer --*/\n position: relative;\n min-width: 15.5em;\n /* \"min-width\" set in style property on element */\n /* \"max-width\" set in style property on element */\n margin: 0 0.25em;\n flex: 1 0 0em;\n align-self: auto;\n /*-- Layout Inner --*/\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-content: stretch;\n align-items: stretch;\n margin-bottom: 0.25em;\n /* Last resort to avoid scrollbars caused by collapsed list\n * titles in cases where height differs from assumed ideal\n * value. (e.g. when control banner wraps.) */\n overflow: hidden;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-L-Container_Card-OI-_ {\n /*-- Layout Outer --*/\n flex: 1 1 auto;\n align-self: auto;\n /*-- Layout Inner --*/\n overflow: auto;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-content: stretch;\n align-items: stretch;\n}\n\n\n/* ---- Title Bar\n** ---------------------------------------------------------------- */\n\n.dpbd-L-TitleBar-OIV-_ {\n /*-- Layout Outer --*/\n flex: 0 0 auto;\n align-self: auto;\n /*-- Layout Inner --*/\n padding: 0.75em 0.5em 0.375em 0.5em;\n /*-- Visual --*/\n border-style: solid solid none solid;\n border-color: <<color tab-border-selected>>;\n border-width: 1px;\n background-color: <<color tab-background-selected>>;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-L_TB-Title-I-_ {\n /*-- Layout Inner --*/\n padding: 0.25em 0 0.25em 0;\n}\n\n.dpbd-L_TB-Title_Collapsed-OZTM-_ {\n /*-- Layout Outer --*/\n position: absolute;\n top: 0;\n left: 0;\n /* \"max-width\" set in style property on element */\n /*-- Transforms and Transitions --*/\n transform-origin: left top;\n transform: rotateZ(90deg) translateX(4em) translateY(-2.25em);\n /*-- Text --*/\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n /*-- Miscellaneous --*/\n pointer-events: none;\n}\n\n.dpbd-L_TB-Title_h3-O-_ {\n /*-- Layout Outer --*/\n display: inline;\n margin: 0;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-L_TB-ColorPreview-OI-_ {\n /*-- Layout Outer --*/\n position: absolute;\n top: 0px;\n left: 0;\n width: 100%;\n height: 0.25em;\n /*-- Layout Inner --*/\n padding: 0 0.5em;\n}\n\n.dpbd-L_TB-ColorPreview_Child-OV-_ {\n /*-- Layout Outer --*/\n width: 100%;\n height: 100%;\n /*-- Visual --*/\n /* \"background-color\" set in style property on element */\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-L_TB-DropArea_Left-OI-_,\n.dpbd-L_TB-DropArea_Left-OI-_.dpbd-L_TB-DropArea_Left-OI-_.dpbd-L_TB-DropArea_Left-OI-_\n{\n /*-- Layout Outer --*/\n position: relative;\n display: inline;\n vertical-align: text-top;\n line-height: 1em;\n margin: 0em 0.25em 0em 0em;\n /*-- Layout Inner --*/\n padding: 0.375em 0 0.125em 0.375em;\n}\n\n.dpbd-L_TB-Container_DropArea_Right-O-_,\n.dpbd-L_TB-Container_DropArea_Right-O-_.dpbd-L_TB-Container_DropArea_Right-O-_\n{\n /*-- Layout Outer --*/\n float: right;\n white-space: nowrap; /* Workaround for a display issue in Firefox. */\n}\n\n.dpbd-L_TB-DropArea_Right-OIT-_,\n.dpbd-L_TB-DropArea_Right-OIT-_.dpbd-L_TB-DropArea_Right-OIT-_.dpbd-L_TB-DropArea_Right-OIT-_\n{\n /*-- Layout Outer --*/\n position: relative;\n display: inline;\n vertical-align: text-top;\n line-height: 1em;\n margin: 0em 0em 0em 0.25em;\n /*-- Layout Inner --*/\n padding: 0.375em 0.375em 0.125em 0.375em;\n /*-- Text --*/\n white-space: nowrap; /* Workaround for a display issue in Firefox. */\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-L_TB-Container_ButtonCollapse-O-_,\n.dpbd-L_TB-Container_ButtonCollapse-O-_.dpbd-L_TB-Container_ButtonCollapse-O-_\n{\n /*-- Layout Outer --*/\n float: right;\n}\n\n.dpbd-L_TB-ButtonCollapse-OIV_,\n.dpbd-L_TB-ButtonCollapse-OIV_.dpbd-L_TB-ButtonCollapse-OIV_\n{\n /*-- Layout Outer --*/\n display: inline;\n vertical-align: top;\n margin: 0em;\n /*-- Layout Inner --*/\n padding: 0.25em 0.375em 0.25em 0.375em;\n /*-- Visual --*/\n fill: <<color tiddler-controls-foreground>>;\n}\n\n.dpbd-L_TB-ButtonCollapse_ImgTransform-OZ-_,\n.dpbd-L_TB-ButtonCollapse_ImgTransform-OZ-_.dpbd-L_TB-ButtonCollapse_ImgTransform-OZ-_\n{\n /*-- Layout Outer --*/\n display: inline-block;\n /*-- Transforms --*/\n transform-origin: top right;\n transform: rotateZ(-90deg) translateY(-50%);\n}\n\n/* -------/-------/-------/-------/-------/-------/-------/-------/ */\n\n/* =======/=======/=======/=======/=======/=======/=======/=======/ */\n\n\n\n\n/* ==== Card\n** ================================================================ */\n\n.dpbd-_-Card-OV-_,\n.dpbd-_-Card-OV-_.dpbd-_-Card-OV-_.dpbd-_-Card-OV-_\n{\n /*-- Layout Outer --*/\n /* EXTENDS tc-tiddler-frame */\n max-width: 100%; /* Restrict width when using fixed-fluid layout (tc-tiddler-frame sets width). */\n min-height: 2.5em;\n margin-bottom: 0.5em;\n padding: 0 0.5em;\n /*-- Visual --*/\n background-color: <<color dropdown-background>>;\n}\n\n.dpbd-_-Droppable_Card-O-_, /* The droppable widget does not seem to apply its class attribute to the element, so we use the following rule. */\n.dpbd-L-Container_Card-OI-_ > .tc-droppable {\n /*-- Layout Outer --*/\n flex: 0 0 auto;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-C-TiddlerControls-OIT-_ {\n /*-- Layout Outer --*/\n margin: 0.15em 0 0 0;\n clear: right;\n float: right;\n /*-- Layout Inner --*/\n padding: 0;\n /*-- Text --*/\n line-height: 1em;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-C-TiddlerIcon-OIVT-_ {\n /*-- Layout Outer --*/\n max-height: 1em;\n margin: 0.625em 0.125em 0 0;\n float: left;\n clear: none;\n /*-- Layout Inner --*/\n padding: 0;\n /*-- Visual --*/\n /* \"fill\" set in style property on element */\n /*-- Text --*/\n line-height: 1em;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-C-Container_IconInfo-O-_ {\n /*-- Layout Outer --*/\n position: absolute;\n bottom: 0;\n right: 0.25em;\n}\n\n.dpbd-C-IconInfo-OV-_ {\n /*-- Layout Outer --*/\n display: inline-block;\n /*-- Visual --*/\n fill: <<color message-foreground>>;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-C-TagPreview-OI-_ {\n /*-- Layout Outer --*/\n position: absolute;\n top: -1px;\n left: 0;\n width: 100%;\n height: 0.25em;\n /*-- Layout Inner --*/\n padding: 0 0.5em;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-content: stretch;\n align-items: stretch;\n}\n\n.dpbd-C-TagPreview_Child-OVM-_ {\n /*-- Layout Outer --*/\n flex: 1 1 auto;\n align-self: auto;\n margin-right: 2px;\n /*-- Visual --*/\n /* \"background-color\" set in style property on element */\n /*-- Miscellaneous --*/\n cursor: help;\n}\n\n/* . . . . . . . . */\n\n.dpbd-C-ColorPreview-OI-_ {\n /*-- Layout Outer --*/\n position: absolute;\n top: 0;\n left: -1px;\n width: 0.25em;\n height: 1.875em;\n /*-- Layout Inner --*/\n padding-top: 0.375em;\n}\n\n.dpbd-C-ColorPreview_Child-OV-_ {\n /*-- Layout Outer --*/\n width: 100%;\n height: 100%;\n /*-- Visual --*/\n /* \"background-color\" set in style property on element */\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-C-Popup_TagEditor-OIV-_CD {\n /*-- Layout Outer --*/\n max-width: 80%;\n /*-- Visual --*/\n background-color: white;\n}\n\n.dpbd-C-Popup_TagEditor-OIV-_CD > .tc-edit-tags {\n /*-- Visual --*/\n -webkit-box-shadow: none;\n -moz-box-shadow: none;\n box-shadow: none;\n}\n\n.dpbd-C-Popup_TagEditor-OIV-_CD .tc-block-dropdown {\n /*-- Layout Outer --*/\n min-width: 0;\n max-width: 120%;\n max-height: 15em;\n /*-- Layout Inner --*/\n overflow-y: scroll;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-C-EditTitle-T-D > .tc-titlebar {\n /*-- Text --*/\n font-size: 0.75em;\n}\n\n.dpbd-C-TextEditorToolbar-OT-D .tc-editor-toolbar {\n /*-- Layout Outer --*/\n margin-top: 0;\n /*-- Text --*/\n font-size: 0.75em;\n}\n\n/* =======/=======/=======/=======/=======/=======/=======/=======/ */\n\n\n\n\n/* ==== Other - In Namespace\n** ================================================================ */\n\n\n/* ---- Card Content and shorttext - View and Edit\n** ---------------------------------------------------------------- */\n\n.dpbd-C-TextView-OIVM-_C {\n /*-- Text --*/\n line-height: inherit;\n}\n\n.dpbd-C-TextView-OIVM-_C > div,\n.dpbd-C-TextView-OIVM-_C > img,\n.dpbd-C-TextView-OIVM-_C.dpbd-C-TextView-OIVM-_C.dpbd-C-TextView-OIVM-_C.dpbd-C-TextView-OIVM-_C > p\n{\n /*-- Layout Outer --*/\n /* Additional specificity for \"p\" needed in sidebar. */\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n}\n\n.dpbd-C-TextView-OIVM-_C > ul,\n.dpbd-C-TextView-OIVM-_C > ol\n{\n /*-- Layout Inner --*/\n padding-left: 1.25em;\n}\n\n.dpbd-_-ShorttextView-OM-C > img,\n.dpbd-_-ShorttextView-OM-C > svg\n{\n /*-- Layout Outer --*/\n height: 1em;\n width: auto;\n}\n\n.dpbd-C-TextView-OIVM-_C > img,\n.dpbd-_-ShorttextView-OM-C > img\n{\n /*-- Miscellaneous --*/\n /* Dragging a tiddler with an image creates a\n * new tiddler with the content of the title\n * being the data uri of the image. */\n pointer-events: none;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-_-MainView_Shorttext-OTV-S.tc-subtitle {\n /*-- Layout Outer --*/\n margin: 0 0 0.5em 0;\n /*-- Text --*/\n font-size: 1em;\n /*-- Visual --*/\n color: <<color tiddler-title-foreground>>;\n}\n\n/* . . . . . . . . */\n\n.dpbd-_-MainEdit_Shorttext-I-_ {\n /*-- Layout Inner --*/\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-content: stretch;\n align-items: flex-start;\n}\n\n.dpbd-_-MainEdit_Shorttext_Textarea-O-_ {\n /*-- Layout Outer --*/\n flex: 1 0 auto;\n}\n\n.dpbd-_-MainEdit_Shorttext_Button-O-_ {\n /*-- Layout Outer --*/\n flex: 0 0 auto;\n margin: 0.25em 0 0 0.25em;\n}\n\n/* -------/-------/-------/-------/-------/-------/-------/-------/ */\n\n\n/* ---- Drop Area and Droppable Placeholders\n** ---------------------------------------------------------------- */\n\n.dpbd-_-DropArea-IV-_,\n.dpbd-_-DropArea-IV-_.dpbd-_-DropArea-IV-_\n{\n /*-- Layout Inner --*/\n /* EXTENDS tc-edit-tags */\n padding: 1em 0.25em 1em 0.25em;\n /*-- Visual --*/\n color: <<color sidebar-tab-foreground-selected>>;\n fill: <<color sidebar-tab-foreground-selected>>;\n border-color: <<color sidebar-tab-border-selected>>;\n background: <<color sidebar-tab-background-selected>>;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.tc-droppable.tc-dragover > .dpbd-DA-IndicatorThin-OV-c {\n /*-- Layout Outer --*/\n display: block;\n box-sizing: border-box;\n height: 0;\n /*-- Visual --*/\n border: 0;\n}\n\n.tc-droppable.tc-dragover > .dpbd-DA-IndicatorThin-OV-c > .dpbd-DA-IndicatorThin_Child-OV-c {\n /*-- Layout Outer --*/\n display: block;\n box-sizing: content-box;\n position: relative;\n top: -4px;\n left: -2px;\n height: 0;\n width: calc(100% + 4px);\n /*-- Visual --*/\n border-width: 2px 0 0 0;\n border-style: dashed none none none;\n border-color: <<color primary>>;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-DA-IndicatorBottom-OV-_D {\n /*-- Layout Outer --*/\n flex: 1 0 2.5em;\n position: relative;\n}\n\n.dpbd-DA-IndicatorBottom-OV-_D > .tc-droppable {\n /*-- Layout Outer --*/\n display: block;\n position: absolute;\n width: 100%;\n height: 100%;\n}\n\n.dpbd-DA-IndicatorBottom-OV-_D > .tc-droppable.tc-dragover {\n /*-- Visual --*/\n border: 2px dashed <<color primary>>;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n.dpbd-DA-IndicatorList-OV-_D {\n /*-- Layout Outer --*/\n display: none;\n}\n\n.tc-droppable.tc-dragover > .dpbd-DA-IndicatorList-OV-_D {\n /*-- Layout Outer --*/\n position: absolute;\n display: block;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n /*-- Visual --*/\n border: 2px dashed <<color primary>>;\n}\n\n/* -------/-------/-------/-------/-------/-------/-------/-------/ */\n\n\n/* ---- Search List\n** ---------------------------------------------------------------- */\n\n.dpbd-SL-DropArea-IV-_,\n.dpbd-SL-DropArea-IV-_.dpbd-SL-DropArea-IV-_\n{\n /*-- Layout Outer --*/\n /* EXTENDS tc-edit-tags */\n /*-- Layout Inner --*/\n padding: 1em 0.25em 1em 0.25em;\n /*-- Visual --*/\n background: none;\n box-shadow: none;\n line-height: 1.25;\n color: <<color sidebar-tab-foreground-selected>>;\n fill: <<color sidebar-tab-foreground-selected>>;\n border-color: <<color sidebar-tab-border-selected>>;\n background: <<color sidebar-tab-background-selected>>;\n border-style: dashed;\n}\n\n.dpbd-SL-Card-V-_,\n.dpbd-SL-Card-V-_.dpbd-SL-Card-V-_\n{\n /*-- Visual --*/\n border: 1px dashed <<color sidebar-tab-border-selected>>;\n}\n\n.dpbd-SL-Container_List-OI-_ {\n /*-- Layout Outer --*/\n /* \"flex\" set in style property on element */\n border-right: 0.25em dashed #ddd;\n /*-- Layout Inner --*/\n display: flex;\n flex-direction: column;\n padding: 0.75em 0.5em 0.75em 0;\n}\n\n/* -------/-------/-------/-------/-------/-------/-------/-------/ */\n\n/* =======/=======/=======/=======/=======/=======/=======/=======/ */\n\n\n\n\n/* ==== Other - TiddlyWiki Overrides and Extensions\n** ================================================================ */\n\n/* ---- TW Helpers\n** ---------------------------------------------------------------- */\n\n.dpbd-_-FillColor_ControlsForeground-V-_,\n.dpbd-_-FillColor_ControlsForeground-V-_.dpbd-_-FillColor_ControlsForeground-V-_\n{\n /*-- Visual --*/\n fill: <<color tiddler-controls-foreground>>;\n}\n\n/* -------/-------/-------/-------/-------/-------/-------/-------/ */\n\n/* ---- SideBar Reset\n** ---------------------------------------------------------------- */\n\n.dpbd-SB-Container_Reset-OIV-_ {\n /*-- Layout Outer --*/\n min-width: 100%;\n max-width: 100%;\n margin-top: 0.5em;\n display: inline-block;\n /*-- Layout Inner --*/\n padding: 0.5em;\n /*-- Visual --*/\n border-color: <<colour tab-border>>;\n border-width: 3px 1px 1px 1px;\n border-style: double dashed dashed dashed;\n}\n\n.dpbd-SB-Reset-VO-_ {\n /*-- Visual --*/\n background-color: <<color tiddler-background>>;\n color: <<color foreground>>;\n fill: <<color foreground>>;\n}\n\n.dpbd-SB-Reset-VO-_.dpbd-SB-Reset-VO-_ a.tc-tiddlylink,\n.dpbd-SB-Reset-VO-_.dpbd-SB-Reset-VO-_ a.tc-tiddlylink:hover\n{\n /*-- Visual --*/\n color: <<color tiddler-link-foreground>>;\n}\n\n.tc-sidebar-header .tc-sidebar-lists .dpbd-SB-Reset-VO-_ p {\n /*-- Layout Outer --*/\n margin-top: unset;\n margin-bottom: unset;\n}\n\n/* -------/-------/-------/-------/-------/-------/-------/-------/ */\n\n/* =======/=======/=======/=======/=======/=======/=======/=======/ */\n\n\n\n\n/* ==== Other - General Use\n** ================================================================ */\n\n._-_-Button_StyleLink-OVTM-_,\n._-_-Button_StyleLink-OVTM-_._-_-Button_StyleLink-OVTM-_ {\n /*-- Layout Inner --*/\n padding: 0;\n /*-- Visual --*/\n color: <<color primary>>;\n fill: <<color primary>>;\n border: none;\n background: none;\n /*-- Text --*/\n font-family: arial, sans-serif; /*input has OS specific font-family*/\n /*-- Miscellaneous --*/\n cursor: pointer;\n}\n\n._-_-Button_StyleLink-OVTM-_:hover {\n /*-- Visual --*/\n text-decoration: underline;\n}\n\n/* . . . . . . . . */\n\n._-_-img_inline-OV-_C {\n /*-- Visual --*/\n /* \"fill\" set in style property on element */\n}\n\n._-_-img_inline-OV-_C > img,\n._-_-img_inline-OV-_C > svg\n{\n /*-- Layout Outer --*/\n height: 1em;\n width: auto;\n}\n\n._-_-img_inline_help-M-_ {\n /*-- Miscellaneous --*/\n cursor: help;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n._-_-Position_TR-O-_ {\n /*-- Layout Outer --*/\n position: absolute;\n top: 0.125em;\n right: 0.125em;\n}\n\n/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */\n\n._-_-VerticalRule-OV-_ {\n /*-- Layout Outer --*/\n display: inline;\n margin: 0 0.5em;\n /*-- Visual --*/\n border-style: none none none solid ;\n border-width: 0 0 0 1px ;\n border-color: black;\n}\n\n/* =======/=======/=======/=======/=======/=======/=======/=======/ */\n\n\"\"\""
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/bold": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/bold",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/editor-height": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/editor-height",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/excise": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/excise",
"text": "show"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-1": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-1",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-2": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-2",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-3": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-3",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/italic": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/italic",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/line-width": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/line-width",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/link": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/link",
"text": "show"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/list-bullet": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/list-bullet",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/list-number": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/list-number",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/mono-block": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/mono-block",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/mono-line": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/mono-line",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/picture": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/picture",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/preview": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/preview",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/quote": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/quote",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/stamp": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/stamp",
"text": "show"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/strikethrough": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/strikethrough",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/subscript": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/subscript",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/superscript": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/superscript",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/underline": {
"title": "$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/underline",
"text": "hide"
},
"$:/plugins/reidgould/dpbd/images/Dropboard": {
"title": "$:/plugins/reidgould/dpbd/images/Dropboard",
"text": "<svg class=\"tc-image-options-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 22 22\">\n<g>\n <rect x=\"15.5\" y=\"3\" width=\"3.5\" height=\"2\"/>\n <rect x=\"9\" y=\"3\" width=\"4\" height=\"2\"/>\n <rect x=\"9\" y=\"6\" width=\"4\" height=\"2\"/>\n <rect x=\"9\" y=\"9\" width=\"4\" height=\"2\"/>\n <rect x=\"9\" y=\"12\" width=\"4\" height=\"2\"/>\n <rect x=\"3\" y=\"3\" width=\"3.5\" height=\"2\"/>\n <rect x=\"3\" y=\"6\" width=\"3.5\" height=\"2\"/>\n <path d=\"M19,0H3C1.4,0,0,1.4,0,3v16c0,1.6,1.4,3,3,3h16c1.6,0,3-1.4,3-3V3C22,1.4,20.7,0,19,0z M14.5,20V2H19c0.5,0,1,0.5,1,1v16\n c0,0.5-0.5,1-1,1H14.5z M8,20V2h6v18L8,20z M2,19V3c0-0.5,0.5-1,1-1h4.5v18H3C2.5,20,2,19.5,2,19z\"/>\n</g>\n</svg>\n"
},
"$:/plugins/reidgould/dpbd/license": {
"title": "$:/plugins/reidgould/dpbd/license",
"type": "text/plain",
"text": "Dropboard created by Reid Gould, (reidgould [at] gmail [dot] com)\n\nCopyright (c) 2017, Reid Gould\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
},
"$:/plugins/reidgould/dpbd/notifications/NoActionDraggedOntoSame": {
"title": "$:/plugins/reidgould/dpbd/notifications/NoActionDraggedOntoSame",
"text": "No Action. Dragged onto same."
},
"$:/plugins/reidgould/dpbd/notifications/NoActionSearchList": {
"title": "$:/plugins/reidgould/dpbd/notifications/NoActionSearchList",
"text": "No Action. Cannot drag the Search List or drop into it, only drag cards out."
},
"$:/plugins/reidgould/dpbd/ui/notifications/shortidNotInstalled": {
"title": "$:/plugins/reidgould/dpbd/ui/notifications/shortidNotInstalled",
"text": "New tiddler not placed properly?<br>\nInstall <a href=\"http://reidgould.github.io/tiddlywiki-shortid-plugin\" target=\"_blank\" rel=\"noopener noreferrer\">shortid</a>."
},
"$:/plugins/reidgould/dpbd/readme": {
"title": "$:/plugins/reidgould/dpbd/readme",
"type": "text/x-markdown",
"text": "# Dropboard\nA TiddlyWiki plugin for kanban like organization in the style of Trello using boards, lists, and cards.\n\nCreated by [Reid Gould](https://www.reidgould.com) <[reidgould@gmail.com](mailto:reidgould@gmail.com)>\n\n* [Source on GitHub](https://github.com/reidgould/tiddlywiki-dropboard).\n* [User Guide in a TiddlyWiki](http://reidgould.github.io/tiddlywiki-dropboard).\n\nGet Dropboard by opening the User Guide and choosing one of the methods found there, or by cloning this repository and using `npm run` to execute the scripts listed in \"package.json\".\n"
},
"$:/plugins/reidgould/dpbd/snippets/BoardTemplate": {
"title": "$:/plugins/reidgould/dpbd/snippets/BoardTemplate",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Dropboard - Board Template",
"text": "<$transclude tiddler=\"$:/plugins/reidgould/dpbd/templates/view/Board\" mode=\"inline\" />"
},
"$:/plugins/reidgould/dpbd/templates/edit/Card": {
"title": "$:/plugins/reidgould/dpbd/templates/edit/Card",
"text": "\\define action-Save()\n <$action-sendmessage $message=\"tm-add-tag\" $param={{$:/temp/NewTagName}}/>\n <$action-deletetiddler $tiddler=\"$:/temp/NewTagName\"/>\n <$action-sendmessage $message=\"tm-add-field\" $name={{$:/temp/newfieldname}} $value={{$:/temp/newfieldvalue}}/>\n <$action-deletetiddler $tiddler=\"$:/temp/newfieldname\"/>\n <$action-deletetiddler $tiddler=\"$:/temp/newfieldvalue\"/>\n <$action-sendmessage $message=\"tm-save-tiddler\"/>\n\\end\n\\define class-Card-Norm()\n tc-tiddler-frame tc-tiddler-edit-frame dpbd-C-TextEditorToolbar-OT-D $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$ dpbd-_-Card-OV-_\n\\end\n\\define class-Card-SearchList()\n tc-tiddler-frame tc-tiddler-edit-frame dpbd-C-TextEditorToolbar-OT-D $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$ dpbd-_-Card-OV-_ dpbd-SL-Card-V-_\n\\end\n\\define config-visibility-title()\n$:/plugins/reidgould/dpbd/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\n\\end\n\n<$set name=\"currentCardTiddler\" value=<<currentTiddler>> >\n<$set name=\"class-Card\" filter=\"[<currentListTiddler>field:title<tiddler-SearchListFilter-Live>]\"\n value=<<class-Card-SearchList>>\n emptyValue=<<class-Card-Norm>> >\n<$droppable actions=<<action-Droppable-Card>> >\n<div class=\"dpbd-DA-IndicatorThin-OV-c\">\n <div class=\"dpbd-DA-IndicatorThin_Child-OV-c\"></div>\n</div>\n<div class=<<class-Card>>>\n <$fieldmangler>\n <!-- keeping this SetWidget for storyTiddler for internals from TW core -->\n <$set name=\"storyTiddler\" value=<<currentTiddler>>>\n <$keyboard key=\"((cancel-edit-tiddler))\" message=\"tm-cancel-tiddler\">\n <$keyboard key=\"((save-tiddler))\" actions=<<action-Save>>>\n <div class=\"dpbd-C-TiddlerControls-OI-_\">\n <$button message=\"tm-delete-tiddler\" tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=\"tc-btn-invisible dpbd-_-FillColor_ControlsForeground-V-_\">\n {{$:/core/images/delete-button}}\n </$button>\n <$button message=\"tm-cancel-tiddler\" tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=\"tc-btn-invisible dpbd-_-FillColor_ControlsForeground-V-_\">\n {{$:/core/images/cancel-button}}\n </$button>\n <$button actions=<<action-Save>> tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=\"tc-btn-invisible dpbd-_-FillColor_ControlsForeground-V-_\">\n {{$:/core/images/save-button}}\n </$button>\n </div>\n <span class=\"dpbd-C-EditTitle-T-D\">\n <$transclude tiddler=\"$:/core/ui/EditTemplate/title\" mode=\"inline\" />\n </span>\n <$edit-text field=\"shorttext\" tag=\"textarea\" autoHeight=\"yes\" minHeight=\"1.25em\" focus=\"yes\" class=\"tc-edit-texteditor\" placeholder={{$:/plugins/reidgould/dpbd/templates/shorttextPlaceholder}} />\n <<currentTiddler>>\n <$list filter=\"[<currentTiddler>regexp:shorttext[\\n]]\" variable=\"\">\n <div class=\"tc-message-box\">\n <p>{{$:/core/images/warning}} Warning: avoid using multiple lines in shorttext. Tiddlers with newline characters in shorttext create invalid \".tid\" files.</p>\n </div>\n </$list>\n <$edit\n field=\"text\"\n focus=\"no\"\n class=\"tc-edit-texteditor\"\n placeholder={{$:/language/EditTemplate/Body/Placeholder}}\n ><$set\n value=<<currentTiddler>>\n ><$list\n filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\"\n ><$reveal\n type=\"nomatch\"\n state=<<config-visibility-title>>\n text=\"hide\"\n class=\"tc-text-editor-toolbar-item-wrapper\"\n ><$transclude\n tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\"\n mode=\"inline\"\n /></$reveal></$list></$set></$edit>\n </$keyboard>\n </$keyboard>\n </$set>\n </$fieldmangler>\n</div>\n</$droppable>\n</$set>\n</$set>"
},
"$:/plugins/reidgould/dpbd/templates/edit/shorttext": {
"title": "$:/plugins/reidgould/dpbd/templates/edit/shorttext",
"tags": "$:/tags/EditTemplate",
"list-before": "$:/core/ui/EditTemplate/body",
"text": "<div class=\"dpbd-_-MainEdit_Shorttext-I-_\">\n <div class=\"dpbd-_-MainEdit_Shorttext_Textarea-O-_\">\n <$edit-text field=\"shorttext\" tag=\"textarea\" autoHeight=\"yes\" minHeight=\"1.25em\" focus=\"no\" class=\"tc-edit-texteditor\" placeholder={{$:/plugins/reidgould/dpbd/templates/shorttextPlaceholder}} />\n </div>\n <div class=\"dpbd-_-MainEdit_Shorttext_Button-O-_ tc-tiddler-controls\">\n <$button actions=\"\"\"<$action-deletefield shorttext />\"\"\" tooltip=\"delete field shorttext\" class=\"tc-btn-invisible\">\n {{$:/core/images/close-button}}\n </$button>\n </div>\n</div>\n<$list filter=\"[<currentTiddler>regexp:shorttext[\\n]]\" variable=\"\">\n <div class=\"tc-message-box\">\n <p>{{$:/core/images/warning}} Warning: avoid using multiple lines in shorttext. Tiddlers with newline characters in shorttext create invalid \".tid\" files.</p>\n </div>\n</$list>"
},
"$:/plugins/reidgould/dpbd/templates/shorttextPlaceholder": {
"title": "$:/plugins/reidgould/dpbd/templates/shorttextPlaceholder",
"text": "\"shorttext\" for plain text up to a paragraph. Use \"title\" as ID, \"text\" for large content."
},
"$:/plugins/reidgould/dpbd/templates/view/Board": {
"title": "$:/plugins/reidgould/dpbd/templates/view/Board",
"text": "<$set name=\"currentBoardTiddler\" value=<<currentTiddler>> >\n<$set name=\"val-BoardHeight\" filter={{{[<currentBoardTiddler>get[dpbd-boardheight]]}}} value=\"\" emptyValue=<<val-BoardHeight-Default>> >\n<div class=\"dpbd-_-Board-OI-_\" style=<<style-BoardHeight>> >\n <$list filter=\"[<currentBoardTiddler>] -[<storyTiddler>] +[count[]] -[[0]]\" variable=\"\">\n <div class=\"dpbd-B-Row_Title-O-_\">\n <$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n <$link>\n <$set name=\"foregroundColor\" value={{!!color}} >\n <span class=\"_-_-img_inline-OV-_C\" style=<<style-IconColor>>>\n <$transclude tiddler={{!!icon}} mode=\"inline\" />\n </span>\n </$set>\n <$list filter=\"[all[current]removeprefix[$:/]]\">\n <h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n <span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n </h2>\n </$list>\n <$list filter=\"[all[current]!prefix[$:/]]\">\n <h2 class=\"tc-title dpbd-B-Row_Title_h2-O-_\">\n <$view field=\"title\"/>\n </h2>\n </$list>\n </$link>\n <$list filter=\"[<windowTiddler>] -[<currentBoardTiddler>] -[[]]\" variable=\"\">\n in\n <$link to=<<windowTiddler>> >\n <<windowTiddler>>\n </$link>\n </$list>\n </$set>\n </div>\n </$list>\n <div class=\"dpbd-B-Row_ControlBanner-OI-_\">\n <div class=\"dpbd-CB-Container_WidgetDrop-OI-_\">\n <div class=\"dpbd-CB-ContainerSub_WidgetDrop-OI-_\">\n <div class=\"dpbd-CB-Widget-O-_ dpbd-CB-WidgetDrop-OI-_ tc-edit-tags dpbd-_-DropArea-IV-_\" title=\"Drop into either card or list position.\">\n <$draggable tiddler=\"$:/plugins/reidgould/dpbd/action/newTiddler\" class=\"dpbd-_-Card-OV-_ dpbd-CB_WD-Card-O-_ tc-tiddler-frame\">\n <p class=\"dpbd-CB_WD-p-OIT-_C\">{{$:/core/images/new-button}}New Tiddler</p>\n </$draggable>\n </div>\n <div class=\"dpbd-CB-Widget-O-_ dpbd-CB-WidgetDrop-OI-_ tc-edit-tags dpbd-_-DropArea-IV-_\" >\n <$droppable actions=\"\"\"\n <$action-deletetiddler $tiddler=<<tiddler-Holding>> />\n <$action-createtiddler $basetitle=<<tiddler-Holding>> text=<<actionTiddler>> /> \"\"\" >\n <div class=\"dpbd-CB_WD-Droppable-OI-_\"><p class=\"dpbd-CB_WD-p-OIT-_C\">{{$:/core/images/full-screen-button}}Hold Tiddler </p></div>\n </$droppable>\n <$list filter=\"[<tiddler-Holding>get[title]]\" >\n <$tiddler tiddler={{{ [<tiddler-Holding>get[text]] }}} >\n <$vars currentHeldTiddler=<<currentTiddler>> val-HeldShorttext={{!!shorttext}} >\n <$draggable tiddler=<<currentTiddler>> class=\"dpbd-_-Card-OV-_ dpbd-CB_WD-Card-O-_ tc-tiddler-frame\">\n <$button actions=\"\"\"<$action-deletetiddler $tiddler=<<tiddler-Holding>> />\"\"\" class=\"tc-btn-invisible dpbd-_-FillColor_ControlsForeground-V-_ _-_-Position_TR-O-_\">\n {{$:/core/images/close-button}}\n </$button>\n <p class=\"dpbd-CB_WD-p-OIT-_C\" title=<<HeldToolTip>>>\n {{$:/core/images/file}}\n Tiddler: \n <span class=\"dpbd-CB_WD-HeldTitle-OT-_ dpbd-_-ShorttextView-OM-C\">\n <$set name=\"field-shorttextOrTitle\" filter=\"[<currentTiddler>has[shorttext]]\" value=\"shorttext\" emptyValue=\"title\">\n <$transclude field=<<field-shorttextOrTitle>> mode=\"inline\" class=\"\" />\n </$set>\n </span>\n </p>\n </$draggable>\n </$vars>\n </$tiddler>\n </$list>\n </div>\n </div>\n <div class=\"dpbd-CB-ContainerSub_WidgetDrop-OI-_\">\n <div class=\"dpbd-CB-Widget-O-_ dpbd-CB-WidgetDrop-OI-_ tc-edit-tags dpbd-_-DropArea-IV-_\" >\n <$droppable actions=\"\"\"<$action-navigate $to=<<actionTiddler>> $scroll=\"yes\" />\"\"\" >\n <div class=\"dpbd-CB_WD-Droppable-OI-_\"><p class=\"dpbd-CB_WD-p-OIT-_C\">{{$:/core/images/export-button}}Open in Main Story</p></div>\n </$droppable>\n </div>\n <div class=\"dpbd-CB-Widget-O-_ dpbd-CB-WidgetDrop-OI-_ tc-edit-tags dpbd-_-DropArea-IV-_\" >\n <$droppable actions=\"\"\"<<action-RemoveFromBoard>>\"\"\" >\n <div class=\"dpbd-CB_WD-Droppable-OI-_\"><p class=\"dpbd-CB_WD-p-OIT-_C\">{{$:/core/images/close-button}}Remove from Board</p></div>\n </$droppable>\n </div>\n </div>\n </div>\n <div class=\"dpbd-CB-Container_WidgetInput-OI-_\">\n <div class=\"dpbd-CB-ContainerSub_WidgetInput-OI-_\">\n <div class=\"dpbd-CB-Widget-O-_ dpbd-CB-WidgetInput-O-_\" title=\"Filter (append to each)\">\n <p class=\"dpbd-CB_WI-Label_p-OT-_\">Filter</p>\n <$button class=\"dpbd-CB_WI-Input-O-_ dpbd-CB_WI-Input_Button-OV-_\" popup=<<tiddler-popupUserFilter>> >{{$:/core/images/unfold-button}}</$button>\n <$reveal type=\"popup\" state=<<tiddler-popupUserFilter>> position=\"below\" class=\"tc-popup-keep\">\n <div class=\"tc-drop-down dpbd-CB_WI-Popup-OIV-_C\">\n <span class=\"dpbd-CB_WI_P-FlexE-O-_\">\n <$edit-text tiddler=<<tiddler-UserFilter-Stage>> tag=\"input\" type=\"text\" default=\"\" placeholder=\"Use only + or - runs.\" class=\"dpbd-CB_WI_P-Child_TextArea-O-_\" />\n </span>\n <$button class=\"dpbd-CB_WI_P-FlexC-O-_ dpbd-CB_WI_P-Button-OV-_\" actions=\"\"\"\n <$action-deletetiddler $tiddler=<<tiddler-UserFilter-Live>> />\n <$action-createtiddler $basetitle=<<tiddler-UserFilter-Live>> text={{{ [<tiddler-UserFilter-Stage>get[text]] }}} />\n \"\"\">\n Set\n </$button>\n <$button class=\"dpbd-CB_WI_P-FlexC-O-_ tc-btn-invisible\" actions=\"\"\"\n <$action-deletetiddler $tiddler=<<tiddler-UserFilter-Stage>> />\n <$action-deletetiddler $tiddler=<<tiddler-UserFilter-Live>> />\n \"\"\" >\n {{$:/core/images/close-button}}\n </$button>\n </div>\n </$reveal>\n </div>\n <div class=\"dpbd-CB-Widget-O-_ dpbd-CB-WidgetInput-O-_\" title=\"Display Text Field\">\n <p class=\"dpbd-CB_WI-Label_p-OT-_\">Text</p>\n <div class=\"dpbd-CB_WI-Input-O-_ dpbd-CB_WI-Input_Container_Checkbox-OTV-_\">\n <$checkbox class=\"\" field=\"dpbd-displaytext\" checked=\"yes\" unchecked=\"no\" default=\"yes\"></$checkbox>\n </div>\n </div>\n <div class=\"dpbd-CB-Widget-O-_ dpbd-CB-WidgetInput-O-_\" title=\"Display Image Tiddlers\">\n <p class=\"dpbd-CB_WI-Label_p-OT-_\">Image</p>\n <div class=\"dpbd-CB_WI-Input-O-_ dpbd-CB_WI-Input_Container_Checkbox-OTV-_\">\n <$checkbox class=\"\" field=\"dpbd-displayimages\" checked=\"yes\" unchecked=\"no\" default=\"yes\"></$checkbox>\n </div>\n </div>\n <div class=\"dpbd-CB-Widget-O-_ dpbd-CB-WidgetInput-O-_\" title=\"Search List Filter.\">\n <p class=\"dpbd-CB_WI-Label_p-OT-_\">Search</p>\n <$button class=\"dpbd-CB_WI-Input-O-_ dpbd-CB_WI-Input_Button-OV-_\" popup=<<tiddler-popupSearchList>> >{{$:/core/images/unfold-button}}</$button>\n <$reveal type=\"popup\" state=<<tiddler-popupSearchList>> position=\"below\" class=\"tc-popup-keep\">\n <div class=\"tc-drop-down dpbd-CB_WI-Popup-OIV-_C\">\n <span class=\"dpbd-CB_WI_P-FlexE-O-_\">\n <$edit-text tiddler=<<tiddler-SearchListFilter-Stage>> tag=\"input\" type=\"text\" default=\"\" placeholder=\"Excludes tiddlers on board.\" class=\"dpbd-CB_WI_P-Child_TextArea-O-_\" />\n </span>\n <$button class=\"dpbd-CB_WI_P-FlexC-O-_ dpbd-CB_WI_P-Button-OV-_\" actions=\"\"\"\n <$action-deletetiddler $tiddler=<<tiddler-SearchListFilter-Live>> />\n <$action-createtiddler $basetitle=<<tiddler-SearchListFilter-Live>> text={{{ [<tiddler-SearchListFilter-Stage>get[text]] }}} /> \"\"\">\n Set\n </$button>\n <$button class=\"dpbd-CB_WI_P-FlexC-O-_ tc-btn-invisible\" actions=\"\"\"\n <$action-deletetiddler $tiddler=<<tiddler-SearchListFilter-Stage>> />\n <$action-deletetiddler $tiddler=<<tiddler-SearchListFilter-Live>> />\n \"\"\" >\n {{$:/core/images/close-button}}\n </$button>\n </div>\n </$reveal>\n </div>\n </div>\n <div class=\"dpbd-CB-ContainerSub_WidgetInput-OI-_\">\n <div class=\"dpbd-CB-Widget-O-_ dpbd-CB-WidgetInput-O-_\" title=\"Board Height\">\n <p class=\"dpbd-CB_WI-Label_p-OT-_\">Height</p>\n <$button class=\"dpbd-CB_WI-Input-O-_ dpbd-CB_WI-Input_Button-OV-_\" popup=<<tiddler-popupBoardHeight>> >{{$:/core/images/unfold-button}}</$button>\n <$reveal type=\"popup\" state=<<tiddler-popupBoardHeight>> position=\"below\" class=\"tc-popup-keep\">\n <div class=\"tc-drop-down dpbd-CB_WI-Popup-OIV-_C\">\n <$set name=\"val-BoardHeight-current\" value={{{ [<currentBoardTiddler>get[dpbd-boardheight]] }}} >\n <span class=\"dpbd-CB_WI_P-FlexE-O-_\">\n <$edit-text tiddler=<<tiddler-BoardHeight-Stage>> tag=\"input\" type=\"text\" default=\"\" placeholder=<<val-BoardHeight-current>> class=\"dpbd-CB_WI_P-Child_TextArea-O-_\" />\n </span>\n </$set>\n <$button class=\"dpbd-CB_WI_P-FlexC-O-_ dpbd-CB_WI_P-Button-OV-_\" actions=\"\"\"\n <$action-setfield $tiddler=<<currentBoardTiddler>> $field=\"dpbd-boardheight\" $value={{{ [<tiddler-BoardHeight-Stage>get[text]addsuffix[vh]] }}} />\n <$action-deletetiddler $tiddler=<<tiddler-BoardHeight-Stage>> />\n \"\"\">\n Set (vh)\n </$button>\n <$button class=\"dpbd-CB_WI_P-FlexC-O-_ tc-btn-invisible\" actions=\"\"\"\n <$action-deletetiddler $tiddler=<<tiddler-BoardHeight-Stage>> />\n <$action-deletefield $tiddler=<<currentBoardTiddler>> $field=\"dpbd-boardheight\" />\n \"\"\" >\n {{$:/core/images/close-button}}\n </$button>\n </div>\n </$reveal>\n </div>\n <div class=\"dpbd-CB-Widget-O-_ dpbd-CB-WidgetInput-O-_\" title=\"List Width\">\n <p class=\"dpbd-CB_WI-Label_p-OT-_\">Width</p>\n <$button class=\"dpbd-CB_WI-Input-O-_ dpbd-CB_WI-Input_Button-OV-_\" popup=<<tiddler-popupListWidth>> >{{$:/core/images/unfold-button}}</$button>\n <$reveal type=\"popup\" state=<<tiddler-popupListWidth>> position=\"below\" class=\"tc-popup-keep\">\n <div class=\"tc-drop-down dpbd-CB_WI-Popup-OIV-_C\">\n <$set name=\"val-ListWidth-current\" value={{{ [<currentBoardTiddler>get[dpbd-listwidth-em]] }}} >\n <span class=\"dpbd-CB_WI_P-FlexE-O-_\">\n <$edit-text tiddler=<<tiddler-ListWidth-Stage>> tag=\"input\" type=\"text\" default=\"\" placeholder=<<val-ListWidth-current>> class=\"dpbd-CB_WI_P-Child_TextArea-O-_\" />\n </span>\n </$set>\n <$button class=\"dpbd-CB_WI_P-FlexC-O-_ dpbd-CB_WI_P-Button-OV-_\" actions=\"\"\"\n <$action-setfield $tiddler=<<currentBoardTiddler>> $field=\"dpbd-listwidth-em\" $value={{{ [<tiddler-ListWidth-Stage>get[text]] }}} />\n <$action-deletetiddler $tiddler=<<tiddler-ListWidth-Stage>> />\n \"\"\">\n Set (em)\n </$button>\n <p class=\"_-_-VerticalRule-OV-_ dpbd-CB_WI_P-FlexC-O-_\">‌</p>\n <p class=\"dpbd-CB_WI_P-FlexC-O-_\">Fit:</p>\n <$select class=\"dpbd-CB_WI_P-FlexC-O-_\" tiddler=<<currentBoardTiddler>> field=\"dpbd-listwidth-num\"\n actions=\"\"\"\n <$action-setfield $field=\"dpbd-widthismax\" $value=\"yes\" />\n <$action-deletefield $tiddler=<<currentBoardTiddler>> $field=\"dpbd-listwidth-em\" />\n \"\"\" >\n <$list filter=\"[enlist<table-ListWidth-Num>]\" variable=\"val-ListWidth-Num-Current\">\n <option value=<<val-ListWidth-Num-Current>> ><<val-ListWidth-Num-Current>></option>\n </$list>\n </$select>\n <p class=\"_-_-VerticalRule-OV-_ dpbd-CB_WI_P-FlexC-O-_\">‌</p>\n <$checkbox class=\"dpbd-CB_WI_P-FlexC-O-_\" field=\"dpbd-widthismax\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> Is Max</$checkbox>\n <p class=\"_-_-VerticalRule-OV-_ dpbd-CB_WI_P-FlexC-O-_\">‌</p>\n <$button class=\"dpbd-CB_WI_P-FlexC-O-_ tc-btn-invisible\" actions=\"\"\"\n <$action-deletetiddler $tiddler=<<tiddler-ListWidth-Stage>> />\n <$action-deletefield $tiddler=<<currentBoardTiddler>> $field=\"dpbd-listwidth-num\" />\n <$action-deletefield $tiddler=<<currentBoardTiddler>> $field=\"dpbd-listwidth-em\" />\n <$action-deletefield $tiddler=<<currentBoardTiddler>> $field=\"dpbd-widthismax\" />\n \"\"\" >\n {{$:/core/images/close-button}}\n </$button>\n </div>\n </$reveal>\n </div>\n <div class=\"dpbd-CB-Widget-O-_ dpbd-CB-WidgetInput-O-_\" title=\"Open In New Window\">\n <p class=\"dpbd-CB_WI-Label_p-OT-_\">Window</p>\n <$button class=\"dpbd-CB_WI-Input-O-_ dpbd-CB_WI-Input_Button-OV-_\" actions=\"\"\"\n <$action-sendmessage $message=\"tm-open-window\" $param=<<storyTiddler>> width=\"9999\" height=\"9999\" windowTiddler=<<storyTiddler>> />\n <$action-setfield $tiddler=<<currentBoardTiddler>> $field=\"dpbd-boardheight\" $value=\"100%\" />\n <$action-sendmessage $message=\"tm-close-tiddler\" $param=<<storyTiddler>> />\n \"\"\" >\n <span class=\"_-_-img_inline-OV-_C\">{{$:/core/images/open-window}}</span>\n </$button>\n </div>\n <div class=\"dpbd-CB-Widget-O-_ dpbd-CB-WidgetInput-O-_\" title=\"Show in SideBar\">\n <p class=\"dpbd-CB_WI-Label_p-OT-_\">SideBar</p>\n <$set name=\"wikitext-SideBar-Button\" filter=\"[<tiddler-SideBar>has:field[title]]\"\n value=<<wikitext-SideBar-Button-Delete>>\n emptyValue=<<wikitext-SideBar-Button-Create>> >\n <<wikitext-SideBar-Button>>\n </$set>\n </div>\n </div>\n </div>\n </div>\n <!-- Set values if board has fields. -->\n <$set name=\"val-ListWidth-Em\" filter=\"[<currentBoardTiddler>has:value[dpbd-listwidth-em]]\"\n value={{{[<currentBoardTiddler>get[dpbd-listwidth-em]]}}}\n emptyValue=<<val-ListWidth-Em-Default>> >\n <$set name=\"val-ListWidth-Num\" filter=\"[<currentBoardTiddler>has:value[dpbd-listwidth-num]]\"\n value={{{[<currentBoardTiddler>get[dpbd-listwidth-num]]}}}\n emptyValue=<<val-ListWidth-Num-Default>> >\n <!-- Unshift table if necessary. Decimal part of new values are because listop disallows duplicates. -->\n <$set name=\"list-ListWidth-Pct-SL\" filter=\"[[100.001]] [enlist<table-ListWidth-Pct>]\" >\n <$set name=\"table-ListWidth-Pct\" filter=\"[field:title<tiddler-SearchListFilter-Live>]\"\n value=<<list-ListWidth-Pct-SL>>\n emptyValue=<<table-ListWidth-Pct>> >\n <$set name=\"list-ListWidth-Dec-SL\" filter=\"[[1.001]] [enlist<table-ListWidth-Dec>]\" >\n <$set name=\"table-ListWidth-Dec\" filter=\"[field:title<tiddler-SearchListFilter-Live>]\"\n value=<<list-ListWidth-Dec-SL>>\n emptyValue=<<table-ListWidth-Dec >\n <!-- Set final values from table lookup. -->\n <$set name=\"val-ListWidth-Pct\" value={{{ [enlist<table-ListWidth-Pct>nth<val-ListWidth-Num>] }}} >\n <$set name=\"val-ListWidth-Dec\" value={{{ [enlist<table-ListWidth-Dec>nth<val-ListWidth-Num>] }}} >\n <!-- Use Em value if set, otherwise use percent value. -->\n <$set name=\"val-listWidthMin\" filter=\"[<currentBoardTiddler>has:value[dpbd-listwidth-em]]\"\n value=<<val-WidthPropVal-Em>>\n emptyValue=<<val-WidthPropVal-Pct>> >\n <div class=\"dpbd-B-Row_List-OI-_\" >\n <$list filter=\"[field:title<tiddler-SearchListFilter-Live>]\" >\n <$set name=\"style-Width--SearchList-Container\" filter=\"[<currentBoardTiddler>has:value[dpbd-listwidth-em]]\"\n value=<<style-Flex-Em>>\n emptyValue=<<style-Flex-Dec>> >\n <div class=\"dpbd-SL-Container_List-OI-_\" style=<<style-Width--SearchList-Container>> >\n <$transclude tiddler=\"$:/plugins/reidgould/dpbd/templates/view/List\" mode=\"inline\" />\n </div>\n </$set>\n </$list>\n <div class=\"dpbd-B_RL-Container_List-OI-_\" >\n <$list filter=\"[<currentTiddler>tagging[]!has[draft.of]]\"\n emptyMessage=\"\"\"\n <div class=\"tc-edit-tags dpbd-_-DropArea-IV-_\" style=\"flex:1 1 auto;\">\n <$droppable actions=<<action-Droppable-List>> >\n <div class=\"dpbd-B-EmptyMessage-OM-_\" style=\"position:relative;\">\n Drag in the \"New Tiddler\" above, or any existing tiddler, to use it as a list.\n </div>\n </$droppable>\n </div>\n \"\"\">\n <$transclude tiddler=\"$:/plugins/reidgould/dpbd/templates/view/List\" mode=\"inline\" />\n </$list>\n </div>\n </div>\n </$set>\n </$set>\n </$set>\n </$set>\n </$set>\n </$set>\n </$set>\n </$set>\n </$set>\n <$list filter=\"[<currentBoardTiddler>get[dpbd-boardheight]suffix[%]]\" variable=\"\">\n <$list filter=\"[<storyTiddler>] -[[]]\" variable=\"\">\n <div style=\"text-align:center;margin:0.5em;\">\n Currently in \"Window\" mode.<br>\n <$button actions=\"\"\"\n <$action-deletefield $tiddler=<<currentBoardTiddler>> $field=\"dpbd-boardheight\" />\n \"\"\">\n Restore default height.\n </$button>\n </div>\n </$list>\n </$list>\n <div class=\"dpbd-B-Footer-OT-_\">\n <$link to=\"$:/plugins/reidgould/dpbd\">{{$:/plugins/reidgould/dpbd!!name}}</$link> by <a href={{$:/plugins/reidgould/dpbd!!author-web}} target=\"_blank\" rel=\"noopener noreferrer\">{{$:/plugins/reidgould/dpbd!!author-name}}</a>\n </div>\n</div>\n</$set>\n</$set>"
},
"$:/plugins/reidgould/dpbd/templates/view/Card": {
"title": "$:/plugins/reidgould/dpbd/templates/view/Card",
"text": "<$set name=\"currentCardTiddler\" value=<<currentTiddler>> >\n <$droppable class=\"dpbd-_-Droppable_Card-O-_\" actions=<<action-Droppable-Card>> >\n <$macrocall $name=\"wikitext-CardView\" palette-tagBackground={{$:/palette}} />\n </$droppable>\n</$set>"
},
"$:/plugins/reidgould/dpbd/templates/view/CardMacros": {
"title": "$:/plugins/reidgould/dpbd/templates/view/CardMacros",
"tags": "$:/tags/Macro",
"text": "\\define wikitext-Text-IfTextDisplay()\n <$list filter=\"[<currentBoardTiddler>!field:dpbd-displaytext[no]]\" variable=\"\">\n <$transclude field=\"text\" mode=\"block\" />\n </$list>\n\\end\n\n\\define wikitext-Image-IfImageDisplay()\n <$list filter=\"[<currentBoardTiddler>!field:dpbd-displayimages[no]]\" variable=\"\">\n <$transclude field=\"text\" mode=\"block\" />\n </$list>\n\\end\n\n\\define wikitext-CardView(palette-tagBackground)\n <$set name=\"class-Card\" filter=\"[<currentListTiddler>field:title<tiddler-SearchListFilter-Live>]\"\n value=\"tc-tiddler-frame dpbd-_-Card-OV-_ dpbd-SL-Card-V-_\"\n emptyValue=\"tc-tiddler-frame dpbd-_-Card-OV-_\" >\n <div class=\"dpbd-DA-IndicatorThin-OV-c\">\n <div class=\"dpbd-DA-IndicatorThin_Child-OV-c\"></div>\n </div>\n <$draggable tiddler=<<currentTiddler>> class=<<class-Card>> >\n <$set name=\"foregroundColor\" value={{!!color}} >\n <div class=\"dpbd-C-TiddlerIcon-OIVT-_\" style=<<style-IconColor>> >\n <span class=\"_-_-img_inline-OV-_C\"><$transclude tiddler={{!!icon}} mode=\"inline\" /></span>\n </div>\n </$set>\n <div class=\"dpbd-C-TiddlerControls-OIT-_\">\n <$button popup=<<tiddler-popupTagsState>> tooltip={{$:/language/Buttons/Tag/Hint}} aria-label={{$:/language/Buttons/Tag/Caption}} class=\"tc-btn-invisible dpbd-_-FillColor_ControlsForeground-V-_\">\n {{$:/core/images/tag-button}}\n </$button>\n <$button message=\"tm-edit-tiddler\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=\"tc-btn-invisible dpbd-_-FillColor_ControlsForeground-V-_\" >\n {{$:/core/images/edit-button}}\n </$button>\n </div>\n <$reveal type=\"popup\" state=<<tiddler-popupTagsState>> position=\"belowleft\" class=\"tc-popup-keep dpbd-C-Popup_TagEditor-OIV-_CD\">\n <$transclude tiddler=\"$:/core/ui/EditTemplate/tags\" />\n </$reveal>\n <div class=\"dpbd-C-TagPreview-OI-_\">\n <$list filter=\"[<currentTiddler>tags[]] -[<currentListTiddler>] +[sort[title]]\">\n <$wikify name=\"val-TagColor-Default\" text={{$palette-tagBackground$##tag-background}} mode=\"inline\" output=\"html\">\n <$set name=\"val-TagColor\" filter=\"[<currentTiddler>has[color]]\" value={{!!color}} emptyValue=<<val-TagColor-Default>> >\n <$set name=\"field-shorttextOrTitle\" filter=\"[<currentTiddler>get[shorttext]]\" emptyValue=<<currentTiddler>> >\n <div class=\"dpbd-C-TagPreview_Child-OVM-_\" style=<<style-TagColor>> title=<<field-shorttextOrTitle>> ></div>\n </$set>\n </$set>\n </$wikify>\n </$list>\n </div>\n <div class=\"dpbd-C-ColorPreview-OI-_\">\n <$list filter=\"[<currentTiddler>has:field[color]]\">\n <$set name=\"val-TagColor\" value={{{ [<currentTiddler>get[color]] }}} >\n <div class=\"dpbd-C-ColorPreview_Child-OV-_\" style=<<style-TagColor>> ></div>\n </$set>\n </$list>\n </div>\n <div class=\"dpbd-C-Container_IconInfo-O-_\">\n <$list filter=\"[<currentCardTiddler>has:value[text]!is[image]]\" variable=\"\">\n <$list filter=\"[<currentBoardTiddler>field:displayText[no]]\" variable=\"\">\n <div class=\"dpbd-C-IconInfo-OV-_\" title=\"This tiddler contains text. Open in main story to view.\">\n <span class=\"_-_-img_inline-OV-_C _-_-img_inline_help-M-_\">{{$:/core/images/import-button}}</span>\n </div>\n </$list>\n </$list>\n <$list filter=\"[<currentCardTiddler>has[list]]\" variable=\"\">\n <div class=\"dpbd-C-IconInfo-OV-_\" title=\"This tiddler contains a list.\">\n <span class=\"_-_-img_inline-OV-_C _-_-img_inline_help-M-_\">{{$:/core/images/storyview-classic}}</span>\n </div>\n </$list>\n </div>\n <div title={{!!title}} class=\"dpbd-C-TextView-OIVM-_C\">\n <$set name=\"field-shorttextOrTitle\" filter=\"[<currentTiddler>has[shorttext]]\" value=\"shorttext\" emptyValue=\"title\">\n <p class=\"dpbd-_-ShorttextView-OM-C\">\n <$transclude field=<<field-shorttextOrTitle>> mode=\"inline\" class=\"\" />\n </p>\n </$set>\n <$set name=\"wikitext-LargeContent\" filter=\"[<currentCardTiddler>is[image]]\"\n value=<<wikitext-Image-IfImageDisplay>>\n emptyValue=<<wikitext-Text-IfTextDisplay>> >\n <<wikitext-LargeContent>>\n </$set>\n </div>\n </$draggable>\n </$set>\n\\end"
},
"$:/plugins/reidgould/dpbd/templates/view/List": {
"title": "$:/plugins/reidgould/dpbd/templates/view/List",
"text": "<$set name=\"currentListTiddler\" value=<<currentTiddler>> >\n <!-- Setup for collapsed lists. -->\n <$set name=\"list-collapse_in\"\n value={{{[<currentListTiddler>get[dpbd-collapse_in]]}}} >\n <$set name=\"is_collapsed\" filter=\"[enlist<list-collapse_in>field:title<currentBoardTiddler>]\"\n value=\"$:/plugins/reidgould/dpbd/values/yes\"\n emptyValue=\"$:/plugins/reidgould/dpbd/values/no\" >\n <$set name=\"class-ListTitle\" filter=\"[<is_collapsed>field:title[$:/plugins/reidgould/dpbd/values/yes]]\"\n value=\"\"\"dpbd-L_TB-Title_Collapsed-OZTM-_\"\"\"\n emptyValue=\"\"\"dpbd-L_TB-Title-I-_\"\"\" >\n <$set name=\"value-ListTitle-Height\" filter=\"[<currentBoardTiddler>get[dpbd-boardheight]suffix[%]]\"\n value=\"calc(100vh - 16em)\"\n emptyValue=<<Val-ListTitle-Collapsed>> >\n <$set name=\"style-ListTitle\" filter=\"[<is_collapsed>field:title[$:/plugins/reidgould/dpbd/values/yes]]\"\n value=<<style-ListTitle-Collapsed>>\n emptyValue=\"\" >\n <!-- Set values for list width -->\n <$set name=\"val-listWidthMin\" filter=\"[<is_collapsed>field:title[$:/plugins/reidgould/dpbd/values/yes]]\"\n value=\"3em\"\n emptyValue=<<val-listWidthMin>> >\n <$set name=\"val-listWidthMin\" filter=\"[<currentListTiddler>field:title<tiddler-SearchListFilter-Live>]\"\n value=\"100%\"\n emptyValue=<<val-listWidthMin>> >\n <$set name=\"val-listWidthMax\" filter=\"[<currentBoardTiddler>!field:dpbd-widthismax[no]] [<is_collapsed>field:title[$:/plugins/reidgould/dpbd/values/yes]]\"\n value=<<val-listWidthMin>>\n emptyValue=<<val-ListWidthMax-Default>> >\n <!-- Set visual style for \"Search List\" -->\n <$set name=\"class-scrollableArea\" filter=\"[<currentListTiddler>field:title<tiddler-SearchListFilter-Live>]\"\n value=\"tc-edit-tags dpbd-L-Container_Card-OI-_ dpbd-SL-DropArea-IV-_\"\n emptyValue=\"tc-edit-tags dpbd-L-Container_Card-OI-_ dpbd-_-DropArea-IV-_\" >\n <div class=\"dpbd-_-List-OI-_\" style=<<style-ListWidth>> >\n <$draggable tiddler=<<currentTiddler>> class=\"dpbd-L-TitleBar-OIV-_\" >\n <$list filter=\"[<currentListTiddler>!field:title<tiddler-SearchListFilter-Live>]\" variable=\"\">\n <$list filter=\"[<is_collapsed>!field:title[$:/plugins/reidgould/dpbd/values/yes]]\" variable=\"\">\n <span class=\"tc-edit-tags dpbd-_-DropArea-IV-_ dpbd-L_TB-DropArea_Left-OI-_\" title=\"Drop tiddler here to place in list position.\">\n <$droppable actions=<<action-Droppable-List>> >\n <span class=\"_-_-img_inline-OV-_C\">{{$:/core/images/chevron-left}}</span>\n <div class=\"dpbd-DA-IndicatorList-OV-_D\">\n </div>\n </$droppable>\n </span>\n <span class=\"dpbd-L_TB-Container_DropArea_Right-O-_\">\n <span class=\"tc-edit-tags dpbd-_-DropArea-IV-_ dpbd-L_TB-DropArea_Right-OIT-_\" title=\"Drop tiddler here to place in list position.\">\n <$set name=\"currentListTiddler\" value={{{ [<currentListTiddler>next<currentBoardTiddler>] }}} >\n <$droppable actions=<<action-Droppable-List>> >\n <span class=\"_-_-img_inline-OV-_C\">{{$:/core/images/chevron-right}}</span>\n <div class=\"dpbd-DA-IndicatorList-OV-_D\">\n </div>\n </$droppable>\n </$set>\n </span>\n </span>\n <span class=\"dpbd-L_TB-Container_ButtonCollapse-O-_\">\n <$button tag=\"span\" class=\"tc-btn-invisible dpbd-L_TB-ButtonCollapse-OIV_\" tooltip=\"Collapse list.\"\n actions=\"\"\"<$action-listops $tiddler=<<currentListTiddler>> $field=\"dpbd-collapse_in\" $subfilter=\"[<currentBoardTiddler>]\" />\"\"\" >\n <span class=\"_-_-img_inline-OV-_C dpbd-L_TB-ButtonCollapse_ImgTransform-OZ-_\">{{$:/core/images/fold-button}}</span>\n </$button>\n </span>\n </$list>\n <$list filter=\"[<is_collapsed>field:title[$:/plugins/reidgould/dpbd/values/yes]]\" variable=\"\">\n <$button tag=\"span\" class=\"tc-btn-invisible dpbd-L_TB-ButtonCollapse-OIV_\" tooltip=\"Expand list.\"\n actions=\"\"\"<$action-listops $tiddler=<<currentListTiddler>> $field=\"dpbd-collapse_in\" $subfilter=\"-[<currentBoardTiddler>]\" />\"\"\" >\n <span class=\"_-_-img_inline-OV-_C dpbd-L_TB-ButtonCollapse_ImgTransform-OZ-_\">{{$:/core/images/unfold-button}}</span>\n </$button>\n </$list>\n </$list>\n <div class=\"dpbd-L_TB-ColorPreview-OI-_\">\n <$list filter=\"[<currentTiddler>has:field[color]]\" variable=\"\">\n <$set name=\"val-TagColor\" value={{{ [<currentTiddler>get[color]] }}} >\n <div class=\"dpbd-L_TB-ColorPreview_Child-OV-_\" style=<<style-TagColor>> ></div>\n </$set>\n </$list>\n </div>\n <span class=<<class-ListTitle>> style=<<style-ListTitle>> >\n <$set name=\"foregroundColor\" value={{!!color}}>\n <span class=\"_-_-img_inline-OV-_C\" style=<<style-IconColor>>>\n <$transclude tiddler={{!!icon}} mode=\"inline\" />\n </span>\n </$set>\n <$link>\n <$list filter=\"[<currentListTiddler>!field:title<tiddler-SearchListFilter-Live>]\" variable=\"\">\n <$set name=\"field-shorttextOrTitle\" filter=\"[<currentTiddler>has[shorttext]]\" value=\"shorttext\" emptyValue=\"title\">\n <h3 class=\"tc-title dpbd-L_TB-Title_h3-O-_\"><$transclude field=<<field-shorttextOrTitle>> mode=\"inline\"/></h3>\n </$set>\n </$list>\n <$list filter=\"[<currentListTiddler>field:title<tiddler-SearchListFilter-Live>]\" variable=\"\">\n <h3 class=\"tc-title dpbd-L_TB-Title_h3-O-_\">Search List</h3>\n </$list>\n </$link>\n </span>\n </$draggable>\n <div class=<<class-scrollableArea>> >\n <$navigator story=<<List-StoryList>> history=<<List-HistoryList>> openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n <$linkcatcher>\n <$list filter=\"[<is_collapsed>!field:title[$:/plugins/reidgould/dpbd/values/yes]]\" variable=\"\">\n <$list filter=\"[<currentListTiddler>!field:title<tiddler-SearchListFilter-Live>]\" variable=\"\">\n <$set name=\"list-TiddlersWithDrafts\" filter=\"[list<currentListTiddler>get[draft.of]]\">\n <$set name=\"list-TiddlersWithDraftsMain\" filter=\"[list[$:/StoryList]has[draft.of]]\">\n <$set name=\"filter-userText\" value={{{ [<tiddler-UserFilter-Live>get[text]] }}} >\n <$list filter=<<filter-currentList>> history=<<List-HistoryList>> template=\"$:/plugins/reidgould/dpbd/templates/view/Card\" editTemplate=\"$:/plugins/reidgould/dpbd/templates/edit/Card\" storyview={{$:/view}}\n emptyMessage=\"\"\"\n <div class=\"dpbd-B-EmptyMessage-OM-_\">\n Drag in the \"New Tiddler\" above, or any existing tiddler, to include it in a list.\n </div>\n \"\"\" />\n </$set>\n </$set>\n </$set>\n </$list>\n <$list filter=\"[<currentListTiddler>field:title<tiddler-SearchListFilter-Live>]\" variable=\"\">\n <$set name=\"list-TiddlersWithDrafts\" filter=\"[list<currentListTiddler>get[draft.of]]\">\n <$set name=\"list-TiddlersWithDraftsMain\" filter=\"[list[$:/StoryList]has[draft.of]]\">\n <$set name=\"filter-SearchListText\" value={{{ [<tiddler-SearchListFilter-Live>get[text]] }}}>\n <$list filter=<<filter-SearchList>> history=\"\" template=\"$:/plugins/reidgould/dpbd/templates/view/Card\" editTemplate=\"$:/plugins/reidgould/dpbd/templates/edit/Card\" storyview={{$:/view}}\n emptyMessage=\"\"\"\n <div class=\"dpbd-B-EmptyMessage-OM-_\">\n No tiddlers found by Search List filter.\n </div>\n \"\"\" />\n </$set>\n </$set>\n </$set>\n </$list>\n </$list>\n <$tiddler tiddler=\"\">\n <div class=\"dpbd-DA-IndicatorBottom-OV-_D\">\n <$droppable actions=<<action-Droppable-Card>> >\n </$droppable>\n </div>\n </$tiddler>\n </$linkcatcher>\n </$navigator>\n </div>\n </div>\n </$set>\n </$set>\n </$set>\n </$set>\n </$set>\n </$set>\n </$set>\n </$set>\n</$set>"
},
"$:/plugins/reidgould/dpbd/templates/view/shorttext": {
"title": "$:/plugins/reidgould/dpbd/templates/view/shorttext",
"tags": "$:/tags/ViewTemplate",
"list-before": "$:/core/ui/ViewTemplate/body",
"text": "<$list filter=\"[<currentTiddler>has[shorttext]]\" >\n <h3 class=\"tc-subtitle dpbd-_-MainView_Shorttext-OTV-S dpbd-_-ShorttextView-OM-C\">\n <$transclude field=\"shorttext\" mode=\"inline\" class=\"\" />\n </h3>\n</$list>"
},
"$:/plugins/reidgould/dpbd/values/no": {
"title": "$:/plugins/reidgould/dpbd/values/no",
"text": ""
},
"$:/plugins/reidgould/dpbd/values/yes": {
"title": "$:/plugins/reidgould/dpbd/values/yes",
"text": ""
},
"$:/plugins/reidgould/dpbd/version": {
"title": "$:/plugins/reidgould/dpbd/version",
"text": "1.0.2"
}
}
}
<$button tooltip="New Board" class=<<tv-config-toolbar-class>>>
<$action-sendmessage $message="tm-new-tiddler" title="New Board" tags="" text="""<$transclude tiddler="$:/plugins/reidgould/dpbd/templates/view/Board" mode="inline" />""" />
<$list filter="[<tv-config-toolbar-icons>prefix[yes]]">
{{$:/plugins/reidgould/dpbd/images/Dropboard}}
</$list>
<$list filter="[<tv-config-toolbar-text>prefix[yes]]">
<span class="tc-btn-text">New Board</span>
</$list>
</$button>
{
"tiddlers": {
"$:/plugins/reidgould/shortid/shortid-macro.js": {
"text": "/*\\\ntitle: $:/plugins/reidgould/shortid/shortid-macro.js\ntype: application/javascript\nmodule-type: macro\nMacro to return a short, URL friendly, unique id.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"shortid\";\n\nexports.params = [\n \"prefix\"\n];\n\n/*\nRun the macro\n*/\nexports.run = function(prefix) {\n let id = $tw.utils.shortid.generate();\n return prefix ? prefix + id : id;\n};\n\n})();\n",
"title": "$:/plugins/reidgould/shortid/shortid-macro.js",
"type": "application/javascript",
"module-type": "macro"
},
"$:/plugins/reidgould/shortid/shortid-util.js": {
"text": "/*\\\r\ntitle: $:/plugins/reidgould/shortid/shortid-util.js\r\ntype: application/javascript\r\nmodule-type: utils\r\nBundle of the shortid package for tiddlywiki.\r\n\\*/\r\n\n!function(t,r){for(var e in r)t[e]=r[e]}(exports,function(t){function r(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var e={};return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,\"a\",e),e},r.o=function(t,r){return Object.prototype.hasOwnProperty.call(t,r)},r.p=\"\",r(r.s=2)}([function(t,r,e){\"use strict\";function n(){p=!1}function o(t){if(!t)return void(a!==d&&(a=d,n()));if(t!==a){if(t.length!==d.length)throw new Error(\"Custom alphabet for shortid must be \"+d.length+\" unique characters. You submitted \"+t.length+\" characters: \"+t);var r=t.split(\"\").filter(function(t,r,e){return r!==e.lastIndexOf(t)});if(r.length)throw new Error(\"Custom alphabet for shortid must be \"+d.length+\" unique characters. These characters were not unique: \"+r.join(\", \"));a=t,n()}}function u(t){return o(t),a}function i(t){h.seed(t),l!==t&&(n(),l=t)}function s(){a||o(d);for(var t,r=a.split(\"\"),e=[],n=h.nextValue();r.length>0;)n=h.nextValue(),t=Math.floor(n*r.length),e.push(r.splice(t,1)[0]);return e.join(\"\")}function c(){return p||(p=s())}function f(t){return c()[t]}var a,l,p,h=e(6),d=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-\";t.exports={characters:u,seed:i,lookup:f,shuffled:c}},function(t,r,e){\"use strict\";function n(t,r){for(var e,n=0,u=\"\";!e;)u+=t(r>>4*n&15|o()),e=r<Math.pow(16,n+1),n++;return u}var o=e(7);t.exports=n},function(t,r,e){t.exports=e(3)},function(t,r,e){var n=e(4),o=function(){};Object.defineProperty(o,\"generate\",{configurable:!1,enumerable:!1,writable:!1,value:n.generate}),r.shortid=o},function(t,r,e){\"use strict\";t.exports=e(5)},function(t,r,e){\"use strict\";function n(r){return s.seed(r),t.exports}function o(r){return l=r,t.exports}function u(t){return void 0!==t&&s.characters(t),s.shuffled()}function i(){return f(l)}var s=e(0),c=(e(1),e(8)),f=e(9),a=e(10),l=e(11)||0;t.exports=i,t.exports.generate=i,t.exports.seed=n,t.exports.worker=o,t.exports.characters=u,t.exports.decode=c,t.exports.isValid=a},function(t,r,e){\"use strict\";function n(){return(u=(9301*u+49297)%233280)/233280}function o(t){u=t}var u=1;t.exports={nextValue:n,seed:o}},function(t,r,e){\"use strict\";function n(){if(!o||!o.getRandomValues)return 48&Math.floor(256*Math.random());var t=new Uint8Array(1);return o.getRandomValues(t),48&t[0]}var o=\"object\"==typeof window&&(window.crypto||window.msCrypto);t.exports=n},function(t,r,e){\"use strict\";function n(t){var r=o.shuffled();return{version:15&r.indexOf(t.substr(0,1)),worker:15&r.indexOf(t.substr(1,1))}}var o=e(0);t.exports=n},function(t,r,e){\"use strict\";function n(t){var r=\"\",e=Math.floor(.001*(Date.now()-c));return e===u?o++:(o=0,u=e),r+=i(s.lookup,f),r+=i(s.lookup,t),o>0&&(r+=i(s.lookup,o)),r+=i(s.lookup,e)}var o,u,i=e(1),s=e(0),c=1459707606518,f=6;t.exports=n},function(t,r,e){\"use strict\";function n(t){if(!t||\"string\"!=typeof t||t.length<6)return!1;for(var r=o.characters(),e=t.length,n=0;n<e;n++)if(-1===r.indexOf(t[n]))return!1;return!0}var o=e(0);t.exports=n},function(t,r,e){\"use strict\";t.exports=0}]));",
"title": "$:/plugins/reidgould/shortid/shortid-util.js",
"type": "application/javascript",
"module-type": "utils"
},
"$:/plugins/reidgould/shortid/readme": {
"title": "$:/plugins/reidgould/shortid/readme",
"type": "text/x-markdown",
"text": "# shortid Plugin\n\nThe [shortid](https://github.com/dylang/shortid) package bundled as a macro for TiddlyWiki.\n\nSource found at:\nhttps://github.com/reidgould/tiddlywiki-shortid-plugin\n\nWiki found at:\nhttp://reidgould.github.io/tiddlywiki-shortid-plugin\n\n## Usage:\n\nIn wikitext:\n\n`<<shortid>>`\n\nReturns a short id.\n\nUsing parameter \"prefix\":\n\n`<<shortid \"prefix/text/\">>`\n\n`<$macrocall $name=\"shortid\" prefix=\"prefix/text/\" />`\n\nReturns a short id prefixed with the passed value.\n\n## Attribution:\n\n### shortid copyright:\n> Copyright (c) 2016 Dylan Greene, contributors.\n\n### shortid license:\n> Copyright (c) Dylan Greene\n> All rights reserved.\n>\n> MIT +no-false-attribs License\n>\n> Permission is hereby granted, free of charge, to any person\n> obtaining a copy of this software and associated documentation\n> files (the \"Software\"), to deal in the Software without\n> restriction, including without limitation the rights to use,\n> copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons to whom the\n> Software is furnished to do so, subject to the following\n> conditions:\n>\n> The above copyright notice and this permission notice shall be\n> included in all copies or substantial portions of the Software.\n>\n> Distributions of all or part of the Software intended to be used\n> by the recipients as they would use the unmodified Software,\n> containing modifications that substantially alter, remove, or\n> disable functionality of the Software, outside of the documented\n> configuration mechanisms provided by the Software, shall be\n> modified such that the Original Author's bug reporting email\n> addresses and urls are either replaced with the contact information\n> of the parties responsible for the changes, or removed entirely.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n> WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n> FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n> OTHER DEALINGS IN THE SOFTWARE.\n"
},
"$:/plugins/reidgould/shortid/license": {
"title": "$:/plugins/reidgould/shortid/license",
"type": "text/plain",
"text": "shortid plugin created by Reid Gould, (reidgould [at] gmail [dot] com)\n\nCopyright (c) 2017, Reid Gould\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
}
}
}
{
"tiddlers": {
"$:/plugins/snowgoon88/edit-comptext/config": {
"title": "$:/plugins/snowgoon88/edit-comptext/config",
"type": "application/json",
"text": "{\n \"configuration\": {\n \"caseSensitive\" : false,\n \"maxMatch\" : 8,\n \"minPatLength\" : 2,\n \"triggerKeyCombination\" : \"^ \"\n },\n \"template\": [{\n \"pattern\": \"[[\",\n \"filter\": \"[all[tiddlers]!is[system]]\",\n \"start\": \"[[\",\n \"end\": \"]]\"\n }\n ]\n}\n"
},
"$:/plugins/snowgoon88/edit-comptext/edit-comptext.js": {
"title": "$:/plugins/snowgoon88/edit-comptext/edit-comptext.js",
"text": "/*\\\ntitle: $:/plugins/snowgoon88/edit-comptext/edit-comptext.js\ntype: application/javascript\nmodule-type: widget\n\nTaken from original Edit-text widget\nVersion 5.1.13 of TW5\nAdd link-to-tiddler completion in framed.js and simple.js\n\nTODO : CHECK usefull, and particularly save_changes after every input ??\nTODO : where should popupNode be created in the DOM ?\nTODO : check that options are valid (numeric ?)\nvar isNumeric = function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n};\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tFramedCompEngine = require(\"$:/plugins/snowgoon88/edit-comptext/framed.js\").FramedCompEngine,\n\tSimpleCompEngine = require(\"$:/plugins/snowgoon88/edit-comptext/simple.js\").SimpleCompEngine;\n\nexports[\"edit-comptext\"] = editTextWidgetFactory(FramedCompEngine,SimpleCompEngine);\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/snowgoon88/edit-comptext/examples": {
"title": "$:/plugins/snowgoon88/edit-comptext/examples",
"text": "The configuration file [[$:/plugins/snowgoon88/edit-comptext/config]] allow you to use the completion plugin for various usages. Here are some examples...\n\n!! Link Completion\nThe basic and default usage. Completion is triggered by `[[`, the search is among all non-system tiddlers. When selected, the `title` of the tiddler is inserted in the text, surrounded by `[[` and `]]`. This gives the following Completion Template.\n\n\n```\n{\n \"pattern\": \"[[\",\n \"title\": \"[all[tiddlers]!is[system]]\",\n \"start\": \"[[\",\n \"end\": \"]]\"\n}\t \n```\n\n\n!! Special macro completion\nI have a 'pnjin' macro that is invoked by `<<pnjin \"TiddlerPNJName\">>` where 'TiddlerPNJName is a tiddler that hold data about a PNJ. I use tiddlywiki to organise my Role Playing Games campaigns. So, I want `<p` to trigger the completion. The search is among all non-system tiddlers tagged `PNJ` and, once selected, the title of the tiddler must be inserted surrouned by `<<pnjin \\\"` and `\\\">>`. So...\n\n```\n{\n\t\"pattern\": \"<p\",\n \t\"title\": \"[tag[PNJ]!is[system]]\",\n \t\"start\": \"<<pnjin \\\"\",\n \t\"end\": \"\\\">>\"\n}\n```\n\n!! Insert some templates or stamp or snippets into text.\nI frequently use some text pattern and I want to insert them easily. So, I could create several tiddlers, tagged '$:stamp' and in their body are the piece of texte I want to insert. The titles of these tiddlers always start with `$:/config/stamp/` (i.e. $:/config/stamp/macro, $:/config/stamp/list1, $:/config/stamp/list2). I want to trigger the completion by using `<<`, then I only want to chose among the last part of the titles of tiddlers tagged `$:stamp` so I use a mask (`$:/config/stamp/`) to only display the last part of the tiddlers title. When selectected, the `body` of the tiddler is inserted, with no surrounding strings. As a results, the Completion Template is (notice the `body` field):\n\n```\n{\n \"pattern\": \"<<\",\n \"body\": \"[tag[$:stamp]]\",\n \"mask\" : \"$:/config/stamp/\",\n \"start\": \"\",\n \"end\": \"\"\n}\n```\n\n!! And you ?\nIf you have funny usages of completion, let me know. If you'd like to do something that is not yet possible, let me know...\n\nmail : snowgoon88(AT)gmail(DOT)com"
},
"$:/plugins/snowgoon88/edit-comptext/framed.js": {
"text": "/*\\\ntitle: $:/plugins/snowgoon88/edit-comptext/framed.js\ntype: application/javascript\nmodule-type: library\n\nTaken from $:/core/modules/editor/engines/framed.js\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\n// Configuration tiddler\nvar COMPLETION_OPTIONS = \"$:/plugins/snowgoon88/edit-comptext/config\";\nvar Completion = require(\"$:/plugins/snowgoon88/edit-comptext/completion.js\").Completion;\n\t\nfunction FramedCompEngine(options) {\n //DEBUG console.log( \"==FramedCompEngine::creation\" );\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\n\t// Completion\n\t// Load Completion configuration as JSON\n this._configOptions = $tw.wiki.getTiddlerData( COMPLETION_OPTIONS, {} );\n\t\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass;\n\t}\n\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create dummy popup for reading its styles\n\t//this._dummyCompletion = new Completion( this.widget, this.dummyTextArea, this._configOptions);\n\t//REMOVEthis._dummyCompletion.setAttribute(\"hidden\",\"true\");\n\t\n\t// Create the iframe\n\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\n\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";\n\tthis.widget.domNodes.push(this.iframeNode);\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.iframeDoc.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\t// Copy the styles from the dummy textarea\n\tthis.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this.widget,handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.iframeDoc.body.appendChild(this.domNode);\n\n\t// add Completion popup\n this._completion = new Completion( this.widget, this.domNode, this._configOptions, this.dummyTextArea, this.iframeNode.offsetTop, this.iframeNode.offsetLeft );\n\t// print iframe offset\n\t//DEBUG console.log( \" __iframe.offsetLeft: \"+this.iframeNode.offsetLeft );\n //DEBUG console.log( \" __iframe.offsetTop: \"+this.iframeNode.offsetTop );\n \n\t// Copy all styles from dummyCompletion\n\t//$tw.utils.copyStyles(this._dummyCompletion._popNode, this._completion._popNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\t//this._completion._popNode.style.display = \"block\";\n\t//this._completion._popNode.style.width = \"100%\";\n\t//this._completion._popNode.style.margin = \"0\";\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\t//this._completion._popNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n \n}\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedCompEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedCompEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nFramedCompEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedCompEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.iframeNode.style.height = (newHeight + 14) + \"px\"; // +14 for the border on the textarea\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\tthis.iframeNode.style.height = (fixedHeight + 14) + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedCompEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedCompEngine.prototype.handleInputEvent = function(event) {\n //DEBUG console.log( \"__framed.js::handleInputEvent\");\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedCompEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedCompEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.iframeDoc.queryCommandSupported(\"insertText\") && this.iframeDoc.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.iframeDoc.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.iframeDoc.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedCompEngine = FramedCompEngine;\n\n})();\n",
"type": "application/javascript",
"title": "$:/plugins/snowgoon88/edit-comptext/framed.js",
"module-type": "library"
},
"$:/plugins/snowgoon88/edit-comptext/simple.js": {
"text": "/*\\\ntitle: $:/plugins/snowgoon88/edit-comptext/simple.js\ntype: application/javascript\nmodule-type: library\n\nTaken from $:/core/modules/editor/engines/simple.js\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\n// Configuration tiddler\nvar COMPLETION_OPTIONS = \"$:/plugins/snowgoon88/edit-comptext/config\";\nvar Completion = require(\"$:/plugins/snowgoon88/edit-comptext/completion.js\").Completion;\n\nfunction SimpleCompEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\n // Completion\n\t// Load Completion configuration as JSON\n this._configOptions = $tw.wiki.getTiddlerData( COMPLETION_OPTIONS, {} );\n\t\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n\n\t// add Completion popup\n this._completion = new Completion( this.widget, this.domNode, this._configOptions );\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleCompEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nSimpleCompEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleCompEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleCompEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleCompEngine.prototype.handleInputEvent = function(event) {\n\tconsole.log( \"__simple.js::handleInputEvent\");\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleCompEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNode,\n\t\t\ttitle: this.widget.editFocusPopup,\n\t\t\twiki: this.widget.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleCompEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleCompEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleCompEngine = SimpleCompEngine;\n\n})();\n",
"type": "application/javascript",
"title": "$:/plugins/snowgoon88/edit-comptext/simple.js",
"module-type": "library"
},
"$:/plugins/snowgoon88/edit-comptext/cursor-position.js": {
"text": "/*\\\nModule that compute the pixel position of the cursor of a text\nements.\n\nTaken from https://github.com/component/textarea-caret-position\n\n(as https://github.com/kir/js_cursor_position is not updated any more)\n\\*/\n// Fonction anonyme executée immediatement\n( function(){\n \n// The properties that we copy into a mirrored div.\n// Note that some browsers, such as Firefox,\n// do not concatenate properties, i.e. padding-top, bottom etc. -> padding,\n// so we have to do every single property specifically.\nvar properties = [\n 'direction', // RTL support\n 'boxSizing',\n 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does\n 'height',\n 'overflowX',\n 'overflowY', // copy the scrollbar for IE\n\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderStyle',\n\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n 'fontStyle',\n 'fontVariant',\n 'fontWeight',\n 'fontStretch',\n 'fontSize',\n 'fontSizeAdjust',\n 'lineHeight',\n 'fontFamily',\n\n 'textAlign',\n 'textTransform',\n 'textIndent',\n 'textDecoration', // might not make a difference, but better be safe\n\n 'letterSpacing',\n 'wordSpacing',\n\n 'tabSize',\n 'MozTabSize'\n\n];\nvar isFirefox = false;\nif($tw.browser) {\n isFirefox = window.mozInnerScreenX != null;\n}\n\nfunction getCaretCoordinates(element, position, options) {\n\n var debug = options && options.debug || false;\n if (debug) {\n var el = document.querySelector('#input-textarea-caret-position-mirror-div');\n if ( el ) { el.parentNode.removeChild(el); }\n }\n\n // mirrored div\n var div = document.createElement('div');\n div.id = 'input-textarea-caret-position-mirror-div';\n document.body.appendChild(div);\n\n var style = div.style;\n var computed;\n if($tw.browser) {\n computed = window.getComputedStyle? getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9\n } \n else {\n computed = element.currentStyle;\n }\n \n\n // default textarea styles\n style.whiteSpace = 'pre-wrap';\n if (element.nodeName !== 'INPUT')\n style.wordWrap = 'break-word'; // only for textarea-s\n\n // position off-screen\n style.position = 'absolute'; // required to return coordinates properly\n if (!debug)\n style.visibility = 'hidden'; // not 'display: none' because we want rendering\n\n // transfer the element's properties to the div\n properties.forEach(function (prop) {\n style[prop] = computed[prop];\n });\n\n if (isFirefox) {\n // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275\n if (element.scrollHeight > parseInt(computed.height))\n style.overflowY = 'scroll';\n } else {\n style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'\n }\n\n div.textContent = element.value.substring(0, position);\n // the second special handling for input type=\"text\" vs textarea: spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037\n if (element.nodeName === 'INPUT')\n div.textContent = div.textContent.replace(/\\s/g, \"\\u00a0\");\n\n var span = document.createElement('span');\n // Wrapping must be replicated *exactly*, including when a long word gets\n // onto the next line, with whitespace at the end of the line before (#7).\n // The *only* reliable way to do that is to copy the *entire* rest of the\n // textarea's content into the <span> created at the caret position.\n // for inputs, just '.' would be enough, but why bother?\n span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all\n div.appendChild(span);\n\n var coordinates = {\n top: span.offsetTop + parseInt(computed['borderTopWidth']),\n left: span.offsetLeft + parseInt(computed['borderLeftWidth'])\n };\n\n if (debug) {\n span.style.backgroundColor = '#aaa';\n } else {\n document.body.removeChild(div);\n }\n\n return coordinates;\n}\n\n// Exporte as a module of node.js otherwise set as global\nif (typeof module != \"undefined\" && typeof module.exports != \"undefined\") {\n module.exports = getCaretCoordinates;\n} else {\n window.getCaretCoordinates = getCaretCoordinates;\n}\n\n})();\n",
"type": "application/javascript",
"title": "$:/plugins/snowgoon88/edit-comptext/cursor-position.js",
"module-type": "library"
},
"$:/plugins/snowgoon88/edit-comptext/completion.js": {
"text": "/*\\\ntitle: $:/plugins/snowgoon88/edit-comptext/completion.js\ntype: application/javascript\nmodule-type: library\n\nTry to make self-contained completion module.\n\nTo use this 'module', you need a `widget` with a kind of `editarea` node.\nI do not know the exacte prerequisites of this editarea node for the module to\nwork, but mostly one should be able to attach the following `eventHandler` to\nit:\n - input\n - keydown\n - keypress\n - keyup\nThe `widget` is needed because I use:\n - widget.document\n - widget.wiki.filterTiddlers(...)\n\nFrom the Widget, once you have a proper editarea, you just have to call\n - var completion = new Completion( theWidget, theEditAreaNode, configObject);\nwhere `configObject` is expected to have the following fields. if a field is missing, a default value will be given.\nOne can have many `elements' in the template array.\n\n{\n \"configuration\": {\n \"caseSensitive\" : false,\n \"maxMatch\" : 8,\n \"minPatLength\" : 2,\n \"triggerKeyCombination\" : \"^ \"\n },\n \"template\": [{\n \"pattern\": \"[[\",\n \"filter\": \"[all[tiddlers]!is[system]]\",\n \"start\": \"[[\",\n \"end\": \"]]\"\n }\n ]\n}\n\nTODO : CHECK if needed\n\\*/\n\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// To compute pixel coordinates of cursor\nvar getCaretCoordinates = require(\"$:/plugins/snowgoon88/edit-comptext/cursor-position.js\");\n\n/** Default Completion Attributes */\nvar DEFATT = { maxMatch: 5, minPatLength: 2, caseSensitive: false, triggerKeyCombination: \"^ \" };\n\n/** \n * Struct for generic Completion Templates.\n * <ul>\n * <li>pat : pattern searched for.</li>\n * <li>filter : filter operation used to find the list of completion options</li>\n * <li>mask: replaced by \"\" when presenting completion options</li>\n * </ul>\n */\nvar Template = function( pat, filter, mask, field, start, end ) {\n this.pat = pat;\n this.filter = filter;\n this.mask = \"^\"+regExpEscape(mask);\n this.field = field;\n this.start = start;\n this.end = end;\n this.pos = 0;\n};\n/**\n * Struct for storing completion options, as we need to memorise \n * the titles of the tiddlers when masked and when body must be displayed.\n */\nvar OptCompletion = function( title, str ) {\n this.title = title;\n this.str = str;\n};\n\nvar keyMatchGenerator = function(combination) {\n\tlet singleMatchGenerator = function(character) {\n\t\tif (character === '^') {\n\t\t\treturn event => event.ctrlKey;\n\t\t}\n\t\telse if (character === '+') {\n\t\t\treturn event => event.shiftKey;\n\t\t}\n\t\telse if (character === '!') {\n\t\t\treturn event => event.altKey;\n\t\t}\n\t\telse {\n\t\t\treturn event => (event.keyCode || event.which) === character.charCodeAt(0);\n\t\t}\n\t};\n\n\tlet matchers = [];\n\tfor (let i = 0; i < combination.length; i++) {\n\t\tmatchers.push(singleMatchGenerator(combination[i]));\n\t}\n\n\treturn event => {\n\t\tfor (let i = 0; i < matchers.length; i++) {\n\t\t\tif (!matchers[i](event)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t};\n};\n\n/**\n * Widget is needed in creating popupNode.\n * - widget.document\n * - widget.wiki.filterTiddlers(...)\n * - sibling : where to create the popup in the DOM.\n */\n\tvar Completion = function( editWidget, areaNode, param, sibling, offTop, offLeft ) {\n\tconsole.log( \"==Completion::creation\" );\n\n // About underlying Widget\n this._widget = editWidget;\n\tthis._areaNode = areaNode;\n\tthis._sibling = (typeof sibling !== 'undefined') ? sibling : this._areaNode;\n\tthis._offTop = (typeof offTop !== 'undefined') ? offTop : 0;\n\tthis._offLeft = (typeof offLeft !== 'undefined') ? offLeft : 0;\t\n\t\t\n // Completions attributes\n /** State */\n this._state = \"VOID\";\n this._template = undefined;\n /** Best matches */\n this._bestMatches = []; // An array of OptCompletion\n this._idxChoice = -1;\n /** Param */\n // maximum nb of match displayed\n this._maxMatch = param.configuration.maxMatch || DEFATT.maxMatch; \n this._minPatLength = param.configuration.minPatLength || DEFATT.minPatLength;\n this._caseSensitive= param.configuration.caseSensitive || DEFATT.caseSensitive;\n this._triggerKeyMatcher = keyMatchGenerator(param.configuration.triggerKeyCombination || DEFATT.triggerKeyCombination);\n /** Input information */\n this._lastChar = \"\";\n this._hasInput = false;\n /** List of Completion Templates */\n this._listTemp = [];\n \n // Read templates from Param\n if( param.template ) {\n \tvar idT;\n \tfor( idT=0; idT<param.template.length; idT++ ) {\n \t var temp = param.template[idT];\n\t // field 'body' ou 'title' (default)\n\t if( temp.body ) {\t\t\n \t\tthis._listTemp.push( \n \t\t new Template( temp.pattern, temp.body,\n\t\t\t\t temp.mask ? temp.mask : \"\",\n\t\t\t\t \"body\",\n \t\t\t\t temp.start, temp.end )\n \t\t);\n\t }\n\t else {\n \t\tthis._listTemp.push( \n \t\t new Template( temp.pattern, \n\t\t\t\t temp.title ? temp.title : temp.filter,\n\t\t\t\t temp.mask ? temp.mask : \"\",\n\t\t\t\t \"title\",\n \t\t\t\t temp.start, temp.end )\n \t\t);\n\t }\n\t //DEBUG temp = this._listTemp[this._listTemp.length-1];\n\t //DEBUG console.log( \"__CONF : \"+temp.pattern+\":\"+temp.filter+\":\"+temp.mask+\":\"+temp.field+\":\"+temp.start+\":\"+temp.end );\n \t}\n }\n // or defaut template\n else {\n \tthis._listTemp = [\n \t new Template( \"[[\", \"[all[tiddlers]!is[system]]\", \n\t\t\t \"\", \"title\",\n\t\t\t \"[[\", \"]]\" )\n \t];\n }\n // Create Popup\n\t//this._popNode = createPopup(this._widget, this._areaNode );\n\tthis._popNode = createPopup(this._widget, this._sibling );\t\n \n // Listen to the Keyboard\n $tw.utils.addEventListeners( this._areaNode,[\n\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInput\"},\n\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleKeydown\"},\n\t{name: \"keypress\", handlerObject: this, handlerMethod: \"handleKeypress\"},\n \t{name: \"keyup\", handlerObject: this, handlerMethod: \"handleKeyup\"}\n ]);\n \n /** \n * Find the bestMatches among listChoice with given pattern\n * @param listChoice : array of String\n * @change : this._bestMatches => array of OptCompletion\n */\n this._findBestMatches = function( listChoice, pattern, nbMax) {\n\t// regexp search pattern, case sensitive\n\tvar flagSearch = this._caseSensitive ? \"\" : \"i\" ;\n\tvar regpat = RegExp( regExpEscape(pattern), flagSearch );\n\tvar regpat_start = RegExp( \"^\"+regExpEscape(pattern), flagSearch );\n\tvar regMask = RegExp( this._template.mask ? this._template.mask : \"\",\"\");\n\tvar nbMatch = 0;\n\t// nbMax set to _maxMatch if no value given\n\tnbMax = nbMax !== undefined ? nbMax : this._maxMatch;\n\n\t//DEBUG console.log( \"__FIND masked=\"+regMask+\" regPat=\"+regpat);\n\n\tthis._bestMatches= [];\n\tvar otherMatches = [];\n\t// We test every possible choice\n\tfor( var i=0; i< listChoice.length; i++ ) {\n\t // apply mask over potential choice\n\t var maskedChoice = listChoice[i].replace( regMask, \"\");\n\t // Test first if pattern is found at START of the maskedChoice\n\t // THEN added to BestMatches\n \t if( regpat_start.test( maskedChoice )) {\n\t\tif (nbMatch >= nbMax) {\n\t\t this._bestMatches.push( new OptCompletion(\"\",\"...\") );\n\t\t return;\n\t\t} else {\n\t\t this._bestMatches.push( new OptCompletion(listChoice[i],maskedChoice) );\n\t\t nbMatch += 1;\n\t\t}\n\t }\n\t // then if pattern is found WITHIN the maskedChoice\n\t // added AFTER the choices that starts with pattern\n\t else if( regpat.test( maskedChoice ) ) {\n\t\tif (nbMatch >= nbMax) {\n\t\t // add all otherMatches to _bestMatches\n\t\t this._bestMatches.push( new OptCompletion(\"\",\"<hr>\") ) ; //separator\n\t\t this._bestMatches = this._bestMatches.concat( otherMatches );\n\t\t this._bestMatches.push( new OptCompletion(\"\",\"...\") );\n\t\t return;\n\t\t} else {\n\t\t otherMatches.push( new OptCompletion(listChoice[i],maskedChoice) );\n\t\t nbMatch += 1;\n\t\t}\n\t }\n\t}\n\t// Here, must add the otherMatches\n\tthis._bestMatches.push( new OptCompletion(\"\",\"<hr>\") ) ; //separator\n\tthis._bestMatches = this._bestMatches.concat( otherMatches );\n };\n /**\n * Change Selected Status of Items\n */\n this._next = function (node) {\n\tvar count = node.children.length;\n\t//DEBUG console.log( \"__NEXT: co=\"+count+\" nbMatch=\"+this._bestMatches.length);\n\tif( this._bestMatches.length > 0 ) \n\t this._goto( node, this._idxChoice < count - 1 ? this._idxChoice + 1 : -1);\n\t//DEBUG this._logStatus( \"NexT\" );\n };\n this._previous = function (node) {\n\tvar count = node.children.length;\n\tvar selected = this._idxChoice > -1;\n\t//DEBUG console.log( \"__PREV: co=\"+count+\" nbMatch=\"+this._bestMatches.length);\n\tif( this._bestMatches.length > 0 ) \n\t this._goto( node, selected ? this._idxChoice - 1 : count - 1);\n\t//DEBUG this._logStatus( \"PreV\" );\n };\n // Should not be used, highlights specific item without any checks!\n this._goto = function (node, idx) {\n\tvar lis = node.children;\n\tvar selected = this._idxChoice > -1;\n\tif (selected) {\n\t lis[this._idxChoice].setAttribute(\"patt-selected\", \"false\");\n\t}\n\n\tthis._idxChoice = idx;\n \n\tif (idx > -1 && lis.length > 0) {\n\t lis[idx].setAttribute(\"patt-selected\", \"true\");\n\t}\n };\n /**\n * Abort pattern and undisplay.\n */\n this._abortPattern = function (displayNode) {\n\tthis._state = \"VOID\";\n\tthis._bestChoices = [];\n\tthis._idxChoice = -1;\n\tthis._undisplay( displayNode );\n\tthis._template = undefined;\n };\n /**\n * Display popupNode at the cursor position in areaNode.\n */\n this._display = function( areaNode, popupNode ) {\n\tif ( popupNode.style.display == 'none' ) {\n\t // Must get coordinate\n\t // Cursor coordinates within area + area coordinates + scroll\n var coord = getCaretCoordinates(areaNode, areaNode.selectionEnd);\n var styleSize = getComputedStyle(areaNode).getPropertyValue('font-size');\n var fontSize = parseFloat(styleSize); \n\t\t\n\t popupNode.style.left = (this._offLeft+areaNode.offsetLeft-areaNode.scrollLeft+coord.left) + 'px';\n\t popupNode.style.top = (this._offTop+areaNode.offsetTop-areaNode.scrollTop+coord.top+fontSize*2) + 'px';\n\t popupNode.style.display = 'block';\n\t}\n };\n /**\n * Undisplay someNode\n */\n this._undisplay = function( displayNode ) {\n\tif ( displayNode.style.display != 'none' ) {\n\t displayNode.style.display = 'none';\n\t}\n };\n\n /**\n * Used for debug\n */\n this._logStatus = function(msg) {\n\tconsole.log( \"__STATUS: \"+this._state+\":-\"+msg+\"- idx=\"+this._idxChoice );\n };\n\n};\n// **************************************************************************\n// ******************************************************************eventCbk\n// **************************************************************************\n/**\n * Disable the *effects* of ENTER / UP / DOWN / ESC when needed.\n * Set _hasInput to false.\n */\nCompletion.prototype.handleKeydown = function(event) {\n // key \n var key = event.keyCode;\n this._hasInput = false;\n \n //DEBUG console.log( \"__KEYDOWN (\"+key+\") hasI=\"+this._hasInput);\n \n // ENTER while selecting\n if( (this._state === \"PATTERN\" || this._state === \"SELECT\") && key === 13 ) {\n \tevent.preventDefault();\n \tevent.stopPropagation();\n }\n // ESC while selecting\n if( (this._state === \"PATTERN\" || this._state === \"SELECT\") && key === 27 ) {\n \tevent.preventDefault();\n \tevent.stopPropagation();\n }\n // UP/DOWN while a pattern is extracted\n if( (key===38 || key===40) && \n\t(this._state === \"PATTERN\" || this._state === \"SELECT\") ) {\n\tevent.preventDefault();\n }\n};\n/**\n * Means that something has been added/deleted => set _hasInput\n */\nCompletion.prototype.handleInput = function(event) {\n this._hasInput = true;\n //DEBUG console.log( \"__INPUT hasI=\"+this._hasInput );\n};\n\t\n/**\n * Set _lastChar, detects CTRL+SPACE.\n */\nCompletion.prototype.handleKeypress = function(event) {\n var curPos = this._areaNode.selectionStart; // cursor position\n var val = this._areaNode.value; // text in the area\n // key \n var key = event.keyCode || event.which;\n\t\n this._lastChar = String.fromCharCode(key);\n //DEBUG console.log( \"__KEYPRESS (\"+key+\") hasI=\"+this._hasInput+\" char=\"+this._lastChar );\n //DEBUG this._logStatus( \"KEYPRESS\" );\n \n // Detect Ctrl+Space\n if( this._triggerKeyMatcher(event) && this._state === \"VOID\" ) {\n\t//Find a proper Template\n\t// first from which we can extract a pattern\n\tif( this._template === undefined ) {\n\t //DEBUG console.log(\"__SPACE : find a Template\" );\n\t var idT, res;\n\t for( idT=0; idT < this._listTemp.length; idT++ ) {\n\t\tres = extractPattern( val, curPos, this._listTemp[idT] );\n\t\t//DEBUG console.log(\" t=\"+this._listTemp[idT].pat+\" res=\"+res);\n\t\t// res is not undefined => good template candidate\n\t\tif( res ) {\n\t\t this._template = this._listTemp[idT];\n\t\t this._state = \"PATTERN\";\n\t\t break;\n\t\t}\n\t }\n\t}\n\telse {\n\t //DEBUG console.log(\"__SPACE : already a template\" );\n\t this._state = \"PATTERN\";\n\t}\n }\n};\n/**\n * ESC -> abort; \n * Detect [ -> VOID switch to _state=PATTERN\n * PATTERN || SELECT : ENTER -> insertText\n * UP/DOWN -> previous/next\n * pattern.length > _minPatternLength -> display \n */\nCompletion.prototype.handleKeyup = function(event) {\n var curPos = this._areaNode.selectionStart; // cursor position\n var val = this._areaNode.value; // text in the area\n // key a\n var key = event.keyCode;\n \n //DEBUG console.log( \"__KEYUP (\"+key+\") hasI=\"+this._hasInput );\n \n // ESC\n if( key === 27 ) {\n\tthis._abortPattern( this._popNode );\n\t//DEBUG this._logStatus( \"\" );\n }\n // Check for every template\n if( this._hasInput && this._state === \"VOID\" ) {\n\t// check every template's pattern\n\tvar idT, template;\n\tfor( idT=0; idT < this._listTemp.length; idT++ ) {\n\t template = this._listTemp[idT];\n\t if( this._lastChar === template.pat[template.pos] ) {\n\t\ttemplate.pos += 1;\n\t\t//DEBUG console.log( \"__CHECK : pat=\"+template.pat+\" pos=\"+template.pos );\n\t\t// Pattern totaly matched ?\n\t\tif( template.pos === template.pat.length ) {\n\t\t //DEBUG console.log( \"__CHECK => found \"+template.pat );\n\t\t this._state = \"PATTERN\";\n\t\t this._template = template;\n\t\t \n\t\t break; // get out of loop\n\t\t}\n\t }\n\t else {\n\t\ttemplate.pos = 0;\n\t\t//DEBUG console.log( \"__CHECK : pat=\"+template.pat+\" pos=\"+template.pos );\n\t }\n\t}\n }\n // a pattern\n else if( this._state === \"PATTERN\" || this._state === \"SELECT\" ) {\n\t// Pattern below cursor : undefined if no pattern\n\tvar pattern = extractPattern( val, curPos, this._template );\n\tif( key === 13 ) { // ENTER\n\t //DEBUG console.log( \"KEY : Enter\" );\n \t // Choice made in the displayNode ?\n \t var selected = this._idxChoice > -1 && this._idxChoice !== this._maxMatch;\n \t //DEBUG console.log( \" > sel=\"+selected+\" len=\"+this._bestChoices.length );\n \t if( selected ) {\n \t\t//DEBUG console.log( \" > selected\" );\n\t\tvar temp = this._bestMatches[this._idxChoice];\n\t\tvar str = temp.str;\n\t\tif( this._template.field === \"body\" ) {\n\t\t str = $tw.wiki.getTiddlerText( temp.title );\n\t\t}\n \t\tinsertInto( this._areaNode,\n\t\t\t str,\n\t\t\t pattern.start, curPos, this._template );\n\t\t// save this new content\n\t\tthis._widget.saveChanges( this._areaNode.value );\n\t }\n\t // otherwise take the first choice (if exists)\n\t else if( this._bestMatches.length > 0 ) {\n \t\t//DEBUG console.log( \" > take first one\" );\n\t\tvar temp = this._bestMatches[0];\n\t\tvar str = temp.str;\n\t\tif( this._template.field === \"body\" ) {\n\t\t str = $tw.wiki.getTiddlerText( temp.title );\n\t\t}\n \t\tinsertInto( this._areaNode,\n\t\t\t str,\n\t\t\t pattern.start, curPos, this._template );\n\t\t// save this new content\n\t\tthis._widget.saveChanges( this._areaNode.value );\n\t }\n\t this._abortPattern( this._popNode );\n\t\t//DEBUG this._logStatus( \"\" );\n \t }\n\t else if( key === 38 && this._hasInput === false) { // up\n\t\tthis._state = \"SELECT\";\n \t\tevent.preventDefault();\n \t\tthis._previous( this._popNode );\n\t\t//DEBUG this._logStatus( pattern.text );\n \t\t//event.stopPropagation();\n \t }\n \t else if( key === 40 && this._hasInput === false) { // down\n\t\tthis._state = \"SELECT\";\n \t\tevent.preventDefault();\n \t\tthis._next( this._popNode );\n\t\t//DEBUG this._logStatus( pattern.text );\n \t\t//event.stopPropagation();\n \t }\n \t else if( pattern ) { // pattern changed by keypressed\n\t\tthis._idxChoice = -1;\n \t\t// log\n\t\t//DEBUG this._logStatus( pattern.text );\n \t\t// Popup with choices if pattern at least minPatLength letters long\n\t\tif( pattern.text.length > (this._minPatLength-1) ) {\n\t\t // compute listOptions from templateFilter\n\t\t var allOptions;\n\t\t if( this._template )\n\t\t\tallOptions = this._widget.wiki.filterTiddlers( this._template.filter );\n\t\t else\n\t\t\tallOptions = this._widget.wiki.filterTiddlers(\"[all[tiddlers]]\");\n\t\t this._findBestMatches( allOptions, pattern.text );\n \t\t this._popNode.innerHTML = \"\";\n \t\t //console.log( \"BC \"+ this._pattern + \" => \" + choice );\n \t\t if (this._bestMatches.length > 0) {\n\t\t\tfor( var i=0; i<this._bestMatches.length; i++) {\n \t\t\t this._popNode.appendChild( \n\t\t\t\titemHTML(this._bestMatches[i].str,\n\t\t\t\t\t pattern.text));\n \t\t\t}\n\t\t\tthis._display( this._areaNode, this._popNode );\t\t\t\n \t\t }\n\t\t else { // no matches\n\t\t\tthis._state = \"PATTERN\";\n\t\t\tthis._undisplay( this._popNode );\n\t\t }\n\t\t}\n \t }\n\t else { // no pattern detected\n\t\tthis._abortPattern( this._popNode );\n\t }\n\t}\n\t// to ensure that one MUST add an input (through onInput())\n\tthis._hasInput = false;\n};\n// **************************************************************************\n// ******************************************************** private functions\n// **************************************************************************\n/**\n * Create popup element.\n */\nvar createPopup = function( widget, node ) {\n // Insert a special \"div\" element for poping up\n // Its 'display' property in 'style' control its visibility\n var popupNode = widget.document.createElement(\"div\");\n popupNode.setAttribute( \"style\", \"display:none; position: absolute;\");\n popupNode.className = \"tc-block-dropdown ect-block-dropdown\";\n // Insert the element into the DOM\n node.parentNode.insertBefore(popupNode,node.nextSibling);\n //CHECK the domNodes is a attribute of Widget [widget.js]\n //CHECK this.domNodes.push(popupNode);\n \n return popupNode;\n};\n/**\n * Extract Pattern from text at a given position.\n *\n * Between previous template.pat (or '[[') and pos\n * \n * If no pattern -> undefined\n */\nvar extractPattern = function( text, pos, template ) {\n // Detect previous and next ]]=>STOP or [[=>START\n var sPat = template.pat ? template.pat : '[[';\n var pos_prevOpen = text.lastIndexOf( sPat, pos );\n var ePat = template.end ? template.end : ']]';\n var pos_prevClosed = text.lastIndexOf( ePat, pos );\n var pos_nextClosed = text.indexOf( ePat, pos );\n //DEBUG console.log(\"__CALC st=\"+sPat+\" -> en=\"+ePat );\n //DEBUG console.log(\"__CALC po=\"+pos_prevOpen+\" pc=\"+pos_prevClosed+\" nc=\"+pos_nextClosed+\" pos=\"+pos);\n pos_nextClosed = (pos_nextClosed >= 0) ? pos_nextClosed : pos;\n \n if( (pos_prevOpen >= 0) && // must be opened\n\t((pos_prevOpen > pos_prevClosed ) || // not closed yet\n\t (pos_prevClosed === pos))) { // closed at cursor\n\t//DEBUG console.log(\" pat=\"+text.slice( pos_prevOpen+sPat.length, pos) );\n\treturn { text: text.slice( pos_prevOpen+sPat.length, pos ),\n\t\t start: pos_prevOpen,\n\t\t end: pos_nextClosed\n\t };\n }\n};\n/**\n * Controls how list items are generated.\n * Function that takes two parameters :\n * - text : suggestion text\n * - input : the user’s input\n * Returns : list item. \n * Generates list items with the user’s input highlighted via <mark>.\n */\nvar itemHTML = function (text, input ) {\n // text si input === ''\n // otherwise, build RegExp that is global (g) and case insensitive (i)\n // to replace with <mark>$&</mark> where \"$&\" is the matched pattern\n var html = input === '' ? text : text.replace(RegExp(regExpEscape(input.trim()), \"gi\"), \"<mark>$&</mark>\");\n return create(\"li\", {\n\tinnerHTML: html,\n\t\"patt-selected\": \"false\"\n });\n};\n/**\n * Insert text into a textarea node, \n * enclosing in 'template.start..template.end'\n *\n * - posBefore : where the 'template.pat+pattern' starts\n * - posAfter : where the cursor currently is\n */\nvar insertInto = function(node, text, posBefore, posAfter, template ) {\n //DEBUG console.log( \"__INSERT : \"+template.pattern+\":\"+template.filter+\":\"+template.mask+\":\"+template.field+\":\"+template.start+\":\"+template.end );\n var val = node.value;\n var sStart = template.start !== undefined ? template.start : '[[';\n var sEnd = template.end !== undefined ? template.end : ']]';\n var newVal = val.slice(0, posBefore) + sStart + text + sEnd + val.slice(posAfter);\n //console.log(\"__INSERT s=\"+sStart+\" e=\"+sEnd);\n //console.log (\"__INSERT pb=\"+posBefore+\" pa=\"+posAfter+\" txt=\"+text);\n //console.log( \"NEW VAL = \"+newVal );\n // WARN : Directly modifie domNode.value.\n // Not sure it does not short-circuit other update methods of the domNode....\n // i.e. could use widget.updateEditor(newVal) from edit-comptext widget.\n // but how to be sure that cursor is well positionned ?\n node.value = newVal;\n node.setSelectionRange(posBefore+text.length+sStart.length+sEnd.length, posBefore+text.length+sStart.length+sEnd.length );\n};\n/**\n * Add an '\\' in front of -\\^$*+?.()|[]{}\n */\nvar regExpEscape = function (s) {\n return s.replace(/[-\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n};\n/**\n * Add an element in the DOM.\n */\nvar create = function(tag, o) {\n var element = document.createElement(tag);\n \n for (var i in o) {\n\tvar val = o[i];\n\t\n\tif (i === \"inside\") {\n\t $(val).appendChild(element);\n\t}\n\telse if (i === \"around\") {\n\t var ref = $(val);\n\t ref.parentNode.insertBefore(element, ref);\n\t element.appendChild(ref);\n\t}\n\telse if (i in element) {\n\t element[i] = val;\n\t}\n\telse {\n\t element.setAttribute(i, val);\n\t}\n }\n \n return element;\n};\n\n\nexports.Completion = Completion;\n\n})();\n\n \n",
"type": "application/javascript",
"title": "$:/plugins/snowgoon88/edit-comptext/completion.js",
"module-type": "library"
},
"$:/plugins/snowgoon88/edit-comptext/edit-comptext.css": {
"text": "\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/* The \\rules pragma at the top of the tiddler restricts the WikiText \n * to just allow macros and transclusion. This avoids mistakenly \n * triggering unwanted WikiText processing.\n * \n * MUST not save as text/css for macro to be processed\n*/\n\n.ect-block-dropdown li {\n display: block;\n padding: 4px 14px 4px 14px;\n text-decoration: none;\n color: <<colour tiddler-link-foreground>>; /*#5778d8;*/ \n background: transparent;\n}\n.ect-block-dropdown li[patt-selected=\"true\"] {\n color: <<colour tiddler-link-background>>; /*#ffffff; */\n background-color: <<colour tiddler-link-foreground>>; /*#5778d8; */\n}\n.ect-block-dropdown li[patt-selected=\"true\"] mark {\n background: hsl(86, 100%, 21%);\n color: inherit;\n}\n\n",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/snowgoon88/edit-comptext/edit-comptext.css",
"tags": "[[$:/tags/Stylesheet]]"
},
"$:/plugins/snowgoon88/edit-comptext/readme": {
"title": "$:/plugins/snowgoon88/edit-comptext/readme",
"text": "!! What ?\nThis plugin adds ''completion'' when editing the body of a tiddler.\n\n* Enter completion-mode by typing `[[` or `CTRL+SPACE`\n* A list of tiddlers with a title that matches the pattern between `[[` and cursor appears\n* `UP/DOWN` keys can select a tiddler, `ENTER` to validate\n* If there is only one match, `ENTER` selects it.\n* `NEW` : you can specify you own trigger pattern and the list of possible completions. See [[$:/plugins/snowgoon88/edit-comptext/usage]] for more details.\n\n\n!! To try it or get the latest news\nSee [[http://snowgoon88.github.io/TW5-extendedit]]\n\n!! Install \n\nTo add the plugin to your own TiddlyWiki5, just drag this link to the browser window:\n\n[[$:/plugins/snowgoon88/edit-comptext]]\n\nSometime, a small configuration step is then needed\n\nin `$:/ControlPanel -> Advanced -> Editor Type -> text/vnd.tiddlywiki` you must chose `comptext` instead of `text`.\n\nReload and « voilà »...\n\nThis plugin is quite mature now :o)\n\n!! Old version\n\n* A version compatible with 5.0.8 to 5.1.11 : [[http://snowgoon88.github.io/TW5-extendedit/index_5.1.11.html]]\n\n!! Source code\nOn github [[https://github.com/snowgoon88/TW5-extendedit]]\n\nGet in touch : snowgoon88(AT)gmail(DOT)com\n"
},
"$:/plugins/snowgoon88/edit-comptext/usage": {
"title": "$:/plugins/snowgoon88/edit-comptext/usage",
"text": "''Important'' : be sure that in `$:/ControlPanel -> Advanced -> Editor Type -> text/vnd.tiddlywiki` you have chosen `comptext` instead of `text`.\n\nConfiguration of the edit-comptext plugin can be done through the tiddler [[$:/plugins/snowgoon88/edit-comptext/config]]. Use a JSON tiddler (do not forget to set the type to `application/json`. See some examples at [[$:/plugins/snowgoon88/edit-comptext/examples]]\n\nIn the `configuration` object you can set :\n\n* `caseSensitive`: `true`/`false` (is search case sensitive ?)\n* `maxMatch` : an `integer` (max number of match displayed)\n* `minPatLength` : an `integer` (minimal length of a pattern to trigger completion search)\n* `triggerKeyCombination ` : a `string` representing the key combination that triggers the autocompletion popup. To use modifier keys in your combination, use following conversions : `ctrl` -> `^`, `alt` -> `!`, `shift` -> `+`. Note: ` ` (literally a whitespace) represents the `space` key.\n\nIn the `template` array you can specify the various completion templates that will be used. Every template can have the following members.\n\n* `pattern` : `string` (pattern that triggers a completion, default \"[[\" )\n* `title` or `body`: `string` (the filter operators that gives the list of valid completions, default \"[all[tiddlers]!is[system]]\"). If you specify `body`, then the body of the tiddler will be inserted on selection.\n* `start` : `string` (when completion is chosen, start is put before the completion, default \"[[\")\n* `end` : `string` (when completion is chosen, end is put after the completion, default \"]]\")\n\n!! Current body of Config Tiddler\n\n{{$:/plugins/snowgoon88/edit-comptext/config}}\n\n"
}
}
}
{
"configuration": {
"caseSensitive" : false,
"maxMatch" : 20,
"minPatLength" : 2,
"triggerKeyCombination" : "^ "
},
"template": [{
"pattern": "[[",
"filter": "[all[tiddlers]!is[system]]",
"start": "[[",
"end": "]]"
},
{
"pattern": "{{",
"filter": "[all[tiddlers]!is[system]]",
"start": "{{",
"end": "}}"
}
]
}
{
"tiddlers": {
"$:/config/EditorTypeMappings/application/javascript": {
"title": "$:/config/EditorTypeMappings/application/javascript",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/application/json": {
"title": "$:/config/EditorTypeMappings/application/json",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/application/x-tiddler-dictionary": {
"title": "$:/config/EditorTypeMappings/application/x-tiddler-dictionary",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/css": {
"title": "$:/config/EditorTypeMappings/text/css",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/html": {
"title": "$:/config/EditorTypeMappings/text/html",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/plain": {
"title": "$:/config/EditorTypeMappings/text/plain",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/x-markdown": {
"title": "$:/config/EditorTypeMappings/text/x-markdown",
"text": "codemirror"
},
"$:/config/EditorTypeMappings/text/x-tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/x-tiddlywiki",
"text": "codemirror"
},
"$:/config/codemirror/cursorBlinkRate": {
"title": "$:/config/codemirror/cursorBlinkRate",
"type": "integer",
"text": "530"
},
"$:/config/codemirror/extraKeysTW": {
"title": "$:/config/codemirror/extraKeysTW",
"extend": "extraKeys",
"type": "json",
"text": "{\n\t\"Ctrl-Esc\": \"singleSelection\",\n\t\"Esc\": \"\",\n\t\"Ctrl-S\": \"\",\n\t\"Ctrl-U\": \"\",\n\t\"Ctrl-T\": \"\",\n\t\"Alt-T\": \"transposeChars\",\n\t\"Alt-U\": \"undoSelection\",\n\t\"Shift-Alt-U\": \"redoSelection\",\n\t\"Cmd-U\": \"\",\n\t\"Tab\": \"indentAuto()\",\n\t\"Enter\": \"newLineAndIndent()\"\n}\n"
},
"$:/config/codemirror/indentUnit": {
"title": "$:/config/codemirror/indentUnit",
"type": "integer",
"text": "2"
},
"$:/config/codemirror/indentWithTabs": {
"title": "$:/config/codemirror/indentWithTabs",
"type": "bool",
"text": "true"
},
"$:/config/codemirror/inputStyle": {
"title": "$:/config/codemirror/inputStyle",
"type": "string",
"text": "textarea"
},
"$:/config/codemirror/keyMap": {
"title": "$:/config/codemirror/keyMap",
"type": "string",
"text": "default"
},
"$:/config/codemirror/lineNumbers": {
"title": "$:/config/codemirror/lineNumbers",
"type": "bool",
"text": "false"
},
"$:/config/codemirror/lineWrapping": {
"title": "$:/config/codemirror/lineWrapping",
"type": "bool",
"text": "true"
},
"$:/config/codemirror/showCursorWhenSelecting": {
"title": "$:/config/codemirror/showCursorWhenSelecting",
"type": "bool",
"text": "true"
},
"$:/config/codemirror/smartIndent": {
"title": "$:/config/codemirror/smartIndent",
"type": "bool",
"text": "true"
},
"$:/config/codemirror/styleActiveLine": {
"title": "$:/config/codemirror/styleActiveLine",
"type": "bool",
"text": "false"
},
"$:/config/codemirror/tabSize": {
"title": "$:/config/codemirror/tabSize",
"type": "integer",
"text": "2"
},
"$:/config/codemirror/theme": {
"title": "$:/config/codemirror/theme",
"type": "string",
"text": "default"
},
"$:/language/codemirror/homeUrl": {
"title": "$:/language/codemirror/homeUrl",
"text": "http://codemirror.net"
},
"$:/language/codemirror/addOnUrl": {
"title": "$:/language/codemirror/addOnUrl",
"text": "http://codemirror.net/doc/manual.html#addons"
},
"$:/language/codemirror/configUrl": {
"title": "$:/language/codemirror/configUrl",
"text": "http://codemirror.net/doc/manual.html#config"
},
"$:/language/codemirror/controlPanel/hint": {
"title": "$:/language/codemirror/controlPanel/hint",
"text": "These settings let you customise the behaviour of [[CodeMirror|$:/plugins/tiddlywiki/codemirror]]."
},
"$:/language/codemirror/controlPanel/usage": {
"title": "$:/language/codemirror/controlPanel/usage",
"text": "Usage information"
},
"$:/language/codemirror/editorFont/hint": {
"title": "$:/language/codemirror/editorFont/hint",
"text": "Editor font family"
},
"$:/language/codemirror/editorFont/info": {
"title": "$:/language/codemirror/editorFont/info",
"text": "Set the font family for the ~CodeMirror text-editor"
},
"$:/language/codemirror/controlPanel/keyboard": {
"title": "$:/language/codemirror/controlPanel/keyboard",
"text": "Keyboard shortcuts"
},
"$:/language/codemirror/keyMap/hint": {
"title": "$:/language/codemirror/keyMap/hint",
"text": "~CodeMirror keymap"
},
"$:/language/codemirror/keyMap/info": {
"title": "$:/language/codemirror/keyMap/info",
"text": "~The Keyboard KeyMap used within the ~CodeMirror text-editor"
},
"$:/language/codemirror/lineNumbers/hint": {
"title": "$:/language/codemirror/lineNumbers/hint",
"text": "Enable line numbers"
},
"$:/language/codemirror/lineNumbers/info": {
"title": "$:/language/codemirror/lineNumbers/info",
"text": "Whether to show line numbers to the left of the editor."
},
"$:/language/codemirror/lineWrapping/hint": {
"title": "$:/language/codemirror/lineWrapping/hint",
"text": "Enable line wrapping"
},
"$:/language/codemirror/lineWrapping/info": {
"title": "$:/language/codemirror/lineWrapping/info",
"text": "Whether CodeMirror should scroll or wrap for long lines. Defaults to `false` (scroll)."
},
"$:/language/codemirror/showCursorWhenSelecting/hint": {
"title": "$:/language/codemirror/showCursorWhenSelecting/hint",
"text": "Show cursor, when selecting"
},
"$:/language/codemirror/showCursorWhenSelecting/info": {
"title": "$:/language/codemirror/showCursorWhenSelecting/info",
"text": "Whether the cursor should be drawn when a selection is active."
},
"$:/language/codemirror/styleActiveLine/hint": {
"title": "$:/language/codemirror/styleActiveLine/hint",
"text": "Highlight active line"
},
"$:/language/codemirror/styleActiveLine/info": {
"title": "$:/language/codemirror/styleActiveLine/info",
"text": "Whether or not to highlight the active text-editor line"
},
"$:/language/codemirror/theme/hint": {
"title": "$:/language/codemirror/theme/hint",
"text": "Select a theme"
},
"$:/language/codemirror/theme/info": {
"title": "$:/language/codemirror/theme/info",
"text": "Choose between ~CodeMirror themes"
},
"$:/plugins/tiddlywiki/codemirror/edit-codemirror.js": {
"title": "$:/plugins/tiddlywiki/codemirror/edit-codemirror.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/codemirror/edit-codemirror.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-codemirror widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tCodeMirrorEngine = require(\"$:/plugins/tiddlywiki/codemirror/engine.js\").CodeMirrorEngine;\n\nexports[\"edit-codemirror\"] = editTextWidgetFactory(CodeMirrorEngine,CodeMirrorEngine);\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/tiddlywiki/codemirror/engine.js": {
"title": "$:/plugins/tiddlywiki/codemirror/engine.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/codemirror/engine.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a CodeMirror instance\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CODEMIRROR_OPTIONS = \"$:/config/CodeMirror\",\nHEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\",\nCONFIG_FILTER = \"[all[shadows+tiddlers]prefix[$:/config/codemirror/]]\"\n\t\n// Install CodeMirror\nif($tw.browser && !window.CodeMirror) {\n\n\tvar modules = $tw.modules.types[\"codemirror\"];\n\tvar req = Object.getOwnPropertyNames(modules);\n\n\twindow.CodeMirror = require(\"$:/plugins/tiddlywiki/codemirror/lib/codemirror.js\");\n\t// Install required CodeMirror plugins\n\tif(req) {\n\t\tif($tw.utils.isArray(req)) {\n\t\t\tfor(var index=0; index<req.length; index++) {\n\t\t\t\trequire(req[index]);\n\t\t\t}\n\t\t} else {\n\t\t\trequire(req);\n\t\t}\n\t}\n}\n\nfunction getCmConfig() {\n\tvar type,\n\t\ttest,\n\t\tvalue,\n\t\telement,\n\t\textend,\n\t\ttiddler,\n\t\tconfig = {},\n\t\tconfigTiddlers = $tw.wiki.filterTiddlers(CONFIG_FILTER);\n\n\tif ($tw.utils.isArray(configTiddlers)) {\n\t\tfor (var i=0; i<configTiddlers.length; i++) {\n\t\t\ttiddler = $tw.wiki.getTiddler(configTiddlers[i]);\n\t\t\t\tif (tiddler) {\n\t\t\t\telement = configTiddlers[i].replace(/\\$:\\/config\\/codemirror\\//ig,\"\");\n\t\t\t\t\ttype = (tiddler.fields.type) ? tiddler.fields.type.trim().toLocaleLowerCase() : \"string\";\n\t\t\t\tswitch (type) {\n\t\t\t\t\tcase \"bool\":\n\t\t\t\t\ttest = tiddler.fields.text.trim().toLowerCase();\n\t\t\t\t\tvalue = (test === \"true\") ? true : false;\n\t\t\t\t\tconfig[element] = value;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"string\":\n\t\t\t\t\tvalue = tiddler.fields.text.trim();\n\t\t\t\t\tconfig[element] = value;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"integer\":\n\t\t\t\t\tvalue = parseInt(tiddler.fields.text.trim(), 10);\n\t\t\t\t\tconfig[element] = value;\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"json\":\n\t\t\t\t\tvalue = JSON.parse(tiddler.fields.text.trim());\n\t\t\t\t\t\textend = (tiddler.fields.extend) ? tiddler.fields.extend : element;\n\n\t\t\t\t\tif (config[extend]) {\n\t\t\t\t\t\t$tw.utils.extend(config[extend], value);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconfig[extend] = value;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn config;\n}\n\nfunction CodeMirrorEngine(options) {\n\n\t// Save our options\n\tvar self = this;\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create the wrapper DIV\n\tthis.domNode = this.widget.document.createElement(\"div\");\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tthis.domNode.style.display = \"inline-block\";\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n\t\n\t// Set all cm-plugin defaults\n\t// Get the configuration options for the CodeMirror object\n\tvar config = getCmConfig();\n\n\tconfig.mode = options.type;\n\tconfig.value = options.value;\n\tif(this.widget.editTabIndex) {\n\t\tconfig[\"tabindex\"] = this.widget.editTabIndex;\n\t}\n\t// Create the CodeMirror instance\n\tthis.cm = window.CodeMirror(function(cmDomNode) {\n\t\t// Note that this is a synchronous callback that is called before the constructor returns\n\t\tif(!self.widget.document.isTiddlyWikiFakeDom) {\n\t\t\tself.domNode.appendChild(cmDomNode);\n\t\t}\n\t},config);\n\n\t// Set up a change event handler\n\tthis.cm.on(\"change\",function() {\n\t\tself.widget.saveChanges(self.getText());\n\t});\n\tthis.cm.on(\"drop\",function(cm,event) {\n\t\tevent.stopPropagation(); // Otherwise TW's dropzone widget sees the drop event\n\t\treturn false;\n\t});\n\tthis.cm.on(\"keydown\",function(cm,event) {\n\t\treturn self.widget.handleKeydownEvent.call(self.widget,event);\n\t});\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nCodeMirrorEngine.prototype.setText = function(text,type) {\n\tvar self = this;\n\tself.cm.setOption(\"mode\",type);\n\tif(!this.cm.hasFocus()) {\n\t\tthis.cm.setValue(text);\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nCodeMirrorEngine.prototype.getText = function() {\n\treturn this.cm.getValue();\n};\n\n/*\nFix the height of textarea to fit content\n*/\nCodeMirrorEngine.prototype.fixHeight = function() {\n\tif(this.widget.editAutoHeight) {\n\t\t// Resize to fit\n\t\tthis.cm.setSize(null,null);\n\t} else {\n\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\tthis.cm.setSize(null,fixedHeight);\n\t}\n};\n\n/*\nFocus the engine node\n*/\nCodeMirrorEngine.prototype.focus = function() {\n\tthis.cm.focus();\n}\n\n/*\nCreate a blank structure representing a text operation\n*/\nCodeMirrorEngine.prototype.createTextOperation = function() {\n\tvar selections = this.cm.listSelections();\n\tif(selections.length > 0) {\n\t\tvar anchorPos = this.cm.indexFromPos(selections[0].anchor),\n\t\theadPos = this.cm.indexFromPos(selections[0].head);\n\t}\n\tvar operation = {\n\t\ttext: this.cm.getValue(),\n\t\tselStart: Math.min(anchorPos,headPos),\n\t\tselEnd: Math.max(anchorPos,headPos),\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nCodeMirrorEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tthis.cm.replaceRange(operation.replacement,this.cm.posFromIndex(operation.cutStart),this.cm.posFromIndex(operation.cutEnd));\n\t\tthis.cm.setSelection(this.cm.posFromIndex(operation.newSelStart),this.cm.posFromIndex(operation.newSelEnd));\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t}\n\tthis.cm.focus();\n\treturn newText;\n};\n\nexports.CodeMirrorEngine = CodeMirrorEngine;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/plugins/tiddlywiki/codemirror/lib/codemirror.js": {
"text": "!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):e.CodeMirror=t()}(this,function(){\"use strict\";var e=navigator.userAgent,t=navigator.platform,r=/gecko\\/\\d/i.test(e),n=/MSIE \\d/.test(e),i=/Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(e),o=/Edge\\/(\\d+)/.exec(e),l=n||i||o,s=l&&(n?document.documentMode||6:+(o||i)[1]),a=!o&&/WebKit\\//.test(e),u=a&&/Qt\\/\\d+\\.\\d+/.test(e),c=!o&&/Chrome\\//.test(e),h=/Opera\\//.test(e),f=/Apple Computer/.test(navigator.vendor),d=/Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(e),p=/PhantomJS/.test(e),g=!o&&/AppleWebKit/.test(e)&&/Mobile\\/\\w+/.test(e),v=/Android/.test(e),m=g||v||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),y=g||/Mac/.test(t),b=/\\bCrOS\\b/.test(e),w=/win/i.test(t),x=h&&e.match(/Version\\/(\\d*\\.\\d*)/);x&&(x=Number(x[1])),x&&x>=15&&(h=!1,a=!0);var C=y&&(u||h&&(null==x||x<12.11)),S=r||l&&s>=9;function L(e){return new RegExp(\"(^|\\\\s)\"+e+\"(?:$|\\\\s)\\\\s*\")}var k,T=function(e,t){var r=e.className,n=L(t).exec(r);if(n){var i=r.slice(n.index+n[0].length);e.className=r.slice(0,n.index)+(i?n[1]+i:\"\")}};function M(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function N(e,t){return M(e).appendChild(t)}function O(e,t,r,n){var i=document.createElement(e);if(r&&(i.className=r),n&&(i.style.cssText=n),\"string\"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o<t.length;++o)i.appendChild(t[o]);return i}function A(e,t,r,n){var i=O(e,t,r,n);return i.setAttribute(\"role\",\"presentation\"),i}function D(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do{if(11==t.nodeType&&(t=t.host),t==e)return!0}while(t=t.parentNode)}function W(){var e;try{e=document.activeElement}catch(t){e=document.body||null}for(;e&&e.shadowRoot&&e.shadowRoot.activeElement;)e=e.shadowRoot.activeElement;return e}function H(e,t){var r=e.className;L(t).test(r)||(e.className+=(r?\" \":\"\")+t)}function F(e,t){for(var r=e.split(\" \"),n=0;n<r.length;n++)r[n]&&!L(r[n]).test(t)&&(t+=\" \"+r[n]);return t}k=document.createRange?function(e,t,r,n){var i=document.createRange();return i.setEnd(n||e,r),i.setStart(e,t),i}:function(e,t,r){var n=document.body.createTextRange();try{n.moveToElementText(e.parentNode)}catch(e){return n}return n.collapse(!0),n.moveEnd(\"character\",r),n.moveStart(\"character\",t),n};var P=function(e){e.select()};function E(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function z(e,t,r){for(var n in t||(t={}),e)!e.hasOwnProperty(n)||!1===r&&t.hasOwnProperty(n)||(t[n]=e[n]);return t}function I(e,t,r,n,i){null==t&&-1==(t=e.search(/[^\\s\\u00a0]/))&&(t=e.length);for(var o=n||0,l=i||0;;){var s=e.indexOf(\"\\t\",o);if(s<0||s>=t)return l+(t-o);l+=s-o,l+=r-l%r,o=s+1}}g?P=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:l&&(P=function(e){try{e.select()}catch(e){}});var R=function(){this.id=null};function B(e,t){for(var r=0;r<e.length;++r)if(e[r]==t)return r;return-1}R.prototype.set=function(e,t){clearTimeout(this.id),this.id=setTimeout(t,e)};var G=30,U={toString:function(){return\"CodeMirror.Pass\"}},V={scroll:!1},K={origin:\"*mouse\"},j={origin:\"+move\"};function X(e,t,r){for(var n=0,i=0;;){var o=e.indexOf(\"\\t\",n);-1==o&&(o=e.length);var l=o-n;if(o==e.length||i+l>=t)return n+Math.min(l,t-i);if(i+=o-n,n=o+1,(i+=r-i%r)>=t)return n}}var Y=[\"\"];function _(e){for(;Y.length<=e;)Y.push(q(Y)+\" \");return Y[e]}function q(e){return e[e.length-1]}function $(e,t){for(var r=[],n=0;n<e.length;n++)r[n]=t(e[n],n);return r}function Z(){}function Q(e,t){var r;return Object.create?r=Object.create(e):(Z.prototype=e,r=new Z),t&&z(t,r),r}var J=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;function ee(e){return/\\w/.test(e)||e>\"\"&&(e.toUpperCase()!=e.toLowerCase()||J.test(e))}function te(e,t){return t?!!(t.source.indexOf(\"\\\\w\")>-1&&ee(e))||t.test(e):ee(e)}function re(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}var ne=/[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;function ie(e){return e.charCodeAt(0)>=768&&ne.test(e)}function oe(e,t,r){for(;(r<0?t>0:t<e.length)&&ie(e.charAt(t));)t+=r;return t}function le(e,t,r){for(var n=t>r?-1:1;;){if(t==r)return t;var i=(t+r)/2,o=n<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:r;e(o)?r=o:t=o+n}}function se(e,t){if((t-=e.first)<0||t>=e.size)throw new Error(\"There is no line \"+(t+e.first)+\" in the document.\");for(var r=e;!r.lines;)for(var n=0;;++n){var i=r.children[n],o=i.chunkSize();if(t<o){r=i;break}t-=o}return r.lines[t]}function ae(e,t,r){var n=[],i=t.line;return e.iter(t.line,r.line+1,function(e){var o=e.text;i==r.line&&(o=o.slice(0,r.ch)),i==t.line&&(o=o.slice(t.ch)),n.push(o),++i}),n}function ue(e,t,r){var n=[];return e.iter(t,r,function(e){n.push(e.text)}),n}function ce(e,t){var r=t-e.height;if(r)for(var n=e;n;n=n.parent)n.height+=r}function he(e){if(null==e.parent)return null;for(var t=e.parent,r=B(t.lines,e),n=t.parent;n;t=n,n=n.parent)for(var i=0;n.children[i]!=t;++i)r+=n.children[i].chunkSize();return r+t.first}function fe(e,t){var r=e.first;e:do{for(var n=0;n<e.children.length;++n){var i=e.children[n],o=i.height;if(t<o){e=i;continue e}t-=o,r+=i.chunkSize()}return r}while(!e.lines);for(var l=0;l<e.lines.length;++l){var s=e.lines[l].height;if(t<s)break;t-=s}return r+l}function de(e,t){return t>=e.first&&t<e.first+e.size}function pe(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function ge(e,t,r){if(void 0===r&&(r=null),!(this instanceof ge))return new ge(e,t,r);this.line=e,this.ch=t,this.sticky=r}function ve(e,t){return e.line-t.line||e.ch-t.ch}function me(e,t){return e.sticky==t.sticky&&0==ve(e,t)}function ye(e){return ge(e.line,e.ch)}function be(e,t){return ve(e,t)<0?t:e}function we(e,t){return ve(e,t)<0?e:t}function xe(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function Ce(e,t){if(t.line<e.first)return ge(e.first,0);var r,n,i,o=e.first+e.size-1;return t.line>o?ge(o,se(e,o).text.length):(r=t,n=se(e,t.line).text.length,null==(i=r.ch)||i>n?ge(r.line,n):i<0?ge(r.line,0):r)}function Se(e,t){for(var r=[],n=0;n<t.length;n++)r[n]=Ce(e,t[n]);return r}var Le=!1,ke=!1;function Te(e,t,r){this.marker=e,this.from=t,this.to=r}function Me(e,t){if(e)for(var r=0;r<e.length;++r){var n=e[r];if(n.marker==t)return n}}function Ne(e,t){for(var r,n=0;n<e.length;++n)e[n]!=t&&(r||(r=[])).push(e[n]);return r}function Oe(e,t){if(t.full)return null;var r=de(e,t.from.line)&&se(e,t.from.line).markedSpans,n=de(e,t.to.line)&&se(e,t.to.line).markedSpans;if(!r&&!n)return null;var i=t.from.ch,o=t.to.ch,l=0==ve(t.from,t.to),s=function(e,t,r){var n;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker;if(null==o.from||(l.inclusiveLeft?o.from<=t:o.from<t)||o.from==t&&\"bookmark\"==l.type&&(!r||!o.marker.insertLeft)){var s=null==o.to||(l.inclusiveRight?o.to>=t:o.to>t);(n||(n=[])).push(new Te(l,o.from,s?null:o.to))}}return n}(r,i,l),a=function(e,t,r){var n;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker;if(null==o.to||(l.inclusiveRight?o.to>=t:o.to>t)||o.from==t&&\"bookmark\"==l.type&&(!r||o.marker.insertLeft)){var s=null==o.from||(l.inclusiveLeft?o.from<=t:o.from<t);(n||(n=[])).push(new Te(l,s?null:o.from-t,null==o.to?null:o.to-t))}}return n}(n,o,l),u=1==t.text.length,c=q(t.text).length+(u?i:0);if(s)for(var h=0;h<s.length;++h){var f=s[h];if(null==f.to){var d=Me(a,f.marker);d?u&&(f.to=null==d.to?null:d.to+c):f.to=i}}if(a)for(var p=0;p<a.length;++p){var g=a[p];if(null!=g.to&&(g.to+=c),null==g.from)Me(s,g.marker)||(g.from=c,u&&(s||(s=[])).push(g));else g.from+=c,u&&(s||(s=[])).push(g)}s&&(s=Ae(s)),a&&a!=s&&(a=Ae(a));var v=[s];if(!u){var m,y=t.text.length-2;if(y>0&&s)for(var b=0;b<s.length;++b)null==s[b].to&&(m||(m=[])).push(new Te(s[b].marker,null,null));for(var w=0;w<y;++w)v.push(m);v.push(a)}return v}function Ae(e){for(var t=0;t<e.length;++t){var r=e[t];null!=r.from&&r.from==r.to&&!1!==r.marker.clearWhenEmpty&&e.splice(t--,1)}return e.length?e:null}function De(e){var t=e.markedSpans;if(t){for(var r=0;r<t.length;++r)t[r].marker.detachLine(e);e.markedSpans=null}}function We(e,t){if(t){for(var r=0;r<t.length;++r)t[r].marker.attachLine(e);e.markedSpans=t}}function He(e){return e.inclusiveLeft?-1:0}function Fe(e){return e.inclusiveRight?1:0}function Pe(e,t){var r=e.lines.length-t.lines.length;if(0!=r)return r;var n=e.find(),i=t.find(),o=ve(n.from,i.from)||He(e)-He(t);if(o)return-o;var l=ve(n.to,i.to)||Fe(e)-Fe(t);return l||t.id-e.id}function Ee(e,t){var r,n=ke&&e.markedSpans;if(n)for(var i=void 0,o=0;o<n.length;++o)(i=n[o]).marker.collapsed&&null==(t?i.from:i.to)&&(!r||Pe(r,i.marker)<0)&&(r=i.marker);return r}function ze(e){return Ee(e,!0)}function Ie(e){return Ee(e,!1)}function Re(e,t,r,n,i){var o=se(e,t),l=ke&&o.markedSpans;if(l)for(var s=0;s<l.length;++s){var a=l[s];if(a.marker.collapsed){var u=a.marker.find(0),c=ve(u.from,r)||He(a.marker)-He(i),h=ve(u.to,n)||Fe(a.marker)-Fe(i);if(!(c>=0&&h<=0||c<=0&&h>=0)&&(c<=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?ve(u.to,r)>=0:ve(u.to,r)>0)||c>=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?ve(u.from,n)<=0:ve(u.from,n)<0)))return!0}}}function Be(e){for(var t;t=ze(e);)e=t.find(-1,!0).line;return e}function Ge(e,t){var r=se(e,t),n=Be(r);return r==n?t:he(n)}function Ue(e,t){if(t>e.lastLine())return t;var r,n=se(e,t);if(!Ve(e,n))return t;for(;r=Ie(n);)n=r.find(1,!0).line;return he(n)+1}function Ve(e,t){var r=ke&&t.markedSpans;if(r)for(var n=void 0,i=0;i<r.length;++i)if((n=r[i]).marker.collapsed){if(null==n.from)return!0;if(!n.marker.widgetNode&&0==n.from&&n.marker.inclusiveLeft&&Ke(e,t,n))return!0}}function Ke(e,t,r){if(null==r.to){var n=r.marker.find(1,!0);return Ke(e,n.line,Me(n.line.markedSpans,r.marker))}if(r.marker.inclusiveRight&&r.to==t.text.length)return!0;for(var i=void 0,o=0;o<t.markedSpans.length;++o)if((i=t.markedSpans[o]).marker.collapsed&&!i.marker.widgetNode&&i.from==r.to&&(null==i.to||i.to!=r.from)&&(i.marker.inclusiveLeft||r.marker.inclusiveRight)&&Ke(e,t,i))return!0}function je(e){for(var t=0,r=(e=Be(e)).parent,n=0;n<r.lines.length;++n){var i=r.lines[n];if(i==e)break;t+=i.height}for(var o=r.parent;o;o=(r=o).parent)for(var l=0;l<o.children.length;++l){var s=o.children[l];if(s==r)break;t+=s.height}return t}function Xe(e){if(0==e.height)return 0;for(var t,r=e.text.length,n=e;t=ze(n);){var i=t.find(0,!0);n=i.from.line,r+=i.from.ch-i.to.ch}for(n=e;t=Ie(n);){var o=t.find(0,!0);r-=n.text.length-o.from.ch,r+=(n=o.to.line).text.length-o.to.ch}return r}function Ye(e){var t=e.display,r=e.doc;t.maxLine=se(r,r.first),t.maxLineLength=Xe(t.maxLine),t.maxLineChanged=!0,r.iter(function(e){var r=Xe(e);r>t.maxLineLength&&(t.maxLineLength=r,t.maxLine=e)})}var _e=null;function qe(e,t,r){var n;_e=null;for(var i=0;i<e.length;++i){var o=e[i];if(o.from<t&&o.to>t)return i;o.to==t&&(o.from!=o.to&&\"before\"==r?n=i:_e=i),o.from==t&&(o.from!=o.to&&\"before\"!=r?n=i:_e=i)}return null!=n?n:_e}var $e=function(){var e=\"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\",t=\"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\";var r=/[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/,n=/[stwN]/,i=/[LRr]/,o=/[Lb1n]/,l=/[1n]/;function s(e,t,r){this.level=e,this.from=t,this.to=r}return function(a,u){var c=\"ltr\"==u?\"L\":\"R\";if(0==a.length||\"ltr\"==u&&!r.test(a))return!1;for(var h,f=a.length,d=[],p=0;p<f;++p)d.push((h=a.charCodeAt(p))<=247?e.charAt(h):1424<=h&&h<=1524?\"R\":1536<=h&&h<=1785?t.charAt(h-1536):1774<=h&&h<=2220?\"r\":8192<=h&&h<=8203?\"w\":8204==h?\"b\":\"L\");for(var g=0,v=c;g<f;++g){var m=d[g];\"m\"==m?d[g]=v:v=m}for(var y=0,b=c;y<f;++y){var w=d[y];\"1\"==w&&\"r\"==b?d[y]=\"n\":i.test(w)&&(b=w,\"r\"==w&&(d[y]=\"R\"))}for(var x=1,C=d[0];x<f-1;++x){var S=d[x];\"+\"==S&&\"1\"==C&&\"1\"==d[x+1]?d[x]=\"1\":\",\"!=S||C!=d[x+1]||\"1\"!=C&&\"n\"!=C||(d[x]=C),C=S}for(var L=0;L<f;++L){var k=d[L];if(\",\"==k)d[L]=\"N\";else if(\"%\"==k){var T=void 0;for(T=L+1;T<f&&\"%\"==d[T];++T);for(var M=L&&\"!\"==d[L-1]||T<f&&\"1\"==d[T]?\"1\":\"N\",N=L;N<T;++N)d[N]=M;L=T-1}}for(var O=0,A=c;O<f;++O){var D=d[O];\"L\"==A&&\"1\"==D?d[O]=\"L\":i.test(D)&&(A=D)}for(var W=0;W<f;++W)if(n.test(d[W])){var H=void 0;for(H=W+1;H<f&&n.test(d[H]);++H);for(var F=\"L\"==(W?d[W-1]:c),P=F==(\"L\"==(H<f?d[H]:c))?F?\"L\":\"R\":c,E=W;E<H;++E)d[E]=P;W=H-1}for(var z,I=[],R=0;R<f;)if(o.test(d[R])){var B=R;for(++R;R<f&&o.test(d[R]);++R);I.push(new s(0,B,R))}else{var G=R,U=I.length;for(++R;R<f&&\"L\"!=d[R];++R);for(var V=G;V<R;)if(l.test(d[V])){G<V&&I.splice(U,0,new s(1,G,V));var K=V;for(++V;V<R&&l.test(d[V]);++V);I.splice(U,0,new s(2,K,V)),G=V}else++V;G<R&&I.splice(U,0,new s(1,G,R))}return\"ltr\"==u&&(1==I[0].level&&(z=a.match(/^\\s+/))&&(I[0].from=z[0].length,I.unshift(new s(0,0,z[0].length))),1==q(I).level&&(z=a.match(/\\s+$/))&&(q(I).to-=z[0].length,I.push(new s(0,f-z[0].length,f)))),\"rtl\"==u?I.reverse():I}}();function Ze(e,t){var r=e.order;return null==r&&(r=e.order=$e(e.text,t)),r}var Qe=[],Je=function(e,t,r){if(e.addEventListener)e.addEventListener(t,r,!1);else if(e.attachEvent)e.attachEvent(\"on\"+t,r);else{var n=e._handlers||(e._handlers={});n[t]=(n[t]||Qe).concat(r)}};function et(e,t){return e._handlers&&e._handlers[t]||Qe}function tt(e,t,r){if(e.removeEventListener)e.removeEventListener(t,r,!1);else if(e.detachEvent)e.detachEvent(\"on\"+t,r);else{var n=e._handlers,i=n&&n[t];if(i){var o=B(i,r);o>-1&&(n[t]=i.slice(0,o).concat(i.slice(o+1)))}}}function rt(e,t){var r=et(e,t);if(r.length)for(var n=Array.prototype.slice.call(arguments,2),i=0;i<r.length;++i)r[i].apply(null,n)}function nt(e,t,r){return\"string\"==typeof t&&(t={type:t,preventDefault:function(){this.defaultPrevented=!0}}),rt(e,r||t.type,e,t),ut(t)||t.codemirrorIgnore}function it(e){var t=e._handlers&&e._handlers.cursorActivity;if(t)for(var r=e.curOp.cursorActivityHandlers||(e.curOp.cursorActivityHandlers=[]),n=0;n<t.length;++n)-1==B(r,t[n])&&r.push(t[n])}function ot(e,t){return et(e,t).length>0}function lt(e){e.prototype.on=function(e,t){Je(this,e,t)},e.prototype.off=function(e,t){tt(this,e,t)}}function st(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function at(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function ut(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function ct(e){st(e),at(e)}function ht(e){return e.target||e.srcElement}function ft(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),y&&e.ctrlKey&&1==t&&(t=3),t}var dt,pt,gt=function(){if(l&&s<9)return!1;var e=O(\"div\");return\"draggable\"in e||\"dragDrop\"in e}();function vt(e){if(null==dt){var t=O(\"span\",\"\");N(e,O(\"span\",[t,document.createTextNode(\"x\")])),0!=e.firstChild.offsetHeight&&(dt=t.offsetWidth<=1&&t.offsetHeight>2&&!(l&&s<8))}var r=dt?O(\"span\",\"\"):O(\"span\",\" \",null,\"display: inline-block; width: 1px; margin-right: -1px\");return r.setAttribute(\"cm-text\",\"\"),r}function mt(e){if(null!=pt)return pt;var t=N(e,document.createTextNode(\"AخA\")),r=k(t,0,1).getBoundingClientRect(),n=k(t,1,2).getBoundingClientRect();return M(e),!(!r||r.left==r.right)&&(pt=n.right-r.right<3)}var yt,bt=3!=\"\\n\\nb\".split(/\\n/).length?function(e){for(var t=0,r=[],n=e.length;t<=n;){var i=e.indexOf(\"\\n\",t);-1==i&&(i=e.length);var o=e.slice(t,\"\\r\"==e.charAt(i-1)?i-1:i),l=o.indexOf(\"\\r\");-1!=l?(r.push(o.slice(0,l)),t+=l+1):(r.push(o),t=i+1)}return r}:function(e){return e.split(/\\r\\n?|\\n/)},wt=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints(\"StartToEnd\",t)},xt=\"oncopy\"in(yt=O(\"div\"))||(yt.setAttribute(\"oncopy\",\"return;\"),\"function\"==typeof yt.oncopy),Ct=null;var St={},Lt={};function kt(e){if(\"string\"==typeof e&&Lt.hasOwnProperty(e))e=Lt[e];else if(e&&\"string\"==typeof e.name&&Lt.hasOwnProperty(e.name)){var t=Lt[e.name];\"string\"==typeof t&&(t={name:t}),(e=Q(t,e)).name=t.name}else{if(\"string\"==typeof e&&/^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(e))return kt(\"application/xml\");if(\"string\"==typeof e&&/^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(e))return kt(\"application/json\")}return\"string\"==typeof e?{name:e}:e||{name:\"null\"}}function Tt(e,t){t=kt(t);var r=St[t.name];if(!r)return Tt(e,\"text/plain\");var n=r(e,t);if(Mt.hasOwnProperty(t.name)){var i=Mt[t.name];for(var o in i)i.hasOwnProperty(o)&&(n.hasOwnProperty(o)&&(n[\"_\"+o]=n[o]),n[o]=i[o])}if(n.name=t.name,t.helperType&&(n.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)n[l]=t.modeProps[l];return n}var Mt={};function Nt(e,t){z(t,Mt.hasOwnProperty(e)?Mt[e]:Mt[e]={})}function Ot(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var r={};for(var n in t){var i=t[n];i instanceof Array&&(i=i.concat([])),r[n]=i}return r}function At(e,t){for(var r;e.innerMode&&(r=e.innerMode(t))&&r.mode!=e;)t=r.state,e=r.mode;return r||{mode:e,state:t}}function Dt(e,t,r){return!e.startState||e.startState(t,r)}var Wt=function(e,t,r){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=r};Wt.prototype.eol=function(){return this.pos>=this.string.length},Wt.prototype.sol=function(){return this.pos==this.lineStart},Wt.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},Wt.prototype.next=function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},Wt.prototype.eat=function(e){var t=this.string.charAt(this.pos);if(\"string\"==typeof e?t==e:t&&(e.test?e.test(t):e(t)))return++this.pos,t},Wt.prototype.eatWhile=function(e){for(var t=this.pos;this.eat(e););return this.pos>t},Wt.prototype.eatSpace=function(){for(var e=this.pos;/[\\s\\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},Wt.prototype.skipToEnd=function(){this.pos=this.string.length},Wt.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},Wt.prototype.backUp=function(e){this.pos-=e},Wt.prototype.column=function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=I(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?I(this.string,this.lineStart,this.tabSize):0)},Wt.prototype.indentation=function(){return I(this.string,null,this.tabSize)-(this.lineStart?I(this.string,this.lineStart,this.tabSize):0)},Wt.prototype.match=function(e,t,r){if(\"string\"!=typeof e){var n=this.string.slice(this.pos).match(e);return n&&n.index>0?null:(n&&!1!==t&&(this.pos+=n[0].length),n)}var i=function(e){return r?e.toLowerCase():e};if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},Wt.prototype.current=function(){return this.string.slice(this.start,this.pos)},Wt.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},Wt.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},Wt.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var Ht=function(e,t){this.state=e,this.lookAhead=t},Ft=function(e,t,r,n){this.state=t,this.doc=e,this.line=r,this.maxLookAhead=n||0,this.baseTokens=null,this.baseTokenPos=1};function Pt(e,t,r,n){var i=[e.state.modeGen],o={};Kt(e,t.text,e.doc.mode,r,function(e,t){return i.push(e,t)},o,n);for(var l=r.state,s=function(n){r.baseTokens=i;var s=e.state.overlays[n],a=1,u=0;r.state=!0,Kt(e,t.text,s.mode,r,function(e,t){for(var r=a;u<e;){var n=i[a];n>e&&i.splice(a,1,e,i[a+1],n),a+=2,u=Math.min(e,n)}if(t)if(s.opaque)i.splice(r,a-r,e,\"overlay \"+t),a=r+2;else for(;r<a;r+=2){var o=i[r+1];i[r+1]=(o?o+\" \":\"\")+\"overlay \"+t}},o),r.state=l,r.baseTokens=null,r.baseTokenPos=1},a=0;a<e.state.overlays.length;++a)s(a);return{styles:i,classes:o.bgClass||o.textClass?o:null}}function Et(e,t,r){if(!t.styles||t.styles[0]!=e.state.modeGen){var n=zt(e,he(t)),i=t.text.length>e.options.maxHighlightLength&&Ot(e.doc.mode,n.state),o=Pt(e,t,n);i&&(n.state=i),t.stateAfter=n.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),r===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function zt(e,t,r){var n=e.doc,i=e.display;if(!n.mode.startState)return new Ft(n,!0,t);var o=function(e,t,r){for(var n,i,o=e.doc,l=r?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;s>l;--s){if(s<=o.first)return o.first;var a=se(o,s-1),u=a.stateAfter;if(u&&(!r||s+(u instanceof Ht?u.lookAhead:0)<=o.modeFrontier))return s;var c=I(a.text,null,e.options.tabSize);(null==i||n>c)&&(i=s-1,n=c)}return i}(e,t,r),l=o>n.first&&se(n,o-1).stateAfter,s=l?Ft.fromSaved(n,l,o):new Ft(n,Dt(n.mode),o);return n.iter(o,t,function(r){It(e,r.text,s);var n=s.line;r.stateAfter=n==t-1||n%5==0||n>=i.viewFrom&&n<i.viewTo?s.save():null,s.nextLine()}),r&&(n.modeFrontier=s.line),s}function It(e,t,r,n){var i=e.doc.mode,o=new Wt(t,e.options.tabSize,r);for(o.start=o.pos=n||0,\"\"==t&&Rt(i,r.state);!o.eol();)Bt(i,o,r.state),o.start=o.pos}function Rt(e,t){if(e.blankLine)return e.blankLine(t);if(e.innerMode){var r=At(e,t);return r.mode.blankLine?r.mode.blankLine(r.state):void 0}}function Bt(e,t,r,n){for(var i=0;i<10;i++){n&&(n[0]=At(e,r).mode);var o=e.token(t,r);if(t.pos>t.start)return o}throw new Error(\"Mode \"+e.name+\" failed to advance stream.\")}Ft.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},Ft.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,\"\"),size:this.baseTokens[this.baseTokenPos]-e}},Ft.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},Ft.fromSaved=function(e,t,r){return t instanceof Ht?new Ft(e,Ot(e.mode,t.state),r,t.lookAhead):new Ft(e,Ot(e.mode,t),r)},Ft.prototype.save=function(e){var t=!1!==e?Ot(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new Ht(t,this.maxLookAhead):t};var Gt=function(e,t,r){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=r};function Ut(e,t,r,n){var i,o,l=e.doc,s=l.mode,a=se(l,(t=Ce(l,t)).line),u=zt(e,t.line,r),c=new Wt(a.text,e.options.tabSize,u);for(n&&(o=[]);(n||c.pos<t.ch)&&!c.eol();)c.start=c.pos,i=Bt(s,c,u.state),n&&o.push(new Gt(c,i,Ot(l.mode,u.state)));return n?o:new Gt(c,i,u.state)}function Vt(e,t){if(e)for(;;){var r=e.match(/(?:^|\\s+)line-(background-)?(\\S+)/);if(!r)break;e=e.slice(0,r.index)+e.slice(r.index+r[0].length);var n=r[1]?\"bgClass\":\"textClass\";null==t[n]?t[n]=r[2]:new RegExp(\"(?:^|s)\"+r[2]+\"(?:$|s)\").test(t[n])||(t[n]+=\" \"+r[2])}return e}function Kt(e,t,r,n,i,o,l){var s=r.flattenSpans;null==s&&(s=e.options.flattenSpans);var a,u=0,c=null,h=new Wt(t,e.options.tabSize,n),f=e.options.addModeClass&&[null];for(\"\"==t&&Vt(Rt(r,n.state),o);!h.eol();){if(h.pos>e.options.maxHighlightLength?(s=!1,l&&It(e,t,n,h.pos),h.pos=t.length,a=null):a=Vt(Bt(r,h,n.state,f),o),f){var d=f[0].name;d&&(a=\"m-\"+(a?d+\" \"+a:d))}if(!s||c!=a){for(;u<h.start;)i(u=Math.min(h.start,u+5e3),c);c=a}h.start=h.pos}for(;u<h.pos;){var p=Math.min(h.pos,u+5e3);i(p,c),u=p}}var jt=function(e,t,r){this.text=e,We(this,t),this.height=r?r(this):1};jt.prototype.lineNo=function(){return he(this)},lt(jt);var Xt={},Yt={};function _t(e,t){if(!e||/^\\s*$/.test(e))return null;var r=t.addModeClass?Yt:Xt;return r[e]||(r[e]=e.replace(/\\S+/g,\"cm-$&\"))}function qt(e,t){var r=A(\"span\",null,null,a?\"padding-right: .1px\":null),n={pre:A(\"pre\",[r],\"CodeMirror-line\"),content:r,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:(l||a)&&e.getOption(\"lineWrapping\")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var o=i?t.rest[i-1]:t.line,s=void 0;n.pos=0,n.addToken=Zt,mt(e.display.measure)&&(s=Ze(o,e.doc.direction))&&(n.addToken=Qt(n.addToken,s)),n.map=[],er(o,n,Et(e,o,t!=e.display.externalMeasured&&he(o))),o.styleClasses&&(o.styleClasses.bgClass&&(n.bgClass=F(o.styleClasses.bgClass,n.bgClass||\"\")),o.styleClasses.textClass&&(n.textClass=F(o.styleClasses.textClass,n.textClass||\"\"))),0==n.map.length&&n.map.push(0,0,n.content.appendChild(vt(e.display.measure))),0==i?(t.measure.map=n.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(n.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(a){var u=n.content.lastChild;(/\\bcm-tab\\b/.test(u.className)||u.querySelector&&u.querySelector(\".cm-tab\"))&&(n.content.className=\"cm-tab-wrap-hack\")}return rt(e,\"renderLine\",e,t.line,n.pre),n.pre.className&&(n.textClass=F(n.pre.className,n.textClass||\"\")),n}function $t(e){var t=O(\"span\",\"•\",\"cm-invalidchar\");return t.title=\"\\\\u\"+e.charCodeAt(0).toString(16),t.setAttribute(\"aria-label\",t.title),t}function Zt(e,t,r,n,i,o,a){if(t){var u,c=e.splitSpaces?function(e,t){if(e.length>1&&!/ /.test(e))return e;for(var r=t,n=\"\",i=0;i<e.length;i++){var o=e.charAt(i);\" \"!=o||!r||i!=e.length-1&&32!=e.charCodeAt(i+1)||(o=\" \"),n+=o,r=\" \"==o}return n}(t,e.trailingSpace):t,h=e.cm.state.specialChars,f=!1;if(h.test(t)){u=document.createDocumentFragment();for(var d=0;;){h.lastIndex=d;var p=h.exec(t),g=p?p.index-d:t.length-d;if(g){var v=document.createTextNode(c.slice(d,d+g));l&&s<9?u.appendChild(O(\"span\",[v])):u.appendChild(v),e.map.push(e.pos,e.pos+g,v),e.col+=g,e.pos+=g}if(!p)break;d+=g+1;var m=void 0;if(\"\\t\"==p[0]){var y=e.cm.options.tabSize,b=y-e.col%y;(m=u.appendChild(O(\"span\",_(b),\"cm-tab\"))).setAttribute(\"role\",\"presentation\"),m.setAttribute(\"cm-text\",\"\\t\"),e.col+=b}else\"\\r\"==p[0]||\"\\n\"==p[0]?((m=u.appendChild(O(\"span\",\"\\r\"==p[0]?\"␍\":\"\",\"cm-invalidchar\"))).setAttribute(\"cm-text\",p[0]),e.col+=1):((m=e.cm.options.specialCharPlaceholder(p[0])).setAttribute(\"cm-text\",p[0]),l&&s<9?u.appendChild(O(\"span\",[m])):u.appendChild(m),e.col+=1);e.map.push(e.pos,e.pos+1,m),e.pos++}}else e.col+=t.length,u=document.createTextNode(c),e.map.push(e.pos,e.pos+t.length,u),l&&s<9&&(f=!0),e.pos+=t.length;if(e.trailingSpace=32==c.charCodeAt(t.length-1),r||n||i||f||a){var w=r||\"\";n&&(w+=n),i&&(w+=i);var x=O(\"span\",[u],w,a);return o&&(x.title=o),e.content.appendChild(x)}e.content.appendChild(u)}}function Qt(e,t){return function(r,n,i,o,l,s,a){i=i?i+\" cm-force-border\":\"cm-force-border\";for(var u=r.pos,c=u+n.length;;){for(var h=void 0,f=0;f<t.length&&!((h=t[f]).to>u&&h.from<=u);f++);if(h.to>=c)return e(r,n,i,o,l,s,a);e(r,n.slice(0,h.to-u),i,o,null,s,a),o=null,n=n.slice(h.to-u),u=h.to}}}function Jt(e,t,r,n){var i=!n&&r.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!n&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement(\"span\"))),i.setAttribute(\"cm-marker\",r.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function er(e,t,r){var n=e.markedSpans,i=e.text,o=0;if(n)for(var l,s,a,u,c,h,f,d=i.length,p=0,g=1,v=\"\",m=0;;){if(m==p){a=u=c=h=s=\"\",f=null,m=1/0;for(var y=[],b=void 0,w=0;w<n.length;++w){var x=n[w],C=x.marker;\"bookmark\"==C.type&&x.from==p&&C.widgetNode?y.push(C):x.from<=p&&(null==x.to||x.to>p||C.collapsed&&x.to==p&&x.from==p)?(null!=x.to&&x.to!=p&&m>x.to&&(m=x.to,u=\"\"),C.className&&(a+=\" \"+C.className),C.css&&(s=(s?s+\";\":\"\")+C.css),C.startStyle&&x.from==p&&(c+=\" \"+C.startStyle),C.endStyle&&x.to==m&&(b||(b=[])).push(C.endStyle,x.to),C.title&&!h&&(h=C.title),C.collapsed&&(!f||Pe(f.marker,C)<0)&&(f=x)):x.from>p&&m>x.from&&(m=x.from)}if(b)for(var S=0;S<b.length;S+=2)b[S+1]==m&&(u+=\" \"+b[S]);if(!f||f.from==p)for(var L=0;L<y.length;++L)Jt(t,0,y[L]);if(f&&(f.from||0)==p){if(Jt(t,(null==f.to?d+1:f.to)-p,f.marker,null==f.from),null==f.to)return;f.to==p&&(f=!1)}}if(p>=d)break;for(var k=Math.min(d,m);;){if(v){var T=p+v.length;if(!f){var M=T>k?v.slice(0,k-p):v;t.addToken(t,M,l?l+a:a,c,p+M.length==m?u:\"\",h,s)}if(T>=k){v=v.slice(k-p),p=k;break}p=T,c=\"\"}v=i.slice(o,o=r[g++]),l=_t(r[g++],t.cm.options)}}else for(var N=1;N<r.length;N+=2)t.addToken(t,i.slice(o,o=r[N]),_t(r[N+1],t.cm.options))}function tr(e,t,r){this.line=t,this.rest=function(e){for(var t,r;t=Ie(e);)e=t.find(1,!0).line,(r||(r=[])).push(e);return r}(t),this.size=this.rest?he(q(this.rest))-r+1:1,this.node=this.text=null,this.hidden=Ve(e,t)}function rr(e,t,r){for(var n,i=[],o=t;o<r;o=n){var l=new tr(e.doc,se(e.doc,o),o);n=o+l.size,i.push(l)}return i}var nr=null;var ir=null;function or(e,t){var r=et(e,t);if(r.length){var n,i=Array.prototype.slice.call(arguments,2);nr?n=nr.delayedCallbacks:ir?n=ir:(n=ir=[],setTimeout(lr,0));for(var o=function(e){n.push(function(){return r[e].apply(null,i)})},l=0;l<r.length;++l)o(l)}}function lr(){var e=ir;ir=null;for(var t=0;t<e.length;++t)e[t]()}function sr(e,t,r,n){for(var i=0;i<t.changes.length;i++){var o=t.changes[i];\"text\"==o?cr(e,t):\"gutter\"==o?fr(e,t,r,n):\"class\"==o?hr(e,t):\"widget\"==o&&dr(e,t,n)}t.changes=null}function ar(e){return e.node==e.text&&(e.node=O(\"div\",null,null,\"position: relative\"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),l&&s<8&&(e.node.style.zIndex=2)),e.node}function ur(e,t){var r=e.display.externalMeasured;return r&&r.line==t.line?(e.display.externalMeasured=null,t.measure=r.measure,r.built):qt(e,t)}function cr(e,t){var r=t.text.className,n=ur(e,t);t.text==t.node&&(t.node=n.pre),t.text.parentNode.replaceChild(n.pre,t.text),t.text=n.pre,n.bgClass!=t.bgClass||n.textClass!=t.textClass?(t.bgClass=n.bgClass,t.textClass=n.textClass,hr(e,t)):r&&(t.text.className=r)}function hr(e,t){!function(e,t){var r=t.bgClass?t.bgClass+\" \"+(t.line.bgClass||\"\"):t.line.bgClass;if(r&&(r+=\" CodeMirror-linebackground\"),t.background)r?t.background.className=r:(t.background.parentNode.removeChild(t.background),t.background=null);else if(r){var n=ar(t);t.background=n.insertBefore(O(\"div\",null,r),n.firstChild),e.display.input.setUneditable(t.background)}}(e,t),t.line.wrapClass?ar(t).className=t.line.wrapClass:t.node!=t.text&&(t.node.className=\"\");var r=t.textClass?t.textClass+\" \"+(t.line.textClass||\"\"):t.line.textClass;t.text.className=r||\"\"}function fr(e,t,r,n){if(t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null),t.gutterBackground&&(t.node.removeChild(t.gutterBackground),t.gutterBackground=null),t.line.gutterClass){var i=ar(t);t.gutterBackground=O(\"div\",null,\"CodeMirror-gutter-background \"+t.line.gutterClass,\"left: \"+(e.options.fixedGutter?n.fixedPos:-n.gutterTotalWidth)+\"px; width: \"+n.gutterTotalWidth+\"px\"),e.display.input.setUneditable(t.gutterBackground),i.insertBefore(t.gutterBackground,t.text)}var o=t.line.gutterMarkers;if(e.options.lineNumbers||o){var l=ar(t),s=t.gutter=O(\"div\",null,\"CodeMirror-gutter-wrapper\",\"left: \"+(e.options.fixedGutter?n.fixedPos:-n.gutterTotalWidth)+\"px\");if(e.display.input.setUneditable(s),l.insertBefore(s,t.text),t.line.gutterClass&&(s.className+=\" \"+t.line.gutterClass),!e.options.lineNumbers||o&&o[\"CodeMirror-linenumbers\"]||(t.lineNumber=s.appendChild(O(\"div\",pe(e.options,r),\"CodeMirror-linenumber CodeMirror-gutter-elt\",\"left: \"+n.gutterLeft[\"CodeMirror-linenumbers\"]+\"px; width: \"+e.display.lineNumInnerWidth+\"px\"))),o)for(var a=0;a<e.options.gutters.length;++a){var u=e.options.gutters[a],c=o.hasOwnProperty(u)&&o[u];c&&s.appendChild(O(\"div\",[c],\"CodeMirror-gutter-elt\",\"left: \"+n.gutterLeft[u]+\"px; width: \"+n.gutterWidth[u]+\"px\"))}}}function dr(e,t,r){t.alignable&&(t.alignable=null);for(var n=t.node.firstChild,i=void 0;n;n=i)i=n.nextSibling,\"CodeMirror-linewidget\"==n.className&&t.node.removeChild(n);pr(e,t,r)}function pr(e,t,r){if(gr(e,t.line,t,r,!0),t.rest)for(var n=0;n<t.rest.length;n++)gr(e,t.rest[n],t,r,!1)}function gr(e,t,r,n,i){if(t.widgets)for(var o=ar(r),l=0,s=t.widgets;l<s.length;++l){var a=s[l],u=O(\"div\",[a.node],\"CodeMirror-linewidget\");a.handleMouseEvents||u.setAttribute(\"cm-ignore-events\",\"true\"),vr(a,u,r,n),e.display.input.setUneditable(u),i&&a.above?o.insertBefore(u,r.gutter||r.text):o.appendChild(u),or(a,\"redraw\")}}function vr(e,t,r,n){if(e.noHScroll){(r.alignable||(r.alignable=[])).push(t);var i=n.wrapperWidth;t.style.left=n.fixedPos+\"px\",e.coverGutter||(i-=n.gutterTotalWidth,t.style.paddingLeft=n.gutterTotalWidth+\"px\"),t.style.width=i+\"px\"}e.coverGutter&&(t.style.zIndex=5,t.style.position=\"relative\",e.noHScroll||(t.style.marginLeft=-n.gutterTotalWidth+\"px\"))}function mr(e){if(null!=e.height)return e.height;var t=e.doc.cm;if(!t)return 0;if(!D(document.body,e.node)){var r=\"position: relative;\";e.coverGutter&&(r+=\"margin-left: -\"+t.display.gutters.offsetWidth+\"px;\"),e.noHScroll&&(r+=\"width: \"+t.display.wrapper.clientWidth+\"px;\"),N(t.display.measure,O(\"div\",[e.node],null,r))}return e.height=e.node.parentNode.offsetHeight}function yr(e,t){for(var r=ht(t);r!=e.wrapper;r=r.parentNode)if(!r||1==r.nodeType&&\"true\"==r.getAttribute(\"cm-ignore-events\")||r.parentNode==e.sizer&&r!=e.mover)return!0}function br(e){return e.lineSpace.offsetTop}function wr(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function xr(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=N(e.measure,O(\"pre\",\"x\")),r=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle,n={left:parseInt(r.paddingLeft),right:parseInt(r.paddingRight)};return isNaN(n.left)||isNaN(n.right)||(e.cachedPaddingH=n),n}function Cr(e){return G-e.display.nativeBarWidth}function Sr(e){return e.display.scroller.clientWidth-Cr(e)-e.display.barWidth}function Lr(e){return e.display.scroller.clientHeight-Cr(e)-e.display.barHeight}function kr(e,t,r){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var n=0;n<e.rest.length;n++)if(e.rest[n]==t)return{map:e.measure.maps[n],cache:e.measure.caches[n]};for(var i=0;i<e.rest.length;i++)if(he(e.rest[i])>r)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function Tr(e,t,r,n){return Or(e,Nr(e,t),r,n)}function Mr(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.display.view[on(e,t)];var r=e.display.externalMeasured;return r&&t>=r.lineN&&t<r.lineN+r.size?r:void 0}function Nr(e,t){var r=he(t),n=Mr(e,r);n&&!n.text?n=null:n&&n.changes&&(sr(e,n,r,Jr(e)),e.curOp.forceUpdate=!0),n||(n=function(e,t){var r=he(t=Be(t)),n=e.display.externalMeasured=new tr(e.doc,t,r);n.lineN=r;var i=n.built=qt(e,n);return n.text=i.pre,N(e.display.lineMeasure,i.pre),n}(e,t));var i=kr(n,t,r);return{line:t,view:n,rect:null,map:i.map,cache:i.cache,before:i.before,hasHeights:!1}}function Or(e,t,r,n,i){t.before&&(r=-1);var o,a=r+(n||\"\");return t.cache.hasOwnProperty(a)?o=t.cache[a]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(!function(e,t,r){var n=e.options.lineWrapping,i=n&&Sr(e);if(!t.measure.heights||n&&t.measure.width!=i){var o=t.measure.heights=[];if(n){t.measure.width=i;for(var l=t.text.firstChild.getClientRects(),s=0;s<l.length-1;s++){var a=l[s],u=l[s+1];Math.abs(a.bottom-u.bottom)>2&&o.push((a.bottom+u.top)/2-r.top)}}o.push(r.bottom-r.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,r,n){var i,o=Wr(t.map,r,n),a=o.node,u=o.start,c=o.end,h=o.collapse;if(3==a.nodeType){for(var f=0;f<4;f++){for(;u&&ie(t.line.text.charAt(o.coverStart+u));)--u;for(;o.coverStart+c<o.coverEnd&&ie(t.line.text.charAt(o.coverStart+c));)++c;if((i=l&&s<9&&0==u&&c==o.coverEnd-o.coverStart?a.parentNode.getBoundingClientRect():Hr(k(a,u,c).getClientRects(),n)).left||i.right||0==u)break;c=u,u-=1,h=\"right\"}l&&s<11&&(i=function(e,t){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!function(e){if(null!=Ct)return Ct;var t=N(e,O(\"span\",\"x\")),r=t.getBoundingClientRect(),n=k(t,0,1).getBoundingClientRect();return Ct=Math.abs(r.left-n.left)>1}(e))return t;var r=screen.logicalXDPI/screen.deviceXDPI,n=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*r,right:t.right*r,top:t.top*n,bottom:t.bottom*n}}(e.display.measure,i))}else{var d;u>0&&(h=n=\"right\"),i=e.options.lineWrapping&&(d=a.getClientRects()).length>1?d[\"right\"==n?d.length-1:0]:a.getBoundingClientRect()}if(l&&s<9&&!u&&(!i||!i.left&&!i.right)){var p=a.parentNode.getClientRects()[0];i=p?{left:p.left,right:p.left+Qr(e.display),top:p.top,bottom:p.bottom}:Dr}for(var g=i.top-t.rect.top,v=i.bottom-t.rect.top,m=(g+v)/2,y=t.view.measure.heights,b=0;b<y.length-1&&!(m<y[b]);b++);var w=b?y[b-1]:0,x=y[b],C={left:(\"right\"==h?i.right:i.left)-t.rect.left,right:(\"left\"==h?i.left:i.right)-t.rect.left,top:w,bottom:x};i.left||i.right||(C.bogus=!0);e.options.singleCursorHeightPerLine||(C.rtop=g,C.rbottom=v);return C}(e,t,r,n)).bogus||(t.cache[a]=o)),{left:o.left,right:o.right,top:i?o.rtop:o.top,bottom:i?o.rbottom:o.bottom}}var Ar,Dr={left:0,right:0,top:0,bottom:0};function Wr(e,t,r){for(var n,i,o,l,s,a,u=0;u<e.length;u+=3)if(s=e[u],a=e[u+1],t<s?(i=0,o=1,l=\"left\"):t<a?o=(i=t-s)+1:(u==e.length-3||t==a&&e[u+3]>t)&&(i=(o=a-s)-1,t>=a&&(l=\"right\")),null!=i){if(n=e[u+2],s==a&&r==(n.insertLeft?\"left\":\"right\")&&(l=r),\"left\"==r&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)n=e[2+(u-=3)],l=\"left\";if(\"right\"==r&&i==a-s)for(;u<e.length-3&&e[u+3]==e[u+4]&&!e[u+5].insertLeft;)n=e[(u+=3)+2],l=\"right\";break}return{node:n,start:i,end:o,collapse:l,coverStart:s,coverEnd:a}}function Hr(e,t){var r=Dr;if(\"left\"==t)for(var n=0;n<e.length&&(r=e[n]).left==r.right;n++);else for(var i=e.length-1;i>=0&&(r=e[i]).left==r.right;i--);return r}function Fr(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t<e.rest.length;t++)e.measure.caches[t]={}}function Pr(e){e.display.externalMeasure=null,M(e.display.lineMeasure);for(var t=0;t<e.display.view.length;t++)Fr(e.display.view[t])}function Er(e){Pr(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function zr(){return c&&v?-(document.body.getBoundingClientRect().left-parseInt(getComputedStyle(document.body).marginLeft)):window.pageXOffset||(document.documentElement||document.body).scrollLeft}function Ir(){return c&&v?-(document.body.getBoundingClientRect().top-parseInt(getComputedStyle(document.body).marginTop)):window.pageYOffset||(document.documentElement||document.body).scrollTop}function Rr(e){var t=0;if(e.widgets)for(var r=0;r<e.widgets.length;++r)e.widgets[r].above&&(t+=mr(e.widgets[r]));return t}function Br(e,t,r,n,i){if(!i){var o=Rr(t);r.top+=o,r.bottom+=o}if(\"line\"==n)return r;n||(n=\"local\");var l=je(t);if(\"local\"==n?l+=br(e.display):l-=e.display.viewOffset,\"page\"==n||\"window\"==n){var s=e.display.lineSpace.getBoundingClientRect();l+=s.top+(\"window\"==n?0:Ir());var a=s.left+(\"window\"==n?0:zr());r.left+=a,r.right+=a}return r.top+=l,r.bottom+=l,r}function Gr(e,t,r){if(\"div\"==r)return t;var n=t.left,i=t.top;if(\"page\"==r)n-=zr(),i-=Ir();else if(\"local\"==r||!r){var o=e.display.sizer.getBoundingClientRect();n+=o.left,i+=o.top}var l=e.display.lineSpace.getBoundingClientRect();return{left:n-l.left,top:i-l.top}}function Ur(e,t,r,n,i){return n||(n=se(e.doc,t.line)),Br(e,n,Tr(e,n,t.ch,i),r)}function Vr(e,t,r,n,i,o){function l(t,l){var s=Or(e,i,t,l?\"right\":\"left\",o);return l?s.left=s.right:s.right=s.left,Br(e,n,s,r)}n=n||se(e.doc,t.line),i||(i=Nr(e,n));var s=Ze(n,e.doc.direction),a=t.ch,u=t.sticky;if(a>=n.text.length?(a=n.text.length,u=\"before\"):a<=0&&(a=0,u=\"after\"),!s)return l(\"before\"==u?a-1:a,\"before\"==u);function c(e,t,r){return l(r?e-1:e,1==s[t].level!=r)}var h=qe(s,a,u),f=_e,d=c(a,h,\"before\"==u);return null!=f&&(d.other=c(a,f,\"before\"!=u)),d}function Kr(e,t){var r=0;t=Ce(e.doc,t),e.options.lineWrapping||(r=Qr(e.display)*t.ch);var n=se(e.doc,t.line),i=je(n)+br(e.display);return{left:r,right:r,top:i,bottom:i+n.height}}function jr(e,t,r,n,i){var o=ge(e,t,r);return o.xRel=i,n&&(o.outside=!0),o}function Xr(e,t,r){var n=e.doc;if((r+=e.display.viewOffset)<0)return jr(n.first,0,null,!0,-1);var i=fe(n,r),o=n.first+n.size-1;if(i>o)return jr(n.first+n.size-1,se(n,o).text.length,null,!0,1);t<0&&(t=0);for(var l=se(n,i);;){var s=$r(e,l,i,t,r),a=Ie(l),u=a&&a.find(0,!0);if(!a||!(s.ch>u.from.ch||s.ch==u.from.ch&&s.xRel>0))return s;i=he(l=u.to.line)}}function Yr(e,t,r,n){n-=Rr(t);var i=t.text.length,o=le(function(t){return Or(e,r,t-1).bottom<=n},i,0);return{begin:o,end:i=le(function(t){return Or(e,r,t).top>n},o,i)}}function _r(e,t,r,n){return r||(r=Nr(e,t)),Yr(e,t,r,Br(e,t,Or(e,r,n),\"line\").top)}function qr(e,t,r,n){return!(e.bottom<=r)&&(e.top>r||(n?e.left:e.right)>t)}function $r(e,t,r,n,i){i-=je(t);var o=Nr(e,t),l=Rr(t),s=0,a=t.text.length,u=!0,c=Ze(t,e.doc.direction);if(c){var h=(e.options.lineWrapping?function(e,t,r,n,i,o,l){var s=Yr(e,t,n,l),a=s.begin,u=s.end;/\\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,h=null,f=0;f<i.length;f++){var d=i[f];if(!(d.from>=u||d.to<=a)){var p=1!=d.level,g=Or(e,n,p?Math.min(u,d.to)-1:Math.max(a,d.from)).right,v=g<o?o-g+1e9:g-o;(!c||h>v)&&(c=d,h=v)}}c||(c=i[i.length-1]);c.from<a&&(c={from:a,to:c.to,level:c.level});c.to>u&&(c={from:c.from,to:u,level:c.level});return c}:function(e,t,r,n,i,o,l){var s=le(function(s){var a=i[s],u=1!=a.level;return qr(Vr(e,ge(r,u?a.to:a.from,u?\"before\":\"after\"),\"line\",t,n),o,l,!0)},0,i.length-1),a=i[s];if(s>0){var u=1!=a.level,c=Vr(e,ge(r,u?a.from:a.to,u?\"after\":\"before\"),\"line\",t,n);qr(c,o,l,!0)&&c.top>l&&(a=i[s-1])}return a})(e,t,r,o,c,n,i);s=(u=1!=h.level)?h.from:h.to-1,a=u?h.to:h.from-1}var f,d,p=null,g=null,v=le(function(t){var r=Or(e,o,t);return r.top+=l,r.bottom+=l,!!qr(r,n,i,!1)&&(r.top<=i&&r.left<=n&&(p=t,g=r),!0)},s,a),m=!1;if(g){var y=n-g.left<g.right-n,b=y==u;v=p+(b?0:1),d=b?\"after\":\"before\",f=y?g.left:g.right}else{u||v!=a&&v!=s||v++,d=0==v?\"after\":v==t.text.length?\"before\":Or(e,o,v-(u?1:0)).bottom+l<=i==u?\"after\":\"before\";var w=Vr(e,ge(r,v,d),\"line\",t,o);f=w.left,m=i<w.top||i>=w.bottom}return jr(r,v=oe(t.text,v,1),d,m,n-f)}function Zr(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Ar){Ar=O(\"pre\");for(var t=0;t<49;++t)Ar.appendChild(document.createTextNode(\"x\")),Ar.appendChild(O(\"br\"));Ar.appendChild(document.createTextNode(\"x\"))}N(e.measure,Ar);var r=Ar.offsetHeight/50;return r>3&&(e.cachedTextHeight=r),M(e.measure),r||1}function Qr(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=O(\"span\",\"xxxxxxxxxx\"),r=O(\"pre\",[t]);N(e.measure,r);var n=t.getBoundingClientRect(),i=(n.right-n.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function Jr(e){for(var t=e.display,r={},n={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l)r[e.options.gutters[l]]=o.offsetLeft+o.clientLeft+i,n[e.options.gutters[l]]=o.clientWidth;return{fixedPos:en(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:r,gutterWidth:n,wrapperWidth:t.wrapper.clientWidth}}function en(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function tn(e){var t=Zr(e.display),r=e.options.lineWrapping,n=r&&Math.max(5,e.display.scroller.clientWidth/Qr(e.display)-3);return function(i){if(Ve(e.doc,i))return 0;var o=0;if(i.widgets)for(var l=0;l<i.widgets.length;l++)i.widgets[l].height&&(o+=i.widgets[l].height);return r?o+(Math.ceil(i.text.length/n)||1)*t:o+t}}function rn(e){var t=e.doc,r=tn(e);t.iter(function(e){var t=r(e);t!=e.height&&ce(e,t)})}function nn(e,t,r,n){var i=e.display;if(!r&&\"true\"==ht(t).getAttribute(\"cm-not-content\"))return null;var o,l,s=i.lineSpace.getBoundingClientRect();try{o=t.clientX-s.left,l=t.clientY-s.top}catch(t){return null}var a,u=Xr(e,o,l);if(n&&1==u.xRel&&(a=se(e.doc,u.line).text).length==u.ch){var c=I(a,a.length,e.options.tabSize)-a.length;u=ge(u.line,Math.max(0,Math.round((o-xr(e.display).left)/Qr(e.display))-c))}return u}function on(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var r=e.display.view,n=0;n<r.length;n++)if((t-=r[n].size)<0)return n}function ln(e){e.display.input.showSelection(e.display.input.prepareSelection())}function sn(e,t){void 0===t&&(t=!0);for(var r=e.doc,n={},i=n.cursors=document.createDocumentFragment(),o=n.selection=document.createDocumentFragment(),l=0;l<r.sel.ranges.length;l++)if(t||l!=r.sel.primIndex){var s=r.sel.ranges[l];if(!(s.from().line>=e.display.viewTo||s.to().line<e.display.viewFrom)){var a=s.empty();(a||e.options.showCursorWhenSelecting)&&an(e,s.head,i),a||cn(e,s,o)}}return n}function an(e,t,r){var n=Vr(e,t,\"div\",null,null,!e.options.singleCursorHeightPerLine),i=r.appendChild(O(\"div\",\" \",\"CodeMirror-cursor\"));if(i.style.left=n.left+\"px\",i.style.top=n.top+\"px\",i.style.height=Math.max(0,n.bottom-n.top)*e.options.cursorHeight+\"px\",n.other){var o=r.appendChild(O(\"div\",\" \",\"CodeMirror-cursor CodeMirror-secondarycursor\"));o.style.display=\"\",o.style.left=n.other.left+\"px\",o.style.top=n.other.top+\"px\",o.style.height=.85*(n.other.bottom-n.other.top)+\"px\"}}function un(e,t){return e.top-t.top||e.left-t.left}function cn(e,t,r){var n=e.display,i=e.doc,o=document.createDocumentFragment(),l=xr(e.display),s=l.left,a=Math.max(n.sizerWidth,Sr(e)-n.sizer.offsetLeft)-l.right,u=\"ltr\"==i.direction;function c(e,t,r,n){t<0&&(t=0),t=Math.round(t),n=Math.round(n),o.appendChild(O(\"div\",null,\"CodeMirror-selected\",\"position: absolute; left: \"+e+\"px;\\n top: \"+t+\"px; width: \"+(null==r?a-e:r)+\"px;\\n height: \"+(n-t)+\"px\"))}function h(t,r,n){var o,l,h=se(i,t),f=h.text.length;function d(r,n){return Ur(e,ge(t,r),\"div\",h,n)}function p(t,r,n){var i=_r(e,h,null,t),o=\"ltr\"==r==(\"after\"==n)?\"left\":\"right\";return d(\"after\"==n?i.begin:i.end-(/\\s/.test(h.text.charAt(i.end-1))?2:1),o)[o]}var g=Ze(h,i.direction);return function(e,t,r,n){if(!e)return n(t,r,\"ltr\",0);for(var i=!1,o=0;o<e.length;++o){var l=e[o];(l.from<r&&l.to>t||t==r&&l.to==t)&&(n(Math.max(l.from,t),Math.min(l.to,r),1==l.level?\"rtl\":\"ltr\",o),i=!0)}i||n(t,r,\"ltr\")}(g,r||0,null==n?f:n,function(e,t,i,h){var v=\"ltr\"==i,m=d(e,v?\"left\":\"right\"),y=d(t-1,v?\"right\":\"left\"),b=null==r&&0==e,w=null==n&&t==f,x=0==h,C=!g||h==g.length-1;if(y.top-m.top<=3){var S=(u?w:b)&&C,L=(u?b:w)&&x?s:(v?m:y).left,k=S?a:(v?y:m).right;c(L,m.top,k-L,m.bottom)}else{var T,M,N,O;v?(T=u&&b&&x?s:m.left,M=u?a:p(e,i,\"before\"),N=u?s:p(t,i,\"after\"),O=u&&w&&C?a:y.right):(T=u?p(e,i,\"before\"):s,M=!u&&b&&x?a:m.right,N=!u&&w&&C?s:y.left,O=u?p(t,i,\"after\"):a),c(T,m.top,M-T,m.bottom),m.bottom<y.top&&c(s,m.bottom,null,y.top),c(N,y.top,O-N,y.bottom)}(!o||un(m,o)<0)&&(o=m),un(y,o)<0&&(o=y),(!l||un(m,l)<0)&&(l=m),un(y,l)<0&&(l=y)}),{start:o,end:l}}var f=t.from(),d=t.to();if(f.line==d.line)h(f.line,f.ch,d.ch);else{var p=se(i,f.line),g=se(i,d.line),v=Be(p)==Be(g),m=h(f.line,f.ch,v?p.text.length+1:null).end,y=h(d.line,v?0:null,d.ch).start;v&&(m.top<y.top-2?(c(m.right,m.top,null,m.bottom),c(s,y.top,y.left,y.bottom)):c(m.right,m.top,y.left-m.right,m.bottom)),m.bottom<y.top&&c(s,m.bottom,null,y.top)}r.appendChild(o)}function hn(e){if(e.state.focused){var t=e.display;clearInterval(t.blinker);var r=!0;t.cursorDiv.style.visibility=\"\",e.options.cursorBlinkRate>0?t.blinker=setInterval(function(){return t.cursorDiv.style.visibility=(r=!r)?\"\":\"hidden\"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility=\"hidden\")}}function fn(e){e.state.focused||(e.display.input.focus(),pn(e))}function dn(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,gn(e))},100)}function pn(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),\"nocursor\"!=e.options.readOnly&&(e.state.focused||(rt(e,\"focus\",e,t),e.state.focused=!0,H(e.display.wrapper,\"CodeMirror-focused\"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),a&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),hn(e))}function gn(e,t){e.state.delayingBlurEvent||(e.state.focused&&(rt(e,\"blur\",e,t),e.state.focused=!1,T(e.display.wrapper,\"CodeMirror-focused\")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function vn(e){for(var t=e.display,r=t.lineDiv.offsetTop,n=0;n<t.view.length;n++){var i=t.view[n],o=void 0;if(!i.hidden){if(l&&s<8){var a=i.node.offsetTop+i.node.offsetHeight;o=a-r,r=a}else{var u=i.node.getBoundingClientRect();o=u.bottom-u.top}var c=i.line.height-o;if(o<2&&(o=Zr(t)),(c>.005||c<-.005)&&(ce(i.line,o),mn(i.line),i.rest))for(var h=0;h<i.rest.length;h++)mn(i.rest[h])}}}function mn(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t){var r=e.widgets[t],n=r.node.parentNode;n&&(r.height=n.offsetHeight)}}function yn(e,t,r){var n=r&&null!=r.top?Math.max(0,r.top):e.scroller.scrollTop;n=Math.floor(n-br(e));var i=r&&null!=r.bottom?r.bottom:n+e.wrapper.clientHeight,o=fe(t,n),l=fe(t,i);if(r&&r.ensure){var s=r.ensure.from.line,a=r.ensure.to.line;s<o?(o=s,l=fe(t,je(se(t,s))+e.wrapper.clientHeight)):Math.min(a,t.lastLine())>=l&&(o=fe(t,je(se(t,a))-e.wrapper.clientHeight),l=a)}return{from:o,to:Math.max(l,o+1)}}function bn(e){var t=e.display,r=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var n=en(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=n+\"px\",l=0;l<r.length;l++)if(!r[l].hidden){e.options.fixedGutter&&(r[l].gutter&&(r[l].gutter.style.left=o),r[l].gutterBackground&&(r[l].gutterBackground.style.left=o));var s=r[l].alignable;if(s)for(var a=0;a<s.length;a++)s[a].style.left=o}e.options.fixedGutter&&(t.gutters.style.left=n+i+\"px\")}}function wn(e){if(!e.options.lineNumbers)return!1;var t=e.doc,r=pe(e.options,t.first+t.size-1),n=e.display;if(r.length!=n.lineNumChars){var i=n.measure.appendChild(O(\"div\",[O(\"div\",r)],\"CodeMirror-linenumber CodeMirror-gutter-elt\")),o=i.firstChild.offsetWidth,l=i.offsetWidth-o;return n.lineGutter.style.width=\"\",n.lineNumInnerWidth=Math.max(o,n.lineGutter.offsetWidth-l)+1,n.lineNumWidth=n.lineNumInnerWidth+l,n.lineNumChars=n.lineNumInnerWidth?r.length:-1,n.lineGutter.style.width=n.lineNumWidth+\"px\",oi(e),!0}return!1}function xn(e,t){var r=e.display,n=Zr(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:r.scroller.scrollTop,o=Lr(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s=e.doc.height+wr(r),a=t.top<n,u=t.bottom>s-n;if(t.top<i)l.scrollTop=a?0:t.top;else if(t.bottom>i+o){var c=Math.min(t.top,(u?s:t.bottom)-o);c!=i&&(l.scrollTop=c)}var h=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:r.scroller.scrollLeft,f=Sr(e)-(e.options.fixedGutter?r.gutters.offsetWidth:0),d=t.right-t.left>f;return d&&(t.right=t.left+f),t.left<10?l.scrollLeft=0:t.left<h?l.scrollLeft=Math.max(0,t.left-(d?0:10)):t.right>f+h-3&&(l.scrollLeft=t.right+(d?0:10)-f),l}function Cn(e,t){null!=t&&(kn(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function Sn(e){kn(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function Ln(e,t,r){null==t&&null==r||kn(e),null!=t&&(e.curOp.scrollLeft=t),null!=r&&(e.curOp.scrollTop=r)}function kn(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Tn(e,Kr(e,t.from),Kr(e,t.to),t.margin))}function Tn(e,t,r,n){var i=xn(e,{left:Math.min(t.left,r.left),top:Math.min(t.top,r.top)-n,right:Math.max(t.right,r.right),bottom:Math.max(t.bottom,r.bottom)+n});Ln(e,i.scrollLeft,i.scrollTop)}function Mn(e,t){Math.abs(e.doc.scrollTop-t)<2||(r||ii(e,{top:t}),Nn(e,t,!0),r&&ii(e),Jn(e,100))}function Nn(e,t,r){t=Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t),(e.display.scroller.scrollTop!=t||r)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function On(e,t,r,n){t=Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth),(r?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!n||(e.doc.scrollLeft=t,bn(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function An(e){var t=e.display,r=t.gutters.offsetWidth,n=Math.round(e.doc.height+wr(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?r:0,docHeight:n,scrollHeight:n+Cr(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:r}}var Dn=function(e,t,r){this.cm=r;var n=this.vert=O(\"div\",[O(\"div\",null,null,\"min-width: 1px\")],\"CodeMirror-vscrollbar\"),i=this.horiz=O(\"div\",[O(\"div\",null,null,\"height: 100%; min-height: 1px\")],\"CodeMirror-hscrollbar\");e(n),e(i),Je(n,\"scroll\",function(){n.clientHeight&&t(n.scrollTop,\"vertical\")}),Je(i,\"scroll\",function(){i.clientWidth&&t(i.scrollLeft,\"horizontal\")}),this.checkedZeroWidth=!1,l&&s<8&&(this.horiz.style.minHeight=this.vert.style.minWidth=\"18px\")};Dn.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,r=e.scrollHeight>e.clientHeight+1,n=e.nativeBarWidth;if(r){this.vert.style.display=\"block\",this.vert.style.bottom=t?n+\"px\":\"0\";var i=e.viewHeight-(t?n:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+\"px\"}else this.vert.style.display=\"\",this.vert.firstChild.style.height=\"0\";if(t){this.horiz.style.display=\"block\",this.horiz.style.right=r?n+\"px\":\"0\",this.horiz.style.left=e.barLeft+\"px\";var o=e.viewWidth-e.barLeft-(r?n:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+o)+\"px\"}else this.horiz.style.display=\"\",this.horiz.firstChild.style.width=\"0\";return!this.checkedZeroWidth&&e.clientHeight>0&&(0==n&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:r?n:0,bottom:t?n:0}},Dn.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,\"horiz\")},Dn.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,\"vert\")},Dn.prototype.zeroWidthHack=function(){var e=y&&!d?\"12px\":\"18px\";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents=\"none\",this.disableHoriz=new R,this.disableVert=new R},Dn.prototype.enableZeroWidthBar=function(e,t,r){e.style.pointerEvents=\"auto\",t.set(1e3,function n(){var i=e.getBoundingClientRect();(\"vert\"==r?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1))!=e?e.style.pointerEvents=\"none\":t.set(1e3,n)})},Dn.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var Wn=function(){};function Hn(e,t){t||(t=An(e));var r=e.display.barWidth,n=e.display.barHeight;Fn(e,t);for(var i=0;i<4&&r!=e.display.barWidth||n!=e.display.barHeight;i++)r!=e.display.barWidth&&e.options.lineWrapping&&vn(e),Fn(e,An(e)),r=e.display.barWidth,n=e.display.barHeight}function Fn(e,t){var r=e.display,n=r.scrollbars.update(t);r.sizer.style.paddingRight=(r.barWidth=n.right)+\"px\",r.sizer.style.paddingBottom=(r.barHeight=n.bottom)+\"px\",r.heightForcer.style.borderBottom=n.bottom+\"px solid transparent\",n.right&&n.bottom?(r.scrollbarFiller.style.display=\"block\",r.scrollbarFiller.style.height=n.bottom+\"px\",r.scrollbarFiller.style.width=n.right+\"px\"):r.scrollbarFiller.style.display=\"\",n.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(r.gutterFiller.style.display=\"block\",r.gutterFiller.style.height=n.bottom+\"px\",r.gutterFiller.style.width=t.gutterWidth+\"px\"):r.gutterFiller.style.display=\"\"}Wn.prototype.update=function(){return{bottom:0,right:0}},Wn.prototype.setScrollLeft=function(){},Wn.prototype.setScrollTop=function(){},Wn.prototype.clear=function(){};var Pn={native:Dn,null:Wn};function En(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&T(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new Pn[e.options.scrollbarStyle](function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),Je(t,\"mousedown\",function(){e.state.focused&&setTimeout(function(){return e.display.input.focus()},0)}),t.setAttribute(\"cm-not-content\",\"true\")},function(t,r){\"horizontal\"==r?On(e,t):Mn(e,t)},e),e.display.scrollbars.addClass&&H(e.display.wrapper,e.display.scrollbars.addClass)}var zn=0;function In(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++zn},t=e.curOp,nr?nr.ops.push(t):t.ownsGroup=nr={ops:[t],delayedCallbacks:[]}}function Rn(e){!function(e,t){var r=e.ownsGroup;if(r)try{!function(e){var t=e.delayedCallbacks,r=0;do{for(;r<t.length;r++)t[r].call(null);for(var n=0;n<e.ops.length;n++){var i=e.ops[n];if(i.cursorActivityHandlers)for(;i.cursorActivityCalled<i.cursorActivityHandlers.length;)i.cursorActivityHandlers[i.cursorActivityCalled++].call(null,i.cm)}}while(r<t.length)}(r)}finally{nr=null,t(r)}}(e.curOp,function(e){for(var t=0;t<e.ops.length;t++)e.ops[t].cm.curOp=null;!function(e){for(var t=e.ops,r=0;r<t.length;r++)Bn(t[r]);for(var n=0;n<t.length;n++)(i=t[n]).updatedDisplay=i.mustUpdate&&ri(i.cm,i.update);var i;for(var o=0;o<t.length;o++)Gn(t[o]);for(var l=0;l<t.length;l++)Un(t[l]);for(var s=0;s<t.length;s++)Vn(t[s])}(e)})}function Bn(e){var t,r,n=e.cm,i=n.display;!(r=(t=n).display).scrollbarsClipped&&r.scroller.offsetWidth&&(r.nativeBarWidth=r.scroller.offsetWidth-r.scroller.clientWidth,r.heightForcer.style.height=Cr(t)+\"px\",r.sizer.style.marginBottom=-r.nativeBarWidth+\"px\",r.sizer.style.borderRightWidth=Cr(t)+\"px\",r.scrollbarsClipped=!0),e.updateMaxLine&&Ye(n),e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<i.viewFrom||e.scrollToPos.to.line>=i.viewTo)||i.maxLineChanged&&n.options.lineWrapping,e.update=e.mustUpdate&&new ti(n,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function Gn(e){var t=e.cm,r=t.display;e.updatedDisplay&&vn(t),e.barMeasure=An(t),r.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Tr(t,r.maxLine,r.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(r.scroller.clientWidth,r.sizer.offsetLeft+e.adjustWidthTo+Cr(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,r.sizer.offsetLeft+e.adjustWidthTo-Sr(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=r.input.prepareSelection())}function Un(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+\"px\",e.maxScrollLeft<t.doc.scrollLeft&&On(t,Math.min(t.display.scroller.scrollLeft,e.maxScrollLeft),!0),t.display.maxLineChanged=!1);var r=e.focus&&e.focus==W();e.preparedSelection&&t.display.input.showSelection(e.preparedSelection,r),(e.updatedDisplay||e.startHeight!=t.doc.height)&&Hn(t,e.barMeasure),e.updatedDisplay&&li(t,e.barMeasure),e.selectionChanged&&hn(t),t.state.focused&&e.updateInput&&t.display.input.reset(e.typing),r&&fn(e.cm)}function Vn(e){var t=e.cm,r=t.display,n=t.doc;(e.updatedDisplay&&ni(t,e.update),null==r.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(r.wheelStartX=r.wheelStartY=null),null!=e.scrollTop&&Nn(t,e.scrollTop,e.forceScroll),null!=e.scrollLeft&&On(t,e.scrollLeft,!0,!0),e.scrollToPos)&&function(e,t){if(!nt(e,\"scrollCursorIntoView\")){var r=e.display,n=r.sizer.getBoundingClientRect(),i=null;if(t.top+n.top<0?i=!0:t.bottom+n.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null!=i&&!p){var o=O(\"div\",\"\",null,\"position: absolute;\\n top: \"+(t.top-r.viewOffset-br(e.display))+\"px;\\n height: \"+(t.bottom-t.top+Cr(e)+r.barHeight)+\"px;\\n left: \"+t.left+\"px; width: \"+Math.max(2,t.right-t.left)+\"px;\");e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)}}}(t,function(e,t,r,n){var i;null==n&&(n=0),e.options.lineWrapping||t!=r||(r=\"before\"==(t=t.ch?ge(t.line,\"before\"==t.sticky?t.ch-1:t.ch,\"after\"):t).sticky?ge(t.line,t.ch+1,\"before\"):t);for(var o=0;o<5;o++){var l=!1,s=Vr(e,t),a=r&&r!=t?Vr(e,r):s,u=xn(e,i={left:Math.min(s.left,a.left),top:Math.min(s.top,a.top)-n,right:Math.max(s.left,a.left),bottom:Math.max(s.bottom,a.bottom)+n}),c=e.doc.scrollTop,h=e.doc.scrollLeft;if(null!=u.scrollTop&&(Mn(e,u.scrollTop),Math.abs(e.doc.scrollTop-c)>1&&(l=!0)),null!=u.scrollLeft&&(On(e,u.scrollLeft),Math.abs(e.doc.scrollLeft-h)>1&&(l=!0)),!l)break}return i}(t,Ce(n,e.scrollToPos.from),Ce(n,e.scrollToPos.to),e.scrollToPos.margin));var i=e.maybeHiddenMarkers,o=e.maybeUnhiddenMarkers;if(i)for(var l=0;l<i.length;++l)i[l].lines.length||rt(i[l],\"hide\");if(o)for(var s=0;s<o.length;++s)o[s].lines.length&&rt(o[s],\"unhide\");r.wrapper.offsetHeight&&(n.scrollTop=t.display.scroller.scrollTop),e.changeObjs&&rt(t,\"changes\",t,e.changeObjs),e.update&&e.update.finish()}function Kn(e,t){if(e.curOp)return t();In(e);try{return t()}finally{Rn(e)}}function jn(e,t){return function(){if(e.curOp)return t.apply(e,arguments);In(e);try{return t.apply(e,arguments)}finally{Rn(e)}}}function Xn(e){return function(){if(this.curOp)return e.apply(this,arguments);In(this);try{return e.apply(this,arguments)}finally{Rn(this)}}}function Yn(e){return function(){var t=this.cm;if(!t||t.curOp)return e.apply(this,arguments);In(t);try{return e.apply(this,arguments)}finally{Rn(t)}}}function _n(e,t,r,n){null==t&&(t=e.doc.first),null==r&&(r=e.doc.first+e.doc.size),n||(n=0);var i=e.display;if(n&&r<i.viewTo&&(null==i.updateLineNumbers||i.updateLineNumbers>t)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)ke&&Ge(e.doc,t)<i.viewTo&&$n(e);else if(r<=i.viewFrom)ke&&Ue(e.doc,r+n)>i.viewFrom?$n(e):(i.viewFrom+=n,i.viewTo+=n);else if(t<=i.viewFrom&&r>=i.viewTo)$n(e);else if(t<=i.viewFrom){var o=Zn(e,r,r+n,1);o?(i.view=i.view.slice(o.index),i.viewFrom=o.lineN,i.viewTo+=n):$n(e)}else if(r>=i.viewTo){var l=Zn(e,t,t,-1);l?(i.view=i.view.slice(0,l.index),i.viewTo=l.lineN):$n(e)}else{var s=Zn(e,t,t,-1),a=Zn(e,r,r+n,1);s&&a?(i.view=i.view.slice(0,s.index).concat(rr(e,s.lineN,a.lineN)).concat(i.view.slice(a.index)),i.viewTo+=n):$n(e)}var u=i.externalMeasured;u&&(r<u.lineN?u.lineN+=n:t<u.lineN+u.size&&(i.externalMeasured=null))}function qn(e,t,r){e.curOp.viewChanged=!0;var n=e.display,i=e.display.externalMeasured;if(i&&t>=i.lineN&&t<i.lineN+i.size&&(n.externalMeasured=null),!(t<n.viewFrom||t>=n.viewTo)){var o=n.view[on(e,t)];if(null!=o.node){var l=o.changes||(o.changes=[]);-1==B(l,r)&&l.push(r)}}}function $n(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function Zn(e,t,r,n){var i,o=on(e,t),l=e.display.view;if(!ke||r==e.doc.first+e.doc.size)return{index:o,lineN:r};for(var s=e.display.viewFrom,a=0;a<o;a++)s+=l[a].size;if(s!=t){if(n>0){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,r+=i}for(;Ge(e.doc,r)!=r;){if(o==(n<0?0:l.length-1))return null;r+=n*l[o-(n<0?1:0)].size,o+=n}return{index:o,lineN:r}}function Qn(e){for(var t=e.display.view,r=0,n=0;n<t.length;n++){var i=t[n];i.hidden||i.node&&!i.changes||++r}return r}function Jn(e,t){e.doc.highlightFrontier<e.display.viewTo&&e.state.highlight.set(t,E(ei,e))}function ei(e){var t=e.doc;if(!(t.highlightFrontier>=e.display.viewTo)){var r=+new Date+e.options.workTime,n=zt(e,t.highlightFrontier),i=[];t.iter(n.line,Math.min(t.first+t.size,e.display.viewTo+500),function(o){if(n.line>=e.display.viewFrom){var l=o.styles,s=o.text.length>e.options.maxHighlightLength?Ot(t.mode,n.state):null,a=Pt(e,o,n,!0);s&&(n.state=s),o.styles=a.styles;var u=o.styleClasses,c=a.classes;c?o.styleClasses=c:u&&(o.styleClasses=null);for(var h=!l||l.length!=o.styles.length||u!=c&&(!u||!c||u.bgClass!=c.bgClass||u.textClass!=c.textClass),f=0;!h&&f<l.length;++f)h=l[f]!=o.styles[f];h&&i.push(n.line),o.stateAfter=n.save(),n.nextLine()}else o.text.length<=e.options.maxHighlightLength&&It(e,o.text,n),o.stateAfter=n.line%5==0?n.save():null,n.nextLine();if(+new Date>r)return Jn(e,e.options.workDelay),!0}),t.highlightFrontier=n.line,t.modeFrontier=Math.max(t.modeFrontier,n.line),i.length&&Kn(e,function(){for(var t=0;t<i.length;t++)qn(e,i[t],\"text\")})}}var ti=function(e,t,r){var n=e.display;this.viewport=t,this.visible=yn(n,e.doc,t),this.editorIsHidden=!n.wrapper.offsetWidth,this.wrapperHeight=n.wrapper.clientHeight,this.wrapperWidth=n.wrapper.clientWidth,this.oldDisplayWidth=Sr(e),this.force=r,this.dims=Jr(e),this.events=[]};function ri(e,t){var r=e.display,n=e.doc;if(t.editorIsHidden)return $n(e),!1;if(!t.force&&t.visible.from>=r.viewFrom&&t.visible.to<=r.viewTo&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo)&&r.renderedView==r.view&&0==Qn(e))return!1;wn(e)&&($n(e),t.dims=Jr(e));var i=n.first+n.size,o=Math.max(t.visible.from-e.options.viewportMargin,n.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);r.viewFrom<o&&o-r.viewFrom<20&&(o=Math.max(n.first,r.viewFrom)),r.viewTo>l&&r.viewTo-l<20&&(l=Math.min(i,r.viewTo)),ke&&(o=Ge(e.doc,o),l=Ue(e.doc,l));var s,u,c,h,f=o!=r.viewFrom||l!=r.viewTo||r.lastWrapHeight!=t.wrapperHeight||r.lastWrapWidth!=t.wrapperWidth;u=o,c=l,0==(h=(s=e).display).view.length||u>=h.viewTo||c<=h.viewFrom?(h.view=rr(s,u,c),h.viewFrom=u):(h.viewFrom>u?h.view=rr(s,u,h.viewFrom).concat(h.view):h.viewFrom<u&&(h.view=h.view.slice(on(s,u))),h.viewFrom=u,h.viewTo<c?h.view=h.view.concat(rr(s,h.viewTo,c)):h.viewTo>c&&(h.view=h.view.slice(0,on(s,c)))),h.viewTo=c,r.viewOffset=je(se(e.doc,r.viewFrom)),e.display.mover.style.top=r.viewOffset+\"px\";var d=Qn(e);if(!f&&0==d&&!t.force&&r.renderedView==r.view&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo))return!1;var p=function(e){if(e.hasFocus())return null;var t=W();if(!t||!D(e.display.lineDiv,t))return null;var r={activeElt:t};if(window.getSelection){var n=window.getSelection();n.anchorNode&&n.extend&&D(e.display.lineDiv,n.anchorNode)&&(r.anchorNode=n.anchorNode,r.anchorOffset=n.anchorOffset,r.focusNode=n.focusNode,r.focusOffset=n.focusOffset)}return r}(e);return d>4&&(r.lineDiv.style.display=\"none\"),function(e,t,r){var n=e.display,i=e.options.lineNumbers,o=n.lineDiv,l=o.firstChild;function s(t){var r=t.nextSibling;return a&&y&&e.display.currentWheelTarget==t?t.style.display=\"none\":t.parentNode.removeChild(t),r}for(var u=n.view,c=n.viewFrom,h=0;h<u.length;h++){var f=u[h];if(f.hidden);else if(f.node&&f.node.parentNode==o){for(;l!=f.node;)l=s(l);var d=i&&null!=t&&t<=c&&f.lineNumber;f.changes&&(B(f.changes,\"gutter\")>-1&&(d=!1),sr(e,f,c,r)),d&&(M(f.lineNumber),f.lineNumber.appendChild(document.createTextNode(pe(e.options,c)))),l=f.node.nextSibling}else{var p=(m=c,b=r,void 0,w=ur(g=e,v=f),v.text=v.node=w.pre,w.bgClass&&(v.bgClass=w.bgClass),w.textClass&&(v.textClass=w.textClass),hr(g,v),fr(g,v,m,b),pr(g,v,b),v.node);o.insertBefore(p,l)}c+=f.size}var g,v,m,b,w;for(;l;)l=s(l)}(e,r.updateLineNumbers,t.dims),d>4&&(r.lineDiv.style.display=\"\"),r.renderedView=r.view,function(e){if(e&&e.activeElt&&e.activeElt!=W()&&(e.activeElt.focus(),e.anchorNode&&D(document.body,e.anchorNode)&&D(document.body,e.focusNode))){var t=window.getSelection(),r=document.createRange();r.setEnd(e.anchorNode,e.anchorOffset),r.collapse(!1),t.removeAllRanges(),t.addRange(r),t.extend(e.focusNode,e.focusOffset)}}(p),M(r.cursorDiv),M(r.selectionDiv),r.gutters.style.height=r.sizer.style.minHeight=0,f&&(r.lastWrapHeight=t.wrapperHeight,r.lastWrapWidth=t.wrapperWidth,Jn(e,400)),r.updateLineNumbers=null,!0}function ni(e,t){for(var r=t.viewport,n=!0;(n&&e.options.lineWrapping&&t.oldDisplayWidth!=Sr(e)||(r&&null!=r.top&&(r={top:Math.min(e.doc.height+wr(e.display)-Lr(e),r.top)}),t.visible=yn(e.display,e.doc,r),!(t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)))&&ri(e,t);n=!1){vn(e);var i=An(e);ln(e),Hn(e,i),li(e,i),t.force=!1}t.signal(e,\"update\",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,\"viewportChange\",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function ii(e,t){var r=new ti(e,t);if(ri(e,r)){vn(e),ni(e,r);var n=An(e);ln(e),Hn(e,n),li(e,n),r.finish()}}function oi(e){var t=e.display.gutters.offsetWidth;e.display.sizer.style.marginLeft=t+\"px\"}function li(e,t){e.display.sizer.style.minHeight=t.docHeight+\"px\",e.display.heightForcer.style.top=t.docHeight+\"px\",e.display.gutters.style.height=t.docHeight+e.display.barHeight+Cr(e)+\"px\"}function si(e){var t=e.display.gutters,r=e.options.gutters;M(t);for(var n=0;n<r.length;++n){var i=r[n],o=t.appendChild(O(\"div\",null,\"CodeMirror-gutter \"+i));\"CodeMirror-linenumbers\"==i&&(e.display.lineGutter=o,o.style.width=(e.display.lineNumWidth||1)+\"px\")}t.style.display=n?\"\":\"none\",oi(e)}function ai(e){var t=B(e.gutters,\"CodeMirror-linenumbers\");-1==t&&e.lineNumbers?e.gutters=e.gutters.concat([\"CodeMirror-linenumbers\"]):t>-1&&!e.lineNumbers&&(e.gutters=e.gutters.slice(0),e.gutters.splice(t,1))}ti.prototype.signal=function(e,t){ot(e,t)&&this.events.push(arguments)},ti.prototype.finish=function(){for(var e=0;e<this.events.length;e++)rt.apply(null,this.events[e])};var ui=0,ci=null;function hi(e){var t=e.wheelDeltaX,r=e.wheelDeltaY;return null==t&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),null==r&&e.detail&&e.axis==e.VERTICAL_AXIS?r=e.detail:null==r&&(r=e.wheelDelta),{x:t,y:r}}function fi(e){var t=hi(e);return t.x*=ci,t.y*=ci,t}function di(e,t){var n=hi(t),i=n.x,o=n.y,l=e.display,s=l.scroller,u=s.scrollWidth>s.clientWidth,c=s.scrollHeight>s.clientHeight;if(i&&u||o&&c){if(o&&y&&a)e:for(var f=t.target,d=l.view;f!=s;f=f.parentNode)for(var p=0;p<d.length;p++)if(d[p].node==f){e.display.currentWheelTarget=f;break e}if(i&&!r&&!h&&null!=ci)return o&&c&&Mn(e,Math.max(0,s.scrollTop+o*ci)),On(e,Math.max(0,s.scrollLeft+i*ci)),(!o||o&&c)&&st(t),void(l.wheelStartX=null);if(o&&null!=ci){var g=o*ci,v=e.doc.scrollTop,m=v+l.wrapper.clientHeight;g<0?v=Math.max(0,v+g-50):m=Math.min(e.doc.height,m+g+50),ii(e,{top:v,bottom:m})}ui<20&&(null==l.wheelStartX?(l.wheelStartX=s.scrollLeft,l.wheelStartY=s.scrollTop,l.wheelDX=i,l.wheelDY=o,setTimeout(function(){if(null!=l.wheelStartX){var e=s.scrollLeft-l.wheelStartX,t=s.scrollTop-l.wheelStartY,r=t&&l.wheelDY&&t/l.wheelDY||e&&l.wheelDX&&e/l.wheelDX;l.wheelStartX=l.wheelStartY=null,r&&(ci=(ci*ui+r)/(ui+1),++ui)}},200)):(l.wheelDX+=i,l.wheelDY+=o))}}l?ci=-.53:r?ci=15:c?ci=-.7:f&&(ci=-1/3);var pi=function(e,t){this.ranges=e,this.primIndex=t};pi.prototype.primary=function(){return this.ranges[this.primIndex]},pi.prototype.equals=function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t<this.ranges.length;t++){var r=this.ranges[t],n=e.ranges[t];if(!me(r.anchor,n.anchor)||!me(r.head,n.head))return!1}return!0},pi.prototype.deepCopy=function(){for(var e=[],t=0;t<this.ranges.length;t++)e[t]=new gi(ye(this.ranges[t].anchor),ye(this.ranges[t].head));return new pi(e,this.primIndex)},pi.prototype.somethingSelected=function(){for(var e=0;e<this.ranges.length;e++)if(!this.ranges[e].empty())return!0;return!1},pi.prototype.contains=function(e,t){t||(t=e);for(var r=0;r<this.ranges.length;r++){var n=this.ranges[r];if(ve(t,n.from())>=0&&ve(e,n.to())<=0)return r}return-1};var gi=function(e,t){this.anchor=e,this.head=t};function vi(e,t){var r=e[t];e.sort(function(e,t){return ve(e.from(),t.from())}),t=B(e,r);for(var n=1;n<e.length;n++){var i=e[n],o=e[n-1];if(ve(o.to(),i.from())>=0){var l=we(o.from(),i.from()),s=be(o.to(),i.to()),a=o.empty()?i.from()==i.head:o.from()==o.head;n<=t&&--t,e.splice(--n,2,new gi(a?s:l,a?l:s))}}return new pi(e,t)}function mi(e,t){return new pi([new gi(e,t||e)],0)}function yi(e){return e.text?ge(e.from.line+e.text.length-1,q(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function bi(e,t){if(ve(e,t.from)<0)return e;if(ve(e,t.to)<=0)return yi(t);var r=e.line+t.text.length-(t.to.line-t.from.line)-1,n=e.ch;return e.line==t.to.line&&(n+=yi(t).ch-t.to.ch),ge(r,n)}function wi(e,t){for(var r=[],n=0;n<e.sel.ranges.length;n++){var i=e.sel.ranges[n];r.push(new gi(bi(i.anchor,t),bi(i.head,t)))}return vi(r,e.sel.primIndex)}function xi(e,t,r){return e.line==t.line?ge(r.line,e.ch-t.ch+r.ch):ge(r.line+(e.line-t.line),e.ch)}function Ci(e){e.doc.mode=Tt(e.options,e.doc.modeOption),Si(e)}function Si(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.modeFrontier=e.doc.highlightFrontier=e.doc.first,Jn(e,100),e.state.modeGen++,e.curOp&&_n(e)}function Li(e,t){return 0==t.from.ch&&0==t.to.ch&&\"\"==q(t.text)&&(!e.cm||e.cm.options.wholeLineUpdateBefore)}function ki(e,t,r,n){function i(e){return r?r[e]:null}function o(e,r,i){!function(e,t,r,n){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),null!=e.order&&(e.order=null),De(e),We(e,r);var i=n?n(e):1;i!=e.height&&ce(e,i)}(e,r,i,n),or(e,\"change\",e,t)}function l(e,t){for(var r=[],o=e;o<t;++o)r.push(new jt(u[o],i(o),n));return r}var s=t.from,a=t.to,u=t.text,c=se(e,s.line),h=se(e,a.line),f=q(u),d=i(u.length-1),p=a.line-s.line;if(t.full)e.insert(0,l(0,u.length)),e.remove(u.length,e.size-u.length);else if(Li(e,t)){var g=l(0,u.length-1);o(h,h.text,d),p&&e.remove(s.line,p),g.length&&e.insert(s.line,g)}else if(c==h)if(1==u.length)o(c,c.text.slice(0,s.ch)+f+c.text.slice(a.ch),d);else{var v=l(1,u.length-1);v.push(new jt(f+c.text.slice(a.ch),d,n)),o(c,c.text.slice(0,s.ch)+u[0],i(0)),e.insert(s.line+1,v)}else if(1==u.length)o(c,c.text.slice(0,s.ch)+u[0]+h.text.slice(a.ch),i(0)),e.remove(s.line+1,p);else{o(c,c.text.slice(0,s.ch)+u[0],i(0)),o(h,f+h.text.slice(a.ch),d);var m=l(1,u.length-1);p>1&&e.remove(s.line+1,p-1),e.insert(s.line+1,m)}or(e,\"change\",e,t)}function Ti(e,t,r){!function e(n,i,o){if(n.linked)for(var l=0;l<n.linked.length;++l){var s=n.linked[l];if(s.doc!=i){var a=o&&s.sharedHist;r&&!a||(t(s.doc,a),e(s.doc,n,a))}}}(e,null,!0)}function Mi(e,t){if(t.cm)throw new Error(\"This document is already in use.\");e.doc=t,t.cm=e,rn(e),Ci(e),Ni(e),e.options.lineWrapping||Ye(e),e.options.mode=t.modeOption,_n(e)}function Ni(e){(\"rtl\"==e.doc.direction?H:T)(e.display.lineDiv,\"CodeMirror-rtl\")}function Oi(e){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=e||1}function Ai(e,t){var r={from:ye(t.from),to:yi(t),text:ae(e,t.from,t.to)};return Pi(e,r,t.from.line,t.to.line+1),Ti(e,function(e){return Pi(e,r,t.from.line,t.to.line+1)},!0),r}function Di(e){for(;e.length;){if(!q(e).ranges)break;e.pop()}}function Wi(e,t,r,n){var i=e.history;i.undone.length=0;var o,l,s,a=+new Date;if((i.lastOp==n||i.lastOrigin==t.origin&&t.origin&&(\"+\"==t.origin.charAt(0)&&i.lastModTime>a-(e.cm?e.cm.options.historyEventDelay:500)||\"*\"==t.origin.charAt(0)))&&(s=i,o=i.lastOp==n?(Di(s.done),q(s.done)):s.done.length&&!q(s.done).ranges?q(s.done):s.done.length>1&&!s.done[s.done.length-2].ranges?(s.done.pop(),q(s.done)):void 0))l=q(o.changes),0==ve(t.from,t.to)&&0==ve(t.from,l.to)?l.to=yi(t):o.changes.push(Ai(e,t));else{var u=q(i.done);for(u&&u.ranges||Fi(e.sel,i.done),o={changes:[Ai(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(r),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=a,i.lastOp=i.lastSelOp=n,i.lastOrigin=i.lastSelOrigin=t.origin,l||rt(e,\"historyAdded\")}function Hi(e,t,r,n){var i,o,l,s,a,u=e.history,c=n&&n.origin;r==u.lastSelOp||c&&u.lastSelOrigin==c&&(u.lastModTime==u.lastSelTime&&u.lastOrigin==c||(i=e,o=c,l=q(u.done),s=t,\"*\"==(a=o.charAt(0))||\"+\"==a&&l.ranges.length==s.ranges.length&&l.somethingSelected()==s.somethingSelected()&&new Date-i.history.lastSelTime<=(i.cm?i.cm.options.historyEventDelay:500)))?u.done[u.done.length-1]=t:Fi(t,u.done),u.lastSelTime=+new Date,u.lastSelOrigin=c,u.lastSelOp=r,n&&!1!==n.clearRedo&&Di(u.undone)}function Fi(e,t){var r=q(t);r&&r.ranges&&r.equals(e)||t.push(e)}function Pi(e,t,r,n){var i=t[\"spans_\"+e.id],o=0;e.iter(Math.max(e.first,r),Math.min(e.first+e.size,n),function(r){r.markedSpans&&((i||(i=t[\"spans_\"+e.id]={}))[o]=r.markedSpans),++o})}function Ei(e){if(!e)return null;for(var t,r=0;r<e.length;++r)e[r].marker.explicitlyCleared?t||(t=e.slice(0,r)):t&&t.push(e[r]);return t?t.length?t:null:e}function zi(e,t){var r=function(e,t){var r=t[\"spans_\"+e.id];if(!r)return null;for(var n=[],i=0;i<t.text.length;++i)n.push(Ei(r[i]));return n}(e,t),n=Oe(e,t);if(!r)return n;if(!n)return r;for(var i=0;i<r.length;++i){var o=r[i],l=n[i];if(o&&l)e:for(var s=0;s<l.length;++s){for(var a=l[s],u=0;u<o.length;++u)if(o[u].marker==a.marker)continue e;o.push(a)}else l&&(r[i]=l)}return r}function Ii(e,t,r){for(var n=[],i=0;i<e.length;++i){var o=e[i];if(o.ranges)n.push(r?pi.prototype.deepCopy.call(o):o);else{var l=o.changes,s=[];n.push({changes:s});for(var a=0;a<l.length;++a){var u=l[a],c=void 0;if(s.push({from:u.from,to:u.to,text:u.text}),t)for(var h in u)(c=h.match(/^spans_(\\d+)$/))&&B(t,Number(c[1]))>-1&&(q(s)[h]=u[h],delete u[h])}}}return n}function Ri(e,t,r,n){if(n){var i=e.anchor;if(r){var o=ve(t,i)<0;o!=ve(r,i)<0?(i=t,t=r):o!=ve(t,r)<0&&(t=r)}return new gi(i,t)}return new gi(r||t,t)}function Bi(e,t,r,n,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),ji(e,new pi([Ri(e.sel.primary(),t,r,i)],0),n)}function Gi(e,t,r){for(var n=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o<e.sel.ranges.length;o++)n[o]=Ri(e.sel.ranges[o],t[o],null,i);ji(e,vi(n,e.sel.primIndex),r)}function Ui(e,t,r,n){var i=e.sel.ranges.slice(0);i[t]=r,ji(e,vi(i,e.sel.primIndex),n)}function Vi(e,t,r,n){ji(e,mi(t,r),n)}function Ki(e,t,r){var n=e.history.done,i=q(n);i&&i.ranges?(n[n.length-1]=t,Xi(e,t,r)):ji(e,t,r)}function ji(e,t,r){Xi(e,t,r),Hi(e,e.sel,e.cm?e.cm.curOp.id:NaN,r)}function Xi(e,t,r){var n,i,o,l;(ot(e,\"beforeSelectionChange\")||e.cm&&ot(e.cm,\"beforeSelectionChange\"))&&(n=e,o=r,l={ranges:(i=t).ranges,update:function(e){this.ranges=[];for(var t=0;t<e.length;t++)this.ranges[t]=new gi(Ce(n,e[t].anchor),Ce(n,e[t].head))},origin:o&&o.origin},rt(n,\"beforeSelectionChange\",n,l),n.cm&&rt(n.cm,\"beforeSelectionChange\",n.cm,l),t=l.ranges!=i.ranges?vi(l.ranges,l.ranges.length-1):i),Yi(e,qi(e,t,r&&r.bias||(ve(t.primary().head,e.sel.primary().head)<0?-1:1),!0)),r&&!1===r.scroll||!e.cm||Sn(e.cm)}function Yi(e,t){t.equals(e.sel)||(e.sel=t,e.cm&&(e.cm.curOp.updateInput=e.cm.curOp.selectionChanged=!0,it(e.cm)),or(e,\"cursorActivity\",e))}function _i(e){Yi(e,qi(e,e.sel,null,!1))}function qi(e,t,r,n){for(var i,o=0;o<t.ranges.length;o++){var l=t.ranges[o],s=t.ranges.length==e.sel.ranges.length&&e.sel.ranges[o],a=Zi(e,l.anchor,s&&s.anchor,r,n),u=Zi(e,l.head,s&&s.head,r,n);(i||a!=l.anchor||u!=l.head)&&(i||(i=t.ranges.slice(0,o)),i[o]=new gi(a,u))}return i?vi(i,t.primIndex):t}function $i(e,t,r,n,i){var o=se(e,t.line);if(o.markedSpans)for(var l=0;l<o.markedSpans.length;++l){var s=o.markedSpans[l],a=s.marker;if((null==s.from||(a.inclusiveLeft?s.from<=t.ch:s.from<t.ch))&&(null==s.to||(a.inclusiveRight?s.to>=t.ch:s.to>t.ch))){if(i&&(rt(a,\"beforeCursorEnter\"),a.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!a.atomic)continue;if(r){var u=a.find(n<0?1:-1),c=void 0;if((n<0?a.inclusiveRight:a.inclusiveLeft)&&(u=Qi(e,u,-n,u&&u.line==t.line?o:null)),u&&u.line==t.line&&(c=ve(u,r))&&(n<0?c<0:c>0))return $i(e,u,t,n,i)}var h=a.find(n<0?-1:1);return(n<0?a.inclusiveLeft:a.inclusiveRight)&&(h=Qi(e,h,n,h.line==t.line?o:null)),h?$i(e,h,t,n,i):null}}return t}function Zi(e,t,r,n,i){var o=n||1,l=$i(e,t,r,o,i)||!i&&$i(e,t,r,o,!0)||$i(e,t,r,-o,i)||!i&&$i(e,t,r,-o,!0);return l||(e.cantEdit=!0,ge(e.first,0))}function Qi(e,t,r,n){return r<0&&0==t.ch?t.line>e.first?Ce(e,ge(t.line-1)):null:r>0&&t.ch==(n||se(e,t.line)).text.length?t.line<e.first+e.size-1?ge(t.line+1,0):null:new ge(t.line,t.ch+r)}function Ji(e){e.setSelection(ge(e.firstLine(),0),ge(e.lastLine()),V)}function eo(e,t,r){var n={canceled:!1,from:t.from,to:t.to,text:t.text,origin:t.origin,cancel:function(){return n.canceled=!0}};return r&&(n.update=function(t,r,i,o){t&&(n.from=Ce(e,t)),r&&(n.to=Ce(e,r)),i&&(n.text=i),void 0!==o&&(n.origin=o)}),rt(e,\"beforeChange\",e,n),e.cm&&rt(e.cm,\"beforeChange\",e.cm,n),n.canceled?null:{from:n.from,to:n.to,text:n.text,origin:n.origin}}function to(e,t,r){if(e.cm){if(!e.cm.curOp)return jn(e.cm,to)(e,t,r);if(e.cm.state.suppressEdits)return}if(!(ot(e,\"beforeChange\")||e.cm&&ot(e.cm,\"beforeChange\"))||(t=eo(e,t,!0))){var n=Le&&!r&&function(e,t,r){var n=null;if(e.iter(t.line,r.line+1,function(e){if(e.markedSpans)for(var t=0;t<e.markedSpans.length;++t){var r=e.markedSpans[t].marker;!r.readOnly||n&&-1!=B(n,r)||(n||(n=[])).push(r)}}),!n)return null;for(var i=[{from:t,to:r}],o=0;o<n.length;++o)for(var l=n[o],s=l.find(0),a=0;a<i.length;++a){var u=i[a];if(!(ve(u.to,s.from)<0||ve(u.from,s.to)>0)){var c=[a,1],h=ve(u.from,s.from),f=ve(u.to,s.to);(h<0||!l.inclusiveLeft&&!h)&&c.push({from:u.from,to:s.from}),(f>0||!l.inclusiveRight&&!f)&&c.push({from:s.to,to:u.to}),i.splice.apply(i,c),a+=c.length-3}}return i}(e,t.from,t.to);if(n)for(var i=n.length-1;i>=0;--i)ro(e,{from:n[i].from,to:n[i].to,text:i?[\"\"]:t.text,origin:t.origin});else ro(e,t)}}function ro(e,t){if(1!=t.text.length||\"\"!=t.text[0]||0!=ve(t.from,t.to)){var r=wi(e,t);Wi(e,t,r,e.cm?e.cm.curOp.id:NaN),oo(e,t,r,Oe(e,t));var n=[];Ti(e,function(e,r){r||-1!=B(n,e.history)||(uo(e.history,t),n.push(e.history)),oo(e,t,null,Oe(e,t))})}}function no(e,t,r){var n=e.cm&&e.cm.state.suppressEdits;if(!n||r){for(var i,o=e.history,l=e.sel,s=\"undo\"==t?o.done:o.undone,a=\"undo\"==t?o.undone:o.done,u=0;u<s.length&&(i=s[u],r?!i.ranges||i.equals(e.sel):i.ranges);u++);if(u!=s.length){for(o.lastOrigin=o.lastSelOrigin=null;;){if(!(i=s.pop()).ranges){if(n)return void s.push(i);break}if(Fi(i,a),r&&!i.equals(e.sel))return void ji(e,i,{clearRedo:!1});l=i}var c=[];Fi(l,a),a.push({changes:c,generation:o.generation}),o.generation=i.generation||++o.maxGeneration;for(var h=ot(e,\"beforeChange\")||e.cm&&ot(e.cm,\"beforeChange\"),f=function(r){var n=i.changes[r];if(n.origin=t,h&&!eo(e,n,!1))return s.length=0,{};c.push(Ai(e,n));var o=r?wi(e,n):q(s);oo(e,n,o,zi(e,n)),!r&&e.cm&&e.cm.scrollIntoView({from:n.from,to:yi(n)});var l=[];Ti(e,function(e,t){t||-1!=B(l,e.history)||(uo(e.history,n),l.push(e.history)),oo(e,n,null,zi(e,n))})},d=i.changes.length-1;d>=0;--d){var p=f(d);if(p)return p.v}}}}function io(e,t){if(0!=t&&(e.first+=t,e.sel=new pi($(e.sel.ranges,function(e){return new gi(ge(e.anchor.line+t,e.anchor.ch),ge(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){_n(e.cm,e.first,e.first-t,t);for(var r=e.cm.display,n=r.viewFrom;n<r.viewTo;n++)qn(e.cm,n,\"gutter\")}}function oo(e,t,r,n){if(e.cm&&!e.cm.curOp)return jn(e.cm,oo)(e,t,r,n);if(t.to.line<e.first)io(e,t.text.length-1-(t.to.line-t.from.line));else if(!(t.from.line>e.lastLine())){if(t.from.line<e.first){var i=t.text.length-1-(e.first-t.from.line);io(e,i),t={from:ge(e.first,0),to:ge(t.to.line+i,t.to.ch),text:[q(t.text)],origin:t.origin}}var o=e.lastLine();t.to.line>o&&(t={from:t.from,to:ge(o,se(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=ae(e,t.from,t.to),r||(r=wi(e,t)),e.cm?function(e,t,r){var n=e.doc,i=e.display,o=t.from,l=t.to,s=!1,a=o.line;e.options.lineWrapping||(a=he(Be(se(n,o.line))),n.iter(a,l.line+1,function(e){if(e==i.maxLine)return s=!0,!0}));n.sel.contains(t.from,t.to)>-1&&it(e);ki(n,t,r,tn(e)),e.options.lineWrapping||(n.iter(a,o.line+t.text.length,function(e){var t=Xe(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0));(function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontier<t-10)){for(var r=e.first,n=t-1;n>r;n--){var i=se(e,n).stateAfter;if(i&&(!(i instanceof Ht)||n+i.lookAhead<t)){r=n+1;break}}e.highlightFrontier=Math.min(e.highlightFrontier,r)}})(n,o.line),Jn(e,400);var u=t.text.length-(l.line-o.line)-1;t.full?_n(e):o.line!=l.line||1!=t.text.length||Li(e.doc,t)?_n(e,o.line,l.line+1,u):qn(e,o.line,\"text\");var c=ot(e,\"changes\"),h=ot(e,\"change\");if(h||c){var f={from:o,to:l,text:t.text,removed:t.removed,origin:t.origin};h&&or(e,\"change\",e,f),c&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(f)}e.display.selForContextMenu=null}(e.cm,t,n):ki(e,t,n),Xi(e,r,V)}}function lo(e,t,r,n,i){var o;(n||(n=r),ve(n,r)<0)&&(r=(o=[n,r])[0],n=o[1]);\"string\"==typeof t&&(t=e.splitLines(t)),to(e,{from:r,to:n,text:t,origin:i})}function so(e,t,r,n){r<e.line?e.line+=n:t<e.line&&(e.line=t,e.ch=0)}function ao(e,t,r,n){for(var i=0;i<e.length;++i){var o=e[i],l=!0;if(o.ranges){o.copied||((o=e[i]=o.deepCopy()).copied=!0);for(var s=0;s<o.ranges.length;s++)so(o.ranges[s].anchor,t,r,n),so(o.ranges[s].head,t,r,n)}else{for(var a=0;a<o.changes.length;++a){var u=o.changes[a];if(r<u.from.line)u.from=ge(u.from.line+n,u.from.ch),u.to=ge(u.to.line+n,u.to.ch);else if(t<=u.to.line){l=!1;break}}l||(e.splice(0,i+1),i=0)}}}function uo(e,t){var r=t.from.line,n=t.to.line,i=t.text.length-(n-r)-1;ao(e.done,r,n,i),ao(e.undone,r,n,i)}function co(e,t,r,n){var i=t,o=t;return\"number\"==typeof t?o=se(e,xe(e,t)):i=he(t),null==i?null:(n(o,i)&&e.cm&&qn(e.cm,i,r),o)}function ho(e){this.lines=e,this.parent=null;for(var t=0,r=0;r<e.length;++r)e[r].parent=this,t+=e[r].height;this.height=t}function fo(e){this.children=e;for(var t=0,r=0,n=0;n<e.length;++n){var i=e[n];t+=i.chunkSize(),r+=i.height,i.parent=this}this.size=t,this.height=r,this.parent=null}gi.prototype.from=function(){return we(this.anchor,this.head)},gi.prototype.to=function(){return be(this.anchor,this.head)},gi.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch},ho.prototype={chunkSize:function(){return this.lines.length},removeInner:function(e,t){for(var r,n=e,i=e+t;n<i;++n){var o=this.lines[n];this.height-=o.height,(r=o).parent=null,De(r),or(o,\"delete\")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,r){this.height+=r,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var n=0;n<t.length;++n)t[n].parent=this},iterN:function(e,t,r){for(var n=e+t;e<n;++e)if(r(this.lines[e]))return!0}},fo.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var r=0;r<this.children.length;++r){var n=this.children[r],i=n.chunkSize();if(e<i){var o=Math.min(t,i-e),l=n.height;if(n.removeInner(e,o),this.height-=l-n.height,i==o&&(this.children.splice(r--,1),n.parent=null),0==(t-=o))break;e=0}else e-=i}if(this.size-t<25&&(this.children.length>1||!(this.children[0]instanceof ho))){var s=[];this.collapse(s),this.children=[new ho(s)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t<this.children.length;++t)this.children[t].collapse(e)},insertInner:function(e,t,r){this.size+=t.length,this.height+=r;for(var n=0;n<this.children.length;++n){var i=this.children[n],o=i.chunkSize();if(e<=o){if(i.insertInner(e,t,r),i.lines&&i.lines.length>50){for(var l=i.lines.length%25+25,s=l;s<i.lines.length;){var a=new ho(i.lines.slice(s,s+=25));i.height-=a.height,this.children.splice(++n,0,a),a.parent=this}i.lines=i.lines.slice(0,l),this.maybeSpill()}break}e-=o}},maybeSpill:function(){if(!(this.children.length<=10)){var e=this;do{var t=new fo(e.children.splice(e.children.length-5,5));if(e.parent){e.size-=t.size,e.height-=t.height;var r=B(e.parent.children,e);e.parent.children.splice(r+1,0,t)}else{var n=new fo(e.children);n.parent=e,e.children=[n,t],e=n}t.parent=e.parent}while(e.children.length>10);e.parent.maybeSpill()}},iterN:function(e,t,r){for(var n=0;n<this.children.length;++n){var i=this.children[n],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e);if(i.iterN(e,l,r))return!0;if(0==(t-=l))break;e=0}else e-=o}}};var po=function(e,t,r){if(r)for(var n in r)r.hasOwnProperty(n)&&(this[n]=r[n]);this.doc=e,this.node=t};function go(e,t,r){je(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&Cn(e,r)}po.prototype.clear=function(){var e=this.doc.cm,t=this.line.widgets,r=this.line,n=he(r);if(null!=n&&t){for(var i=0;i<t.length;++i)t[i]==this&&t.splice(i--,1);t.length||(r.widgets=null);var o=mr(this);ce(r,Math.max(0,r.height-o)),e&&(Kn(e,function(){go(e,r,-o),qn(e,n,\"widget\")}),or(e,\"lineWidgetCleared\",e,this,n))}},po.prototype.changed=function(){var e=this,t=this.height,r=this.doc.cm,n=this.line;this.height=null;var i=mr(this)-t;i&&(ce(n,n.height+i),r&&Kn(r,function(){r.curOp.forceUpdate=!0,go(r,n,i),or(r,\"lineWidgetChanged\",r,e,he(n))}))},lt(po);var vo=0,mo=function(e,t){this.lines=[],this.type=t,this.doc=e,this.id=++vo};function yo(e,t,r,n,i){if(n&&n.shared)return function(e,t,r,n,i){(n=z(n)).shared=!1;var o=[yo(e,t,r,n,i)],l=o[0],s=n.widgetNode;return Ti(e,function(e){s&&(n.widgetNode=s.cloneNode(!0)),o.push(yo(e,Ce(e,t),Ce(e,r),n,i));for(var a=0;a<e.linked.length;++a)if(e.linked[a].isParent)return;l=q(o)}),new bo(o,l)}(e,t,r,n,i);if(e.cm&&!e.cm.curOp)return jn(e.cm,yo)(e,t,r,n,i);var o=new mo(e,i),l=ve(t,r);if(n&&z(n,o,!1),l>0||0==l&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=A(\"span\",[o.replacedWith],\"CodeMirror-widget\"),n.handleMouseEvents||o.widgetNode.setAttribute(\"cm-ignore-events\",\"true\"),n.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(Re(e,t.line,t,r,o)||t.line!=r.line&&Re(e,r.line,t,r,o))throw new Error(\"Inserting collapsed marker partially overlapping an existing one\");ke=!0}o.addToHistory&&Wi(e,{from:t,to:r,origin:\"markText\"},e.sel,NaN);var s,a=t.line,u=e.cm;if(e.iter(a,r.line+1,function(e){var n,i;u&&o.collapsed&&!u.options.lineWrapping&&Be(e)==u.display.maxLine&&(s=!0),o.collapsed&&a!=t.line&&ce(e,0),n=e,i=new Te(o,a==t.line?t.ch:null,a==r.line?r.ch:null),n.markedSpans=n.markedSpans?n.markedSpans.concat([i]):[i],i.marker.attachLine(n),++a}),o.collapsed&&e.iter(t.line,r.line+1,function(t){Ve(e,t)&&ce(t,0)}),o.clearOnEnter&&Je(o,\"beforeCursorEnter\",function(){return o.clear()}),o.readOnly&&(Le=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),o.collapsed&&(o.id=++vo,o.atomic=!0),u){if(s&&(u.curOp.updateMaxLine=!0),o.collapsed)_n(u,t.line,r.line+1);else if(o.className||o.title||o.startStyle||o.endStyle||o.css)for(var c=t.line;c<=r.line;c++)qn(u,c,\"text\");o.atomic&&_i(u.doc),or(u,\"markerAdded\",u,o)}return o}mo.prototype.clear=function(){var e=this;if(!this.explicitlyCleared){var t=this.doc.cm,r=t&&!t.curOp;if(r&&In(t),ot(this,\"clear\")){var n=this.find();n&&or(this,\"clear\",n.from,n.to)}for(var i=null,o=null,l=0;l<this.lines.length;++l){var s=e.lines[l],a=Me(s.markedSpans,e);t&&!e.collapsed?qn(t,he(s),\"text\"):t&&(null!=a.to&&(o=he(s)),null!=a.from&&(i=he(s))),s.markedSpans=Ne(s.markedSpans,a),null==a.from&&e.collapsed&&!Ve(e.doc,s)&&t&&ce(s,Zr(t.display))}if(t&&this.collapsed&&!t.options.lineWrapping)for(var u=0;u<this.lines.length;++u){var c=Be(e.lines[u]),h=Xe(c);h>t.display.maxLineLength&&(t.display.maxLine=c,t.display.maxLineLength=h,t.display.maxLineChanged=!0)}null!=i&&t&&this.collapsed&&_n(t,i,o+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,t&&_i(t.doc)),t&&or(t,\"markerCleared\",t,this,i,o),r&&Rn(t),this.parent&&this.parent.clear()}},mo.prototype.find=function(e,t){var r,n;null==e&&\"bookmark\"==this.type&&(e=1);for(var i=0;i<this.lines.length;++i){var o=this.lines[i],l=Me(o.markedSpans,this);if(null!=l.from&&(r=ge(t?o:he(o),l.from),-1==e))return r;if(null!=l.to&&(n=ge(t?o:he(o),l.to),1==e))return n}return r&&{from:r,to:n}},mo.prototype.changed=function(){var e=this,t=this.find(-1,!0),r=this,n=this.doc.cm;t&&n&&Kn(n,function(){var i=t.line,o=he(t.line),l=Mr(n,o);if(l&&(Fr(l),n.curOp.selectionChanged=n.curOp.forceUpdate=!0),n.curOp.updateMaxLine=!0,!Ve(r.doc,i)&&null!=r.height){var s=r.height;r.height=null;var a=mr(r)-s;a&&ce(i,i.height+a)}or(n,\"markerChanged\",n,e)})},mo.prototype.attachLine=function(e){if(!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;t.maybeHiddenMarkers&&-1!=B(t.maybeHiddenMarkers,this)||(t.maybeUnhiddenMarkers||(t.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(e)},mo.prototype.detachLine=function(e){if(this.lines.splice(B(this.lines,e),1),!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;(t.maybeHiddenMarkers||(t.maybeHiddenMarkers=[])).push(this)}},lt(mo);var bo=function(e,t){this.markers=e,this.primary=t;for(var r=0;r<e.length;++r)e[r].parent=this};function wo(e){return e.findMarks(ge(e.first,0),e.clipPos(ge(e.lastLine())),function(e){return e.parent})}function xo(e){for(var t=function(t){var r=e[t],n=[r.primary.doc];Ti(r.primary.doc,function(e){return n.push(e)});for(var i=0;i<r.markers.length;i++){var o=r.markers[i];-1==B(n,o.doc)&&(o.parent=null,r.markers.splice(i--,1))}},r=0;r<e.length;r++)t(r)}bo.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var e=0;e<this.markers.length;++e)this.markers[e].clear();or(this,\"clear\")}},bo.prototype.find=function(e,t){return this.primary.find(e,t)},lt(bo);var Co=0,So=function(e,t,r,n,i){if(!(this instanceof So))return new So(e,t,r,n,i);null==r&&(r=0),fo.call(this,[new ho([new jt(\"\",null)])]),this.first=r,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.modeFrontier=this.highlightFrontier=r;var o=ge(r,0);this.sel=mi(o),this.history=new Oi(null),this.id=++Co,this.modeOption=t,this.lineSep=n,this.direction=\"rtl\"==i?\"rtl\":\"ltr\",this.extend=!1,\"string\"==typeof e&&(e=this.splitLines(e)),ki(this,{from:o,to:o,text:e}),ji(this,mi(o),V)};So.prototype=Q(fo.prototype,{constructor:So,iter:function(e,t,r){r?this.iterN(e-this.first,t-e,r):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){for(var r=0,n=0;n<t.length;++n)r+=t[n].height;this.insertInner(e-this.first,t,r)},remove:function(e,t){this.removeInner(e-this.first,t)},getValue:function(e){var t=ue(this,this.first,this.first+this.size);return!1===e?t:t.join(e||this.lineSeparator())},setValue:Yn(function(e){var t=ge(this.first,0),r=this.first+this.size-1;to(this,{from:t,to:ge(r,se(this,r).text.length),text:this.splitLines(e),origin:\"setValue\",full:!0},!0),this.cm&&Ln(this.cm,0,0),ji(this,mi(t),V)}),replaceRange:function(e,t,r,n){lo(this,e,t=Ce(this,t),r=r?Ce(this,r):t,n)},getRange:function(e,t,r){var n=ae(this,Ce(this,e),Ce(this,t));return!1===r?n:n.join(r||this.lineSeparator())},getLine:function(e){var t=this.getLineHandle(e);return t&&t.text},getLineHandle:function(e){if(de(this,e))return se(this,e)},getLineNumber:function(e){return he(e)},getLineHandleVisualStart:function(e){return\"number\"==typeof e&&(e=se(this,e)),Be(e)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(e){return Ce(this,e)},getCursor:function(e){var t=this.sel.primary();return null==e||\"head\"==e?t.head:\"anchor\"==e?t.anchor:\"end\"==e||\"to\"==e||!1===e?t.to():t.from()},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Yn(function(e,t,r){Vi(this,Ce(this,\"number\"==typeof e?ge(e,t||0):e),null,r)}),setSelection:Yn(function(e,t,r){Vi(this,Ce(this,e),Ce(this,t||e),r)}),extendSelection:Yn(function(e,t,r){Bi(this,Ce(this,e),t&&Ce(this,t),r)}),extendSelections:Yn(function(e,t){Gi(this,Se(this,e),t)}),extendSelectionsBy:Yn(function(e,t){Gi(this,Se(this,$(this.sel.ranges,e)),t)}),setSelections:Yn(function(e,t,r){if(e.length){for(var n=[],i=0;i<e.length;i++)n[i]=new gi(Ce(this,e[i].anchor),Ce(this,e[i].head));null==t&&(t=Math.min(e.length-1,this.sel.primIndex)),ji(this,vi(n,t),r)}}),addSelection:Yn(function(e,t,r){var n=this.sel.ranges.slice(0);n.push(new gi(Ce(this,e),Ce(this,t||e))),ji(this,vi(n,n.length-1),r)}),getSelection:function(e){for(var t,r=this.sel.ranges,n=0;n<r.length;n++){var i=ae(this,r[n].from(),r[n].to());t=t?t.concat(i):i}return!1===e?t:t.join(e||this.lineSeparator())},getSelections:function(e){for(var t=[],r=this.sel.ranges,n=0;n<r.length;n++){var i=ae(this,r[n].from(),r[n].to());!1!==e&&(i=i.join(e||this.lineSeparator())),t[n]=i}return t},replaceSelection:function(e,t,r){for(var n=[],i=0;i<this.sel.ranges.length;i++)n[i]=e;this.replaceSelections(n,t,r||\"+input\")},replaceSelections:Yn(function(e,t,r){for(var n=[],i=this.sel,o=0;o<i.ranges.length;o++){var l=i.ranges[o];n[o]={from:l.from(),to:l.to(),text:this.splitLines(e[o]),origin:r}}for(var s=t&&\"end\"!=t&&function(e,t,r){for(var n=[],i=ge(e.first,0),o=i,l=0;l<t.length;l++){var s=t[l],a=xi(s.from,i,o),u=xi(yi(s),i,o);if(i=s.to,o=u,\"around\"==r){var c=e.sel.ranges[l],h=ve(c.head,c.anchor)<0;n[l]=new gi(h?u:a,h?a:u)}else n[l]=new gi(a,a)}return new pi(n,e.sel.primIndex)}(this,n,t),a=n.length-1;a>=0;a--)to(this,n[a]);s?Ki(this,s):this.cm&&Sn(this.cm)}),undo:Yn(function(){no(this,\"undo\")}),redo:Yn(function(){no(this,\"redo\")}),undoSelection:Yn(function(){no(this,\"undo\",!0)}),redoSelection:Yn(function(){no(this,\"redo\",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,r=0,n=0;n<e.done.length;n++)e.done[n].ranges||++t;for(var i=0;i<e.undone.length;i++)e.undone[i].ranges||++r;return{undo:t,redo:r}},clearHistory:function(){this.history=new Oi(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(e){return e&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(e){return this.history.generation==(e||this.cleanGeneration)},getHistory:function(){return{done:Ii(this.history.done),undone:Ii(this.history.undone)}},setHistory:function(e){var t=this.history=new Oi(this.history.maxGeneration);t.done=Ii(e.done.slice(0),null,!0),t.undone=Ii(e.undone.slice(0),null,!0)},setGutterMarker:Yn(function(e,t,r){return co(this,e,\"gutter\",function(e){var n=e.gutterMarkers||(e.gutterMarkers={});return n[t]=r,!r&&re(n)&&(e.gutterMarkers=null),!0})}),clearGutter:Yn(function(e){var t=this;this.iter(function(r){r.gutterMarkers&&r.gutterMarkers[e]&&co(t,r,\"gutter\",function(){return r.gutterMarkers[e]=null,re(r.gutterMarkers)&&(r.gutterMarkers=null),!0})})}),lineInfo:function(e){var t;if(\"number\"==typeof e){if(!de(this,e))return null;if(t=e,!(e=se(this,e)))return null}else if(null==(t=he(e)))return null;return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},addLineClass:Yn(function(e,t,r){return co(this,e,\"gutter\"==t?\"gutter\":\"class\",function(e){var n=\"text\"==t?\"textClass\":\"background\"==t?\"bgClass\":\"gutter\"==t?\"gutterClass\":\"wrapClass\";if(e[n]){if(L(r).test(e[n]))return!1;e[n]+=\" \"+r}else e[n]=r;return!0})}),removeLineClass:Yn(function(e,t,r){return co(this,e,\"gutter\"==t?\"gutter\":\"class\",function(e){var n=\"text\"==t?\"textClass\":\"background\"==t?\"bgClass\":\"gutter\"==t?\"gutterClass\":\"wrapClass\",i=e[n];if(!i)return!1;if(null==r)e[n]=null;else{var o=i.match(L(r));if(!o)return!1;var l=o.index+o[0].length;e[n]=i.slice(0,o.index)+(o.index&&l!=i.length?\" \":\"\")+i.slice(l)||null}return!0})}),addLineWidget:Yn(function(e,t,r){return i=e,o=new po(n=this,t,r),(l=n.cm)&&o.noHScroll&&(l.display.alignWidgets=!0),co(n,i,\"widget\",function(e){var t=e.widgets||(e.widgets=[]);if(null==o.insertAt?t.push(o):t.splice(Math.min(t.length-1,Math.max(0,o.insertAt)),0,o),o.line=e,l&&!Ve(n,e)){var r=je(e)<n.scrollTop;ce(e,e.height+mr(o)),r&&Cn(l,o.height),l.curOp.forceUpdate=!0}return!0}),l&&or(l,\"lineWidgetAdded\",l,o,\"number\"==typeof i?i:he(i)),o;var n,i,o,l}),removeLineWidget:function(e){e.clear()},markText:function(e,t,r){return yo(this,Ce(this,e),Ce(this,t),r,r&&r.type||\"range\")},setBookmark:function(e,t){var r={replacedWith:t&&(null==t.nodeType?t.widget:t),insertLeft:t&&t.insertLeft,clearWhenEmpty:!1,shared:t&&t.shared,handleMouseEvents:t&&t.handleMouseEvents};return yo(this,e=Ce(this,e),e,r,\"bookmark\")},findMarksAt:function(e){var t=[],r=se(this,(e=Ce(this,e)).line).markedSpans;if(r)for(var n=0;n<r.length;++n){var i=r[n];(null==i.from||i.from<=e.ch)&&(null==i.to||i.to>=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,r){e=Ce(this,e),t=Ce(this,t);var n=[],i=e.line;return this.iter(e.line,t.line+1,function(o){var l=o.markedSpans;if(l)for(var s=0;s<l.length;s++){var a=l[s];null!=a.to&&i==e.line&&e.ch>=a.to||null==a.from&&i!=e.line||null!=a.from&&i==t.line&&a.from>=t.ch||r&&!r(a.marker)||n.push(a.marker.parent||a.marker)}++i}),n},getAllMarks:function(){var e=[];return this.iter(function(t){var r=t.markedSpans;if(r)for(var n=0;n<r.length;++n)null!=r[n].from&&e.push(r[n].marker)}),e},posFromIndex:function(e){var t,r=this.first,n=this.lineSeparator().length;return this.iter(function(i){var o=i.text.length+n;if(o>e)return t=e,!0;e-=o,++r}),Ce(this,ge(r,t))},indexFromPos:function(e){var t=(e=Ce(this,e)).ch;if(e.line<this.first||e.ch<0)return 0;var r=this.lineSeparator().length;return this.iter(this.first,e.line,function(e){t+=e.text.length+r}),t},copy:function(e){var t=new So(ue(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep,this.direction);return t.scrollTop=this.scrollTop,t.scrollLeft=this.scrollLeft,t.sel=this.sel,t.extend=!1,e&&(t.history.undoDepth=this.history.undoDepth,t.setHistory(this.getHistory())),t},linkedDoc:function(e){e||(e={});var t=this.first,r=this.first+this.size;null!=e.from&&e.from>t&&(t=e.from),null!=e.to&&e.to<r&&(r=e.to);var n=new So(ue(this,t,r),e.mode||this.modeOption,t,this.lineSep,this.direction);return e.sharedHist&&(n.history=this.history),(this.linked||(this.linked=[])).push({doc:n,sharedHist:e.sharedHist}),n.linked=[{doc:this,isParent:!0,sharedHist:e.sharedHist}],function(e,t){for(var r=0;r<t.length;r++){var n=t[r],i=n.find(),o=e.clipPos(i.from),l=e.clipPos(i.to);if(ve(o,l)){var s=yo(e,o,l,n.primary,n.primary.type);n.markers.push(s),s.parent=n}}}(n,wo(this)),n},unlinkDoc:function(e){if(e instanceof wl&&(e=e.doc),this.linked)for(var t=0;t<this.linked.length;++t){if(this.linked[t].doc==e){this.linked.splice(t,1),e.unlinkDoc(this),xo(wo(this));break}}if(e.history==this.history){var r=[e.id];Ti(e,function(e){return r.push(e.id)},!0),e.history=new Oi(null),e.history.done=Ii(this.history.done,r),e.history.undone=Ii(this.history.undone,r)}},iterLinkedDocs:function(e){Ti(this,e)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(e){return this.lineSep?e.split(this.lineSep):bt(e)},lineSeparator:function(){return this.lineSep||\"\\n\"},setDirection:Yn(function(e){var t;(\"rtl\"!=e&&(e=\"ltr\"),e!=this.direction)&&(this.direction=e,this.iter(function(e){return e.order=null}),this.cm&&Kn(t=this.cm,function(){Ni(t),_n(t)}))})}),So.prototype.eachLine=So.prototype.iter;var Lo=0;function ko(e){var t=this;if(To(t),!nt(t,e)&&!yr(t.display,e)){st(e),l&&(Lo=+new Date);var r=nn(t,e,!0),n=e.dataTransfer.files;if(r&&!t.isReadOnly())if(n&&n.length&&window.FileReader&&window.File)for(var i=n.length,o=Array(i),s=0,a=function(e,n){if(!t.options.allowDropFileTypes||-1!=B(t.options.allowDropFileTypes,e.type)){var l=new FileReader;l.onload=jn(t,function(){var e=l.result;if(/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(e)&&(e=\"\"),o[n]=e,++s==i){var a={from:r=Ce(t.doc,r),to:r,text:t.doc.splitLines(o.join(t.doc.lineSeparator())),origin:\"paste\"};to(t.doc,a),Ki(t.doc,mi(r,yi(a)))}}),l.readAsText(e)}},u=0;u<i;++u)a(n[u],u);else{if(t.state.draggingText&&t.doc.sel.contains(r)>-1)return t.state.draggingText(e),void setTimeout(function(){return t.display.input.focus()},20);try{var c=e.dataTransfer.getData(\"Text\");if(c){var h;if(t.state.draggingText&&!t.state.draggingText.copy&&(h=t.listSelections()),Xi(t.doc,mi(r,r)),h)for(var f=0;f<h.length;++f)lo(t.doc,\"\",h[f].anchor,h[f].head,\"drag\");t.replaceSelection(c,\"around\",\"paste\"),t.display.input.focus()}}catch(e){}}}}function To(e){e.display.dragCursor&&(e.display.lineSpace.removeChild(e.display.dragCursor),e.display.dragCursor=null)}function Mo(e){if(document.getElementsByClassName)for(var t=document.getElementsByClassName(\"CodeMirror\"),r=0;r<t.length;r++){var n=t[r].CodeMirror;n&&e(n)}}var No=!1;function Oo(){var e;No||(Je(window,\"resize\",function(){null==e&&(e=setTimeout(function(){e=null,Mo(Ao)},100))}),Je(window,\"blur\",function(){return Mo(gn)}),No=!0)}function Ao(e){var t=e.display;t.lastWrapHeight==t.wrapper.clientHeight&&t.lastWrapWidth==t.wrapper.clientWidth||(t.cachedCharWidth=t.cachedTextHeight=t.cachedPaddingH=null,t.scrollbarsClipped=!1,e.setSize())}for(var Do={3:\"Pause\",8:\"Backspace\",9:\"Tab\",13:\"Enter\",16:\"Shift\",17:\"Ctrl\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Esc\",32:\"Space\",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"Left\",38:\"Up\",39:\"Right\",40:\"Down\",44:\"PrintScrn\",45:\"Insert\",46:\"Delete\",59:\";\",61:\"=\",91:\"Mod\",92:\"Mod\",93:\"Mod\",106:\"*\",107:\"=\",109:\"-\",110:\".\",111:\"/\",127:\"Delete\",145:\"ScrollLock\",173:\"-\",186:\";\",187:\"=\",188:\",\",189:\"-\",190:\".\",191:\"/\",192:\"`\",219:\"[\",220:\"\\\\\",221:\"]\",222:\"'\",63232:\"Up\",63233:\"Down\",63234:\"Left\",63235:\"Right\",63272:\"Delete\",63273:\"Home\",63275:\"End\",63276:\"PageUp\",63277:\"PageDown\",63302:\"Insert\"},Wo=0;Wo<10;Wo++)Do[Wo+48]=Do[Wo+96]=String(Wo);for(var Ho=65;Ho<=90;Ho++)Do[Ho]=String.fromCharCode(Ho);for(var Fo=1;Fo<=12;Fo++)Do[Fo+111]=Do[Fo+63235]=\"F\"+Fo;var Po={};function Eo(e){var t,r,n,i,o=e.split(/-(?!$)/);e=o[o.length-1];for(var l=0;l<o.length-1;l++){var s=o[l];if(/^(cmd|meta|m)$/i.test(s))i=!0;else if(/^a(lt)?$/i.test(s))t=!0;else if(/^(c|ctrl|control)$/i.test(s))r=!0;else{if(!/^s(hift)?$/i.test(s))throw new Error(\"Unrecognized modifier name: \"+s);n=!0}}return t&&(e=\"Alt-\"+e),r&&(e=\"Ctrl-\"+e),i&&(e=\"Cmd-\"+e),n&&(e=\"Shift-\"+e),e}function zo(e){var t={};for(var r in e)if(e.hasOwnProperty(r)){var n=e[r];if(/^(name|fallthrough|(de|at)tach)$/.test(r))continue;if(\"...\"==n){delete e[r];continue}for(var i=$(r.split(\" \"),Eo),o=0;o<i.length;o++){var l=void 0,s=void 0;o==i.length-1?(s=i.join(\" \"),l=n):(s=i.slice(0,o+1).join(\" \"),l=\"...\");var a=t[s];if(a){if(a!=l)throw new Error(\"Inconsistent bindings for \"+s)}else t[s]=l}delete e[r]}for(var u in t)e[u]=t[u];return e}function Io(e,t,r,n){var i=(t=Uo(t)).call?t.call(e,n):t[e];if(!1===i)return\"nothing\";if(\"...\"===i)return\"multi\";if(null!=i&&r(i))return\"handled\";if(t.fallthrough){if(\"[object Array]\"!=Object.prototype.toString.call(t.fallthrough))return Io(e,t.fallthrough,r,n);for(var o=0;o<t.fallthrough.length;o++){var l=Io(e,t.fallthrough[o],r,n);if(l)return l}}}function Ro(e){var t=\"string\"==typeof e?e:Do[e.keyCode];return\"Ctrl\"==t||\"Alt\"==t||\"Shift\"==t||\"Mod\"==t}function Bo(e,t,r){var n=e;return t.altKey&&\"Alt\"!=n&&(e=\"Alt-\"+e),(C?t.metaKey:t.ctrlKey)&&\"Ctrl\"!=n&&(e=\"Ctrl-\"+e),(C?t.ctrlKey:t.metaKey)&&\"Cmd\"!=n&&(e=\"Cmd-\"+e),!r&&t.shiftKey&&\"Shift\"!=n&&(e=\"Shift-\"+e),e}function Go(e,t){if(h&&34==e.keyCode&&e.char)return!1;var r=Do[e.keyCode];return null!=r&&!e.altGraphKey&&(3==e.keyCode&&e.code&&(r=e.code),Bo(r,e,t))}function Uo(e){return\"string\"==typeof e?Po[e]:e}function Vo(e,t){for(var r=e.doc.sel.ranges,n=[],i=0;i<r.length;i++){for(var o=t(r[i]);n.length&&ve(o.from,q(n).to)<=0;){var l=n.pop();if(ve(l.from,o.from)<0){o.from=l.from;break}}n.push(o)}Kn(e,function(){for(var t=n.length-1;t>=0;t--)lo(e.doc,\"\",n[t].from,n[t].to,\"+delete\");Sn(e)})}function Ko(e,t,r){var n=oe(e.text,t+r,r);return n<0||n>e.text.length?null:n}function jo(e,t,r){var n=Ko(e,t.ch,r);return null==n?null:new ge(t.line,n,r<0?\"after\":\"before\")}function Xo(e,t,r,n,i){if(e){var o=Ze(r,t.doc.direction);if(o){var l,s=i<0?q(o):o[0],a=i<0==(1==s.level)?\"after\":\"before\";if(s.level>0||\"rtl\"==t.doc.direction){var u=Nr(t,r);l=i<0?r.text.length-1:0;var c=Or(t,u,l).top;l=le(function(e){return Or(t,u,e).top==c},i<0==(1==s.level)?s.from:s.to-1,l),\"before\"==a&&(l=Ko(r,l,1))}else l=i<0?s.to:s.from;return new ge(n,l,a)}}return new ge(n,i<0?r.text.length:0,i<0?\"before\":\"after\")}Po.basic={Left:\"goCharLeft\",Right:\"goCharRight\",Up:\"goLineUp\",Down:\"goLineDown\",End:\"goLineEnd\",Home:\"goLineStartSmart\",PageUp:\"goPageUp\",PageDown:\"goPageDown\",Delete:\"delCharAfter\",Backspace:\"delCharBefore\",\"Shift-Backspace\":\"delCharBefore\",Tab:\"defaultTab\",\"Shift-Tab\":\"indentAuto\",Enter:\"newlineAndIndent\",Insert:\"toggleOverwrite\",Esc:\"singleSelection\"},Po.pcDefault={\"Ctrl-A\":\"selectAll\",\"Ctrl-D\":\"deleteLine\",\"Ctrl-Z\":\"undo\",\"Shift-Ctrl-Z\":\"redo\",\"Ctrl-Y\":\"redo\",\"Ctrl-Home\":\"goDocStart\",\"Ctrl-End\":\"goDocEnd\",\"Ctrl-Up\":\"goLineUp\",\"Ctrl-Down\":\"goLineDown\",\"Ctrl-Left\":\"goGroupLeft\",\"Ctrl-Right\":\"goGroupRight\",\"Alt-Left\":\"goLineStart\",\"Alt-Right\":\"goLineEnd\",\"Ctrl-Backspace\":\"delGroupBefore\",\"Ctrl-Delete\":\"delGroupAfter\",\"Ctrl-S\":\"save\",\"Ctrl-F\":\"find\",\"Ctrl-G\":\"findNext\",\"Shift-Ctrl-G\":\"findPrev\",\"Shift-Ctrl-F\":\"replace\",\"Shift-Ctrl-R\":\"replaceAll\",\"Ctrl-[\":\"indentLess\",\"Ctrl-]\":\"indentMore\",\"Ctrl-U\":\"undoSelection\",\"Shift-Ctrl-U\":\"redoSelection\",\"Alt-U\":\"redoSelection\",fallthrough:\"basic\"},Po.emacsy={\"Ctrl-F\":\"goCharRight\",\"Ctrl-B\":\"goCharLeft\",\"Ctrl-P\":\"goLineUp\",\"Ctrl-N\":\"goLineDown\",\"Alt-F\":\"goWordRight\",\"Alt-B\":\"goWordLeft\",\"Ctrl-A\":\"goLineStart\",\"Ctrl-E\":\"goLineEnd\",\"Ctrl-V\":\"goPageDown\",\"Shift-Ctrl-V\":\"goPageUp\",\"Ctrl-D\":\"delCharAfter\",\"Ctrl-H\":\"delCharBefore\",\"Alt-D\":\"delWordAfter\",\"Alt-Backspace\":\"delWordBefore\",\"Ctrl-K\":\"killLine\",\"Ctrl-T\":\"transposeChars\",\"Ctrl-O\":\"openLine\"},Po.macDefault={\"Cmd-A\":\"selectAll\",\"Cmd-D\":\"deleteLine\",\"Cmd-Z\":\"undo\",\"Shift-Cmd-Z\":\"redo\",\"Cmd-Y\":\"redo\",\"Cmd-Home\":\"goDocStart\",\"Cmd-Up\":\"goDocStart\",\"Cmd-End\":\"goDocEnd\",\"Cmd-Down\":\"goDocEnd\",\"Alt-Left\":\"goGroupLeft\",\"Alt-Right\":\"goGroupRight\",\"Cmd-Left\":\"goLineLeft\",\"Cmd-Right\":\"goLineRight\",\"Alt-Backspace\":\"delGroupBefore\",\"Ctrl-Alt-Backspace\":\"delGroupAfter\",\"Alt-Delete\":\"delGroupAfter\",\"Cmd-S\":\"save\",\"Cmd-F\":\"find\",\"Cmd-G\":\"findNext\",\"Shift-Cmd-G\":\"findPrev\",\"Cmd-Alt-F\":\"replace\",\"Shift-Cmd-Alt-F\":\"replaceAll\",\"Cmd-[\":\"indentLess\",\"Cmd-]\":\"indentMore\",\"Cmd-Backspace\":\"delWrappedLineLeft\",\"Cmd-Delete\":\"delWrappedLineRight\",\"Cmd-U\":\"undoSelection\",\"Shift-Cmd-U\":\"redoSelection\",\"Ctrl-Up\":\"goDocStart\",\"Ctrl-Down\":\"goDocEnd\",fallthrough:[\"basic\",\"emacsy\"]},Po.default=y?Po.macDefault:Po.pcDefault;var Yo={selectAll:Ji,singleSelection:function(e){return e.setSelection(e.getCursor(\"anchor\"),e.getCursor(\"head\"),V)},killLine:function(e){return Vo(e,function(t){if(t.empty()){var r=se(e.doc,t.head.line).text.length;return t.head.ch==r&&t.head.line<e.lastLine()?{from:t.head,to:ge(t.head.line+1,0)}:{from:t.head,to:ge(t.head.line,r)}}return{from:t.from(),to:t.to()}})},deleteLine:function(e){return Vo(e,function(t){return{from:ge(t.from().line,0),to:Ce(e.doc,ge(t.to().line+1,0))}})},delLineLeft:function(e){return Vo(e,function(e){return{from:ge(e.from().line,0),to:e.from()}})},delWrappedLineLeft:function(e){return Vo(e,function(t){var r=e.charCoords(t.head,\"div\").top+5;return{from:e.coordsChar({left:0,top:r},\"div\"),to:t.from()}})},delWrappedLineRight:function(e){return Vo(e,function(t){var r=e.charCoords(t.head,\"div\").top+5,n=e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:r},\"div\");return{from:t.from(),to:n}})},undo:function(e){return e.undo()},redo:function(e){return e.redo()},undoSelection:function(e){return e.undoSelection()},redoSelection:function(e){return e.redoSelection()},goDocStart:function(e){return e.extendSelection(ge(e.firstLine(),0))},goDocEnd:function(e){return e.extendSelection(ge(e.lastLine()))},goLineStart:function(e){return e.extendSelectionsBy(function(t){return _o(e,t.head.line)},{origin:\"+move\",bias:1})},goLineStartSmart:function(e){return e.extendSelectionsBy(function(t){return qo(e,t.head)},{origin:\"+move\",bias:1})},goLineEnd:function(e){return e.extendSelectionsBy(function(t){return function(e,t){var r=se(e.doc,t),n=function(e){for(var t;t=Ie(e);)e=t.find(1,!0).line;return e}(r);n!=r&&(t=he(n));return Xo(!0,e,r,t,-1)}(e,t.head.line)},{origin:\"+move\",bias:-1})},goLineRight:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,\"div\").top+5;return e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:r},\"div\")},j)},goLineLeft:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,\"div\").top+5;return e.coordsChar({left:0,top:r},\"div\")},j)},goLineLeftSmart:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,\"div\").top+5,n=e.coordsChar({left:0,top:r},\"div\");return n.ch<e.getLine(n.line).search(/\\S/)?qo(e,t.head):n},j)},goLineUp:function(e){return e.moveV(-1,\"line\")},goLineDown:function(e){return e.moveV(1,\"line\")},goPageUp:function(e){return e.moveV(-1,\"page\")},goPageDown:function(e){return e.moveV(1,\"page\")},goCharLeft:function(e){return e.moveH(-1,\"char\")},goCharRight:function(e){return e.moveH(1,\"char\")},goColumnLeft:function(e){return e.moveH(-1,\"column\")},goColumnRight:function(e){return e.moveH(1,\"column\")},goWordLeft:function(e){return e.moveH(-1,\"word\")},goGroupRight:function(e){return e.moveH(1,\"group\")},goGroupLeft:function(e){return e.moveH(-1,\"group\")},goWordRight:function(e){return e.moveH(1,\"word\")},delCharBefore:function(e){return e.deleteH(-1,\"char\")},delCharAfter:function(e){return e.deleteH(1,\"char\")},delWordBefore:function(e){return e.deleteH(-1,\"word\")},delWordAfter:function(e){return e.deleteH(1,\"word\")},delGroupBefore:function(e){return e.deleteH(-1,\"group\")},delGroupAfter:function(e){return e.deleteH(1,\"group\")},indentAuto:function(e){return e.indentSelection(\"smart\")},indentMore:function(e){return e.indentSelection(\"add\")},indentLess:function(e){return e.indentSelection(\"subtract\")},insertTab:function(e){return e.replaceSelection(\"\\t\")},insertSoftTab:function(e){for(var t=[],r=e.listSelections(),n=e.options.tabSize,i=0;i<r.length;i++){var o=r[i].from(),l=I(e.getLine(o.line),o.ch,n);t.push(_(n-l%n))}e.replaceSelections(t)},defaultTab:function(e){e.somethingSelected()?e.indentSelection(\"add\"):e.execCommand(\"insertTab\")},transposeChars:function(e){return Kn(e,function(){for(var t=e.listSelections(),r=[],n=0;n<t.length;n++)if(t[n].empty()){var i=t[n].head,o=se(e.doc,i.line).text;if(o)if(i.ch==o.length&&(i=new ge(i.line,i.ch-1)),i.ch>0)i=new ge(i.line,i.ch+1),e.replaceRange(o.charAt(i.ch-1)+o.charAt(i.ch-2),ge(i.line,i.ch-2),i,\"+transpose\");else if(i.line>e.doc.first){var l=se(e.doc,i.line-1).text;l&&(i=new ge(i.line,1),e.replaceRange(o.charAt(0)+e.doc.lineSeparator()+l.charAt(l.length-1),ge(i.line-1,l.length-1),i,\"+transpose\"))}r.push(new gi(i,i))}e.setSelections(r)})},newlineAndIndent:function(e){return Kn(e,function(){for(var t=e.listSelections(),r=t.length-1;r>=0;r--)e.replaceRange(e.doc.lineSeparator(),t[r].anchor,t[r].head,\"+input\");t=e.listSelections();for(var n=0;n<t.length;n++)e.indentLine(t[n].from().line,null,!0);Sn(e)})},openLine:function(e){return e.replaceSelection(\"\\n\",\"start\")},toggleOverwrite:function(e){return e.toggleOverwrite()}};function _o(e,t){var r=se(e.doc,t),n=Be(r);return n!=r&&(t=he(n)),Xo(!0,e,n,t,1)}function qo(e,t){var r=_o(e,t.line),n=se(e.doc,r.line),i=Ze(n,e.doc.direction);if(!i||0==i[0].level){var o=Math.max(0,n.text.search(/\\S/)),l=t.line==r.line&&t.ch<=o&&t.ch;return ge(r.line,l?0:o,r.sticky)}return r}function $o(e,t,r){if(\"string\"==typeof t&&!(t=Yo[t]))return!1;e.display.input.ensurePolled();var n=e.display.shift,i=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),r&&(e.display.shift=!1),i=t(e)!=U}finally{e.display.shift=n,e.state.suppressEdits=!1}return i}var Zo=new R;function Qo(e,t,r,n){var i=e.state.keySeq;if(i){if(Ro(t))return\"handled\";if(/\\'$/.test(t)?e.state.keySeq=null:Zo.set(50,function(){e.state.keySeq==i&&(e.state.keySeq=null,e.display.input.reset())}),Jo(e,i+\" \"+t,r,n))return!0}return Jo(e,t,r,n)}function Jo(e,t,r,n){var i=function(e,t,r){for(var n=0;n<e.state.keyMaps.length;n++){var i=Io(t,e.state.keyMaps[n],r,e);if(i)return i}return e.options.extraKeys&&Io(t,e.options.extraKeys,r,e)||Io(t,e.options.keyMap,r,e)}(e,t,n);return\"multi\"==i&&(e.state.keySeq=t),\"handled\"==i&&or(e,\"keyHandled\",e,t,r),\"handled\"!=i&&\"multi\"!=i||(st(r),hn(e)),!!i}function el(e,t){var r=Go(t,!0);return!!r&&(t.shiftKey&&!e.state.keySeq?Qo(e,\"Shift-\"+r,t,function(t){return $o(e,t,!0)})||Qo(e,r,t,function(t){if(\"string\"==typeof t?/^go[A-Z]/.test(t):t.motion)return $o(e,t)}):Qo(e,r,t,function(t){return $o(e,t)}))}var tl=null;function rl(e){var t=this;if(t.curOp.focus=W(),!nt(t,e)){l&&s<11&&27==e.keyCode&&(e.returnValue=!1);var r=e.keyCode;t.display.shift=16==r||e.shiftKey;var n=el(t,e);h&&(tl=n?r:null,!n&&88==r&&!xt&&(y?e.metaKey:e.ctrlKey)&&t.replaceSelection(\"\",null,\"cut\")),18!=r||/\\bCodeMirror-crosshair\\b/.test(t.display.lineDiv.className)||function(e){var t=e.display.lineDiv;function r(e){18!=e.keyCode&&e.altKey||(T(t,\"CodeMirror-crosshair\"),tt(document,\"keyup\",r),tt(document,\"mouseover\",r))}H(t,\"CodeMirror-crosshair\"),Je(document,\"keyup\",r),Je(document,\"mouseover\",r)}(t)}}function nl(e){16==e.keyCode&&(this.doc.sel.shift=!1),nt(this,e)}function il(e){var t=this;if(!(yr(t.display,e)||nt(t,e)||e.ctrlKey&&!e.altKey||y&&e.metaKey)){var r=e.keyCode,n=e.charCode;if(h&&r==tl)return tl=null,void st(e);if(!h||e.which&&!(e.which<10)||!el(t,e)){var i,o=String.fromCharCode(null==n?r:n);if(\"\\b\"!=o)if(!Qo(i=t,\"'\"+o+\"'\",e,function(e){return $o(i,e,!0)}))t.display.input.onKeyPress(e)}}}var ol,ll,sl=function(e,t,r){this.time=e,this.pos=t,this.button=r};function al(e){var t=this,r=t.display;if(!(nt(t,e)||r.activeTouch&&r.input.supportsTouch()))if(r.input.ensurePolled(),r.shift=e.shiftKey,yr(r,e))a||(r.scroller.draggable=!1,setTimeout(function(){return r.scroller.draggable=!0},100));else if(!hl(t,e)){var n,i,o,u=nn(t,e),c=ft(e),h=u?(n=u,i=c,o=+new Date,ll&&ll.compare(o,n,i)?(ol=ll=null,\"triple\"):ol&&ol.compare(o,n,i)?(ll=new sl(o,n,i),ol=null,\"double\"):(ol=new sl(o,n,i),ll=null,\"single\")):\"single\";window.focus(),1==c&&t.state.selectingText&&t.state.selectingText(e),u&&function(e,t,r,n,i){var o=\"Click\";\"double\"==n?o=\"Double\"+o:\"triple\"==n&&(o=\"Triple\"+o);return Qo(e,Bo(o=(1==t?\"Left\":2==t?\"Middle\":\"Right\")+o,i),i,function(t){if(\"string\"==typeof t&&(t=Yo[t]),!t)return!1;var n=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),n=t(e,r)!=U}finally{e.state.suppressEdits=!1}return n})}(t,c,u,h,e)||(1==c?u?function(e,t,r,n){l?setTimeout(E(fn,e),0):e.curOp.focus=W();var i,o=function(e,t,r){var n=e.getOption(\"configureMouse\"),i=n?n(e,t,r):{};if(null==i.unit){var o=b?r.shiftKey&&r.metaKey:r.altKey;i.unit=o?\"rectangle\":\"single\"==t?\"char\":\"double\"==t?\"word\":\"line\"}(null==i.extend||e.doc.extend)&&(i.extend=e.doc.extend||r.shiftKey);null==i.addNew&&(i.addNew=y?r.metaKey:r.ctrlKey);null==i.moveOnDrag&&(i.moveOnDrag=!(y?r.altKey:r.ctrlKey));return i}(e,r,n),u=e.doc.sel;e.options.dragDrop&>&&!e.isReadOnly()&&\"single\"==r&&(i=u.contains(t))>-1&&(ve((i=u.ranges[i]).from(),t)<0||t.xRel>0)&&(ve(i.to(),t)>0||t.xRel<0)?function(e,t,r,n){var i=e.display,o=!1,u=jn(e,function(t){a&&(i.scroller.draggable=!1),e.state.draggingText=!1,tt(i.wrapper.ownerDocument,\"mouseup\",u),tt(i.wrapper.ownerDocument,\"mousemove\",c),tt(i.scroller,\"dragstart\",h),tt(i.scroller,\"drop\",u),o||(st(t),n.addNew||Bi(e.doc,r,null,null,n.extend),a||l&&9==s?setTimeout(function(){i.wrapper.ownerDocument.body.focus(),i.input.focus()},20):i.input.focus())}),c=function(e){o=o||Math.abs(t.clientX-e.clientX)+Math.abs(t.clientY-e.clientY)>=10},h=function(){return o=!0};a&&(i.scroller.draggable=!0);e.state.draggingText=u,u.copy=!n.moveOnDrag,i.scroller.dragDrop&&i.scroller.dragDrop();Je(i.wrapper.ownerDocument,\"mouseup\",u),Je(i.wrapper.ownerDocument,\"mousemove\",c),Je(i.scroller,\"dragstart\",h),Je(i.scroller,\"drop\",u),dn(e),setTimeout(function(){return i.input.focus()},20)}(e,n,t,o):function(e,t,r,n){var i=e.display,o=e.doc;st(t);var l,s,a=o.sel,u=a.ranges;n.addNew&&!n.extend?(s=o.sel.contains(r),l=s>-1?u[s]:new gi(r,r)):(l=o.sel.primary(),s=o.sel.primIndex);if(\"rectangle\"==n.unit)n.addNew||(l=new gi(r,r)),r=nn(e,t,!0,!0),s=-1;else{var c=ul(e,r,n.unit);l=n.extend?Ri(l,c.anchor,c.head,n.extend):c}n.addNew?-1==s?(s=u.length,ji(o,vi(u.concat([l]),s),{scroll:!1,origin:\"*mouse\"})):u.length>1&&u[s].empty()&&\"char\"==n.unit&&!n.extend?(ji(o,vi(u.slice(0,s).concat(u.slice(s+1)),0),{scroll:!1,origin:\"*mouse\"}),a=o.sel):Ui(o,s,l,K):(s=0,ji(o,new pi([l],0),K),a=o.sel);var h=r;function f(t){if(0!=ve(h,t))if(h=t,\"rectangle\"==n.unit){for(var i=[],u=e.options.tabSize,c=I(se(o,r.line).text,r.ch,u),f=I(se(o,t.line).text,t.ch,u),d=Math.min(c,f),p=Math.max(c,f),g=Math.min(r.line,t.line),v=Math.min(e.lastLine(),Math.max(r.line,t.line));g<=v;g++){var m=se(o,g).text,y=X(m,d,u);d==p?i.push(new gi(ge(g,y),ge(g,y))):m.length>y&&i.push(new gi(ge(g,y),ge(g,X(m,p,u))))}i.length||i.push(new gi(r,r)),ji(o,vi(a.ranges.slice(0,s).concat(i),s),{origin:\"*mouse\",scroll:!1}),e.scrollIntoView(t)}else{var b,w=l,x=ul(e,t,n.unit),C=w.anchor;ve(x.anchor,C)>0?(b=x.head,C=we(w.from(),x.anchor)):(b=x.anchor,C=be(w.to(),x.head));var S=a.ranges.slice(0);S[s]=function(e,t){var r=t.anchor,n=t.head,i=se(e.doc,r.line);if(0==ve(r,n)&&r.sticky==n.sticky)return t;var o=Ze(i);if(!o)return t;var l=qe(o,r.ch,r.sticky),s=o[l];if(s.from!=r.ch&&s.to!=r.ch)return t;var a,u=l+(s.from==r.ch==(1!=s.level)?0:1);if(0==u||u==o.length)return t;if(n.line!=r.line)a=(n.line-r.line)*(\"ltr\"==e.doc.direction?1:-1)>0;else{var c=qe(o,n.ch,n.sticky),h=c-l||(n.ch-r.ch)*(1==s.level?-1:1);a=c==u-1||c==u?h<0:h>0}var f=o[u+(a?-1:0)],d=a==(1==f.level),p=d?f.from:f.to,g=d?\"after\":\"before\";return r.ch==p&&r.sticky==g?t:new gi(new ge(r.line,p,g),n)}(e,new gi(Ce(o,C),b)),ji(o,vi(S,s),K)}}var d=i.wrapper.getBoundingClientRect(),p=0;function g(t){e.state.selectingText=!1,p=1/0,st(t),i.input.focus(),tt(i.wrapper.ownerDocument,\"mousemove\",v),tt(i.wrapper.ownerDocument,\"mouseup\",m),o.history.lastSelOrigin=null}var v=jn(e,function(t){ft(t)?function t(r){var l=++p;var s=nn(e,r,!0,\"rectangle\"==n.unit);if(!s)return;if(0!=ve(s,h)){e.curOp.focus=W(),f(s);var a=yn(i,o);(s.line>=a.to||s.line<a.from)&&setTimeout(jn(e,function(){p==l&&t(r)}),150)}else{var u=r.clientY<d.top?-20:r.clientY>d.bottom?20:0;u&&setTimeout(jn(e,function(){p==l&&(i.scroller.scrollTop+=u,t(r))}),50)}}(t):g(t)}),m=jn(e,g);e.state.selectingText=m,Je(i.wrapper.ownerDocument,\"mousemove\",v),Je(i.wrapper.ownerDocument,\"mouseup\",m)}(e,n,t,o)}(t,u,h,e):ht(e)==r.scroller&&st(e):2==c?(u&&Bi(t.doc,u),setTimeout(function(){return r.input.focus()},20)):3==c&&(S?fl(t,e):dn(t)))}}function ul(e,t,r){if(\"char\"==r)return new gi(t,t);if(\"word\"==r)return e.findWordAt(t);if(\"line\"==r)return new gi(ge(t.line,0),Ce(e.doc,ge(t.line+1,0)));var n=r(e,t);return new gi(n.from,n.to)}function cl(e,t,r,n){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(t){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;n&&st(t);var l=e.display,s=l.lineDiv.getBoundingClientRect();if(o>s.bottom||!ot(e,r))return ut(t);o-=s.top-l.viewOffset;for(var a=0;a<e.options.gutters.length;++a){var u=l.gutters.childNodes[a];if(u&&u.getBoundingClientRect().right>=i)return rt(e,r,e,fe(e.doc,o),e.options.gutters[a],t),ut(t)}}function hl(e,t){return cl(e,t,\"gutterClick\",!0)}function fl(e,t){yr(e.display,t)||function(e,t){if(!ot(e,\"gutterContextMenu\"))return!1;return cl(e,t,\"gutterContextMenu\",!1)}(e,t)||nt(e,t,\"contextmenu\")||e.display.input.onContextMenu(t)}function dl(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\\s*cm-s-\\S+/g,\"\")+e.options.theme.replace(/(^|\\s)\\s*/g,\" cm-s-\"),Er(e)}sl.prototype.compare=function(e,t,r){return this.time+400>e&&0==ve(t,this.pos)&&r==this.button};var pl={toString:function(){return\"CodeMirror.Init\"}},gl={},vl={};function ml(e){si(e),_n(e),bn(e)}function yl(e,t,r){if(!t!=!(r&&r!=pl)){var n=e.display.dragFunctions,i=t?Je:tt;i(e.display.scroller,\"dragstart\",n.start),i(e.display.scroller,\"dragenter\",n.enter),i(e.display.scroller,\"dragover\",n.over),i(e.display.scroller,\"dragleave\",n.leave),i(e.display.scroller,\"drop\",n.drop)}}function bl(e){e.options.lineWrapping?(H(e.display.wrapper,\"CodeMirror-wrap\"),e.display.sizer.style.minWidth=\"\",e.display.sizerWidth=null):(T(e.display.wrapper,\"CodeMirror-wrap\"),Ye(e)),rn(e),_n(e),Er(e),setTimeout(function(){return Hn(e)},100)}function wl(e,t){var n=this;if(!(this instanceof wl))return new wl(e,t);this.options=t=t?z(t):{},z(gl,t,!1),ai(t);var i=t.value;\"string\"==typeof i&&(i=new So(i,t.mode,null,t.lineSeparator,t.direction)),this.doc=i;var o=new wl.inputStyles[t.inputStyle](this),u=this.display=new function(e,t,n){var i=this;this.input=n,i.scrollbarFiller=O(\"div\",null,\"CodeMirror-scrollbar-filler\"),i.scrollbarFiller.setAttribute(\"cm-not-content\",\"true\"),i.gutterFiller=O(\"div\",null,\"CodeMirror-gutter-filler\"),i.gutterFiller.setAttribute(\"cm-not-content\",\"true\"),i.lineDiv=A(\"div\",null,\"CodeMirror-code\"),i.selectionDiv=O(\"div\",null,null,\"position: relative; z-index: 1\"),i.cursorDiv=O(\"div\",null,\"CodeMirror-cursors\"),i.measure=O(\"div\",null,\"CodeMirror-measure\"),i.lineMeasure=O(\"div\",null,\"CodeMirror-measure\"),i.lineSpace=A(\"div\",[i.measure,i.lineMeasure,i.selectionDiv,i.cursorDiv,i.lineDiv],null,\"position: relative; outline: none\");var o=A(\"div\",[i.lineSpace],\"CodeMirror-lines\");i.mover=O(\"div\",[o],null,\"position: relative\"),i.sizer=O(\"div\",[i.mover],\"CodeMirror-sizer\"),i.sizerWidth=null,i.heightForcer=O(\"div\",null,null,\"position: absolute; height: \"+G+\"px; width: 1px;\"),i.gutters=O(\"div\",null,\"CodeMirror-gutters\"),i.lineGutter=null,i.scroller=O(\"div\",[i.sizer,i.heightForcer,i.gutters],\"CodeMirror-scroll\"),i.scroller.setAttribute(\"tabIndex\",\"-1\"),i.wrapper=O(\"div\",[i.scrollbarFiller,i.gutterFiller,i.scroller],\"CodeMirror\"),l&&s<8&&(i.gutters.style.zIndex=-1,i.scroller.style.paddingRight=0),a||r&&m||(i.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(i.wrapper):e(i.wrapper)),i.viewFrom=i.viewTo=t.first,i.reportedViewFrom=i.reportedViewTo=t.first,i.view=[],i.renderedView=null,i.externalMeasured=null,i.viewOffset=0,i.lastWrapHeight=i.lastWrapWidth=0,i.updateLineNumbers=null,i.nativeBarWidth=i.barHeight=i.barWidth=0,i.scrollbarsClipped=!1,i.lineNumWidth=i.lineNumInnerWidth=i.lineNumChars=null,i.alignWidgets=!1,i.cachedCharWidth=i.cachedTextHeight=i.cachedPaddingH=null,i.maxLine=null,i.maxLineLength=0,i.maxLineChanged=!1,i.wheelDX=i.wheelDY=i.wheelStartX=i.wheelStartY=null,i.shift=!1,i.selForContextMenu=null,i.activeTouch=null,n.init(i)}(e,i,o);for(var c in u.wrapper.CodeMirror=this,si(this),dl(this),t.lineWrapping&&(this.display.wrapper.className+=\" CodeMirror-wrap\"),En(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,selectingText:!1,draggingText:!1,highlight:new R,keySeq:null,specialChars:null},t.autofocus&&!m&&u.input.focus(),l&&s<11&&setTimeout(function(){return n.display.input.reset(!0)},20),function(e){var t=e.display;Je(t.scroller,\"mousedown\",jn(e,al)),Je(t.scroller,\"dblclick\",l&&s<11?jn(e,function(t){if(!nt(e,t)){var r=nn(e,t);if(r&&!hl(e,t)&&!yr(e.display,t)){st(t);var n=e.findWordAt(r);Bi(e.doc,n.anchor,n.head)}}}):function(t){return nt(e,t)||st(t)});S||Je(t.scroller,\"contextmenu\",function(t){return fl(e,t)});var r,n={end:0};function i(){t.activeTouch&&(r=setTimeout(function(){return t.activeTouch=null},1e3),(n=t.activeTouch).end=+new Date)}function o(e,t){if(null==t.left)return!0;var r=t.left-e.left,n=t.top-e.top;return r*r+n*n>400}Je(t.scroller,\"touchstart\",function(i){if(!nt(e,i)&&!function(e){if(1!=e.touches.length)return!1;var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}(i)&&!hl(e,i)){t.input.ensurePolled(),clearTimeout(r);var o=+new Date;t.activeTouch={start:o,moved:!1,prev:o-n.end<=300?n:null},1==i.touches.length&&(t.activeTouch.left=i.touches[0].pageX,t.activeTouch.top=i.touches[0].pageY)}}),Je(t.scroller,\"touchmove\",function(){t.activeTouch&&(t.activeTouch.moved=!0)}),Je(t.scroller,\"touchend\",function(r){var n=t.activeTouch;if(n&&!yr(t,r)&&null!=n.left&&!n.moved&&new Date-n.start<300){var l,s=e.coordsChar(t.activeTouch,\"page\");l=!n.prev||o(n,n.prev)?new gi(s,s):!n.prev.prev||o(n,n.prev.prev)?e.findWordAt(s):new gi(ge(s.line,0),Ce(e.doc,ge(s.line+1,0))),e.setSelection(l.anchor,l.head),e.focus(),st(r)}i()}),Je(t.scroller,\"touchcancel\",i),Je(t.scroller,\"scroll\",function(){t.scroller.clientHeight&&(Mn(e,t.scroller.scrollTop),On(e,t.scroller.scrollLeft,!0),rt(e,\"scroll\",e))}),Je(t.scroller,\"mousewheel\",function(t){return di(e,t)}),Je(t.scroller,\"DOMMouseScroll\",function(t){return di(e,t)}),Je(t.wrapper,\"scroll\",function(){return t.wrapper.scrollTop=t.wrapper.scrollLeft=0}),t.dragFunctions={enter:function(t){nt(e,t)||ct(t)},over:function(t){nt(e,t)||(!function(e,t){var r=nn(e,t);if(r){var n=document.createDocumentFragment();an(e,r,n),e.display.dragCursor||(e.display.dragCursor=O(\"div\",null,\"CodeMirror-cursors CodeMirror-dragcursors\"),e.display.lineSpace.insertBefore(e.display.dragCursor,e.display.cursorDiv)),N(e.display.dragCursor,n)}}(e,t),ct(t))},start:function(t){return function(e,t){if(l&&(!e.state.draggingText||+new Date-Lo<100))ct(t);else if(!nt(e,t)&&!yr(e.display,t)&&(t.dataTransfer.setData(\"Text\",e.getSelection()),t.dataTransfer.effectAllowed=\"copyMove\",t.dataTransfer.setDragImage&&!f)){var r=O(\"img\",null,null,\"position: fixed; left: 0; top: 0;\");r.src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",h&&(r.width=r.height=1,e.display.wrapper.appendChild(r),r._top=r.offsetTop),t.dataTransfer.setDragImage(r,0,0),h&&r.parentNode.removeChild(r)}}(e,t)},drop:jn(e,ko),leave:function(t){nt(e,t)||To(e)}};var a=t.input.getField();Je(a,\"keyup\",function(t){return nl.call(e,t)}),Je(a,\"keydown\",jn(e,rl)),Je(a,\"keypress\",jn(e,il)),Je(a,\"focus\",function(t){return pn(e,t)}),Je(a,\"blur\",function(t){return gn(e,t)})}(this),Oo(),In(this),this.curOp.forceUpdate=!0,Mi(this,i),t.autofocus&&!m||this.hasFocus()?setTimeout(E(pn,this),20):gn(this),vl)vl.hasOwnProperty(c)&&vl[c](n,t[c],pl);wn(this),t.finishInit&&t.finishInit(this);for(var d=0;d<xl.length;++d)xl[d](n);Rn(this),a&&t.lineWrapping&&\"optimizelegibility\"==getComputedStyle(u.lineDiv).textRendering&&(u.lineDiv.style.textRendering=\"auto\")}wl.defaults=gl,wl.optionHandlers=vl;var xl=[];function Cl(e,t,r,n){var i,o=e.doc;null==r&&(r=\"add\"),\"smart\"==r&&(o.mode.indent?i=zt(e,t).state:r=\"prev\");var l=e.options.tabSize,s=se(o,t),a=I(s.text,null,l);s.stateAfter&&(s.stateAfter=null);var u,c=s.text.match(/^\\s*/)[0];if(n||/\\S/.test(s.text)){if(\"smart\"==r&&((u=o.mode.indent(i,s.text.slice(c.length),s.text))==U||u>150)){if(!n)return;r=\"prev\"}}else u=0,r=\"not\";\"prev\"==r?u=t>o.first?I(se(o,t-1).text,null,l):0:\"add\"==r?u=a+e.options.indentUnit:\"subtract\"==r?u=a-e.options.indentUnit:\"number\"==typeof r&&(u=a+r),u=Math.max(0,u);var h=\"\",f=0;if(e.options.indentWithTabs)for(var d=Math.floor(u/l);d;--d)f+=l,h+=\"\\t\";if(f<u&&(h+=_(u-f)),h!=c)return lo(o,h,ge(t,0),ge(t,c.length),\"+input\"),s.stateAfter=null,!0;for(var p=0;p<o.sel.ranges.length;p++){var g=o.sel.ranges[p];if(g.head.line==t&&g.head.ch<c.length){var v=ge(t,c.length);Ui(o,p,new gi(v,v));break}}}wl.defineInitHook=function(e){return xl.push(e)};var Sl=null;function Ll(e){Sl=e}function kl(e,t,r,n,i){var o=e.doc;e.display.shift=!1,n||(n=o.sel);var l,s=e.state.pasteIncoming||\"paste\"==i,a=bt(t),u=null;if(s&&n.ranges.length>1)if(Sl&&Sl.text.join(\"\\n\")==t){if(n.ranges.length%Sl.text.length==0){u=[];for(var c=0;c<Sl.text.length;c++)u.push(o.splitLines(Sl.text[c]))}}else a.length==n.ranges.length&&e.options.pasteLinesPerSelection&&(u=$(a,function(e){return[e]}));for(var h=n.ranges.length-1;h>=0;h--){var f=n.ranges[h],d=f.from(),p=f.to();f.empty()&&(r&&r>0?d=ge(d.line,d.ch-r):e.state.overwrite&&!s?p=ge(p.line,Math.min(se(o,p.line).text.length,p.ch+q(a).length)):Sl&&Sl.lineWise&&Sl.text.join(\"\\n\")==t&&(d=p=ge(d.line,0))),l=e.curOp.updateInput;var g={from:d,to:p,text:u?u[h%u.length]:a,origin:i||(s?\"paste\":e.state.cutIncoming?\"cut\":\"+input\")};to(e.doc,g),or(e,\"inputRead\",e,g)}t&&!s&&Ml(e,t),Sn(e),e.curOp.updateInput=l,e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=!1}function Tl(e,t){var r=e.clipboardData&&e.clipboardData.getData(\"Text\");if(r)return e.preventDefault(),t.isReadOnly()||t.options.disableInput||Kn(t,function(){return kl(t,r,0,null,\"paste\")}),!0}function Ml(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var r=e.doc.sel,n=r.ranges.length-1;n>=0;n--){var i=r.ranges[n];if(!(i.head.ch>100||n&&r.ranges[n-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s<o.electricChars.length;s++)if(t.indexOf(o.electricChars.charAt(s))>-1){l=Cl(e,i.head.line,\"smart\");break}}else o.electricInput&&o.electricInput.test(se(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=Cl(e,i.head.line,\"smart\"));l&&or(e,\"electricInput\",e,i.head.line)}}}function Nl(e){for(var t=[],r=[],n=0;n<e.doc.sel.ranges.length;n++){var i=e.doc.sel.ranges[n].head.line,o={anchor:ge(i,0),head:ge(i+1,0)};r.push(o),t.push(e.getRange(o.anchor,o.head))}return{text:t,ranges:r}}function Ol(e,t){e.setAttribute(\"autocorrect\",\"off\"),e.setAttribute(\"autocapitalize\",\"off\"),e.setAttribute(\"spellcheck\",!!t)}function Al(){var e=O(\"textarea\",null,null,\"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none\"),t=O(\"div\",[e],null,\"overflow: hidden; position: relative; width: 3px; height: 0px;\");return a?e.style.width=\"1000px\":e.setAttribute(\"wrap\",\"off\"),g&&(e.style.border=\"1px solid black\"),Ol(e),t}function Dl(e,t,r,n,i){var o=t,l=r,s=se(e,t.line);function a(n){var o,l;if(null==(o=i?function(e,t,r,n){var i=Ze(t,e.doc.direction);if(!i)return jo(t,r,n);r.ch>=t.text.length?(r.ch=t.text.length,r.sticky=\"before\"):r.ch<=0&&(r.ch=0,r.sticky=\"after\");var o=qe(i,r.ch,r.sticky),l=i[o];if(\"ltr\"==e.doc.direction&&l.level%2==0&&(n>0?l.to>r.ch:l.from<r.ch))return jo(t,r,n);var s,a=function(e,r){return Ko(t,e instanceof ge?e.ch:e,r)},u=function(r){return e.options.lineWrapping?(s=s||Nr(e,t),_r(e,t,s,r)):{begin:0,end:t.text.length}},c=u(\"before\"==r.sticky?a(r,-1):r.ch);if(\"rtl\"==e.doc.direction||1==l.level){var h=1==l.level==n<0,f=a(r,h?1:-1);if(null!=f&&(h?f<=l.to&&f<=c.end:f>=l.from&&f>=c.begin)){var d=h?\"before\":\"after\";return new ge(r.line,f,d)}}var p=function(e,t,n){for(var o=function(e,t){return t?new ge(r.line,a(e,1),\"before\"):new ge(r.line,e,\"after\")};e>=0&&e<i.length;e+=t){var l=i[e],s=t>0==(1!=l.level),u=s?n.begin:a(n.end,-1);if(l.from<=u&&u<l.to)return o(u,s);if(u=s?l.from:a(l.to,-1),n.begin<=u&&u<n.end)return o(u,s)}},g=p(o+n,n,c);if(g)return g;var v=n>0?c.end:a(c.begin,-1);return null==v||n>0&&v==t.text.length||!(g=p(n>0?0:i.length-1,n,u(v)))?null:g}(e.cm,s,t,r):jo(s,t,r))){if(n||(l=t.line+r)<e.first||l>=e.first+e.size||(t=new ge(l,t.ch,t.sticky),!(s=se(e,l))))return!1;t=Xo(i,e.cm,s,t.line,r)}else t=o;return!0}if(\"char\"==n)a();else if(\"column\"==n)a(!0);else if(\"word\"==n||\"group\"==n)for(var u=null,c=\"group\"==n,h=e.cm&&e.cm.getHelper(t,\"wordChars\"),f=!0;!(r<0)||a(!f);f=!1){var d=s.text.charAt(t.ch)||\"\\n\",p=te(d,h)?\"w\":c&&\"\\n\"==d?\"n\":!c||/\\s/.test(d)?null:\"p\";if(!c||f||p||(p=\"s\"),u&&u!=p){r<0&&(r=1,a(),t.sticky=\"after\");break}if(p&&(u=p),r>0&&!a(!f))break}var g=Zi(e,t,o,l,!0);return me(o,g)&&(g.hitSide=!0),g}function Wl(e,t,r,n){var i,o,l=e.doc,s=t.left;if(\"page\"==n){var a=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),u=Math.max(a-.5*Zr(e.display),3);i=(r>0?t.bottom:t.top)+r*u}else\"line\"==n&&(i=r>0?t.bottom+3:t.top-3);for(;(o=Xr(e,s,i)).outside;){if(r<0?i<=0:i>=l.height){o.hitSide=!0;break}i+=5*r}return o}var Hl=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new R,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};function Fl(e,t){var r=Mr(e,t.line);if(!r||r.hidden)return null;var n=se(e.doc,t.line),i=kr(r,n,t.line),o=Ze(n,e.doc.direction),l=\"left\";o&&(l=qe(o,t.ch)%2?\"right\":\"left\");var s=Wr(i.map,t.ch,l);return s.offset=\"right\"==s.collapse?s.end:s.start,s}function Pl(e,t){return t&&(e.bad=!0),e}function El(e,t,r){var n;if(t==e.display.lineDiv){if(!(n=e.display.lineDiv.childNodes[r]))return Pl(e.clipPos(ge(e.display.viewTo-1)),!0);t=null,r=0}else for(n=t;;n=n.parentNode){if(!n||n==e.display.lineDiv)return null;if(n.parentNode&&n.parentNode==e.display.lineDiv)break}for(var i=0;i<e.display.view.length;i++){var o=e.display.view[i];if(o.node==n)return zl(o,t,r)}}function zl(e,t,r){var n=e.text.firstChild,i=!1;if(!t||!D(n,t))return Pl(ge(he(e.line),0),!0);if(t==n&&(i=!0,t=n.childNodes[r],r=0,!t)){var o=e.rest?q(e.rest):e.line;return Pl(ge(he(o),o.text.length),i)}var l=3==t.nodeType?t:null,s=t;for(l||1!=t.childNodes.length||3!=t.firstChild.nodeType||(l=t.firstChild,r&&(r=l.nodeValue.length));s.parentNode!=n;)s=s.parentNode;var a=e.measure,u=a.maps;function c(t,r,n){for(var i=-1;i<(u?u.length:0);i++)for(var o=i<0?a.map:u[i],l=0;l<o.length;l+=3){var s=o[l+2];if(s==t||s==r){var c=he(i<0?e.line:e.rest[i]),h=o[l]+n;return(n<0||s!=t)&&(h=o[l+(n?1:0)]),ge(c,h)}}}var h=c(l,s,r);if(h)return Pl(h,i);for(var f=s.nextSibling,d=l?l.nodeValue.length-r:0;f;f=f.nextSibling){if(h=c(f,f.firstChild,0))return Pl(ge(h.line,h.ch-d),i);d+=f.textContent.length}for(var p=s.previousSibling,g=r;p;p=p.previousSibling){if(h=c(p,p.firstChild,-1))return Pl(ge(h.line,h.ch+g),i);g+=p.textContent.length}}Hl.prototype.init=function(e){var t=this,r=this,n=r.cm,i=r.div=e.lineDiv;function o(e){if(!nt(n,e)){if(n.somethingSelected())Ll({lineWise:!1,text:n.getSelections()}),\"cut\"==e.type&&n.replaceSelection(\"\",null,\"cut\");else{if(!n.options.lineWiseCopyCut)return;var t=Nl(n);Ll({lineWise:!0,text:t.text}),\"cut\"==e.type&&n.operation(function(){n.setSelections(t.ranges,0,V),n.replaceSelection(\"\",null,\"cut\")})}if(e.clipboardData){e.clipboardData.clearData();var o=Sl.text.join(\"\\n\");if(e.clipboardData.setData(\"Text\",o),e.clipboardData.getData(\"Text\")==o)return void e.preventDefault()}var l=Al(),s=l.firstChild;n.display.lineSpace.insertBefore(l,n.display.lineSpace.firstChild),s.value=Sl.text.join(\"\\n\");var a=document.activeElement;P(s),setTimeout(function(){n.display.lineSpace.removeChild(l),a.focus(),a==i&&r.showPrimarySelection()},50)}}Ol(i,n.options.spellcheck),Je(i,\"paste\",function(e){nt(n,e)||Tl(e,n)||s<=11&&setTimeout(jn(n,function(){return t.updateFromDOM()}),20)}),Je(i,\"compositionstart\",function(e){t.composing={data:e.data,done:!1}}),Je(i,\"compositionupdate\",function(e){t.composing||(t.composing={data:e.data,done:!1})}),Je(i,\"compositionend\",function(e){t.composing&&(e.data!=t.composing.data&&t.readFromDOMSoon(),t.composing.done=!0)}),Je(i,\"touchstart\",function(){return r.forceCompositionEnd()}),Je(i,\"input\",function(){t.composing||t.readFromDOMSoon()}),Je(i,\"copy\",o),Je(i,\"cut\",o)},Hl.prototype.prepareSelection=function(){var e=sn(this.cm,!1);return e.focus=this.cm.state.focused,e},Hl.prototype.showSelection=function(e,t){e&&this.cm.display.view.length&&((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},Hl.prototype.showPrimarySelection=function(){var e=window.getSelection(),t=this.cm,n=t.doc.sel.primary(),i=n.from(),o=n.to();if(t.display.viewTo==t.display.viewFrom||i.line>=t.display.viewTo||o.line<t.display.viewFrom)e.removeAllRanges();else{var l=El(t,e.anchorNode,e.anchorOffset),s=El(t,e.focusNode,e.focusOffset);if(!l||l.bad||!s||s.bad||0!=ve(we(l,s),i)||0!=ve(be(l,s),o)){var a=t.display.view,u=i.line>=t.display.viewFrom&&Fl(t,i)||{node:a[0].measure.map[2],offset:0},c=o.line<t.display.viewTo&&Fl(t,o);if(!c){var h=a[a.length-1].measure,f=h.maps?h.maps[h.maps.length-1]:h.map;c={node:f[f.length-1],offset:f[f.length-2]-f[f.length-3]}}if(u&&c){var d,p=e.rangeCount&&e.getRangeAt(0);try{d=k(u.node,u.offset,c.offset,c.node)}catch(e){}d&&(!r&&t.state.focused?(e.collapse(u.node,u.offset),d.collapsed||(e.removeAllRanges(),e.addRange(d))):(e.removeAllRanges(),e.addRange(d)),p&&null==e.anchorNode?e.addRange(p):r&&this.startGracePeriod()),this.rememberSelection()}else e.removeAllRanges()}}},Hl.prototype.startGracePeriod=function(){var e=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){e.gracePeriod=!1,e.selectionChanged()&&e.cm.operation(function(){return e.cm.curOp.selectionChanged=!0})},20)},Hl.prototype.showMultipleSelections=function(e){N(this.cm.display.cursorDiv,e.cursors),N(this.cm.display.selectionDiv,e.selection)},Hl.prototype.rememberSelection=function(){var e=window.getSelection();this.lastAnchorNode=e.anchorNode,this.lastAnchorOffset=e.anchorOffset,this.lastFocusNode=e.focusNode,this.lastFocusOffset=e.focusOffset},Hl.prototype.selectionInEditor=function(){var e=window.getSelection();if(!e.rangeCount)return!1;var t=e.getRangeAt(0).commonAncestorContainer;return D(this.div,t)},Hl.prototype.focus=function(){\"nocursor\"!=this.cm.options.readOnly&&(this.selectionInEditor()||this.showSelection(this.prepareSelection(),!0),this.div.focus())},Hl.prototype.blur=function(){this.div.blur()},Hl.prototype.getField=function(){return this.div},Hl.prototype.supportsTouch=function(){return!0},Hl.prototype.receivedFocus=function(){var e=this;this.selectionInEditor()?this.pollSelection():Kn(this.cm,function(){return e.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,function t(){e.cm.state.focused&&(e.pollSelection(),e.polling.set(e.cm.options.pollInterval,t))})},Hl.prototype.selectionChanged=function(){var e=window.getSelection();return e.anchorNode!=this.lastAnchorNode||e.anchorOffset!=this.lastAnchorOffset||e.focusNode!=this.lastFocusNode||e.focusOffset!=this.lastFocusOffset},Hl.prototype.pollSelection=function(){if(null==this.readDOMTimeout&&!this.gracePeriod&&this.selectionChanged()){var e=window.getSelection(),t=this.cm;if(v&&c&&this.cm.options.gutters.length&&function(e){for(var t=e;t;t=t.parentNode)if(/CodeMirror-gutter-wrapper/.test(t.className))return!0;return!1}(e.anchorNode))return this.cm.triggerOnKeyDown({type:\"keydown\",keyCode:8,preventDefault:Math.abs}),this.blur(),void this.focus();if(!this.composing){this.rememberSelection();var r=El(t,e.anchorNode,e.anchorOffset),n=El(t,e.focusNode,e.focusOffset);r&&n&&Kn(t,function(){ji(t.doc,mi(r,n),V),(r.bad||n.bad)&&(t.curOp.selectionChanged=!0)})}}},Hl.prototype.pollContent=function(){null!=this.readDOMTimeout&&(clearTimeout(this.readDOMTimeout),this.readDOMTimeout=null);var e,t,r,n=this.cm,i=n.display,o=n.doc.sel.primary(),l=o.from(),s=o.to();if(0==l.ch&&l.line>n.firstLine()&&(l=ge(l.line-1,se(n.doc,l.line-1).length)),s.ch==se(n.doc,s.line).text.length&&s.line<n.lastLine()&&(s=ge(s.line+1,0)),l.line<i.viewFrom||s.line>i.viewTo-1)return!1;l.line==i.viewFrom||0==(e=on(n,l.line))?(t=he(i.view[0].line),r=i.view[0].node):(t=he(i.view[e].line),r=i.view[e-1].node.nextSibling);var a,u,c=on(n,s.line);if(c==i.view.length-1?(a=i.viewTo-1,u=i.lineDiv.lastChild):(a=he(i.view[c+1].line)-1,u=i.view[c+1].node.previousSibling),!r)return!1;for(var h=n.doc.splitLines(function(e,t,r,n,i){var o=\"\",l=!1,s=e.doc.lineSeparator();function a(){l&&(o+=s,l=!1)}function u(e){e&&(a(),o+=e)}function c(t){if(1==t.nodeType){var r=t.getAttribute(\"cm-text\");if(null!=r)return void u(r||t.textContent.replace(/\\u200b/g,\"\"));var o,h=t.getAttribute(\"cm-marker\");if(h){var f=e.findMarks(ge(n,0),ge(i+1,0),(g=+h,function(e){return e.id==g}));return void(f.length&&(o=f[0].find(0))&&u(ae(e.doc,o.from,o.to).join(s)))}if(\"false\"==t.getAttribute(\"contenteditable\"))return;var d=/^(pre|div|p)$/i.test(t.nodeName);d&&a();for(var p=0;p<t.childNodes.length;p++)c(t.childNodes[p]);d&&(l=!0)}else 3==t.nodeType&&u(t.nodeValue);var g}for(;c(t),t!=r;)t=t.nextSibling;return o}(n,r,u,t,a)),f=ae(n.doc,ge(t,0),ge(a,se(n.doc,a).text.length));h.length>1&&f.length>1;)if(q(h)==q(f))h.pop(),f.pop(),a--;else{if(h[0]!=f[0])break;h.shift(),f.shift(),t++}for(var d=0,p=0,g=h[0],v=f[0],m=Math.min(g.length,v.length);d<m&&g.charCodeAt(d)==v.charCodeAt(d);)++d;for(var y=q(h),b=q(f),w=Math.min(y.length-(1==h.length?d:0),b.length-(1==f.length?d:0));p<w&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)++p;if(1==h.length&&1==f.length&&t==l.line)for(;d&&d>l.ch&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)d--,p++;h[h.length-1]=y.slice(0,y.length-p).replace(/^\\u200b+/,\"\"),h[0]=h[0].slice(d).replace(/\\u200b+$/,\"\");var x=ge(t,d),C=ge(a,f.length?q(f).length-p:0);return h.length>1||h[0]||ve(x,C)?(lo(n.doc,h,x,C,\"+input\"),!0):void 0},Hl.prototype.ensurePolled=function(){this.forceCompositionEnd()},Hl.prototype.reset=function(){this.forceCompositionEnd()},Hl.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},Hl.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},Hl.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||Kn(this.cm,function(){return _n(e.cm)})},Hl.prototype.setUneditable=function(e){e.contentEditable=\"false\"},Hl.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||jn(this.cm,kl)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},Hl.prototype.readOnlyChanged=function(e){this.div.contentEditable=String(\"nocursor\"!=e)},Hl.prototype.onContextMenu=function(){},Hl.prototype.resetPosition=function(){},Hl.prototype.needsContentAttribute=!0;var Il,Rl,Bl,Gl=function(e){this.cm=e,this.prevInput=\"\",this.pollingFast=!1,this.polling=new R,this.hasSelection=!1,this.composing=null};Gl.prototype.init=function(e){var t=this,r=this,n=this.cm;this.createField(e);var i=this.textarea;function o(e){if(!nt(n,e)){if(n.somethingSelected())Ll({lineWise:!1,text:n.getSelections()});else{if(!n.options.lineWiseCopyCut)return;var t=Nl(n);Ll({lineWise:!0,text:t.text}),\"cut\"==e.type?n.setSelections(t.ranges,null,V):(r.prevInput=\"\",i.value=t.text.join(\"\\n\"),P(i))}\"cut\"==e.type&&(n.state.cutIncoming=!0)}}e.wrapper.insertBefore(this.wrapper,e.wrapper.firstChild),g&&(i.style.width=\"0px\"),Je(i,\"input\",function(){l&&s>=9&&t.hasSelection&&(t.hasSelection=null),r.poll()}),Je(i,\"paste\",function(e){nt(n,e)||Tl(e,n)||(n.state.pasteIncoming=!0,r.fastPoll())}),Je(i,\"cut\",o),Je(i,\"copy\",o),Je(e.scroller,\"paste\",function(t){yr(e,t)||nt(n,t)||(n.state.pasteIncoming=!0,r.focus())}),Je(e.lineSpace,\"selectstart\",function(t){yr(e,t)||st(t)}),Je(i,\"compositionstart\",function(){var e=n.getCursor(\"from\");r.composing&&r.composing.range.clear(),r.composing={start:e,range:n.markText(e,n.getCursor(\"to\"),{className:\"CodeMirror-composing\"})}}),Je(i,\"compositionend\",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},Gl.prototype.createField=function(e){this.wrapper=Al(),this.textarea=this.wrapper.firstChild},Gl.prototype.prepareSelection=function(){var e=this.cm,t=e.display,r=e.doc,n=sn(e);if(e.options.moveInputWithCursor){var i=Vr(e,r.sel.primary().head,\"div\"),o=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();n.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-o.top)),n.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-o.left))}return n},Gl.prototype.showSelection=function(e){var t=this.cm.display;N(t.cursorDiv,e.cursors),N(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+\"px\",this.wrapper.style.left=e.teLeft+\"px\")},Gl.prototype.reset=function(e){if(!this.contextMenuPending&&!this.composing){var t=this.cm;if(t.somethingSelected()){this.prevInput=\"\";var r=t.getSelection();this.textarea.value=r,t.state.focused&&P(this.textarea),l&&s>=9&&(this.hasSelection=r)}else e||(this.prevInput=this.textarea.value=\"\",l&&s>=9&&(this.hasSelection=null))}},Gl.prototype.getField=function(){return this.textarea},Gl.prototype.supportsTouch=function(){return!1},Gl.prototype.focus=function(){if(\"nocursor\"!=this.cm.options.readOnly&&(!m||W()!=this.textarea))try{this.textarea.focus()}catch(e){}},Gl.prototype.blur=function(){this.textarea.blur()},Gl.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Gl.prototype.receivedFocus=function(){this.slowPoll()},Gl.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},Gl.prototype.fastPoll=function(){var e=!1,t=this;t.pollingFast=!0,t.polling.set(20,function r(){t.poll()||e?(t.pollingFast=!1,t.slowPoll()):(e=!0,t.polling.set(60,r))})},Gl.prototype.poll=function(){var e=this,t=this.cm,r=this.textarea,n=this.prevInput;if(this.contextMenuPending||!t.state.focused||wt(r)&&!n&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=r.value;if(i==n&&!t.somethingSelected())return!1;if(l&&s>=9&&this.hasSelection===i||y&&/[\\uf700-\\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||n||(n=\"\"),8666==o)return this.reset(),this.cm.execCommand(\"undo\")}for(var a=0,u=Math.min(n.length,i.length);a<u&&n.charCodeAt(a)==i.charCodeAt(a);)++a;return Kn(t,function(){kl(t,i.slice(a),n.length-a,null,e.composing?\"*compose\":null),i.length>1e3||i.indexOf(\"\\n\")>-1?r.value=e.prevInput=\"\":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor(\"to\"),{className:\"CodeMirror-composing\"}))}),!0},Gl.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Gl.prototype.onKeyPress=function(){l&&s>=9&&(this.hasSelection=null),this.fastPoll()},Gl.prototype.onContextMenu=function(e){var t=this,r=t.cm,n=r.display,i=t.textarea,o=nn(r,e),u=n.scroller.scrollTop;if(o&&!h){r.options.resetSelectionOnContextMenu&&-1==r.doc.sel.contains(o)&&jn(r,ji)(r.doc,mi(o),V);var c=i.style.cssText,f=t.wrapper.style.cssText;t.wrapper.style.cssText=\"position: absolute\";var d,p=t.wrapper.getBoundingClientRect();if(i.style.cssText=\"position: absolute; width: 30px; height: 30px;\\n top: \"+(e.clientY-p.top-5)+\"px; left: \"+(e.clientX-p.left-5)+\"px;\\n z-index: 1000; background: \"+(l?\"rgba(255, 255, 255, .05)\":\"transparent\")+\";\\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\",a&&(d=window.scrollY),n.input.focus(),a&&window.scrollTo(null,d),n.input.reset(),r.somethingSelected()||(i.value=t.prevInput=\" \"),t.contextMenuPending=!0,n.selForContextMenu=r.doc.sel,clearTimeout(n.detectingSelectAll),l&&s>=9&&v(),S){ct(e);var g=function(){tt(window,\"mouseup\",g),setTimeout(m,20)};Je(window,\"mouseup\",g)}else setTimeout(m,50)}function v(){if(null!=i.selectionStart){var e=r.somethingSelected(),o=\"\"+(e?i.value:\"\");i.value=\"⇚\",i.value=o,t.prevInput=e?\"\":\"\",i.selectionStart=1,i.selectionEnd=o.length,n.selForContextMenu=r.doc.sel}}function m(){if(t.contextMenuPending=!1,t.wrapper.style.cssText=f,i.style.cssText=c,l&&s<9&&n.scrollbars.setScrollTop(n.scroller.scrollTop=u),null!=i.selectionStart){(!l||l&&s<9)&&v();var e=0,o=function(){n.selForContextMenu==r.doc.sel&&0==i.selectionStart&&i.selectionEnd>0&&\"\"==t.prevInput?jn(r,Ji)(r):e++<10?n.detectingSelectAll=setTimeout(o,500):(n.selForContextMenu=null,n.input.reset())};n.detectingSelectAll=setTimeout(o,200)}}},Gl.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled=\"nocursor\"==e},Gl.prototype.setUneditable=function(){},Gl.prototype.needsContentAttribute=!1,function(e){var t=e.optionHandlers;function r(r,n,i,o){e.defaults[r]=n,i&&(t[r]=o?function(e,t,r){r!=pl&&i(e,t,r)}:i)}e.defineOption=r,e.Init=pl,r(\"value\",\"\",function(e,t){return e.setValue(t)},!0),r(\"mode\",null,function(e,t){e.doc.modeOption=t,Ci(e)},!0),r(\"indentUnit\",2,Ci,!0),r(\"indentWithTabs\",!1),r(\"smartIndent\",!0),r(\"tabSize\",4,function(e){Si(e),Er(e),_n(e)},!0),r(\"lineSeparator\",null,function(e,t){if(e.doc.lineSep=t,t){var r=[],n=e.doc.first;e.doc.iter(function(e){for(var i=0;;){var o=e.text.indexOf(t,i);if(-1==o)break;i=o+t.length,r.push(ge(n,o))}n++});for(var i=r.length-1;i>=0;i--)lo(e.doc,t,r[i],ge(r[i].line,r[i].ch+t.length))}}),r(\"specialChars\",/[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b-\\u200f\\u2028\\u2029\\ufeff]/g,function(e,t,r){e.state.specialChars=new RegExp(t.source+(t.test(\"\\t\")?\"\":\"|\\t\"),\"g\"),r!=pl&&e.refresh()}),r(\"specialCharPlaceholder\",$t,function(e){return e.refresh()},!0),r(\"electricChars\",!0),r(\"inputStyle\",m?\"contenteditable\":\"textarea\",function(){throw new Error(\"inputStyle can not (yet) be changed in a running editor\")},!0),r(\"spellcheck\",!1,function(e,t){return e.getInputField().spellcheck=t},!0),r(\"rtlMoveVisually\",!w),r(\"wholeLineUpdateBefore\",!0),r(\"theme\",\"default\",function(e){dl(e),ml(e)},!0),r(\"keyMap\",\"default\",function(e,t,r){var n=Uo(t),i=r!=pl&&Uo(r);i&&i.detach&&i.detach(e,n),n.attach&&n.attach(e,i||null)}),r(\"extraKeys\",null),r(\"configureMouse\",null),r(\"lineWrapping\",!1,bl,!0),r(\"gutters\",[],function(e){ai(e.options),ml(e)},!0),r(\"fixedGutter\",!0,function(e,t){e.display.gutters.style.left=t?en(e.display)+\"px\":\"0\",e.refresh()},!0),r(\"coverGutterNextToScrollbar\",!1,function(e){return Hn(e)},!0),r(\"scrollbarStyle\",\"native\",function(e){En(e),Hn(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),r(\"lineNumbers\",!1,function(e){ai(e.options),ml(e)},!0),r(\"firstLineNumber\",1,ml,!0),r(\"lineNumberFormatter\",function(e){return e},ml,!0),r(\"showCursorWhenSelecting\",!1,ln,!0),r(\"resetSelectionOnContextMenu\",!0),r(\"lineWiseCopyCut\",!0),r(\"pasteLinesPerSelection\",!0),r(\"readOnly\",!1,function(e,t){\"nocursor\"==t&&(gn(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),r(\"disableInput\",!1,function(e,t){t||e.display.input.reset()},!0),r(\"dragDrop\",!0,yl),r(\"allowDropFileTypes\",null),r(\"cursorBlinkRate\",530),r(\"cursorScrollMargin\",0),r(\"cursorHeight\",1,ln,!0),r(\"singleCursorHeightPerLine\",!0,ln,!0),r(\"workTime\",100),r(\"workDelay\",100),r(\"flattenSpans\",!0,Si,!0),r(\"addModeClass\",!1,Si,!0),r(\"pollInterval\",100),r(\"undoDepth\",200,function(e,t){return e.doc.history.undoDepth=t}),r(\"historyEventDelay\",1250),r(\"viewportMargin\",10,function(e){return e.refresh()},!0),r(\"maxHighlightLength\",1e4,Si,!0),r(\"moveInputWithCursor\",!0,function(e,t){t||e.display.input.resetPosition()}),r(\"tabindex\",null,function(e,t){return e.display.input.getField().tabIndex=t||\"\"}),r(\"autofocus\",null),r(\"direction\",\"ltr\",function(e,t){return e.doc.setDirection(t)},!0)}(wl),Rl=(Il=wl).optionHandlers,Bl=Il.helpers={},Il.prototype={constructor:Il,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,t){var r=this.options,n=r[e];r[e]==t&&\"mode\"!=e||(r[e]=t,Rl.hasOwnProperty(e)&&jn(this,Rl[e])(this,t,n),rt(this,\"optionChange\",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?\"push\":\"unshift\"](Uo(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,r=0;r<t.length;++r)if(t[r]==e||t[r].name==e)return t.splice(r,1),!0},addOverlay:Xn(function(e,t){var r=e.token?e:Il.getMode(this.options,e);if(r.startState)throw new Error(\"Overlays may not be stateful.\");!function(e,t,r){for(var n=0,i=r(t);n<e.length&&r(e[n])<=i;)n++;e.splice(n,0,t)}(this.state.overlays,{mode:r,modeSpec:e,opaque:t&&t.opaque,priority:t&&t.priority||0},function(e){return e.priority}),this.state.modeGen++,_n(this)}),removeOverlay:Xn(function(e){for(var t=this.state.overlays,r=0;r<t.length;++r){var n=t[r].modeSpec;if(n==e||\"string\"==typeof e&&n.name==e)return t.splice(r,1),this.state.modeGen++,void _n(this)}}),indentLine:Xn(function(e,t,r){\"string\"!=typeof t&&\"number\"!=typeof t&&(t=null==t?this.options.smartIndent?\"smart\":\"prev\":t?\"add\":\"subtract\"),de(this.doc,e)&&Cl(this,e,t,r)}),indentSelection:Xn(function(e){for(var t=this,r=this.doc.sel.ranges,n=-1,i=0;i<r.length;i++){var o=r[i];if(o.empty())o.head.line>n&&(Cl(t,o.head.line,e,!0),n=o.head.line,i==t.doc.sel.primIndex&&Sn(t));else{var l=o.from(),s=o.to(),a=Math.max(n,l.line);n=Math.min(t.lastLine(),s.line-(s.ch?0:1))+1;for(var u=a;u<n;++u)Cl(t,u,e);var c=t.doc.sel.ranges;0==l.ch&&r.length==c.length&&c[i].from().ch>0&&Ui(t.doc,i,new gi(l,c[i].to()),V)}}}),getTokenAt:function(e,t){return Ut(this,e,t)},getLineTokens:function(e,t){return Ut(this,ge(e),t,!0)},getTokenTypeAt:function(e){e=Ce(this.doc,e);var t,r=Et(this,se(this.doc,e.line)),n=0,i=(r.length-1)/2,o=e.ch;if(0==o)t=r[2];else for(;;){var l=n+i>>1;if((l?r[2*l-1]:0)>=o)i=l;else{if(!(r[2*l+1]<o)){t=r[2*l+2];break}n=l+1}}var s=t?t.indexOf(\"overlay \"):-1;return s<0?t:0==s?null:t.slice(0,s-1)},getModeAt:function(e){var t=this.doc.mode;return t.innerMode?Il.innerMode(t,this.getTokenAt(e).state).mode:t},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var r=[];if(!Bl.hasOwnProperty(t))return r;var n=Bl[t],i=this.getModeAt(e);if(\"string\"==typeof i[t])n[i[t]]&&r.push(n[i[t]]);else if(i[t])for(var o=0;o<i[t].length;o++){var l=n[i[t][o]];l&&r.push(l)}else i.helperType&&n[i.helperType]?r.push(n[i.helperType]):n[i.name]&&r.push(n[i.name]);for(var s=0;s<n._global.length;s++){var a=n._global[s];a.pred(i,this)&&-1==B(r,a.val)&&r.push(a.val)}return r},getStateAfter:function(e,t){var r=this.doc;return zt(this,(e=xe(r,null==e?r.first+r.size-1:e))+1,t).state},cursorCoords:function(e,t){var r=this.doc.sel.primary();return Vr(this,null==e?r.head:\"object\"==typeof e?Ce(this.doc,e):e?r.from():r.to(),t||\"page\")},charCoords:function(e,t){return Ur(this,Ce(this.doc,e),t||\"page\")},coordsChar:function(e,t){return Xr(this,(e=Gr(this,e,t||\"page\")).left,e.top)},lineAtHeight:function(e,t){return e=Gr(this,{top:e,left:0},t||\"page\").top,fe(this.doc,e+this.display.viewOffset)},heightAtLine:function(e,t,r){var n,i=!1;if(\"number\"==typeof e){var o=this.doc.first+this.doc.size-1;e<this.doc.first?e=this.doc.first:e>o&&(e=o,i=!0),n=se(this.doc,e)}else n=e;return Br(this,n,{top:0,left:0},t||\"page\",r||i).top+(i?this.doc.height-je(n):0)},defaultTextHeight:function(){return Zr(this.display)},defaultCharWidth:function(){return Qr(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,r,n,i){var o,l,s,a=this.display,u=(e=Vr(this,Ce(this.doc,e))).bottom,c=e.left;if(t.style.position=\"absolute\",t.setAttribute(\"cm-ignore-events\",\"true\"),this.display.input.setUneditable(t),a.sizer.appendChild(t),\"over\"==n)u=e.top;else if(\"above\"==n||\"near\"==n){var h=Math.max(a.wrapper.clientHeight,this.doc.height),f=Math.max(a.sizer.clientWidth,a.lineSpace.clientWidth);(\"above\"==n||e.bottom+t.offsetHeight>h)&&e.top>t.offsetHeight?u=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=h&&(u=e.bottom),c+t.offsetWidth>f&&(c=f-t.offsetWidth)}t.style.top=u+\"px\",t.style.left=t.style.right=\"\",\"right\"==i?(c=a.sizer.clientWidth-t.offsetWidth,t.style.right=\"0px\"):(\"left\"==i?c=0:\"middle\"==i&&(c=(a.sizer.clientWidth-t.offsetWidth)/2),t.style.left=c+\"px\"),r&&(o=this,l={left:c,top:u,right:c+t.offsetWidth,bottom:u+t.offsetHeight},null!=(s=xn(o,l)).scrollTop&&Mn(o,s.scrollTop),null!=s.scrollLeft&&On(o,s.scrollLeft))},triggerOnKeyDown:Xn(rl),triggerOnKeyPress:Xn(il),triggerOnKeyUp:nl,triggerOnMouseDown:Xn(al),execCommand:function(e){if(Yo.hasOwnProperty(e))return Yo[e].call(null,this)},triggerElectric:Xn(function(e){Ml(this,e)}),findPosH:function(e,t,r,n){var i=1;t<0&&(i=-1,t=-t);for(var o=Ce(this.doc,e),l=0;l<t&&!(o=Dl(this.doc,o,i,r,n)).hitSide;++l);return o},moveH:Xn(function(e,t){var r=this;this.extendSelectionsBy(function(n){return r.display.shift||r.doc.extend||n.empty()?Dl(r.doc,n.head,e,t,r.options.rtlMoveVisually):e<0?n.from():n.to()},j)}),deleteH:Xn(function(e,t){var r=this.doc.sel,n=this.doc;r.somethingSelected()?n.replaceSelection(\"\",null,\"+delete\"):Vo(this,function(r){var i=Dl(n,r.head,e,t,!1);return e<0?{from:i,to:r.head}:{from:r.head,to:i}})}),findPosV:function(e,t,r,n){var i=1,o=n;t<0&&(i=-1,t=-t);for(var l=Ce(this.doc,e),s=0;s<t;++s){var a=Vr(this,l,\"div\");if(null==o?o=a.left:a.left=o,(l=Wl(this,a,i,r)).hitSide)break}return l},moveV:Xn(function(e,t){var r=this,n=this.doc,i=[],o=!this.display.shift&&!n.extend&&n.sel.somethingSelected();if(n.extendSelectionsBy(function(l){if(o)return e<0?l.from():l.to();var s=Vr(r,l.head,\"div\");null!=l.goalColumn&&(s.left=l.goalColumn),i.push(s.left);var a=Wl(r,s,e,t);return\"page\"==t&&l==n.sel.primary()&&Cn(r,Ur(r,a,\"div\").top-s.top),a},j),i.length)for(var l=0;l<n.sel.ranges.length;l++)n.sel.ranges[l].goalColumn=i[l]}),findWordAt:function(e){var t=se(this.doc,e.line).text,r=e.ch,n=e.ch;if(t){var i=this.getHelper(e,\"wordChars\");\"before\"!=e.sticky&&n!=t.length||!r?++n:--r;for(var o=t.charAt(r),l=te(o,i)?function(e){return te(e,i)}:/\\s/.test(o)?function(e){return/\\s/.test(e)}:function(e){return!/\\s/.test(e)&&!te(e)};r>0&&l(t.charAt(r-1));)--r;for(;n<t.length&&l(t.charAt(n));)++n}return new gi(ge(e.line,r),ge(e.line,n))},toggleOverwrite:function(e){null!=e&&e==this.state.overwrite||((this.state.overwrite=!this.state.overwrite)?H(this.display.cursorDiv,\"CodeMirror-overwrite\"):T(this.display.cursorDiv,\"CodeMirror-overwrite\"),rt(this,\"overwriteToggle\",this,this.state.overwrite))},hasFocus:function(){return this.display.input.getField()==W()},isReadOnly:function(){return!(!this.options.readOnly&&!this.doc.cantEdit)},scrollTo:Xn(function(e,t){Ln(this,e,t)}),getScrollInfo:function(){var e=this.display.scroller;return{left:e.scrollLeft,top:e.scrollTop,height:e.scrollHeight-Cr(this)-this.display.barHeight,width:e.scrollWidth-Cr(this)-this.display.barWidth,clientHeight:Lr(this),clientWidth:Sr(this)}},scrollIntoView:Xn(function(e,t){var r,n;null==e?(e={from:this.doc.sel.primary().head,to:null},null==t&&(t=this.options.cursorScrollMargin)):\"number\"==typeof e?e={from:ge(e,0),to:null}:null==e.from&&(e={from:e,to:null}),e.to||(e.to=e.from),e.margin=t||0,null!=e.from.line?(n=e,kn(r=this),r.curOp.scrollToPos=n):Tn(this,e.from,e.to,e.margin)}),setSize:Xn(function(e,t){var r=this,n=function(e){return\"number\"==typeof e||/^\\d+$/.test(String(e))?e+\"px\":e};null!=e&&(this.display.wrapper.style.width=n(e)),null!=t&&(this.display.wrapper.style.height=n(t)),this.options.lineWrapping&&Pr(this);var i=this.display.viewFrom;this.doc.iter(i,this.display.viewTo,function(e){if(e.widgets)for(var t=0;t<e.widgets.length;t++)if(e.widgets[t].noHScroll){qn(r,i,\"widget\");break}++i}),this.curOp.forceUpdate=!0,rt(this,\"refresh\",this)}),operation:function(e){return Kn(this,e)},startOperation:function(){return In(this)},endOperation:function(){return Rn(this)},refresh:Xn(function(){var e=this.display.cachedTextHeight;_n(this),this.curOp.forceUpdate=!0,Er(this),Ln(this,this.doc.scrollLeft,this.doc.scrollTop),oi(this),(null==e||Math.abs(e-Zr(this.display))>.5)&&rn(this),rt(this,\"refresh\",this)}),swapDoc:Xn(function(e){var t=this.doc;return t.cm=null,Mi(this,e),Er(this),this.display.input.reset(),Ln(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,or(this,\"swapDoc\",this,t),t}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},lt(Il),Il.registerHelper=function(e,t,r){Bl.hasOwnProperty(e)||(Bl[e]=Il[e]={_global:[]}),Bl[e][t]=r},Il.registerGlobalHelper=function(e,t,r,n){Il.registerHelper(e,t,n),Bl[e]._global.push({pred:r,val:n})};var Ul,Vl=\"iter insert remove copy getEditor constructor\".split(\" \");for(var Kl in So.prototype)So.prototype.hasOwnProperty(Kl)&&B(Vl,Kl)<0&&(wl.prototype[Kl]=function(e){return function(){return e.apply(this.doc,arguments)}}(So.prototype[Kl]));return lt(So),wl.inputStyles={textarea:Gl,contenteditable:Hl},wl.defineMode=function(e){wl.defaults.mode||\"null\"==e||(wl.defaults.mode=e),function(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),St[e]=t}.apply(this,arguments)},wl.defineMIME=function(e,t){Lt[e]=t},wl.defineMode(\"null\",function(){return{token:function(e){return e.skipToEnd()}}}),wl.defineMIME(\"text/plain\",\"null\"),wl.defineExtension=function(e,t){wl.prototype[e]=t},wl.defineDocExtension=function(e,t){So.prototype[e]=t},wl.fromTextArea=function(e,t){if((t=t?z(t):{}).value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),null==t.autofocus){var r=W();t.autofocus=r==e||null!=e.getAttribute(\"autofocus\")&&r==document.body}function n(){e.value=s.getValue()}var i;if(e.form&&(Je(e.form,\"submit\",n),!t.leaveSubmitMethodAlone)){var o=e.form;i=o.submit;try{var l=o.submit=function(){n(),o.submit=i,o.submit(),o.submit=l}}catch(e){}}t.finishInit=function(t){t.save=n,t.getTextArea=function(){return e},t.toTextArea=function(){t.toTextArea=isNaN,n(),e.parentNode.removeChild(t.getWrapperElement()),e.style.display=\"\",e.form&&(tt(e.form,\"submit\",n),\"function\"==typeof e.form.submit&&(e.form.submit=i))}},e.style.display=\"none\";var s=wl(function(t){return e.parentNode.insertBefore(t,e.nextSibling)},t);return s},(Ul=wl).off=tt,Ul.on=Je,Ul.wheelEventPixels=fi,Ul.Doc=So,Ul.splitLines=bt,Ul.countColumn=I,Ul.findColumn=X,Ul.isWordChar=ee,Ul.Pass=U,Ul.signal=rt,Ul.Line=jt,Ul.changeEnd=yi,Ul.scrollbarModel=Pn,Ul.Pos=ge,Ul.cmpPos=ve,Ul.modes=St,Ul.mimeModes=Lt,Ul.resolveMode=kt,Ul.getMode=Tt,Ul.modeExtensions=Mt,Ul.extendMode=Nt,Ul.copyState=Ot,Ul.startState=Dt,Ul.innerMode=At,Ul.commands=Yo,Ul.keyMap=Po,Ul.keyName=Go,Ul.isModifierKey=Ro,Ul.lookupKey=Io,Ul.normalizeKeyMap=zo,Ul.StringStream=Wt,Ul.SharedTextMarker=bo,Ul.TextMarker=mo,Ul.LineWidget=po,Ul.e_preventDefault=st,Ul.e_stopPropagation=at,Ul.e_stop=ct,Ul.addClass=H,Ul.contains=D,Ul.rmClass=T,Ul.keyNames=Do,wl.version=\"5.37.1\",wl});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/lib/codemirror.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/codemirror/lib/codemirror.css": {
"text": ".CodeMirror{font-family:monospace;height:300px;color:black;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:white}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:black}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid black;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{0%{}50%{background-color:transparent}}@-webkit-keyframes blink{0%{}50%{background-color:transparent}}@keyframes blink{0%{}50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:blue}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3,.cm-s-default .cm-type{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:white}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:none;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:none}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:none}\n",
"type": "text/vnd.tiddlywiki",
"title": "$:/plugins/tiddlywiki/codemirror/lib/codemirror.css",
"tags": "[[$:/tags/Stylesheet]]"
},
"$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.css": {
"text": ".CodeMirror-dialog {\n position: absolute;\n left: 0; right: 0;\n background: inherit;\n z-index: 15;\n padding: .1em .8em;\n overflow: hidden;\n color: inherit;\n}\n\n.CodeMirror-dialog-top {\n border-bottom: 1px solid #eee;\n top: 0;\n}\n\n.CodeMirror-dialog-bottom {\n border-top: 1px solid #eee;\n bottom: 0;\n}\n\n.CodeMirror-dialog input {\n border: none;\n outline: none;\n background: transparent;\n width: 20em;\n color: inherit;\n font-family: monospace;\n}\n\n.CodeMirror-dialog button {\n font-size: 70%;\n}\n",
"type": "text/css",
"title": "$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.css",
"tags": "[[$:/tags/Stylesheet]]"
},
"$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js": {
"text": "!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){function o(e,o,n){var t;return(t=e.getWrapperElement().appendChild(document.createElement(\"div\"))).className=n?\"CodeMirror-dialog CodeMirror-dialog-bottom\":\"CodeMirror-dialog CodeMirror-dialog-top\",\"string\"==typeof o?t.innerHTML=o:t.appendChild(o),t}function n(e,o){e.state.currentNotificationClose&&e.state.currentNotificationClose(),e.state.currentNotificationClose=o}e.defineExtension(\"openDialog\",function(t,i,r){r||(r={}),n(this,null);var u=o(this,t,r.bottom),l=!1,c=this;function a(e){if(\"string\"==typeof e)s.value=e;else{if(l)return;l=!0,u.parentNode.removeChild(u),c.focus(),r.onClose&&r.onClose(u)}}var f,s=u.getElementsByTagName(\"input\")[0];return s?(s.focus(),r.value&&(s.value=r.value,!1!==r.selectValueOnOpen&&s.select()),r.onInput&&e.on(s,\"input\",function(e){r.onInput(e,s.value,a)}),r.onKeyUp&&e.on(s,\"keyup\",function(e){r.onKeyUp(e,s.value,a)}),e.on(s,\"keydown\",function(o){r&&r.onKeyDown&&r.onKeyDown(o,s.value,a)||((27==o.keyCode||!1!==r.closeOnEnter&&13==o.keyCode)&&(s.blur(),e.e_stop(o),a()),13==o.keyCode&&i(s.value,o))}),!1!==r.closeOnBlur&&e.on(s,\"blur\",a)):(f=u.getElementsByTagName(\"button\")[0])&&(e.on(f,\"click\",function(){a(),c.focus()}),!1!==r.closeOnBlur&&e.on(f,\"blur\",a),f.focus()),a}),e.defineExtension(\"openConfirm\",function(t,i,r){n(this,null);var u=o(this,t,r&&r.bottom),l=u.getElementsByTagName(\"button\"),c=!1,a=this,f=1;function s(){c||(c=!0,u.parentNode.removeChild(u),a.focus())}l[0].focus();for(var d=0;d<l.length;++d){var p=l[d];!function(o){e.on(p,\"click\",function(n){e.e_preventDefault(n),s(),o&&o(a)})}(i[d]),e.on(p,\"blur\",function(){--f,setTimeout(function(){f<=0&&s()},200)}),e.on(p,\"focus\",function(){++f})}}),e.defineExtension(\"openNotification\",function(t,i){n(this,a);var r,u=o(this,t,i&&i.bottom),l=!1,c=i&&void 0!==i.duration?i.duration:5e3;function a(){l||(l=!0,clearTimeout(r),u.parentNode.removeChild(u))}return e.on(u,\"click\",function(o){e.e_preventDefault(o),a()}),c&&(r=setTimeout(a,c)),a})});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/dialog/dialog.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/selection/activeline.js": {
"text": "!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){\"use strict\";var t=\"CodeMirror-activeline\",n=\"CodeMirror-activeline-background\",i=\"CodeMirror-activeline-gutter\";function r(e){for(var r=0;r<e.state.activeLines.length;r++)e.removeLineClass(e.state.activeLines[r],\"wrap\",t),e.removeLineClass(e.state.activeLines[r],\"background\",n),e.removeLineClass(e.state.activeLines[r],\"gutter\",i)}function o(e,o){for(var a=[],s=0;s<o.length;s++){var c=o[s],l=e.getOption(\"styleActiveLine\");if(\"object\"==typeof l&&l.nonEmpty?c.anchor.line==c.head.line:c.empty()){var f=e.getLineHandleVisualStart(c.head.line);a[a.length-1]!=f&&a.push(f)}}(function(e,t){if(e.length!=t.length)return!1;for(var n=0;n<e.length;n++)if(e[n]!=t[n])return!1;return!0})(e.state.activeLines,a)||e.operation(function(){r(e);for(var o=0;o<a.length;o++)e.addLineClass(a[o],\"wrap\",t),e.addLineClass(a[o],\"background\",n),e.addLineClass(a[o],\"gutter\",i);e.state.activeLines=a})}function a(e,t){o(e,t.ranges)}e.defineOption(\"styleActiveLine\",!1,function(t,n,i){var s=i!=e.Init&&i;n!=s&&(s&&(t.off(\"beforeSelectionChange\",a),r(t),delete t.state.activeLines),n&&(t.state.activeLines=[],o(t,t.listSelections()),t.on(\"beforeSelectionChange\",a)))})});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/selection/activeline.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/mode/tw-meta.js": {
"text": "!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../lib/codemirror\"],e):e(CodeMirror)}(function(e){\"use strict\";e.modeInfo=[{name:\"CMake\",mime:\"text/x-cmake\",mode:\"cmake\",ext:[\"cmake\",\"cmake.in\"],file:/^CMakeLists.txt$/},{name:\"Cython\",mime:\"text/x-cython\",mode:\"python\",ext:[\"pyx\",\"pxd\",\"pxi\"]},{name:\"CSS\",mime:\"text/css\",mode:\"css\",ext:[\"css\"]},{name:\"diff\",mime:\"text/x-diff\",mode:\"diff\",ext:[\"diff\",\"patch\"]},{name:\"Embedded Javascript\",mime:\"application/x-ejs\",mode:\"htmlembedded\",ext:[\"ejs\"]},{name:\"Embedded Ruby\",mime:\"application/x-erb\",mode:\"htmlembedded\",ext:[\"erb\"]},{name:\"Erlang\",mime:\"text/x-erlang\",mode:\"erlang\",ext:[\"erl\"]},{name:\"GitHub Flavored Markdown\",mime:\"text/x-gfm\",mode:\"gfm\",file:/^(readme|contributing|history).md$/i},{name:\"Go\",mime:\"text/x-go\",mode:\"go\",ext:[\"go\"]},{name:\"ASP.NET\",mime:\"application/x-aspx\",mode:\"htmlembedded\",ext:[\"aspx\"],alias:[\"asp\",\"aspx\"]},{name:\"HTML\",mime:\"text/html\",mode:\"htmlmixed\",ext:[\"html\",\"htm\",\"handlebars\",\"hbs\"],alias:[\"xhtml\"]},{name:\"HTTP\",mime:\"message/http\",mode:\"http\"},{name:\"JavaScript\",mimes:[\"text/javascript\",\"text/ecmascript\",\"application/javascript\",\"application/x-javascript\",\"application/ecmascript\"],mode:\"javascript\",ext:[\"js\"],alias:[\"ecmascript\",\"js\",\"node\"]},{name:\"JSON\",mimes:[\"application/json\",\"application/x-json\"],mode:\"javascript\",ext:[\"json\",\"map\"],alias:[\"json5\"]},{name:\"JSON-LD\",mime:\"application/ld+json\",mode:\"javascript\",ext:[\"jsonld\"],alias:[\"jsonld\"]},{name:\"Lua\",mime:\"text/x-lua\",mode:\"lua\",ext:[\"lua\"]},{name:\"Markdown\",mime:\"text/x-markdown\",mode:\"markdown\",ext:[\"markdown\",\"md\",\"mkd\"]},{name:\"MySQL\",mime:\"text/x-mysql\",mode:\"sql\"},{name:\"Plain Text\",mime:\"text/plain\",mode:\"null\",ext:[\"txt\",\"text\",\"conf\",\"def\",\"list\",\"log\"]},{name:\"Python\",mime:\"text/x-python\",mode:\"python\",ext:[\"BUILD\",\"bzl\",\"py\",\"pyw\"],file:/^(BUCK|BUILD)$/},{name:\"SCSS\",mime:\"text/x-scss\",mode:\"css\",ext:[\"scss\"]},{name:\"LaTeX\",mime:\"text/x-latex\",mode:\"stex\",ext:[\"text\",\"ltx\",\"tex\"],alias:[\"tex\"]},{name:\"TiddlyWiki \",mime:\"text/x-tiddlywiki\",mode:\"tiddlywiki\"}];for(var t=0;t<e.modeInfo.length;t++){var m=e.modeInfo[t];m.mimes&&(m.mime=m.mimes[0])}e.findModeByMIME=function(t){t=t.toLowerCase();for(var m=0;m<e.modeInfo.length;m++){var i=e.modeInfo[m];if(i.mime==t)return i;if(i.mimes)for(var a=0;a<i.mimes.length;a++)if(i.mimes[a]==t)return i}return/\\+xml$/.test(t)?e.findModeByMIME(\"application/xml\"):/\\+json$/.test(t)?e.findModeByMIME(\"application/json\"):void 0},e.findModeByExtension=function(t){for(var m=0;m<e.modeInfo.length;m++){var i=e.modeInfo[m];if(i.ext)for(var a=0;a<i.ext.length;a++)if(i.ext[a]==t)return i}},e.findModeByFileName=function(t){for(var m=0;m<e.modeInfo.length;m++){var i=e.modeInfo[m];if(i.file&&i.file.test(t))return i}var a=t.lastIndexOf(\".\"),o=a>-1&&t.substring(a+1,t.length);if(o)return e.findModeByExtension(o)},e.findModeByName=function(t){t=t.toLowerCase();for(var m=0;m<e.modeInfo.length;m++){var i=e.modeInfo[m];if(i.name.toLowerCase()==t)return i;if(i.alias)for(var a=0;a<i.alias.length;a++)if(i.alias[a].toLowerCase()==t)return i}}});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/mode/tw-meta.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/keyboard": {
"title": "$:/plugins/tiddlywiki/codemirror/keyboard",
"text": "\n!!Default keyboard shortcuts\n\n!!!Basic shortcuts\n\n|Shortcut |Function |h\n|Left |goCharLeft |\n|Right |goCharRight |\n|Up |goLineUp |\n|Down |goLineDown |\n|End |goLineEnd |\n|Home |goLineStartSmart |\n|~PageUp |goPageUp |\n|~PageDown |goPageDown |\n|Delete |delCharAfter |\n|Backspace |delCharBefore |\n|Shift-Backspace |delCharBefore |\n|Tab |defaultTab |\n|Shift-Tab |indentAuto |\n|Enter |newlineAndIndent |\n|Insert |toggleOverwrite |\n|Ctrl-Esc |singleSelection |\n\n\n!!!Shortcuts on Windows and Linux\n\n|Shortcut |Function |h\n|Ctrl-A |selectAll |\n|Ctrl-D |deleteLine |\n|Ctrl-Z |undo |\n|Shift-Ctrl-Z |redo |\n|Ctrl-Y |redo |\n|Ctrl-Home |goDocStart |\n|Ctrl-End |goDocEnd |\n|Ctrl-Up |goLineUp |\n|Ctrl-Down |goLineDown |\n|Ctrl-Left |goGroupLeft |\n|Ctrl-Right |goGroupRight |\n|Alt-Left |goLineStart |\n|Alt-Right |goLineEnd |\n|Ctrl-Backspace |delGroupBefore |\n|Ctrl-Delete |delGroupAfter |\n|Ctrl-F |find |\n|Ctrl-G |findNext |\n|Shift-Ctrl-G |findPrev |\n|Shift-Ctrl-F |replace |\n|Shift-Ctrl-R |replaceAll |\n|Ctrl-[ |indentLess |\n|Ctrl-] |indentMore |\n|Alt-U |undoSelection |\n|Shift-Ctrl-U |redoSelection |\n|Shift-Alt-U |redoSelection |\n\n\n!!!Shortcuts on ~MacOs\n\n|Shortcut |Function |h\n|Cmd-A |selectAll |\n|Cmd-D |deleteLine |\n|Cmd-Z |undo |\n|Shift-Cmd-Z |redo |\n|Cmd-Y |redo |\n|Cmd-Home |goDocStart |\n|Cmd-Up |goDocStart |\n|Cmd-End |goDocEnd |\n|Cmd-Down |goDocEnd |\n|Alt-Left |goGroupLeft |\n|Alt-Right |goGroupRight |\n|Cmd-Left |goLineLeft |\n|Cmd-Right |goLineRight |\n|Alt-Backspace |delGroupBefore |\n|Ctrl-Alt-Backspace |delGroupAfter |\n|Alt-Delete |delGroupAfter |\n|Cmd-F |find |\n|Cmd-G |findNext |\n|Shift-Cmd-G |findPrev |\n|Cmd-Alt-F |replace |\n|Shift-Cmd-Alt-F |replaceAll |\n|Cmd-[ |indentLess |\n|Cmd-] |indentMore |\n|Cmd-Backspace |delWrappedLineLeft |\n|Cmd-Delete |delWrappedLineRight |\n|Alt-U |undoSelection |\n|Shift-Alt-U |redoSelection |\n|Ctrl-Up |goDocStart |\n|Ctrl-Down |goDocEnd |\n|Ctrl-F |goCharRight |\n|Ctrl-B |goCharLeft |\n|Ctrl-P |goLineUp |\n|Ctrl-N |goLineDown |\n|Alt-F |goWordRight |\n|Alt-B |goWordLeft |\n|Ctrl-A |goLineStart |\n|Ctrl-E |goLineEnd |\n|Ctrl-V |goPageDown |\n|Shift-Ctrl-V |goPageUp |\n|Ctrl-D |delCharAfter |\n|Ctrl-H |delCharBefore |\n|Alt-D |delWordAfter |\n|Alt-Backspace |delWordBefore |\n|Ctrl-K |killLine |\n|Alt-T |transposeChars |\n|Ctrl-O |openLine |\n\n\n"
},
"$:/plugins/tiddlywiki/codemirror/license": {
"title": "$:/plugins/tiddlywiki/codemirror/license",
"text": "\"\"\"\n~CodeMirror, copyright (c) by Marijn Haverbeke and others\nDistributed under an MIT license: http://codemirror.net/LICENSE\n\nCopyright (c) 2004-2007, Jeremy Ruston\nCopyright (c) 2007-2018, UnaMesa Association\nDistributed under an BSD license: https://tiddlywiki.com/#License\n\"\"\"\n"
},
"$:/plugins/tiddlywiki/codemirror/readme": {
"title": "$:/plugins/tiddlywiki/codemirror/readme",
"text": "This plugin provides an enhanced text editor component based on [[CodeMirror|http://codemirror.net]]. The basic configuration is designed to be as lightweight as possible and is just around 235kb of size. Additional features can be installed with ~CodeMirror ~AddOns from the plugin library.\n\n[[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/codemirror]]\n\nBased on ~CodeMirror version 5.37.0\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/editorFont": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/editorFont",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/editorFont/hint}}",
"text": "\\define lingo-base() $:/language/ThemeTweaks/\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/keyMap": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/keyMap",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/keyMap/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/keyMap\n\n<$link to=\"$:/config/codemirror/keyMap\"><<lingo hint>></$link>\n\n<$select tiddler=\"$:/config/codemirror/keyMap\" default=\"default\">\n<option value=\"default\">default</option>\n<$list filter=\"[all[shadows+tiddlers]module-type[codemirror-keymap]!has[draft.of]get[text]]\">\n<option value=<<currentTiddler>>><$transclude><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/lineNumbers": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/lineNumbers",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/lineNumbers/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/lineNumbers/\n<<lingo hint>>\n\n<$checkbox tiddler=\"$:/config/codemirror/lineNumbers\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"false\"> <$link to=\"$:/config/codemirror/lineNumbers\"><<lingo info>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/lineWrapping": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/lineWrapping",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/lineWrapping/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/lineWrapping/\n<<lingo hint>>\n\n<$checkbox tiddler=\"$:/config/codemirror/lineWrapping\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"true\"> <$link to=\"$:/config/codemirror/lineWrapping\"><<lingo info>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/showCursorWhenSelecting": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/showCursorWhenSelecting",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/showCursorWhenSelecting/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/showCursorWhenSelecting/\n<<lingo hint>>\n\n<$checkbox tiddler=\"$:/config/codemirror/showCursorWhenSelecting\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"true\"> <$link to=\"$:/config/codemirror/showCursorWhenSelecting\"><<lingo info>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/styleActiveLine": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/styleActiveLine",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/styleActiveLine/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/styleActiveLine/\n<<lingo hint>>\n\n<$checkbox tiddler=\"$:/config/codemirror/styleActiveLine\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"false\"> <$link to=\"$:/config/codemirror/styleActiveLine\"><<lingo info>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/theme": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/theme",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/theme/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/\n\n<$link to=\"$:/config/codemirror/theme\"><<lingo hint>></$link>\n\n<$select tiddler=\"$:/config/codemirror/theme\" default=\"default\">\n<option value=\"default\">default</option>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]module-type[codemirror-theme]!has[draft.of]get[name]]\">\n<option value=<<currentTiddler>>><$transclude field=\"name\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n\n//see the [[CodeMirror Usage|$:/plugins/tiddlywiki/codemirror/usage]] how to add themes//\n"
},
"$:/plugins/tiddlywiki/codemirror/styles": {
"title": "$:/plugins/tiddlywiki/codemirror/styles",
"tags": "[[$:/tags/Stylesheet]]",
"text": "/* Make the editor resize to fit its content */\n\n.CodeMirror {\n\theight: auto;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tline-height: 1.5;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n}\n\n.CodeMirror-scroll {\n\toverflow-x: auto;\n\toverflow-y: hidden;\t\n}\n"
},
"$:/core/ui/ControlPanel/Settings/CodeMirror": {
"title": "$:/core/ui/ControlPanel/Settings/CodeMirror",
"tags": "$:/tags/ControlPanel/SettingsTab",
"caption": "CodeMirror",
"list-after": "$:/core/ui/ControlPanel/Settings/TiddlyWiki",
"text": "\\define lingo-base() $:/language/codemirror/controlPanel/\n\n<<lingo hint>>\n\n<$link to=\"$:/plugins/tiddlywiki/codemirror/usage\"><<lingo usage>></$link>\n\n<$link to=\"$:/plugins/tiddlywiki/codemirror/keyboard\"><<lingo keyboard>></$link>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings/CodeMirror]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ControlPanel/Settings": {
"title": "$:/core/ui/ControlPanel/Settings",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Settings/Caption}}",
"text": "<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/SettingsTab]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Settings/TiddlyWiki\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Settings/TiddlyWiki": {
"title": "$:/core/ui/ControlPanel/Settings/TiddlyWiki",
"tags": "$:/tags/ControlPanel/SettingsTab",
"caption": "TiddlyWiki",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
},
"$:/plugins/tiddlywiki/codemirror/usage": {
"title": "$:/plugins/tiddlywiki/codemirror/usage",
"text": "! Configuration\n\nConfiguration for the ~CodeMirror text-editor can be done from within the CodeMirror Settings Tab in the [[ControlPanel|$:/ControlPanel]] (Settings - ~CodeMirror)\n\n\n!!Setting a different Theme\n\n~CodeMirror themes are available in the [ext[official GitHub repository|https://github.com/codemirror/CodeMirror/tree/master/theme]]\n\nMore themes can be found at https://github.com/FarhadG/code-mirror-themes/tree/master/themes and previewed [ext[here|http://farhadg.github.io/code-mirror-themes/]]\n\n\nTo add a theme to your wiki, follow these four steps:\n\n* choose one of the CSS files and copy its content to a new tiddler\n* remove all comments from the top and tag the tiddler with <<tag-pill \"$:/tags/Stylesheet\">>\n* add a field \"module-type\" with the value \"codemirror-theme\". add a field \"name\" with the exact ''name'' of the theme as value\n* save the tiddler and go to the Settings tab in $:/ControlPanel - look for the \"theme\" dropdown to select your newly added theme\n\n\n!!Line Numbers\n\nTo show or hide the Line Numbers at the left, go to ~ControlPanel - Settings - ~CodeMirror and look for the \"Line Numbers\" checkbox\n\n\n!!Line Wrapping\n\nControls if long lines get visually wrapped to a new line if they're too long to fit the editor width or if the editor should scroll horizontally\n\nTo change the line-wrapping behaviour, go to ~ControlPanel - Settings - ~CodeMirror and look for the \"Line Wrapping\" checkbox\n\n\n!!Show Cursor when selecting\n\nDefines whether the Mouse cursor should be visually shown or hidden when making a text-selection\n\nTo change the show-cursor-when-selecting behaviour, go to ~ControlPanel - Settings - ~CodeMirror and look for the \"Show cursor when selecting\" checkbox\n\n\n!!~CodeMirror Font Family\n\nThe Font-Family used within the ~CodeMirror text-editor defaults to \"monospace\" which will choose your configured monospace system-font\n\nThat setting can be overridden entering one or more Font-Families in the \"Font Family\" input field at ~ControlPanel - Settings - ~CodeMirror\n\n* The entries must be separated by semicolons ','\n* Font-Family Names that contain spaces must be quoted like \"My Font\"\n* If a list of Font-Families is specified, the last Font-Family found on the user-system gets used, non-existing fonts get ignored\n* If none of the specified Font-Families is available, ~CodeMirror uses the default \"monospace\"\n\n\n!!\"Hidden\" Settings:\n\n!!!Cursor Blink Rate\n\nThe cursor blink-rate defines how fast (in milliseconds) the cursor blinks inside the textarea\n\nYou can change it by editing $:/config/codemirror/cursorBlinkRate\n\"0\" disables blinking\n\n!!!Tabsize\n\nThe Tabsize defines the width of a tab character. Default is 4.\n\nYou can change it by editing $:/config/codemirror/tabSize\n\n!!!Indent Unit\n\nNot enabled for vnd.tiddlywiki and x-tiddlywiki\n\nDefines how many spaces a text-block should be indented. Defaults to 2.\n\nYou can change it by editing $:/config/codemirror/indentUnit\n\n"
}
}
}
{
"tiddlers": {
"$:/config/codemirror/autocomplete": {
"title": "$:/config/codemirror/autocomplete",
"extend": "extraKeys",
"type": "json",
"text": "{\n\t\"Ctrl-Space\": \"autocomplete\"\n}"
},
"$:/plugins/tiddlywiki/codemirror/addon/hint/anyword-hint.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){\"use strict\";var r=/[\\w$]+/;e.registerHelper(\"hint\",\"anyword\",function(t,o){for(var i=o&&o.word||r,n=o&&o.range||500,f=t.getCursor(),s=t.getLine(f.line),a=f.ch,c=a;c&&i.test(s.charAt(c-1));)--c;for(var l=c!=a&&s.slice(c,a),d=o&&o.list||[],u={},p=new RegExp(i.source,\"g\"),g=-1;g<=1;g+=2)for(var h=f.line,m=Math.min(Math.max(h+g*n,t.firstLine()),t.lastLine())+g;h!=m;h+=g)for(var y,b=t.getLine(h);y=p.exec(b);)h==f.line&&y[0]===l||l&&0!=y[0].lastIndexOf(l,0)||Object.prototype.hasOwnProperty.call(u,y[0])||(u[y[0]]=!0,d.push(y[0]));return{list:d,from:e.Pos(f.line,c),to:e.Pos(f.line,a)}})});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/hint/anyword-hint.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/hint/css-hint.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\"),require(\"../../mode/css/css\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../../mode/css/css\"],e):e(CodeMirror)}(function(e){\"use strict\";var r={link:1,visited:1,active:1,hover:1,focus:1,\"first-letter\":1,\"first-line\":1,\"first-child\":1,before:1,after:1,lang:1};e.registerHelper(\"hint\",\"css\",function(t){var o=t.getCursor(),s=t.getTokenAt(o),i=e.innerMode(t.getMode(),s.state);if(\"css\"==i.mode.name){if(\"keyword\"==s.type&&0==\"!important\".indexOf(s.string))return{list:[\"!important\"],from:e.Pos(o.line,s.start),to:e.Pos(o.line,s.end)};var n=s.start,a=o.ch,d=s.string.slice(0,a-n);/[^\\w$_-]/.test(d)&&(d=\"\",n=a=o.ch);var c=e.resolveMode(\"text/css\"),f=[],l=i.state.state;return\"pseudo\"==l||\"variable-3\"==s.type?p(r):\"block\"==l||\"maybeprop\"==l?p(c.propertyKeywords):\"prop\"==l||\"parens\"==l||\"at\"==l||\"params\"==l?(p(c.valueKeywords),p(c.colorKeywords)):\"media\"!=l&&\"media_parens\"!=l||(p(c.mediaTypes),p(c.mediaFeatures)),f.length?{list:f,from:e.Pos(o.line,n),to:e.Pos(o.line,a)}:void 0}function p(e){for(var r in e)d&&0!=r.lastIndexOf(d,0)||f.push(r)}})});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/hint/css-hint.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/hint/html-hint.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(l){\"object\"==typeof exports&&\"object\"==typeof module?l(require(\"../../lib/codemirror\"),require(\"./xml-hint\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"./xml-hint\"],l):l(CodeMirror)}(function(l){\"use strict\";var t=\"ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu\".split(\" \"),e=[\"_blank\",\"_self\",\"_top\",\"_parent\"],a=[\"ascii\",\"utf-8\",\"utf-16\",\"latin1\",\"latin1\"],n=[\"get\",\"post\",\"put\",\"delete\"],r=[\"application/x-www-form-urlencoded\",\"multipart/form-data\",\"text/plain\"],o=[\"all\",\"screen\",\"print\",\"embossed\",\"braille\",\"handheld\",\"print\",\"projection\",\"screen\",\"tty\",\"tv\",\"speech\",\"3d-glasses\",\"resolution [>][<][=] [X]\",\"device-aspect-ratio: X/Y\",\"orientation:portrait\",\"orientation:landscape\",\"device-height: [X]\",\"device-width: [X]\"],s={attrs:{}},u={a:{attrs:{href:null,ping:null,type:null,media:o,target:e,hreflang:t}},abbr:s,acronym:s,address:s,applet:s,area:{attrs:{alt:null,coords:null,href:null,target:null,ping:null,media:o,hreflang:t,type:null,shape:[\"default\",\"rect\",\"circle\",\"poly\"]}},article:s,aside:s,audio:{attrs:{src:null,mediagroup:null,crossorigin:[\"anonymous\",\"use-credentials\"],preload:[\"none\",\"metadata\",\"auto\"],autoplay:[\"\",\"autoplay\"],loop:[\"\",\"loop\"],controls:[\"\",\"controls\"]}},b:s,base:{attrs:{href:null,target:e}},basefont:s,bdi:s,bdo:s,big:s,blockquote:{attrs:{cite:null}},body:s,br:s,button:{attrs:{form:null,formaction:null,name:null,value:null,autofocus:[\"\",\"autofocus\"],disabled:[\"\",\"autofocus\"],formenctype:r,formmethod:n,formnovalidate:[\"\",\"novalidate\"],formtarget:e,type:[\"submit\",\"reset\",\"button\"]}},canvas:{attrs:{width:null,height:null}},caption:s,center:s,cite:s,code:s,col:{attrs:{span:null}},colgroup:{attrs:{span:null}},command:{attrs:{type:[\"command\",\"checkbox\",\"radio\"],label:null,icon:null,radiogroup:null,command:null,title:null,disabled:[\"\",\"disabled\"],checked:[\"\",\"checked\"]}},data:{attrs:{value:null}},datagrid:{attrs:{disabled:[\"\",\"disabled\"],multiple:[\"\",\"multiple\"]}},datalist:{attrs:{data:null}},dd:s,del:{attrs:{cite:null,datetime:null}},details:{attrs:{open:[\"\",\"open\"]}},dfn:s,dir:s,div:s,dl:s,dt:s,em:s,embed:{attrs:{src:null,type:null,width:null,height:null}},eventsource:{attrs:{src:null}},fieldset:{attrs:{disabled:[\"\",\"disabled\"],form:null,name:null}},figcaption:s,figure:s,font:s,footer:s,form:{attrs:{action:null,name:null,\"accept-charset\":a,autocomplete:[\"on\",\"off\"],enctype:r,method:n,novalidate:[\"\",\"novalidate\"],target:e}},frame:s,frameset:s,h1:s,h2:s,h3:s,h4:s,h5:s,h6:s,head:{attrs:{},children:[\"title\",\"base\",\"link\",\"style\",\"meta\",\"script\",\"noscript\",\"command\"]},header:s,hgroup:s,hr:s,html:{attrs:{manifest:null},children:[\"head\",\"body\"]},i:s,iframe:{attrs:{src:null,srcdoc:null,name:null,width:null,height:null,sandbox:[\"allow-top-navigation\",\"allow-same-origin\",\"allow-forms\",\"allow-scripts\"],seamless:[\"\",\"seamless\"]}},img:{attrs:{alt:null,src:null,ismap:null,usemap:null,width:null,height:null,crossorigin:[\"anonymous\",\"use-credentials\"]}},input:{attrs:{alt:null,dirname:null,form:null,formaction:null,height:null,list:null,max:null,maxlength:null,min:null,name:null,pattern:null,placeholder:null,size:null,src:null,step:null,value:null,width:null,accept:[\"audio/*\",\"video/*\",\"image/*\"],autocomplete:[\"on\",\"off\"],autofocus:[\"\",\"autofocus\"],checked:[\"\",\"checked\"],disabled:[\"\",\"disabled\"],formenctype:r,formmethod:n,formnovalidate:[\"\",\"novalidate\"],formtarget:e,multiple:[\"\",\"multiple\"],readonly:[\"\",\"readonly\"],required:[\"\",\"required\"],type:[\"hidden\",\"text\",\"search\",\"tel\",\"url\",\"email\",\"password\",\"datetime\",\"date\",\"month\",\"week\",\"time\",\"datetime-local\",\"number\",\"range\",\"color\",\"checkbox\",\"radio\",\"file\",\"submit\",\"image\",\"reset\",\"button\"]}},ins:{attrs:{cite:null,datetime:null}},kbd:s,keygen:{attrs:{challenge:null,form:null,name:null,autofocus:[\"\",\"autofocus\"],disabled:[\"\",\"disabled\"],keytype:[\"RSA\"]}},label:{attrs:{for:null,form:null}},legend:s,li:{attrs:{value:null}},link:{attrs:{href:null,type:null,hreflang:t,media:o,sizes:[\"all\",\"16x16\",\"16x16 32x32\",\"16x16 32x32 64x64\"]}},map:{attrs:{name:null}},mark:s,menu:{attrs:{label:null,type:[\"list\",\"context\",\"toolbar\"]}},meta:{attrs:{content:null,charset:a,name:[\"viewport\",\"application-name\",\"author\",\"description\",\"generator\",\"keywords\"],\"http-equiv\":[\"content-language\",\"content-type\",\"default-style\",\"refresh\"]}},meter:{attrs:{value:null,min:null,low:null,high:null,max:null,optimum:null}},nav:s,noframes:s,noscript:s,object:{attrs:{data:null,type:null,name:null,usemap:null,form:null,width:null,height:null,typemustmatch:[\"\",\"typemustmatch\"]}},ol:{attrs:{reversed:[\"\",\"reversed\"],start:null,type:[\"1\",\"a\",\"A\",\"i\",\"I\"]}},optgroup:{attrs:{disabled:[\"\",\"disabled\"],label:null}},option:{attrs:{disabled:[\"\",\"disabled\"],label:null,selected:[\"\",\"selected\"],value:null}},output:{attrs:{for:null,form:null,name:null}},p:s,param:{attrs:{name:null,value:null}},pre:s,progress:{attrs:{value:null,max:null}},q:{attrs:{cite:null}},rp:s,rt:s,ruby:s,s:s,samp:s,script:{attrs:{type:[\"text/javascript\"],src:null,async:[\"\",\"async\"],defer:[\"\",\"defer\"],charset:a}},section:s,select:{attrs:{form:null,name:null,size:null,autofocus:[\"\",\"autofocus\"],disabled:[\"\",\"disabled\"],multiple:[\"\",\"multiple\"]}},small:s,source:{attrs:{src:null,type:null,media:null}},span:s,strike:s,strong:s,style:{attrs:{type:[\"text/css\"],media:o,scoped:null}},sub:s,summary:s,sup:s,table:s,tbody:s,td:{attrs:{colspan:null,rowspan:null,headers:null}},textarea:{attrs:{dirname:null,form:null,maxlength:null,name:null,placeholder:null,rows:null,cols:null,autofocus:[\"\",\"autofocus\"],disabled:[\"\",\"disabled\"],readonly:[\"\",\"readonly\"],required:[\"\",\"required\"],wrap:[\"soft\",\"hard\"]}},tfoot:s,th:{attrs:{colspan:null,rowspan:null,headers:null,scope:[\"row\",\"col\",\"rowgroup\",\"colgroup\"]}},thead:s,time:{attrs:{datetime:null}},title:s,tr:s,track:{attrs:{src:null,label:null,default:null,kind:[\"subtitles\",\"captions\",\"descriptions\",\"chapters\",\"metadata\"],srclang:t}},tt:s,u:s,ul:s,var:s,video:{attrs:{src:null,poster:null,width:null,height:null,crossorigin:[\"anonymous\",\"use-credentials\"],preload:[\"auto\",\"metadata\",\"none\"],autoplay:[\"\",\"autoplay\"],mediagroup:[\"movie\"],muted:[\"\",\"muted\"],controls:[\"\",\"controls\"]}},wbr:s},i={accesskey:[\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\",\"h\",\"i\",\"j\",\"k\",\"l\",\"m\",\"n\",\"o\",\"p\",\"q\",\"r\",\"s\",\"t\",\"u\",\"v\",\"w\",\"x\",\"y\",\"z\",\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],class:null,contenteditable:[\"true\",\"false\"],contextmenu:null,dir:[\"ltr\",\"rtl\",\"auto\"],draggable:[\"true\",\"false\",\"auto\"],dropzone:[\"copy\",\"move\",\"link\",\"string:\",\"file:\"],hidden:[\"hidden\"],id:null,inert:[\"inert\"],itemid:null,itemprop:null,itemref:null,itemscope:[\"itemscope\"],itemtype:null,lang:[\"en\",\"es\"],spellcheck:[\"true\",\"false\"],style:null,tabindex:[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],title:null,translate:[\"yes\",\"no\"],onclick:null,rel:[\"stylesheet\",\"alternate\",\"author\",\"bookmark\",\"help\",\"license\",\"next\",\"nofollow\",\"noreferrer\",\"prefetch\",\"prev\",\"search\",\"tag\"]};function d(l){for(var t in i)i.hasOwnProperty(t)&&(l.attrs[t]=i[t])}for(var c in d(s),u)u.hasOwnProperty(c)&&u[c]!=s&&d(u[c]);l.htmlSchema=u,l.registerHelper(\"hint\",\"html\",function(t,e){var a={schemaInfo:u};if(e)for(var n in e)a[n]=e[n];return l.hint.xml(t,a)})});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/hint/html-hint.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/hint/javascript-hint.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(t){\"object\"==typeof exports&&\"object\"==typeof module?t(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],t):t(CodeMirror)}(function(t){var e=t.Pos;function r(t,e){for(var r=0,n=t.length;r<n;++r)e(t[r])}function n(n,i,l,f){var c=n.getCursor(),p=l(n,c);if(!/\\b(?:string|comment)\\b/.test(p.type)){var u=t.innerMode(n.getMode(),p.state);if(\"json\"!==u.mode.helperType){p.state=u.state,/^[\\w$_]*$/.test(p.string)?p.end>c.ch&&(p.end=c.ch,p.string=p.string.slice(0,c.ch-p.start)):p={start:c.ch,end:c.ch,string:\"\",state:p.state,type:\".\"==p.string?\"property\":null};for(var d=p;\"property\"==d.type;){if(\".\"!=(d=l(n,e(c.line,d.start))).string)return;if(d=l(n,e(c.line,d.start)),!g)var g=[];g.push(d)}return{list:function(t,e,n,i){var l=[],f=t.string,c=i&&i.globalScope||window;function p(t){0!=t.lastIndexOf(f,0)||function(t,e){if(!Array.prototype.indexOf){for(var r=t.length;r--;)if(t[r]===e)return!0;return!1}return-1!=t.indexOf(e)}(l,t)||l.push(t)}function u(t){\"string\"==typeof t?r(o,p):t instanceof Array?r(s,p):t instanceof Function&&r(a,p),function(t,e){if(Object.getOwnPropertyNames&&Object.getPrototypeOf)for(var r=t;r;r=Object.getPrototypeOf(r))Object.getOwnPropertyNames(r).forEach(e);else for(var n in t)e(n)}(t,p)}if(e&&e.length){var d,g=e.pop();for(g.type&&0===g.type.indexOf(\"variable\")?(i&&i.additionalContext&&(d=i.additionalContext[g.string]),i&&!1===i.useGlobalScope||(d=d||c[g.string])):\"string\"==g.type?d=\"\":\"atom\"==g.type?d=1:\"function\"==g.type&&(null==c.jQuery||\"$\"!=g.string&&\"jQuery\"!=g.string||\"function\"!=typeof c.jQuery?null!=c._&&\"_\"==g.string&&\"function\"==typeof c._&&(d=c._()):d=c.jQuery());null!=d&&e.length;)d=d[e.pop().string];null!=d&&u(d)}else{for(var y=t.state.localVars;y;y=y.next)p(y.name);for(var y=t.state.globalVars;y;y=y.next)p(y.name);i&&!1===i.useGlobalScope||u(c),r(n,p)}return l}(p,g,i,f),from:e(c.line,p.start),to:e(c.line,p.end)}}}}function i(t,e){var r=t.getTokenAt(e);return e.ch==r.start+1&&\".\"==r.string.charAt(0)?(r.end=r.start,r.string=\".\",r.type=\"property\"):/^\\.[\\w$_]*$/.test(r.string)&&(r.type=\"property\",r.start++,r.string=r.string.replace(/\\./,\"\")),r}t.registerHelper(\"hint\",\"javascript\",function(t,e){return n(t,l,function(t,e){return t.getTokenAt(e)},e)}),t.registerHelper(\"hint\",\"coffeescript\",function(t,e){return n(t,f,i,e)});var o=\"charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight toUpperCase toLowerCase split concat match replace search\".split(\" \"),s=\"length concat join splice push pop shift unshift slice reverse sort indexOf lastIndexOf every some filter forEach map reduce reduceRight \".split(\" \"),a=\"prototype apply call bind\".split(\" \"),l=\"break case catch class const continue debugger default delete do else export extends false finally for function if in import instanceof new null return super switch this throw true try typeof var void while with yield\".split(\" \"),f=\"and break catch class continue delete do else extends false finally for if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes\".split(\" \")});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/hint/javascript-hint.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/hint/show-hint.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(t){\"object\"==typeof exports&&\"object\"==typeof module?t(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],t):t(CodeMirror)}(function(t){\"use strict\";var i=\"CodeMirror-hint\",e=\"CodeMirror-hint-active\";function n(t,i){this.cm=t,this.options=i,this.widget=null,this.debounce=0,this.tick=0,this.startPos=this.cm.getCursor(\"start\"),this.startLen=this.cm.getLine(this.startPos.line).length-this.cm.getSelection().length;var e=this;t.on(\"cursorActivity\",this.activityFunc=function(){e.cursorActivity()})}t.showHint=function(t,i,e){if(!i)return t.showHint(e);e&&e.async&&(i.async=!0);var n={hint:i};if(e)for(var o in e)n[o]=e[o];return t.showHint(n)},t.defineExtension(\"showHint\",function(i){i=function(t,i,e){var n=t.options.hintOptions,o={};for(var s in a)o[s]=a[s];if(n)for(var s in n)void 0!==n[s]&&(o[s]=n[s]);if(e)for(var s in e)void 0!==e[s]&&(o[s]=e[s]);o.hint.resolve&&(o.hint=o.hint.resolve(t,i));return o}(this,this.getCursor(\"start\"),i);var e=this.listSelections();if(!(e.length>1)){if(this.somethingSelected()){if(!i.hint.supportsSelection)return;for(var o=0;o<e.length;o++)if(e[o].head.line!=e[o].anchor.line)return}this.state.completionActive&&this.state.completionActive.close();var s=this.state.completionActive=new n(this,i);s.options.hint&&(t.signal(this,\"startCompletion\",this),s.update(!0))}});var o=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},s=window.cancelAnimationFrame||clearTimeout;function c(t){return\"string\"==typeof t?t:t.text}function r(t,i){for(;i&&i!=t;){if(\"LI\"===i.nodeName.toUpperCase()&&i.parentNode==t)return i;i=i.parentNode}}function h(n,o){this.completion=n,this.data=o,this.picked=!1;var s=this,h=n.cm,l=this.hints=document.createElement(\"ul\");l.className=\"CodeMirror-hints\",this.selectedHint=o.selectedHint||0;for(var a=o.list,u=0;u<a.length;++u){var f=l.appendChild(document.createElement(\"li\")),d=a[u],p=i+(u!=this.selectedHint?\"\":\" \"+e);null!=d.className&&(p=d.className+\" \"+p),f.className=p,d.render?d.render(f,o,d):f.appendChild(document.createTextNode(d.displayText||c(d))),f.hintId=u}var m=h.cursorCoords(n.options.alignWithWord?o.from:null),g=m.left,v=m.bottom,y=!0;l.style.left=g+\"px\",l.style.top=v+\"px\";var w=window.innerWidth||Math.max(document.body.offsetWidth,document.documentElement.offsetWidth),H=window.innerHeight||Math.max(document.body.offsetHeight,document.documentElement.offsetHeight);(n.options.container||document.body).appendChild(l);var k=l.getBoundingClientRect(),C=k.bottom-H,b=l.scrollHeight>l.clientHeight+1,x=h.getScrollInfo();if(C>0){var A=k.bottom-k.top;if(m.top-(m.bottom-k.top)-A>0)l.style.top=(v=m.top-A)+\"px\",y=!1;else if(A>H){l.style.height=H-5+\"px\",l.style.top=(v=m.bottom-k.top)+\"px\";var S=h.getCursor();o.from.ch!=S.ch&&(m=h.cursorCoords(S),l.style.left=(g=m.left)+\"px\",k=l.getBoundingClientRect())}}var T,M=k.right-w;if(M>0&&(k.right-k.left>w&&(l.style.width=w-5+\"px\",M-=k.right-k.left-w),l.style.left=(g=m.left-M)+\"px\"),b)for(var N=l.firstChild;N;N=N.nextSibling)N.style.paddingRight=h.display.nativeBarWidth+\"px\";(h.addKeyMap(this.keyMap=function(t,i){var e={Up:function(){i.moveFocus(-1)},Down:function(){i.moveFocus(1)},PageUp:function(){i.moveFocus(1-i.menuSize(),!0)},PageDown:function(){i.moveFocus(i.menuSize()-1,!0)},Home:function(){i.setFocus(0)},End:function(){i.setFocus(i.length-1)},Enter:i.pick,Tab:i.pick,Esc:i.close},n=t.options.customKeys,o=n?{}:e;function s(t,n){var s;s=\"string\"!=typeof n?function(t){return n(t,i)}:e.hasOwnProperty(n)?e[n]:n,o[t]=s}if(n)for(var c in n)n.hasOwnProperty(c)&&s(c,n[c]);var r=t.options.extraKeys;if(r)for(var c in r)r.hasOwnProperty(c)&&s(c,r[c]);return o}(n,{moveFocus:function(t,i){s.changeActive(s.selectedHint+t,i)},setFocus:function(t){s.changeActive(t)},menuSize:function(){return s.screenAmount()},length:a.length,close:function(){n.close()},pick:function(){s.pick()},data:o})),n.options.closeOnUnfocus)&&(h.on(\"blur\",this.onBlur=function(){T=setTimeout(function(){n.close()},100)}),h.on(\"focus\",this.onFocus=function(){clearTimeout(T)}));return h.on(\"scroll\",this.onScroll=function(){var t=h.getScrollInfo(),i=h.getWrapperElement().getBoundingClientRect(),e=v+x.top-t.top,o=e-(window.pageYOffset||(document.documentElement||document.body).scrollTop);if(y||(o+=l.offsetHeight),o<=i.top||o>=i.bottom)return n.close();l.style.top=e+\"px\",l.style.left=g+x.left-t.left+\"px\"}),t.on(l,\"dblclick\",function(t){var i=r(l,t.target||t.srcElement);i&&null!=i.hintId&&(s.changeActive(i.hintId),s.pick())}),t.on(l,\"click\",function(t){var i=r(l,t.target||t.srcElement);i&&null!=i.hintId&&(s.changeActive(i.hintId),n.options.completeOnSingleClick&&s.pick())}),t.on(l,\"mousedown\",function(){setTimeout(function(){h.focus()},20)}),t.signal(o,\"select\",a[this.selectedHint],l.childNodes[this.selectedHint]),!0}function l(t,i,e,n){if(t.async)t(i,n,e);else{var o=t(i,e);o&&o.then?o.then(n):n(o)}}n.prototype={close:function(){this.active()&&(this.cm.state.completionActive=null,this.tick=null,this.cm.off(\"cursorActivity\",this.activityFunc),this.widget&&this.data&&t.signal(this.data,\"close\"),this.widget&&this.widget.close(),t.signal(this.cm,\"endCompletion\",this.cm))},active:function(){return this.cm.state.completionActive==this},pick:function(i,e){var n=i.list[e];n.hint?n.hint(this.cm,i,n):this.cm.replaceRange(c(n),n.from||i.from,n.to||i.to,\"complete\"),t.signal(i,\"pick\",n),this.close()},cursorActivity:function(){this.debounce&&(s(this.debounce),this.debounce=0);var t=this.cm.getCursor(),i=this.cm.getLine(t.line);if(t.line!=this.startPos.line||i.length-t.ch!=this.startLen-this.startPos.ch||t.ch<this.startPos.ch||this.cm.somethingSelected()||t.ch&&this.options.closeCharacters.test(i.charAt(t.ch-1)))this.close();else{var e=this;this.debounce=o(function(){e.update()}),this.widget&&this.widget.disable()}},update:function(t){if(null!=this.tick){var i=this,e=++this.tick;l(this.options.hint,this.cm,this.options,function(n){i.tick==e&&i.finishUpdate(n,t)})}},finishUpdate:function(i,e){this.data&&t.signal(this.data,\"update\");var n=this.widget&&this.widget.picked||e&&this.options.completeSingle;this.widget&&this.widget.close(),this.data=i,i&&i.list.length&&(n&&1==i.list.length?this.pick(i,0):(this.widget=new h(this,i),t.signal(i,\"shown\")))}},h.prototype={close:function(){if(this.completion.widget==this){this.completion.widget=null,this.hints.parentNode.removeChild(this.hints),this.completion.cm.removeKeyMap(this.keyMap);var t=this.completion.cm;this.completion.options.closeOnUnfocus&&(t.off(\"blur\",this.onBlur),t.off(\"focus\",this.onFocus)),t.off(\"scroll\",this.onScroll)}},disable:function(){this.completion.cm.removeKeyMap(this.keyMap);var t=this;this.keyMap={Enter:function(){t.picked=!0}},this.completion.cm.addKeyMap(this.keyMap)},pick:function(){this.completion.pick(this.data,this.selectedHint)},changeActive:function(i,n){if(i>=this.data.list.length?i=n?this.data.list.length-1:0:i<0&&(i=n?0:this.data.list.length-1),this.selectedHint!=i){var o=this.hints.childNodes[this.selectedHint];o.className=o.className.replace(\" \"+e,\"\"),(o=this.hints.childNodes[this.selectedHint=i]).className+=\" \"+e,o.offsetTop<this.hints.scrollTop?this.hints.scrollTop=o.offsetTop-3:o.offsetTop+o.offsetHeight>this.hints.scrollTop+this.hints.clientHeight&&(this.hints.scrollTop=o.offsetTop+o.offsetHeight-this.hints.clientHeight+3),t.signal(this.data,\"select\",this.data.list[this.selectedHint],o)}},screenAmount:function(){return Math.floor(this.hints.clientHeight/this.hints.firstChild.offsetHeight)||1}},t.registerHelper(\"hint\",\"auto\",{resolve:function(i,e){var n,o=i.getHelpers(e,\"hint\");if(o.length){var s=function(t,i,e){var n=function(t,i){if(!t.somethingSelected())return i;for(var e=[],n=0;n<i.length;n++)i[n].supportsSelection&&e.push(i[n]);return e}(t,o);!function o(s){if(s==n.length)return i(null);l(n[s],t,e,function(t){t&&t.list.length>0?i(t):o(s+1)})}(0)};return s.async=!0,s.supportsSelection=!0,s}return(n=i.getHelper(i.getCursor(),\"hintWords\"))?function(i){return t.hint.fromList(i,{words:n})}:t.hint.anyword?function(i,e){return t.hint.anyword(i,e)}:function(){}}}),t.registerHelper(\"hint\",\"fromList\",function(i,e){var n,o=i.getCursor(),s=i.getTokenAt(o),c=t.Pos(o.line,s.start),r=o;s.start<o.ch&&/\\w/.test(s.string.charAt(o.ch-s.start-1))?n=s.string.substr(0,o.ch-s.start):(n=\"\",c=o);for(var h=[],l=0;l<e.words.length;l++){var a=e.words[l];a.slice(0,n.length)==n&&h.push(a)}if(h.length)return{list:h,from:c,to:r}}),t.commands.autocomplete=t.showHint;var a={hint:t.hint.auto,completeSingle:!0,alignWithWord:!0,closeCharacters:/[\\s()\\[\\]{};:>,]/,closeOnUnfocus:!0,completeOnSingleClick:!0,container:null,customKeys:null,extraKeys:null};t.defineOption(\"hintOptions\",null)});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/hint/show-hint.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/hint/show-hint.css": {
"text": ".CodeMirror-hints {\n position: absolute;\n z-index: 999;\n overflow: hidden;\n list-style: none;\n\n margin: 0;\n padding: 2px;\n\n -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n box-shadow: 2px 3px 5px rgba(0,0,0,.2);\n border-radius: 3px;\n border: 1px solid silver;\n\n background: white;\n font-size: 90%;\n font-family: monospace;\n\n max-height: 20em;\n overflow-y: auto;\n}\n\n.CodeMirror-hint {\n margin: 0;\n padding: 0 4px;\n border-radius: 2px;\n white-space: pre;\n color: black;\n cursor: pointer;\n}\n\nli.CodeMirror-hint-active {\n background: #08f;\n color: white;\n}\n",
"type": "text/css",
"title": "$:/plugins/tiddlywiki/codemirror/addon/hint/show-hint.css",
"tags": "[[$:/tags/Stylesheet]]"
},
"$:/plugins/tiddlywiki/codemirror/addon/hint/xml-hint.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(t){\"object\"==typeof exports&&\"object\"==typeof module?t(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],t):t(CodeMirror)}(function(t){\"use strict\";var e=t.Pos;t.registerHelper(\"hint\",\"xml\",function(r,s){var n=s&&s.schemaInfo,a=s&&s.quoteChar||'\"';if(n){var i=r.getCursor(),o=r.getTokenAt(i);o.end>i.ch&&(o.end=i.ch,o.string=o.string.slice(0,i.ch-o.start));var l=t.innerMode(r.getMode(),o.state);if(\"xml\"==l.mode.name){var f,g,c=[],h=!1,p=/\\btag\\b/.test(o.type)&&!/>$/.test(o.string),u=p&&/^\\w/.test(o.string);if(u){var d=r.getLine(i.line).slice(Math.max(0,o.start-2),o.start),m=/<\\/$/.test(d)?\"close\":/<$/.test(d)?\"open\":null;m&&(g=o.start-(\"close\"==m?2:1))}else p&&\"<\"==o.string?m=\"open\":p&&\"</\"==o.string&&(m=\"close\");if(!p&&!l.state.tagName||m){u&&(f=o.string),h=m;var v=l.state.context,y=v&&n[v.tagName],x=v?y&&y.children:n[\"!top\"];if(x&&\"close\"!=m)for(var O=0;O<x.length;++O)f&&0!=x[O].lastIndexOf(f,0)||c.push(\"<\"+x[O]);else if(\"close\"!=m)for(var b in n)!n.hasOwnProperty(b)||\"!top\"==b||\"!attrs\"==b||f&&0!=b.lastIndexOf(f,0)||c.push(\"<\"+b);v&&(!f||\"close\"==m&&0==v.tagName.lastIndexOf(f,0))&&c.push(\"</\"+v.tagName+\">\")}else{var w=(y=n[l.state.tagName])&&y.attrs,I=n[\"!attrs\"];if(!w&&!I)return;if(w){if(I){var P={};for(var A in I)I.hasOwnProperty(A)&&(P[A]=I[A]);for(var A in w)w.hasOwnProperty(A)&&(P[A]=w[A]);w=P}}else w=I;if(\"string\"==o.type||\"=\"==o.string){var M,N=(d=r.getRange(e(i.line,Math.max(0,i.ch-60)),e(i.line,\"string\"==o.type?o.start:o.end))).match(/([^\\s\\u00a0=<>\\\"\\']+)=$/);if(!N||!w.hasOwnProperty(N[1])||!(M=w[N[1]]))return;if(\"function\"==typeof M&&(M=M.call(this,r)),\"string\"==o.type){f=o.string;var $=0;/['\"]/.test(o.string.charAt(0))&&(a=o.string.charAt(0),f=o.string.slice(1),$++);var C=o.string.length;/['\"]/.test(o.string.charAt(C-1))&&(a=o.string.charAt(C-1),f=o.string.substr($,C-2)),h=!0}for(O=0;O<M.length;++O)f&&0!=M[O].lastIndexOf(f,0)||c.push(a+M[O]+a)}else for(var j in\"attribute\"==o.type&&(f=o.string,h=!0),w)!w.hasOwnProperty(j)||f&&0!=j.lastIndexOf(f,0)||c.push(j)}return{list:c,from:h?e(i.line,null==g?o.start:g):i,to:h?e(i.line,o.end):i}}}})});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/hint/xml-hint.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror-autocomplete/readme": {
"title": "$:/plugins/tiddlywiki/codemirror-autocomplete/readme",
"text": "This plugin enhances the [[CodeMirror|http://codemirror.net]] text editor with Autocompletion functionality. It needs the latest [[CodeMirror plugin|$:/plugins/tiddlywiki/codemirror]] to be installed\n\nIt adds Autocompletion for ''html'', ''javascript'' and ''xml'' and also for ''already present words'' within a text-editor instance\n\nThe ''Keyboard Shortcut'' for autocompletion is `Ctrl+Space`\n\n"
}
}
}
{
"tiddlers": {
"$:/config/codemirror/autoCloseBrackets": {
"title": "$:/config/codemirror/autoCloseBrackets",
"type": "bool",
"text": "true"
},
"$:/config/codemirror/matchBrackets": {
"title": "$:/config/codemirror/matchBrackets",
"type": "bool",
"text": "true\n"
},
"$:/plugins/tiddlywiki/codemirror/addon/edit/closebrackets.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){var t={pairs:\"()[]{}''\\\"\\\"\",triples:\"\",explode:\"[]{}\"},r=e.Pos;function n(e,r){return\"pairs\"==r&&\"string\"==typeof e?e:\"object\"==typeof e&&null!=e[r]?e[r]:t[r]}e.defineOption(\"autoCloseBrackets\",!1,function(t,r,o){o&&o!=e.Init&&(t.removeKeyMap(i),t.state.closeBrackets=null),r&&(a(n(r,\"pairs\")),t.state.closeBrackets=r,t.addKeyMap(i))});var i={Backspace:function(t){var i=s(t);if(!i||t.getOption(\"disableInput\"))return e.Pass;for(var a=n(i,\"pairs\"),o=t.listSelections(),c=0;c<o.length;c++){if(!o[c].empty())return e.Pass;var f=l(t,o[c].head);if(!f||a.indexOf(f)%2!=0)return e.Pass}for(var c=o.length-1;c>=0;c--){var h=o[c].head;t.replaceRange(\"\",r(h.line,h.ch-1),r(h.line,h.ch+1),\"+delete\")}},Enter:function(t){var r=s(t),i=r&&n(r,\"explode\");if(!i||t.getOption(\"disableInput\"))return e.Pass;for(var a=t.listSelections(),o=0;o<a.length;o++){if(!a[o].empty())return e.Pass;var c=l(t,a[o].head);if(!c||i.indexOf(c)%2!=0)return e.Pass}t.operation(function(){var e=t.lineSeparator()||\"\\n\";t.replaceSelection(e+e,null),t.execCommand(\"goCharLeft\"),a=t.listSelections();for(var r=0;r<a.length;r++){var n=a[r].head.line;t.indentLine(n,null,!0),t.indentLine(n+1,null,!0)}})}};function a(e){for(var t=0;t<e.length;t++){var r=e.charAt(t),n=\"'\"+r+\"'\";i[n]||(i[n]=o(r))}}function o(t){return function(i){return function(t,i){var a=s(t);if(!a||t.getOption(\"disableInput\"))return e.Pass;var o=n(a,\"pairs\"),l=o.indexOf(i);if(-1==l)return e.Pass;for(var c,f=n(a,\"triples\"),h=o.charAt(l+1)==i,d=t.listSelections(),u=l%2==0,g=0;g<d.length;g++){var p,v=d[g],m=v.head,b=t.getRange(m,r(m.line,m.ch+1));if(u&&!v.empty())p=\"surround\";else if(!h&&u||b!=i)if(h&&m.ch>1&&f.indexOf(i)>=0&&t.getRange(r(m.line,m.ch-2),m)==i+i){if(m.ch>2&&/\\bstring/.test(t.getTokenTypeAt(r(m.line,m.ch-2))))return e.Pass;p=\"addFour\"}else if(h){var C=0==m.ch?\" \":t.getRange(r(m.line,m.ch-1),m);if(e.isWordChar(b)||C==i||e.isWordChar(C))return e.Pass;p=\"both\"}else{if(!u||!(t.getLine(m.line).length==m.ch||(x=b,P=o,void 0,k=P.lastIndexOf(x),k>-1&&k%2==1)||/\\s/.test(b)))return e.Pass;p=\"both\"}else p=!h||(S=m,void 0,O=(y=t).getTokenAt(r(S.line,S.ch+1)),!/\\bstring/.test(O.type)||O.start!=S.ch||0!=S.ch&&/\\bstring/.test(y.getTokenTypeAt(S)))?f.indexOf(i)>=0&&t.getRange(m,r(m.line,m.ch+3))==i+i+i?\"skipThree\":\"skip\":\"both\";if(c){if(c!=p)return e.Pass}else c=p}var x,P,k;var y,S,O;var R=l%2?o.charAt(l-1):i,A=l%2?i:o.charAt(l+1);t.operation(function(){if(\"skip\"==c)t.execCommand(\"goCharRight\");else if(\"skipThree\"==c)for(var n=0;n<3;n++)t.execCommand(\"goCharRight\");else if(\"surround\"==c){for(var i=t.getSelections(),n=0;n<i.length;n++)i[n]=R+i[n]+A;t.replaceSelections(i,\"around\"),i=t.listSelections().slice();for(var n=0;n<i.length;n++)i[n]=(a=i[n],void 0,o=e.cmpPos(a.anchor,a.head)>0,{anchor:new r(a.anchor.line,a.anchor.ch+(o?-1:1)),head:new r(a.head.line,a.head.ch+(o?1:-1))});t.setSelections(i)}else\"both\"==c?(t.replaceSelection(R+A,null),t.triggerElectric(R+A),t.execCommand(\"goCharLeft\")):\"addFour\"==c&&(t.replaceSelection(R+R+R+R,\"before\"),t.execCommand(\"goCharRight\"));var a,o})}(i,t)}}function s(e){var t=e.state.closeBrackets;return!t||t.override?t:e.getModeAt(e.getCursor()).closeBrackets||t}function l(e,t){var n=e.getRange(r(t.line,t.ch-1),r(t.line,t.ch+1));return 2==n.length?n:null}a(t.pairs+\"`\")});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/edit/closebrackets.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(t){\"object\"==typeof exports&&\"object\"==typeof module?t(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],t):t(CodeMirror)}(function(t){var e=/MSIE \\d/.test(navigator.userAgent)&&(null==document.documentMode||document.documentMode<8),n=t.Pos,r={\"(\":\")>\",\")\":\"(<\",\"[\":\"]>\",\"]\":\"[<\",\"{\":\"}>\",\"}\":\"{<\"};function i(t,e,i){var c=t.getLineHandle(e.line),o=e.ch-1,l=i&&i.afterCursor;null==l&&(l=/(^| )cm-fat-cursor($| )/.test(t.getWrapperElement().className));var h=!l&&o>=0&&r[c.text.charAt(o)]||r[c.text.charAt(++o)];if(!h)return null;var s=\">\"==h.charAt(1)?1:-1;if(i&&i.strict&&s>0!=(o==e.ch))return null;var u=t.getTokenTypeAt(n(e.line,o+1)),f=a(t,n(e.line,o+(s>0?1:0)),s,u||null,i);return null==f?null:{from:n(e.line,o),to:f&&f.pos,match:f&&f.ch==h.charAt(0),forward:s>0}}function a(t,e,i,a,c){for(var o=c&&c.maxScanLineLength||1e4,l=c&&c.maxScanLines||1e3,h=[],s=c&&c.bracketRegex?c.bracketRegex:/[(){}[\\]]/,u=i>0?Math.min(e.line+l,t.lastLine()+1):Math.max(t.firstLine()-1,e.line-l),f=e.line;f!=u;f+=i){var m=t.getLine(f);if(m){var g=i>0?0:m.length-1,d=i>0?m.length:-1;if(!(m.length>o))for(f==e.line&&(g=e.ch-(i<0?1:0));g!=d;g+=i){var k=m.charAt(g);if(s.test(k)&&(void 0===a||t.getTokenTypeAt(n(f,g+1))==a))if(\">\"==r[k].charAt(1)==i>0)h.push(k);else{if(!h.length)return{pos:n(f,g),ch:k};h.pop()}}}}return f-i!=(i>0?t.lastLine():t.firstLine())&&null}function c(t,r,a){for(var c=t.state.matchBrackets.maxHighlightLineLength||1e3,o=[],l=t.listSelections(),h=0;h<l.length;h++){var s=l[h].empty()&&i(t,l[h].head,a);if(s&&t.getLine(s.from.line).length<=c){var u=s.match?\"CodeMirror-matchingbracket\":\"CodeMirror-nonmatchingbracket\";o.push(t.markText(s.from,n(s.from.line,s.from.ch+1),{className:u})),s.to&&t.getLine(s.to.line).length<=c&&o.push(t.markText(s.to,n(s.to.line,s.to.ch+1),{className:u}))}}if(o.length){e&&t.state.focused&&t.focus();var f=function(){t.operation(function(){for(var t=0;t<o.length;t++)o[t].clear()})};if(!r)return f;setTimeout(f,800)}}function o(t){t.operation(function(){t.state.matchBrackets.currentlyHighlighted&&(t.state.matchBrackets.currentlyHighlighted(),t.state.matchBrackets.currentlyHighlighted=null),t.state.matchBrackets.currentlyHighlighted=c(t,!1,t.state.matchBrackets)})}t.defineOption(\"matchBrackets\",!1,function(e,n,r){r&&r!=t.Init&&(e.off(\"cursorActivity\",o),e.state.matchBrackets&&e.state.matchBrackets.currentlyHighlighted&&(e.state.matchBrackets.currentlyHighlighted(),e.state.matchBrackets.currentlyHighlighted=null)),n&&(e.state.matchBrackets=\"object\"==typeof n?n:{},e.on(\"cursorActivity\",o))}),t.defineExtension(\"matchBrackets\",function(){c(this,!0)}),t.defineExtension(\"findMatchingBracket\",function(t,e,n){return(n||\"boolean\"==typeof e)&&(n?(n.strict=e,e=n):e=e?{strict:!0}:null),i(this,t,e)}),t.defineExtension(\"scanForBracket\",function(t,e,n,r){return a(this,t,e,n,r)})});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/edit/matchbrackets.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror-closebrackets/readme": {
"title": "$:/plugins/tiddlywiki/codemirror-closebrackets/readme",
"text": "This plugin adds the ability to automatically insert the closing brackets when you type an opening bracket.\nAlso enables highlighting of matching brackets.\n\nIt needs the latest [[CodeMirror plugin|$:/plugins/tiddlywiki/codemirror]] to be installed\n\n"
}
}
}
{
"tiddlers": {
"$:/config/codemirror/autoCloseTags": {
"title": "$:/config/codemirror/autoCloseTags",
"type": "bool",
"text": "true\n"
},
"$:/language/codemirror/autoCloseTags/hint": {
"title": "$:/language/codemirror/autoCloseTags/hint",
"text": "Auto-close tags"
},
"$:/language/codemirror/autoCloseTags/info": {
"title": "$:/language/codemirror/autoCloseTags/info",
"text": "Whether or not to automatically close tags"
},
"$:/plugins/tiddlywiki/codemirror/addon/fold/xml-fold.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){\"use strict\";var n=e.Pos;function t(e,n){return e.line-n.line||e.ch-n.ch}var i=\"A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\",r=new RegExp(\"<(/?)([\"+i+\"][A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD-:.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]*)\",\"g\");function u(e,n,t,i){this.line=n,this.ch=t,this.cm=e,this.text=e.getLine(n),this.min=i?Math.max(i.from,e.firstLine()):e.firstLine(),this.max=i?Math.min(i.to-1,e.lastLine()):e.lastLine()}function f(e,t){var i=e.cm.getTokenTypeAt(n(e.line,t));return i&&/\\btag\\b/.test(i)}function o(e){if(!(e.line>=e.max))return e.ch=0,e.text=e.cm.getLine(++e.line),!0}function l(e){if(!(e.line<=e.min))return e.text=e.cm.getLine(--e.line),e.ch=e.text.length,!0}function c(e){for(;;){var n=e.text.indexOf(\">\",e.ch);if(-1==n){if(o(e))continue;return}if(f(e,n+1)){var t=e.text.lastIndexOf(\"/\",n),i=t>-1&&!/\\S/.test(e.text.slice(t+1,n));return e.ch=n+1,i?\"selfClose\":\"regular\"}e.ch=n+1}}function a(e){for(;;){var n=e.ch?e.text.lastIndexOf(\"<\",e.ch-1):-1;if(-1==n){if(l(e))continue;return}if(f(e,n+1)){r.lastIndex=n,e.ch=n;var t=r.exec(e.text);if(t&&t.index==n)return t}else e.ch=n}}function s(e){for(;;){r.lastIndex=e.ch;var n=r.exec(e.text);if(!n){if(o(e))continue;return}if(f(e,n.index+1))return e.ch=n.index+n[0].length,n;e.ch=n.index+1}}function h(e){for(;;){var n=e.ch?e.text.lastIndexOf(\">\",e.ch-1):-1;if(-1==n){if(l(e))continue;return}if(f(e,n+1)){var t=e.text.lastIndexOf(\"/\",n),i=t>-1&&!/\\S/.test(e.text.slice(t+1,n));return e.ch=n+1,i?\"selfClose\":\"regular\"}e.ch=n}}function F(e,t){for(var i=[];;){var r,u=s(e),f=e.line,o=e.ch-(u?u[0].length:0);if(!u||!(r=c(e)))return;if(\"selfClose\"!=r)if(u[1]){for(var l=i.length-1;l>=0;--l)if(i[l]==u[2]){i.length=l;break}if(l<0&&(!t||t==u[2]))return{tag:u[2],from:n(f,o),to:n(e.line,e.ch)}}else i.push(u[2])}}function x(e,t){for(var i=[];;){var r=h(e);if(!r)return;if(\"selfClose\"!=r){var u=e.line,f=e.ch,o=a(e);if(!o)return;if(o[1])i.push(o[2]);else{for(var l=i.length-1;l>=0;--l)if(i[l]==o[2]){i.length=l;break}if(l<0&&(!t||t==o[2]))return{tag:o[2],from:n(e.line,e.ch),to:n(u,f)}}}else a(e)}}e.registerHelper(\"fold\",\"xml\",function(e,i){for(var r=new u(e,i.line,0);;){var f=s(r);if(!f||r.line!=i.line)return;var o=c(r);if(!o)return;if(!f[1]&&\"selfClose\"!=o){var l=n(r.line,r.ch),a=F(r,f[2]);return a&&t(a.from,l)>0?{from:l,to:a.from}:null}}}),e.findMatchingTag=function(e,i,r){var f=new u(e,i.line,i.ch,r);if(-1!=f.text.indexOf(\">\")||-1!=f.text.indexOf(\"<\")){var o=c(f),l=o&&n(f.line,f.ch),s=o&&a(f);if(o&&s&&!(t(f,i)>0)){var h={from:n(f.line,f.ch),to:l,tag:s[2]};return\"selfClose\"==o?{open:h,close:null,at:\"open\"}:s[1]?{open:x(f,s[2]),close:h,at:\"close\"}:{open:h,close:F(f=new u(e,l.line,l.ch,r),s[2]),at:\"open\"}}}},e.findEnclosingTag=function(e,n,t,i){for(var r=new u(e,n.line,n.ch,t);;){var f=x(r,i);if(!f)break;var o=F(new u(e,n.line,n.ch,t),f.tag);if(o)return{open:f,close:o}}},e.scanForClosingTag=function(e,n,t,i){return F(new u(e,n.line,n.ch,i?{from:0,to:i}:null),t)}});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/fold/xml-fold.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/edit/closetag.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\"),require(\"../fold/xml-fold\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../fold/xml-fold\"],e):e(CodeMirror)}(function(e){e.defineOption(\"autoCloseTags\",!1,function(i,s,l){if(l!=e.Init&&l&&i.removeKeyMap(\"autoCloseTags\"),s){var d={name:\"autoCloseTags\"};(\"object\"!=typeof s||s.whenClosing)&&(d[\"'/'\"]=function(t){return(n=t).getOption(\"disableInput\")?e.Pass:o(n,!0);var n}),(\"object\"!=typeof s||s.whenOpening)&&(d[\"'>'\"]=function(o){return function(o){if(o.getOption(\"disableInput\"))return e.Pass;for(var i=o.listSelections(),s=[],l=o.getOption(\"autoCloseTags\"),d=0;d<i.length;d++){if(!i[d].empty())return e.Pass;var c=i[d].head,f=o.getTokenAt(c),g=e.innerMode(o.getMode(),f.state),u=g.state;if(\"xml\"!=g.mode.name||!u.tagName)return e.Pass;var m=\"html\"==g.mode.configuration,h=\"object\"==typeof l&&l.dontCloseTags||m&&t,p=\"object\"==typeof l&&l.indentTags||m&&n,v=u.tagName;f.end>c.ch&&(v=v.slice(0,v.length-f.end+c.ch));var b=v.toLowerCase();if(!v||\"string\"==f.type&&(f.end!=c.ch||!/[\\\"\\']/.test(f.string.charAt(f.string.length-1))||1==f.string.length)||\"tag\"==f.type&&\"closeTag\"==u.type||f.string.indexOf(\"/\")==f.string.length-1||h&&a(h,b)>-1||r(o,v,c,u,!0))return e.Pass;var y=p&&a(p,b)>-1;s[d]={indent:y,text:\">\"+(y?\"\\n\\n\":\"\")+\"</\"+v+\">\",newPos:y?e.Pos(c.line+1,0):e.Pos(c.line,c.ch+1)}}for(var x=\"object\"==typeof l&&l.dontIndentOnAutoClose,d=i.length-1;d>=0;d--){var P=s[d];o.replaceRange(P.text,i[d].head,i[d].anchor,\"+insert\");var T=o.listSelections().slice(0);T[d]={head:P.newPos,anchor:P.newPos},o.setSelections(T),!x&&P.indent&&(o.indentLine(P.newPos.line,null,!0),o.indentLine(P.newPos.line+1,null,!0))}}(o)}),i.addKeyMap(d)}});var t=[\"area\",\"base\",\"br\",\"col\",\"command\",\"embed\",\"hr\",\"img\",\"input\",\"keygen\",\"link\",\"meta\",\"param\",\"source\",\"track\",\"wbr\"],n=[\"applet\",\"blockquote\",\"body\",\"button\",\"div\",\"dl\",\"fieldset\",\"form\",\"frameset\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"html\",\"iframe\",\"layer\",\"legend\",\"object\",\"ol\",\"p\",\"select\",\"table\",\"ul\"];function o(t,n){for(var o=t.listSelections(),a=[],i=n?\"/\":\"</\",s=t.getOption(\"autoCloseTags\"),l=\"object\"==typeof s&&s.dontIndentOnSlash,d=0;d<o.length;d++){if(!o[d].empty())return e.Pass;var c,f=o[d].head,g=t.getTokenAt(f),u=e.innerMode(t.getMode(),g.state),m=u.state;if(n&&(\"string\"==g.type||\"<\"!=g.string.charAt(0)||g.start!=f.ch-1))return e.Pass;if(\"xml\"!=u.mode.name)if(\"htmlmixed\"==t.getMode().name&&\"javascript\"==u.mode.name)c=i+\"script\";else{if(\"htmlmixed\"!=t.getMode().name||\"css\"!=u.mode.name)return e.Pass;c=i+\"style\"}else{if(!m.context||!m.context.tagName||r(t,m.context.tagName,f,m))return e.Pass;c=i+m.context.tagName}\">\"!=t.getLine(f.line).charAt(g.end)&&(c+=\">\"),a[d]=c}if(t.replaceSelections(a),o=t.listSelections(),!l)for(d=0;d<o.length;d++)(d==o.length-1||o[d].head.line<o[d+1].head.line)&&t.indentLine(o[d].head.line)}function a(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0,o=e.length;n<o;++n)if(e[n]==t)return n;return-1}function r(t,n,o,a,r){if(!e.scanForClosingTag)return!1;var i=Math.min(t.lastLine()+1,o.line+500),s=e.scanForClosingTag(t,o,null,i);if(!s||s.tag!=n)return!1;for(var l=a.context,d=r?1:0;l&&l.tagName==n;l=l.prev)++d;o=s.to;for(var c=1;c<d;c++){var f=e.scanForClosingTag(t,o,null,i);if(!f||f.tag!=n)return!1;o=f.to}return!0}e.commands.closeTag=function(e){return o(e)}});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/edit/closetag.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror-closetag/readme": {
"title": "$:/plugins/tiddlywiki/codemirror-closetag/readme",
"text": "This plugin adds the ability to ''automatically close Tags''. It needs the latest [[CodeMirror plugin|$:/plugins/tiddlywiki/codemirror]] to be installed\n\n\n"
},
"$:/core/ui/ControlPanel/Settings/codemirror/autoCloseTags": {
"title": "$:/core/ui/ControlPanel/Settings/codemirror/autoCloseTags",
"tags": "$:/tags/ControlPanel/Settings/CodeMirror",
"caption": "{{$:/language/codemirror/autoCloseTags/hint}}",
"text": "\\define lingo-base() $:/language/codemirror/autoCloseTags/\n<<lingo hint>>\n\n<$checkbox tiddler=\"$:/config/codemirror/autoCloseTags\" field=\"text\" checked=\"true\" unchecked=\"false\" default=\"true\"> <$link to=\"$:/config/codemirror/autoCloseTags\"><<lingo info>></$link> </$checkbox>\n\n"
}
}
}
{
"tiddlers": {
"$:/config/codemirror/fullscreen": {
"title": "$:/config/codemirror/fullscreen",
"extend": "extraKeys",
"type": "json",
"text": "{\n\t\"F11\": \"togglefullscreen\"\n}"
},
"$:/plugins/tiddlywiki/codemirror/addon/fullscreen/fullscreen.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){\"use strict\";e.defineOption(\"fullScreen\",!1,function(t,l,o){var r,n;(o==e.Init&&(o=!1),!o!=!l)&&(l?(n=(r=t).getWrapperElement(),r.state.fullScreenRestore={scrollTop:window.pageYOffset,scrollLeft:window.pageXOffset,width:n.style.width,height:n.style.height},n.style.width=\"\",n.style.height=\"auto\",n.className+=\" CodeMirror-fullscreen\",document.documentElement.style.overflow=\"hidden\",r.refresh()):function(e){var t=e.getWrapperElement();t.className=t.className.replace(/\\s*CodeMirror-fullscreen\\b/,\"\"),document.documentElement.style.overflow=\"\";var l=e.state.fullScreenRestore;t.style.width=l.width,t.style.height=l.height,window.scrollTo(l.scrollLeft,l.scrollTop),e.refresh()}(t))}),e.toggleFullscreen=function(e){e.setOption(\"fullScreen\",!e.getOption(\"fullScreen\"))},e.commands.togglefullscreen=e.toggleFullscreen});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/fullscreen/fullscreen.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/fullscreen/fullscreen.css": {
"text": ".CodeMirror-fullscreen {\n position: fixed;\n top: 0; left: 0; right: 0; bottom: 0;\n height: auto;\n z-index: 9;\n}\n",
"type": "text/css",
"title": "$:/plugins/tiddlywiki/codemirror/addon/fullscreen/fullscreen.css",
"tags": "[[$:/tags/Stylesheet]]"
},
"$:/plugins/tiddlywiki/codemirror-fullscreen/readme": {
"title": "$:/plugins/tiddlywiki/codemirror-fullscreen/readme",
"text": "This plugin adds a ''Fullscreen editing Mode'' to the [[CodeMirror|http://codemirror.net]] text editor. It needs the latest [[CodeMirror plugin|$:/plugins/tiddlywiki/codemirror]] to be installed\n\nPressing ''F11'' with the focus within the editor-textarea will make the editor go fullscreen, pressing ''F11'' again leaves fullscreen-mode\n\n"
}
}
}
{
"tiddlers": {
"$:/plugins/tiddlywiki/codemirror/mode/css/css.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){\"use strict\";function t(e){for(var t={},r=0;r<e.length;++r)t[e[r].toLowerCase()]=!0;return t}e.defineMode(\"css\",function(t,r){var o=r.inline;r.propertyKeywords||(r=e.resolveMode(\"text/css\"));var i,a,n=t.indentUnit,l=r.tokenHooks,s=r.documentTypes||{},c=r.mediaTypes||{},d=r.mediaFeatures||{},p=r.mediaValueKeywords||{},u=r.propertyKeywords||{},m=r.nonStandardPropertyKeywords||{},h=r.fontProperties||{},g=r.counterDescriptors||{},b=r.colorKeywords||{},f=r.valueKeywords||{},y=r.allowNested,w=r.lineComment,k=!0===r.supportsAtComponent;function v(e,t){return i=t,e}function x(e){return function(t,r){for(var o,i=!1;null!=(o=t.next());){if(o==e&&!i){\")\"==e&&t.backUp(1);break}i=!i&&\"\\\\\"==o}return(o==e||!i&&\")\"!=e)&&(r.tokenize=null),v(\"string\",\"string\")}}function z(e,t){return e.next(),e.match(/\\s*[\\\"\\')]/,!1)?t.tokenize=null:t.tokenize=x(\")\"),v(null,\"(\")}function j(e,t,r){this.type=e,this.indent=t,this.prev=r}function q(e,t,r,o){return e.context=new j(r,t.indentation()+(!1===o?0:n),e.context),r}function P(e){return e.context.prev&&(e.context=e.context.prev),e.context.type}function K(e,t,r){return T[r.context.type](e,t,r)}function C(e,t,r,o){for(var i=o||1;i>0;i--)r.context=r.context.prev;return K(e,t,r)}function B(e){var t=e.current().toLowerCase();a=f.hasOwnProperty(t)?\"atom\":b.hasOwnProperty(t)?\"keyword\":\"variable\"}var T={top:function(e,t,r){if(\"{\"==e)return q(r,t,\"block\");if(\"}\"==e&&r.context.prev)return P(r);if(k&&/@component/i.test(e))return q(r,t,\"atComponentBlock\");if(/^@(-moz-)?document$/i.test(e))return q(r,t,\"documentTypes\");if(/^@(media|supports|(-moz-)?document|import)$/i.test(e))return q(r,t,\"atBlock\");if(/^@(font-face|counter-style)/i.test(e))return r.stateArg=e,\"restricted_atBlock_before\";if(/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(e))return\"keyframes\";if(e&&\"@\"==e.charAt(0))return q(r,t,\"at\");if(\"hash\"==e)a=\"builtin\";else if(\"word\"==e)a=\"tag\";else{if(\"variable-definition\"==e)return\"maybeprop\";if(\"interpolation\"==e)return q(r,t,\"interpolation\");if(\":\"==e)return\"pseudo\";if(y&&\"(\"==e)return q(r,t,\"parens\")}return r.context.type},block:function(e,t,r){if(\"word\"==e){var o=t.current().toLowerCase();return u.hasOwnProperty(o)?(a=\"property\",\"maybeprop\"):m.hasOwnProperty(o)?(a=\"string-2\",\"maybeprop\"):y?(a=t.match(/^\\s*:(?:\\s|$)/,!1)?\"property\":\"tag\",\"block\"):(a+=\" error\",\"maybeprop\")}return\"meta\"==e?\"block\":y||\"hash\"!=e&&\"qualifier\"!=e?T.top(e,t,r):(a=\"error\",\"block\")},maybeprop:function(e,t,r){return\":\"==e?q(r,t,\"prop\"):K(e,t,r)},prop:function(e,t,r){if(\";\"==e)return P(r);if(\"{\"==e&&y)return q(r,t,\"propBlock\");if(\"}\"==e||\"{\"==e)return C(e,t,r);if(\"(\"==e)return q(r,t,\"parens\");if(\"hash\"!=e||/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(t.current())){if(\"word\"==e)B(t);else if(\"interpolation\"==e)return q(r,t,\"interpolation\")}else a+=\" error\";return\"prop\"},propBlock:function(e,t,r){return\"}\"==e?P(r):\"word\"==e?(a=\"property\",\"maybeprop\"):r.context.type},parens:function(e,t,r){return\"{\"==e||\"}\"==e?C(e,t,r):\")\"==e?P(r):\"(\"==e?q(r,t,\"parens\"):\"interpolation\"==e?q(r,t,\"interpolation\"):(\"word\"==e&&B(t),\"parens\")},pseudo:function(e,t,r){return\"meta\"==e?\"pseudo\":\"word\"==e?(a=\"variable-3\",r.context.type):K(e,t,r)},documentTypes:function(e,t,r){return\"word\"==e&&s.hasOwnProperty(t.current())?(a=\"tag\",r.context.type):T.atBlock(e,t,r)},atBlock:function(e,t,r){if(\"(\"==e)return q(r,t,\"atBlock_parens\");if(\"}\"==e||\";\"==e)return C(e,t,r);if(\"{\"==e)return P(r)&&q(r,t,y?\"block\":\"top\");if(\"interpolation\"==e)return q(r,t,\"interpolation\");if(\"word\"==e){var o=t.current().toLowerCase();a=\"only\"==o||\"not\"==o||\"and\"==o||\"or\"==o?\"keyword\":c.hasOwnProperty(o)?\"attribute\":d.hasOwnProperty(o)?\"property\":p.hasOwnProperty(o)?\"keyword\":u.hasOwnProperty(o)?\"property\":m.hasOwnProperty(o)?\"string-2\":f.hasOwnProperty(o)?\"atom\":b.hasOwnProperty(o)?\"keyword\":\"error\"}return r.context.type},atComponentBlock:function(e,t,r){return\"}\"==e?C(e,t,r):\"{\"==e?P(r)&&q(r,t,y?\"block\":\"top\",!1):(\"word\"==e&&(a=\"error\"),r.context.type)},atBlock_parens:function(e,t,r){return\")\"==e?P(r):\"{\"==e||\"}\"==e?C(e,t,r,2):T.atBlock(e,t,r)},restricted_atBlock_before:function(e,t,r){return\"{\"==e?q(r,t,\"restricted_atBlock\"):\"word\"==e&&\"@counter-style\"==r.stateArg?(a=\"variable\",\"restricted_atBlock_before\"):K(e,t,r)},restricted_atBlock:function(e,t,r){return\"}\"==e?(r.stateArg=null,P(r)):\"word\"==e?(a=\"@font-face\"==r.stateArg&&!h.hasOwnProperty(t.current().toLowerCase())||\"@counter-style\"==r.stateArg&&!g.hasOwnProperty(t.current().toLowerCase())?\"error\":\"property\",\"maybeprop\"):\"restricted_atBlock\"},keyframes:function(e,t,r){return\"word\"==e?(a=\"variable\",\"keyframes\"):\"{\"==e?q(r,t,\"top\"):K(e,t,r)},at:function(e,t,r){return\";\"==e?P(r):\"{\"==e||\"}\"==e?C(e,t,r):(\"word\"==e?a=\"tag\":\"hash\"==e&&(a=\"builtin\"),\"at\")},interpolation:function(e,t,r){return\"}\"==e?P(r):\"{\"==e||\";\"==e?C(e,t,r):(\"word\"==e?a=\"variable\":\"variable\"!=e&&\"(\"!=e&&\")\"!=e&&(a=\"error\"),\"interpolation\")}};return{startState:function(e){return{tokenize:null,state:o?\"block\":\"top\",stateArg:null,context:new j(o?\"block\":\"top\",e||0,null)}},token:function(e,t){if(!t.tokenize&&e.eatSpace())return null;var r=(t.tokenize||function(e,t){var r=e.next();if(l[r]){var o=l[r](e,t);if(!1!==o)return o}return\"@\"==r?(e.eatWhile(/[\\w\\\\\\-]/),v(\"def\",e.current())):\"=\"==r||(\"~\"==r||\"|\"==r)&&e.eat(\"=\")?v(null,\"compare\"):'\"'==r||\"'\"==r?(t.tokenize=x(r),t.tokenize(e,t)):\"#\"==r?(e.eatWhile(/[\\w\\\\\\-]/),v(\"atom\",\"hash\")):\"!\"==r?(e.match(/^\\s*\\w*/),v(\"keyword\",\"important\")):/\\d/.test(r)||\".\"==r&&e.eat(/\\d/)?(e.eatWhile(/[\\w.%]/),v(\"number\",\"unit\")):\"-\"!==r?/[,+>*\\/]/.test(r)?v(null,\"select-op\"):\".\"==r&&e.match(/^-?[_a-z][_a-z0-9-]*/i)?v(\"qualifier\",\"qualifier\"):/[:;{}\\[\\]\\(\\)]/.test(r)?v(null,r):(\"u\"==r||\"U\"==r)&&e.match(/rl(-prefix)?\\(/i)||(\"d\"==r||\"D\"==r)&&e.match(\"omain(\",!0,!0)||(\"r\"==r||\"R\"==r)&&e.match(\"egexp(\",!0,!0)?(e.backUp(1),t.tokenize=z,v(\"property\",\"word\")):/[\\w\\\\\\-]/.test(r)?(e.eatWhile(/[\\w\\\\\\-]/),v(\"property\",\"word\")):v(null,null):/[\\d.]/.test(e.peek())?(e.eatWhile(/[\\w.%]/),v(\"number\",\"unit\")):e.match(/^-[\\w\\\\\\-]+/)?(e.eatWhile(/[\\w\\\\\\-]/),e.match(/^\\s*:/,!1)?v(\"variable-2\",\"variable-definition\"):v(\"variable-2\",\"variable\")):e.match(/^\\w+-/)?v(\"meta\",\"meta\"):void 0})(e,t);return r&&\"object\"==typeof r&&(i=r[1],r=r[0]),a=r,\"comment\"!=i&&(t.state=T[t.state](i,e,t)),a},indent:function(e,t){var r=e.context,o=t&&t.charAt(0),i=r.indent;return\"prop\"!=r.type||\"}\"!=o&&\")\"!=o||(r=r.prev),r.prev&&(\"}\"!=o||\"block\"!=r.type&&\"top\"!=r.type&&\"interpolation\"!=r.type&&\"restricted_atBlock\"!=r.type?(\")\"!=o||\"parens\"!=r.type&&\"atBlock_parens\"!=r.type)&&(\"{\"!=o||\"at\"!=r.type&&\"atBlock\"!=r.type)||(i=Math.max(0,r.indent-n)):i=(r=r.prev).indent),i},electricChars:\"}\",blockCommentStart:\"/*\",blockCommentEnd:\"*/\",blockCommentContinue:\" * \",lineComment:w,fold:\"brace\"}});var r=[\"domain\",\"regexp\",\"url\",\"url-prefix\"],o=t(r),i=[\"all\",\"aural\",\"braille\",\"handheld\",\"print\",\"projection\",\"screen\",\"tty\",\"tv\",\"embossed\"],a=t(i),n=[\"width\",\"min-width\",\"max-width\",\"height\",\"min-height\",\"max-height\",\"device-width\",\"min-device-width\",\"max-device-width\",\"device-height\",\"min-device-height\",\"max-device-height\",\"aspect-ratio\",\"min-aspect-ratio\",\"max-aspect-ratio\",\"device-aspect-ratio\",\"min-device-aspect-ratio\",\"max-device-aspect-ratio\",\"color\",\"min-color\",\"max-color\",\"color-index\",\"min-color-index\",\"max-color-index\",\"monochrome\",\"min-monochrome\",\"max-monochrome\",\"resolution\",\"min-resolution\",\"max-resolution\",\"scan\",\"grid\",\"orientation\",\"device-pixel-ratio\",\"min-device-pixel-ratio\",\"max-device-pixel-ratio\",\"pointer\",\"any-pointer\",\"hover\",\"any-hover\"],l=t(n),s=[\"landscape\",\"portrait\",\"none\",\"coarse\",\"fine\",\"on-demand\",\"hover\",\"interlace\",\"progressive\"],c=t(s),d=[\"align-content\",\"align-items\",\"align-self\",\"alignment-adjust\",\"alignment-baseline\",\"anchor-point\",\"animation\",\"animation-delay\",\"animation-direction\",\"animation-duration\",\"animation-fill-mode\",\"animation-iteration-count\",\"animation-name\",\"animation-play-state\",\"animation-timing-function\",\"appearance\",\"azimuth\",\"backface-visibility\",\"background\",\"background-attachment\",\"background-blend-mode\",\"background-clip\",\"background-color\",\"background-image\",\"background-origin\",\"background-position\",\"background-repeat\",\"background-size\",\"baseline-shift\",\"binding\",\"bleed\",\"bookmark-label\",\"bookmark-level\",\"bookmark-state\",\"bookmark-target\",\"border\",\"border-bottom\",\"border-bottom-color\",\"border-bottom-left-radius\",\"border-bottom-right-radius\",\"border-bottom-style\",\"border-bottom-width\",\"border-collapse\",\"border-color\",\"border-image\",\"border-image-outset\",\"border-image-repeat\",\"border-image-slice\",\"border-image-source\",\"border-image-width\",\"border-left\",\"border-left-color\",\"border-left-style\",\"border-left-width\",\"border-radius\",\"border-right\",\"border-right-color\",\"border-right-style\",\"border-right-width\",\"border-spacing\",\"border-style\",\"border-top\",\"border-top-color\",\"border-top-left-radius\",\"border-top-right-radius\",\"border-top-style\",\"border-top-width\",\"border-width\",\"bottom\",\"box-decoration-break\",\"box-shadow\",\"box-sizing\",\"break-after\",\"break-before\",\"break-inside\",\"caption-side\",\"caret-color\",\"clear\",\"clip\",\"color\",\"color-profile\",\"column-count\",\"column-fill\",\"column-gap\",\"column-rule\",\"column-rule-color\",\"column-rule-style\",\"column-rule-width\",\"column-span\",\"column-width\",\"columns\",\"content\",\"counter-increment\",\"counter-reset\",\"crop\",\"cue\",\"cue-after\",\"cue-before\",\"cursor\",\"direction\",\"display\",\"dominant-baseline\",\"drop-initial-after-adjust\",\"drop-initial-after-align\",\"drop-initial-before-adjust\",\"drop-initial-before-align\",\"drop-initial-size\",\"drop-initial-value\",\"elevation\",\"empty-cells\",\"fit\",\"fit-position\",\"flex\",\"flex-basis\",\"flex-direction\",\"flex-flow\",\"flex-grow\",\"flex-shrink\",\"flex-wrap\",\"float\",\"float-offset\",\"flow-from\",\"flow-into\",\"font\",\"font-feature-settings\",\"font-family\",\"font-kerning\",\"font-language-override\",\"font-size\",\"font-size-adjust\",\"font-stretch\",\"font-style\",\"font-synthesis\",\"font-variant\",\"font-variant-alternates\",\"font-variant-caps\",\"font-variant-east-asian\",\"font-variant-ligatures\",\"font-variant-numeric\",\"font-variant-position\",\"font-weight\",\"grid\",\"grid-area\",\"grid-auto-columns\",\"grid-auto-flow\",\"grid-auto-rows\",\"grid-column\",\"grid-column-end\",\"grid-column-gap\",\"grid-column-start\",\"grid-gap\",\"grid-row\",\"grid-row-end\",\"grid-row-gap\",\"grid-row-start\",\"grid-template\",\"grid-template-areas\",\"grid-template-columns\",\"grid-template-rows\",\"hanging-punctuation\",\"height\",\"hyphens\",\"icon\",\"image-orientation\",\"image-rendering\",\"image-resolution\",\"inline-box-align\",\"justify-content\",\"justify-items\",\"justify-self\",\"left\",\"letter-spacing\",\"line-break\",\"line-height\",\"line-stacking\",\"line-stacking-ruby\",\"line-stacking-shift\",\"line-stacking-strategy\",\"list-style\",\"list-style-image\",\"list-style-position\",\"list-style-type\",\"margin\",\"margin-bottom\",\"margin-left\",\"margin-right\",\"margin-top\",\"marks\",\"marquee-direction\",\"marquee-loop\",\"marquee-play-count\",\"marquee-speed\",\"marquee-style\",\"max-height\",\"max-width\",\"min-height\",\"min-width\",\"move-to\",\"nav-down\",\"nav-index\",\"nav-left\",\"nav-right\",\"nav-up\",\"object-fit\",\"object-position\",\"opacity\",\"order\",\"orphans\",\"outline\",\"outline-color\",\"outline-offset\",\"outline-style\",\"outline-width\",\"overflow\",\"overflow-style\",\"overflow-wrap\",\"overflow-x\",\"overflow-y\",\"padding\",\"padding-bottom\",\"padding-left\",\"padding-right\",\"padding-top\",\"page\",\"page-break-after\",\"page-break-before\",\"page-break-inside\",\"page-policy\",\"pause\",\"pause-after\",\"pause-before\",\"perspective\",\"perspective-origin\",\"pitch\",\"pitch-range\",\"place-content\",\"place-items\",\"place-self\",\"play-during\",\"position\",\"presentation-level\",\"punctuation-trim\",\"quotes\",\"region-break-after\",\"region-break-before\",\"region-break-inside\",\"region-fragment\",\"rendering-intent\",\"resize\",\"rest\",\"rest-after\",\"rest-before\",\"richness\",\"right\",\"rotation\",\"rotation-point\",\"ruby-align\",\"ruby-overhang\",\"ruby-position\",\"ruby-span\",\"shape-image-threshold\",\"shape-inside\",\"shape-margin\",\"shape-outside\",\"size\",\"speak\",\"speak-as\",\"speak-header\",\"speak-numeral\",\"speak-punctuation\",\"speech-rate\",\"stress\",\"string-set\",\"tab-size\",\"table-layout\",\"target\",\"target-name\",\"target-new\",\"target-position\",\"text-align\",\"text-align-last\",\"text-decoration\",\"text-decoration-color\",\"text-decoration-line\",\"text-decoration-skip\",\"text-decoration-style\",\"text-emphasis\",\"text-emphasis-color\",\"text-emphasis-position\",\"text-emphasis-style\",\"text-height\",\"text-indent\",\"text-justify\",\"text-outline\",\"text-overflow\",\"text-shadow\",\"text-size-adjust\",\"text-space-collapse\",\"text-transform\",\"text-underline-position\",\"text-wrap\",\"top\",\"transform\",\"transform-origin\",\"transform-style\",\"transition\",\"transition-delay\",\"transition-duration\",\"transition-property\",\"transition-timing-function\",\"unicode-bidi\",\"user-select\",\"vertical-align\",\"visibility\",\"voice-balance\",\"voice-duration\",\"voice-family\",\"voice-pitch\",\"voice-range\",\"voice-rate\",\"voice-stress\",\"voice-volume\",\"volume\",\"white-space\",\"widows\",\"width\",\"will-change\",\"word-break\",\"word-spacing\",\"word-wrap\",\"z-index\",\"clip-path\",\"clip-rule\",\"mask\",\"enable-background\",\"filter\",\"flood-color\",\"flood-opacity\",\"lighting-color\",\"stop-color\",\"stop-opacity\",\"pointer-events\",\"color-interpolation\",\"color-interpolation-filters\",\"color-rendering\",\"fill\",\"fill-opacity\",\"fill-rule\",\"image-rendering\",\"marker\",\"marker-end\",\"marker-mid\",\"marker-start\",\"shape-rendering\",\"stroke\",\"stroke-dasharray\",\"stroke-dashoffset\",\"stroke-linecap\",\"stroke-linejoin\",\"stroke-miterlimit\",\"stroke-opacity\",\"stroke-width\",\"text-rendering\",\"baseline-shift\",\"dominant-baseline\",\"glyph-orientation-horizontal\",\"glyph-orientation-vertical\",\"text-anchor\",\"writing-mode\"],p=t(d),u=[\"scrollbar-arrow-color\",\"scrollbar-base-color\",\"scrollbar-dark-shadow-color\",\"scrollbar-face-color\",\"scrollbar-highlight-color\",\"scrollbar-shadow-color\",\"scrollbar-3d-light-color\",\"scrollbar-track-color\",\"shape-inside\",\"searchfield-cancel-button\",\"searchfield-decoration\",\"searchfield-results-button\",\"searchfield-results-decoration\",\"zoom\"],m=t(u),h=t([\"font-family\",\"src\",\"unicode-range\",\"font-variant\",\"font-feature-settings\",\"font-stretch\",\"font-weight\",\"font-style\"]),g=t([\"additive-symbols\",\"fallback\",\"negative\",\"pad\",\"prefix\",\"range\",\"speak-as\",\"suffix\",\"symbols\",\"system\"]),b=[\"aliceblue\",\"antiquewhite\",\"aqua\",\"aquamarine\",\"azure\",\"beige\",\"bisque\",\"black\",\"blanchedalmond\",\"blue\",\"blueviolet\",\"brown\",\"burlywood\",\"cadetblue\",\"chartreuse\",\"chocolate\",\"coral\",\"cornflowerblue\",\"cornsilk\",\"crimson\",\"cyan\",\"darkblue\",\"darkcyan\",\"darkgoldenrod\",\"darkgray\",\"darkgreen\",\"darkkhaki\",\"darkmagenta\",\"darkolivegreen\",\"darkorange\",\"darkorchid\",\"darkred\",\"darksalmon\",\"darkseagreen\",\"darkslateblue\",\"darkslategray\",\"darkturquoise\",\"darkviolet\",\"deeppink\",\"deepskyblue\",\"dimgray\",\"dodgerblue\",\"firebrick\",\"floralwhite\",\"forestgreen\",\"fuchsia\",\"gainsboro\",\"ghostwhite\",\"gold\",\"goldenrod\",\"gray\",\"grey\",\"green\",\"greenyellow\",\"honeydew\",\"hotpink\",\"indianred\",\"indigo\",\"ivory\",\"khaki\",\"lavender\",\"lavenderblush\",\"lawngreen\",\"lemonchiffon\",\"lightblue\",\"lightcoral\",\"lightcyan\",\"lightgoldenrodyellow\",\"lightgray\",\"lightgreen\",\"lightpink\",\"lightsalmon\",\"lightseagreen\",\"lightskyblue\",\"lightslategray\",\"lightsteelblue\",\"lightyellow\",\"lime\",\"limegreen\",\"linen\",\"magenta\",\"maroon\",\"mediumaquamarine\",\"mediumblue\",\"mediumorchid\",\"mediumpurple\",\"mediumseagreen\",\"mediumslateblue\",\"mediumspringgreen\",\"mediumturquoise\",\"mediumvioletred\",\"midnightblue\",\"mintcream\",\"mistyrose\",\"moccasin\",\"navajowhite\",\"navy\",\"oldlace\",\"olive\",\"olivedrab\",\"orange\",\"orangered\",\"orchid\",\"palegoldenrod\",\"palegreen\",\"paleturquoise\",\"palevioletred\",\"papayawhip\",\"peachpuff\",\"peru\",\"pink\",\"plum\",\"powderblue\",\"purple\",\"rebeccapurple\",\"red\",\"rosybrown\",\"royalblue\",\"saddlebrown\",\"salmon\",\"sandybrown\",\"seagreen\",\"seashell\",\"sienna\",\"silver\",\"skyblue\",\"slateblue\",\"slategray\",\"snow\",\"springgreen\",\"steelblue\",\"tan\",\"teal\",\"thistle\",\"tomato\",\"turquoise\",\"violet\",\"wheat\",\"white\",\"whitesmoke\",\"yellow\",\"yellowgreen\"],f=t(b),y=[\"above\",\"absolute\",\"activeborder\",\"additive\",\"activecaption\",\"afar\",\"after-white-space\",\"ahead\",\"alias\",\"all\",\"all-scroll\",\"alphabetic\",\"alternate\",\"always\",\"amharic\",\"amharic-abegede\",\"antialiased\",\"appworkspace\",\"arabic-indic\",\"armenian\",\"asterisks\",\"attr\",\"auto\",\"auto-flow\",\"avoid\",\"avoid-column\",\"avoid-page\",\"avoid-region\",\"background\",\"backwards\",\"baseline\",\"below\",\"bidi-override\",\"binary\",\"bengali\",\"blink\",\"block\",\"block-axis\",\"bold\",\"bolder\",\"border\",\"border-box\",\"both\",\"bottom\",\"break\",\"break-all\",\"break-word\",\"bullets\",\"button\",\"button-bevel\",\"buttonface\",\"buttonhighlight\",\"buttonshadow\",\"buttontext\",\"calc\",\"cambodian\",\"capitalize\",\"caps-lock-indicator\",\"caption\",\"captiontext\",\"caret\",\"cell\",\"center\",\"checkbox\",\"circle\",\"cjk-decimal\",\"cjk-earthly-branch\",\"cjk-heavenly-stem\",\"cjk-ideographic\",\"clear\",\"clip\",\"close-quote\",\"col-resize\",\"collapse\",\"color\",\"color-burn\",\"color-dodge\",\"column\",\"column-reverse\",\"compact\",\"condensed\",\"contain\",\"content\",\"contents\",\"content-box\",\"context-menu\",\"continuous\",\"copy\",\"counter\",\"counters\",\"cover\",\"crop\",\"cross\",\"crosshair\",\"currentcolor\",\"cursive\",\"cyclic\",\"darken\",\"dashed\",\"decimal\",\"decimal-leading-zero\",\"default\",\"default-button\",\"dense\",\"destination-atop\",\"destination-in\",\"destination-out\",\"destination-over\",\"devanagari\",\"difference\",\"disc\",\"discard\",\"disclosure-closed\",\"disclosure-open\",\"document\",\"dot-dash\",\"dot-dot-dash\",\"dotted\",\"double\",\"down\",\"e-resize\",\"ease\",\"ease-in\",\"ease-in-out\",\"ease-out\",\"element\",\"ellipse\",\"ellipsis\",\"embed\",\"end\",\"ethiopic\",\"ethiopic-abegede\",\"ethiopic-abegede-am-et\",\"ethiopic-abegede-gez\",\"ethiopic-abegede-ti-er\",\"ethiopic-abegede-ti-et\",\"ethiopic-halehame-aa-er\",\"ethiopic-halehame-aa-et\",\"ethiopic-halehame-am-et\",\"ethiopic-halehame-gez\",\"ethiopic-halehame-om-et\",\"ethiopic-halehame-sid-et\",\"ethiopic-halehame-so-et\",\"ethiopic-halehame-ti-er\",\"ethiopic-halehame-ti-et\",\"ethiopic-halehame-tig\",\"ethiopic-numeric\",\"ew-resize\",\"exclusion\",\"expanded\",\"extends\",\"extra-condensed\",\"extra-expanded\",\"fantasy\",\"fast\",\"fill\",\"fixed\",\"flat\",\"flex\",\"flex-end\",\"flex-start\",\"footnotes\",\"forwards\",\"from\",\"geometricPrecision\",\"georgian\",\"graytext\",\"grid\",\"groove\",\"gujarati\",\"gurmukhi\",\"hand\",\"hangul\",\"hangul-consonant\",\"hard-light\",\"hebrew\",\"help\",\"hidden\",\"hide\",\"higher\",\"highlight\",\"highlighttext\",\"hiragana\",\"hiragana-iroha\",\"horizontal\",\"hsl\",\"hsla\",\"hue\",\"icon\",\"ignore\",\"inactiveborder\",\"inactivecaption\",\"inactivecaptiontext\",\"infinite\",\"infobackground\",\"infotext\",\"inherit\",\"initial\",\"inline\",\"inline-axis\",\"inline-block\",\"inline-flex\",\"inline-grid\",\"inline-table\",\"inset\",\"inside\",\"intrinsic\",\"invert\",\"italic\",\"japanese-formal\",\"japanese-informal\",\"justify\",\"kannada\",\"katakana\",\"katakana-iroha\",\"keep-all\",\"khmer\",\"korean-hangul-formal\",\"korean-hanja-formal\",\"korean-hanja-informal\",\"landscape\",\"lao\",\"large\",\"larger\",\"left\",\"level\",\"lighter\",\"lighten\",\"line-through\",\"linear\",\"linear-gradient\",\"lines\",\"list-item\",\"listbox\",\"listitem\",\"local\",\"logical\",\"loud\",\"lower\",\"lower-alpha\",\"lower-armenian\",\"lower-greek\",\"lower-hexadecimal\",\"lower-latin\",\"lower-norwegian\",\"lower-roman\",\"lowercase\",\"ltr\",\"luminosity\",\"malayalam\",\"match\",\"matrix\",\"matrix3d\",\"media-controls-background\",\"media-current-time-display\",\"media-fullscreen-button\",\"media-mute-button\",\"media-play-button\",\"media-return-to-realtime-button\",\"media-rewind-button\",\"media-seek-back-button\",\"media-seek-forward-button\",\"media-slider\",\"media-sliderthumb\",\"media-time-remaining-display\",\"media-volume-slider\",\"media-volume-slider-container\",\"media-volume-sliderthumb\",\"medium\",\"menu\",\"menulist\",\"menulist-button\",\"menulist-text\",\"menulist-textfield\",\"menutext\",\"message-box\",\"middle\",\"min-intrinsic\",\"mix\",\"mongolian\",\"monospace\",\"move\",\"multiple\",\"multiply\",\"myanmar\",\"n-resize\",\"narrower\",\"ne-resize\",\"nesw-resize\",\"no-close-quote\",\"no-drop\",\"no-open-quote\",\"no-repeat\",\"none\",\"normal\",\"not-allowed\",\"nowrap\",\"ns-resize\",\"numbers\",\"numeric\",\"nw-resize\",\"nwse-resize\",\"oblique\",\"octal\",\"opacity\",\"open-quote\",\"optimizeLegibility\",\"optimizeSpeed\",\"oriya\",\"oromo\",\"outset\",\"outside\",\"outside-shape\",\"overlay\",\"overline\",\"padding\",\"padding-box\",\"painted\",\"page\",\"paused\",\"persian\",\"perspective\",\"plus-darker\",\"plus-lighter\",\"pointer\",\"polygon\",\"portrait\",\"pre\",\"pre-line\",\"pre-wrap\",\"preserve-3d\",\"progress\",\"push-button\",\"radial-gradient\",\"radio\",\"read-only\",\"read-write\",\"read-write-plaintext-only\",\"rectangle\",\"region\",\"relative\",\"repeat\",\"repeating-linear-gradient\",\"repeating-radial-gradient\",\"repeat-x\",\"repeat-y\",\"reset\",\"reverse\",\"rgb\",\"rgba\",\"ridge\",\"right\",\"rotate\",\"rotate3d\",\"rotateX\",\"rotateY\",\"rotateZ\",\"round\",\"row\",\"row-resize\",\"row-reverse\",\"rtl\",\"run-in\",\"running\",\"s-resize\",\"sans-serif\",\"saturation\",\"scale\",\"scale3d\",\"scaleX\",\"scaleY\",\"scaleZ\",\"screen\",\"scroll\",\"scrollbar\",\"scroll-position\",\"se-resize\",\"searchfield\",\"searchfield-cancel-button\",\"searchfield-decoration\",\"searchfield-results-button\",\"searchfield-results-decoration\",\"self-start\",\"self-end\",\"semi-condensed\",\"semi-expanded\",\"separate\",\"serif\",\"show\",\"sidama\",\"simp-chinese-formal\",\"simp-chinese-informal\",\"single\",\"skew\",\"skewX\",\"skewY\",\"skip-white-space\",\"slide\",\"slider-horizontal\",\"slider-vertical\",\"sliderthumb-horizontal\",\"sliderthumb-vertical\",\"slow\",\"small\",\"small-caps\",\"small-caption\",\"smaller\",\"soft-light\",\"solid\",\"somali\",\"source-atop\",\"source-in\",\"source-out\",\"source-over\",\"space\",\"space-around\",\"space-between\",\"space-evenly\",\"spell-out\",\"square\",\"square-button\",\"start\",\"static\",\"status-bar\",\"stretch\",\"stroke\",\"sub\",\"subpixel-antialiased\",\"super\",\"sw-resize\",\"symbolic\",\"symbols\",\"system-ui\",\"table\",\"table-caption\",\"table-cell\",\"table-column\",\"table-column-group\",\"table-footer-group\",\"table-header-group\",\"table-row\",\"table-row-group\",\"tamil\",\"telugu\",\"text\",\"text-bottom\",\"text-top\",\"textarea\",\"textfield\",\"thai\",\"thick\",\"thin\",\"threeddarkshadow\",\"threedface\",\"threedhighlight\",\"threedlightshadow\",\"threedshadow\",\"tibetan\",\"tigre\",\"tigrinya-er\",\"tigrinya-er-abegede\",\"tigrinya-et\",\"tigrinya-et-abegede\",\"to\",\"top\",\"trad-chinese-formal\",\"trad-chinese-informal\",\"transform\",\"translate\",\"translate3d\",\"translateX\",\"translateY\",\"translateZ\",\"transparent\",\"ultra-condensed\",\"ultra-expanded\",\"underline\",\"unset\",\"up\",\"upper-alpha\",\"upper-armenian\",\"upper-greek\",\"upper-hexadecimal\",\"upper-latin\",\"upper-norwegian\",\"upper-roman\",\"uppercase\",\"urdu\",\"url\",\"var\",\"vertical\",\"vertical-text\",\"visible\",\"visibleFill\",\"visiblePainted\",\"visibleStroke\",\"visual\",\"w-resize\",\"wait\",\"wave\",\"wider\",\"window\",\"windowframe\",\"windowtext\",\"words\",\"wrap\",\"wrap-reverse\",\"x-large\",\"x-small\",\"xor\",\"xx-large\",\"xx-small\"],w=t(y),k=r.concat(i).concat(n).concat(s).concat(d).concat(u).concat(b).concat(y);function v(e,t){for(var r,o=!1;null!=(r=e.next());){if(o&&\"/\"==r){t.tokenize=null;break}o=\"*\"==r}return[\"comment\",\"comment\"]}e.registerHelper(\"hintWords\",\"css\",k),e.defineMIME(\"text/css\",{documentTypes:o,mediaTypes:a,mediaFeatures:l,mediaValueKeywords:c,propertyKeywords:p,nonStandardPropertyKeywords:m,fontProperties:h,counterDescriptors:g,colorKeywords:f,valueKeywords:w,tokenHooks:{\"/\":function(e,t){return!!e.eat(\"*\")&&(t.tokenize=v,v(e,t))}},name:\"css\"}),e.defineMIME(\"text/x-scss\",{mediaTypes:a,mediaFeatures:l,mediaValueKeywords:c,propertyKeywords:p,nonStandardPropertyKeywords:m,colorKeywords:f,valueKeywords:w,fontProperties:h,allowNested:!0,lineComment:\"//\",tokenHooks:{\"/\":function(e,t){return e.eat(\"/\")?(e.skipToEnd(),[\"comment\",\"comment\"]):e.eat(\"*\")?(t.tokenize=v,v(e,t)):[\"operator\",\"operator\"]},\":\":function(e){return!!e.match(/\\s*\\{/,!1)&&[null,null]},$:function(e){return e.match(/^[\\w-]+/),e.match(/^\\s*:/,!1)?[\"variable-2\",\"variable-definition\"]:[\"variable-2\",\"variable\"]},\"#\":function(e){return!!e.eat(\"{\")&&[null,\"interpolation\"]}},name:\"css\",helperType:\"scss\"}),e.defineMIME(\"text/x-less\",{mediaTypes:a,mediaFeatures:l,mediaValueKeywords:c,propertyKeywords:p,nonStandardPropertyKeywords:m,colorKeywords:f,valueKeywords:w,fontProperties:h,allowNested:!0,lineComment:\"//\",tokenHooks:{\"/\":function(e,t){return e.eat(\"/\")?(e.skipToEnd(),[\"comment\",\"comment\"]):e.eat(\"*\")?(t.tokenize=v,v(e,t)):[\"operator\",\"operator\"]},\"@\":function(e){return e.eat(\"{\")?[null,\"interpolation\"]:!e.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\\b/i,!1)&&(e.eatWhile(/[\\w\\\\\\-]/),e.match(/^\\s*:/,!1)?[\"variable-2\",\"variable-definition\"]:[\"variable-2\",\"variable\"])},\"&\":function(){return[\"atom\",\"atom\"]}},name:\"css\",helperType:\"less\"}),e.defineMIME(\"text/x-gss\",{documentTypes:o,mediaTypes:a,mediaFeatures:l,propertyKeywords:p,nonStandardPropertyKeywords:m,fontProperties:h,counterDescriptors:g,colorKeywords:f,valueKeywords:w,supportsAtComponent:!0,tokenHooks:{\"/\":function(e,t){return!!e.eat(\"*\")&&(t.tokenize=v,v(e,t))}},name:\"css\",helperType:\"gss\"})});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/mode/css/css.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror-mode-css/readme": {
"title": "$:/plugins/tiddlywiki/codemirror-mode-css/readme",
"text": "This plugin adds Syntax Highlighting for CSS tiddlers (text/css) to the [[CodeMirror|http://codemirror.net]] text editor. It needs the latest [[CodeMirror plugin|$:/plugins/tiddlywiki/codemirror]] to be installed\n\n\n"
}
}
}
{
"tiddlers": {
"$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){\"use strict\";e.defineMode(\"javascript\",function(t,r){var n,a,i=t.indentUnit,o=r.statementIndent,c=r.jsonld,u=r.json||c,s=r.typescript,f=r.wordCharacters||/[\\w$\\xa1-\\uffff]/,l=function(){function e(e){return{type:e,style:\"keyword\"}}var t=e(\"keyword a\"),r=e(\"keyword b\"),n=e(\"keyword c\"),a=e(\"keyword d\"),i=e(\"operator\"),o={type:\"atom\",style:\"atom\"};return{if:e(\"if\"),while:t,with:t,else:r,do:r,try:r,finally:r,return:a,break:a,continue:a,new:e(\"new\"),delete:n,void:n,throw:n,debugger:e(\"debugger\"),var:e(\"var\"),const:e(\"var\"),let:e(\"var\"),function:e(\"function\"),catch:e(\"catch\"),for:e(\"for\"),switch:e(\"switch\"),case:e(\"case\"),default:e(\"default\"),in:i,typeof:i,instanceof:i,true:o,false:o,null:o,undefined:o,NaN:o,Infinity:o,this:e(\"this\"),class:e(\"class\"),super:e(\"atom\"),yield:n,export:e(\"export\"),import:e(\"import\"),extends:n,await:n}}(),d=/[+\\-*&%=<>!?|~^@]/,p=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/;function m(e,t,r){return n=e,a=r,t}function k(e,t){var r,n=e.next();if('\"'==n||\"'\"==n)return t.tokenize=(r=n,function(e,t){var n,a=!1;if(c&&\"@\"==e.peek()&&e.match(p))return t.tokenize=k,m(\"jsonld-keyword\",\"meta\");for(;null!=(n=e.next())&&(n!=r||a);)a=!a&&\"\\\\\"==n;return a||(t.tokenize=k),m(\"string\",\"string\")}),t.tokenize(e,t);if(\".\"==n&&e.match(/^\\d+(?:[eE][+\\-]?\\d+)?/))return m(\"number\",\"number\");if(\".\"==n&&e.match(\"..\"))return m(\"spread\",\"meta\");if(/[\\[\\]{}\\(\\),;\\:\\.]/.test(n))return m(n);if(\"=\"==n&&e.eat(\">\"))return m(\"=>\",\"operator\");if(\"0\"==n&&e.eat(/x/i))return e.eatWhile(/[\\da-f]/i),m(\"number\",\"number\");if(\"0\"==n&&e.eat(/o/i))return e.eatWhile(/[0-7]/i),m(\"number\",\"number\");if(\"0\"==n&&e.eat(/b/i))return e.eatWhile(/[01]/i),m(\"number\",\"number\");if(/\\d/.test(n))return e.match(/^\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/),m(\"number\",\"number\");if(\"/\"==n)return e.eat(\"*\")?(t.tokenize=v,v(e,t)):e.eat(\"/\")?(e.skipToEnd(),m(\"comment\",\"comment\")):He(e,t,1)?(function(e){for(var t,r=!1,n=!1;null!=(t=e.next());){if(!r){if(\"/\"==t&&!n)return;\"[\"==t?n=!0:n&&\"]\"==t&&(n=!1)}r=!r&&\"\\\\\"==t}}(e),e.match(/^\\b(([gimyu])(?![gimyu]*\\2))+\\b/),m(\"regexp\",\"string-2\")):(e.eat(\"=\"),m(\"operator\",\"operator\",e.current()));if(\"`\"==n)return t.tokenize=y,y(e,t);if(\"#\"==n)return e.skipToEnd(),m(\"error\",\"error\");if(d.test(n))return\">\"==n&&t.lexical&&\">\"==t.lexical.type||(e.eat(\"=\")?\"!\"!=n&&\"=\"!=n||e.eat(\"=\"):/[<>*+\\-]/.test(n)&&(e.eat(n),\">\"==n&&e.eat(n))),m(\"operator\",\"operator\",e.current());if(f.test(n)){e.eatWhile(f);var a=e.current();if(\".\"!=t.lastType){if(l.propertyIsEnumerable(a)){var i=l[a];return m(i.type,i.style,a)}if(\"async\"==a&&e.match(/^(\\s|\\/\\*.*?\\*\\/)*[\\[\\(\\w]/,!1))return m(\"async\",\"keyword\",a)}return m(\"variable\",\"variable\",a)}}function v(e,t){for(var r,n=!1;r=e.next();){if(\"/\"==r&&n){t.tokenize=k;break}n=\"*\"==r}return m(\"comment\",\"comment\")}function y(e,t){for(var r,n=!1;null!=(r=e.next());){if(!n&&(\"`\"==r||\"$\"==r&&e.eat(\"{\"))){t.tokenize=k;break}n=!n&&\"\\\\\"==r}return m(\"quasi\",\"string-2\",e.current())}var b=\"([{}])\";function w(e,t){t.fatArrowAt&&(t.fatArrowAt=null);var r=e.string.indexOf(\"=>\",e.start);if(!(r<0)){if(s){var n=/:\\s*(?:\\w+(?:<[^>]*>|\\[\\])?|\\{[^}]*\\})\\s*$/.exec(e.string.slice(e.start,r));n&&(r=n.index)}for(var a=0,i=!1,o=r-1;o>=0;--o){var c=e.string.charAt(o),u=b.indexOf(c);if(u>=0&&u<3){if(!a){++o;break}if(0==--a){\"(\"==c&&(i=!0);break}}else if(u>=3&&u<6)++a;else if(f.test(c))i=!0;else{if(/[\"'\\/]/.test(c))return;if(i&&!a){++o;break}}}i&&!a&&(t.fatArrowAt=o)}}var x={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,this:!0,\"jsonld-keyword\":!0};function h(e,t,r,n,a,i){this.indented=e,this.column=t,this.type=r,this.prev=a,this.info=i,null!=n&&(this.align=n)}function g(e,t){for(var r=e.localVars;r;r=r.next)if(r.name==t)return!0;for(var n=e.context;n;n=n.prev)for(r=n.vars;r;r=r.next)if(r.name==t)return!0}var j={state:null,column:null,marked:null,cc:null};function M(){for(var e=arguments.length-1;e>=0;e--)j.cc.push(arguments[e])}function V(){return M.apply(null,arguments),!0}function A(e){function t(t){for(var r=t;r;r=r.next)if(r.name==e)return!0;return!1}var n=j.state;if(j.marked=\"def\",n.context){if(t(n.localVars))return;n.localVars={name:e,next:n.localVars}}else{if(t(n.globalVars))return;r.globalVars&&(n.globalVars={name:e,next:n.globalVars})}}function E(e){return\"public\"==e||\"private\"==e||\"protected\"==e||\"abstract\"==e||\"readonly\"==e}var z={name:\"this\",next:{name:\"arguments\"}};function I(){j.state.context={prev:j.state.context,vars:j.state.localVars},j.state.localVars=z}function T(){j.state.localVars=j.state.context.vars,j.state.context=j.state.context.prev}function $(e,t){var r=function(){var r=j.state,n=r.indented;if(\"stat\"==r.lexical.type)n=r.lexical.indented;else for(var a=r.lexical;a&&\")\"==a.type&&a.align;a=a.prev)n=a.indented;r.lexical=new h(n,j.stream.column(),e,null,r.lexical,t)};return r.lex=!0,r}function C(){var e=j.state;e.lexical.prev&&(\")\"==e.lexical.type&&(e.indented=e.lexical.indented),e.lexical=e.lexical.prev)}function q(e){return function t(r){return r==e?V():\";\"==e?M():V(t)}}function O(e,t){return\"var\"==e?V($(\"vardef\",t.length),pe,q(\";\"),C):\"keyword a\"==e?V($(\"form\"),W,O,C):\"keyword b\"==e?V($(\"form\"),O,C):\"keyword d\"==e?j.stream.match(/^\\s*$/,!1)?V():V($(\"stat\"),U,q(\";\"),C):\"debugger\"==e?V(q(\";\")):\"{\"==e?V($(\"}\"),te,C):\";\"==e?V():\"if\"==e?(\"else\"==j.state.lexical.info&&j.state.cc[j.state.cc.length-1]==C&&j.state.cc.pop()(),V($(\"form\"),W,O,C,be)):\"function\"==e?V(Me):\"for\"==e?V($(\"form\"),we,O,C):\"class\"==e||s&&\"interface\"==t?(j.marked=\"keyword\",V($(\"form\"),Ee,C)):\"variable\"==e?s&&\"declare\"==t?(j.marked=\"keyword\",V(O)):s&&(\"module\"==t||\"enum\"==t||\"type\"==t)&&j.stream.match(/^\\s*\\w/,!1)?(j.marked=\"keyword\",\"enum\"==t?V(Ue):\"type\"==t?V(ie,q(\"operator\"),ie,q(\";\")):V($(\"form\"),me,q(\"{\"),$(\"}\"),te,C,C)):s&&\"namespace\"==t?(j.marked=\"keyword\",V($(\"form\"),P,te,C)):s&&\"abstract\"==t?(j.marked=\"keyword\",V(O)):V($(\"stat\"),Q):\"switch\"==e?V($(\"form\"),W,q(\"{\"),$(\"}\",\"switch\"),te,C,C):\"case\"==e?V(P,q(\":\")):\"default\"==e?V(q(\":\")):\"catch\"==e?V($(\"form\"),I,q(\"(\"),Ve,q(\")\"),O,C,T):\"export\"==e?V($(\"stat\"),$e,C):\"import\"==e?V($(\"stat\"),qe,C):\"async\"==e?V(O):\"@\"==t?V(P,O):M($(\"stat\"),P,q(\";\"),C)}function P(e,t){return N(e,t,!1)}function S(e,t){return N(e,t,!0)}function W(e){return\"(\"!=e?M():V($(\")\"),P,q(\")\"),C)}function N(e,t,r){if(j.state.fatArrowAt==j.stream.start){var n=r?J:G;if(\"(\"==e)return V(I,$(\")\"),_(Ve,\")\"),C,q(\"=>\"),n,T);if(\"variable\"==e)return M(I,me,q(\"=>\"),n,T)}var a,i=r?H:B;return x.hasOwnProperty(e)?V(i):\"function\"==e?V(Me,i):\"class\"==e||s&&\"interface\"==t?(j.marked=\"keyword\",V($(\"form\"),Ae,C)):\"keyword c\"==e||\"async\"==e?V(r?S:P):\"(\"==e?V($(\")\"),U,q(\")\"),C,i):\"operator\"==e||\"spread\"==e?V(r?S:P):\"[\"==e?V($(\"]\"),Ne,C,i):\"{\"==e?ee(X,\"}\",null,i):\"quasi\"==e?M(D,i):\"new\"==e?V((a=r,function(e){return\".\"==e?V(a?L:K):\"variable\"==e&&s?V(fe,a?H:B):M(a?S:P)})):\"import\"==e?V(P):V()}function U(e){return e.match(/[;\\}\\)\\],]/)?M():M(P)}function B(e,t){return\",\"==e?V(P):H(e,t,!1)}function H(e,t,r){var n=0==r?B:H,a=0==r?P:S;return\"=>\"==e?V(I,r?J:G,T):\"operator\"==e?/\\+\\+|--/.test(t)||s&&\"!\"==t?V(n):s&&\"<\"==t&&j.stream.match(/^([^>]|<.*?>)*>\\s*\\(/,!1)?V($(\">\"),_(ie,\">\"),C,n):\"?\"==t?V(P,q(\":\"),a):V(a):\"quasi\"==e?M(D,n):\";\"!=e?\"(\"==e?ee(S,\")\",\"call\",n):\".\"==e?V(R,n):\"[\"==e?V($(\"]\"),U,q(\"]\"),C,n):s&&\"as\"==t?(j.marked=\"keyword\",V(ie,n)):\"regexp\"==e?(j.state.lastType=j.marked=\"operator\",j.stream.backUp(j.stream.pos-j.stream.start-1),V(a)):void 0:void 0}function D(e,t){return\"quasi\"!=e?M():\"${\"!=t.slice(t.length-2)?V(D):V(P,F)}function F(e){if(\"}\"==e)return j.marked=\"string-2\",j.state.tokenize=y,V(D)}function G(e){return w(j.stream,j.state),M(\"{\"==e?O:P)}function J(e){return w(j.stream,j.state),M(\"{\"==e?O:S)}function K(e,t){if(\"target\"==t)return j.marked=\"keyword\",V(B)}function L(e,t){if(\"target\"==t)return j.marked=\"keyword\",V(H)}function Q(e){return\":\"==e?V(C,O):M(B,q(\";\"),C)}function R(e){if(\"variable\"==e)return j.marked=\"property\",V()}function X(e,t){if(\"async\"==e)return j.marked=\"property\",V(X);if(\"variable\"==e||\"keyword\"==j.style){return j.marked=\"property\",\"get\"==t||\"set\"==t?V(Y):(s&&j.state.fatArrowAt==j.stream.start&&(r=j.stream.match(/^\\s*:\\s*/,!1))&&(j.state.fatArrowAt=j.stream.pos+r[0].length),V(Z));var r}else{if(\"number\"==e||\"string\"==e)return j.marked=c?\"property\":j.style+\" property\",V(Z);if(\"jsonld-keyword\"==e)return V(Z);if(s&&E(t))return j.marked=\"keyword\",V(X);if(\"[\"==e)return V(P,re,q(\"]\"),Z);if(\"spread\"==e)return V(S,Z);if(\"*\"==t)return j.marked=\"keyword\",V(X);if(\":\"==e)return M(Z)}}function Y(e){return\"variable\"!=e?M(Z):(j.marked=\"property\",V(Me))}function Z(e){return\":\"==e?V(S):\"(\"==e?M(Me):void 0}function _(e,t,r){function n(a,i){if(r?r.indexOf(a)>-1:\",\"==a){var o=j.state.lexical;return\"call\"==o.info&&(o.pos=(o.pos||0)+1),V(function(r,n){return r==t||n==t?M():M(e)},n)}return a==t||i==t?V():V(q(t))}return function(r,a){return r==t||a==t?V():M(e,n)}}function ee(e,t,r){for(var n=3;n<arguments.length;n++)j.cc.push(arguments[n]);return V($(t,r),_(e,t),C)}function te(e){return\"}\"==e?V():M(O,te)}function re(e,t){if(s){if(\":\"==e)return V(ie);if(\"?\"==t)return V(re)}}function ne(e){if(s&&\":\"==e)return j.stream.match(/^\\s*\\w+\\s+is\\b/,!1)?V(P,ae,ie):V(ie)}function ae(e,t){if(\"is\"==t)return j.marked=\"keyword\",V()}function ie(e,t){return\"keyof\"==t||\"typeof\"==t?(j.marked=\"keyword\",V(\"keyof\"==t?ie:S)):\"variable\"==e||\"void\"==t?(j.marked=\"type\",V(se)):\"string\"==e||\"number\"==e||\"atom\"==e?V(se):\"[\"==e?V($(\"]\"),_(ie,\"]\",\",\"),C,se):\"{\"==e?V($(\"}\"),_(ce,\"}\",\",;\"),C,se):\"(\"==e?V(_(ue,\")\"),oe):\"<\"==e?V(_(ie,\">\"),ie):void 0}function oe(e){if(\"=>\"==e)return V(ie)}function ce(e,t){return\"variable\"==e||\"keyword\"==j.style?(j.marked=\"property\",V(ce)):\"?\"==t?V(ce):\":\"==e?V(ie):\"[\"==e?V(P,re,q(\"]\"),ce):void 0}function ue(e,t){return\"variable\"==e&&j.stream.match(/^\\s*[?:]/,!1)||\"?\"==t?V(ue):\":\"==e?V(ie):M(ie)}function se(e,t){return\"<\"==t?V($(\">\"),_(ie,\">\"),C,se):\"|\"==t||\".\"==e||\"&\"==t?V(ie):\"[\"==e?V(q(\"]\"),se):\"extends\"==t||\"implements\"==t?(j.marked=\"keyword\",V(ie)):void 0}function fe(e,t){if(\"<\"==t)return V($(\">\"),_(ie,\">\"),C,se)}function le(){return M(ie,de)}function de(e,t){if(\"=\"==t)return V(ie)}function pe(e,t){return\"enum\"==t?(j.marked=\"keyword\",V(Ue)):M(me,re,ve,ye)}function me(e,t){return s&&E(t)?(j.marked=\"keyword\",V(me)):\"variable\"==e?(A(t),V()):\"spread\"==e?V(me):\"[\"==e?ee(me,\"]\"):\"{\"==e?ee(ke,\"}\"):void 0}function ke(e,t){return\"variable\"!=e||j.stream.match(/^\\s*:/,!1)?(\"variable\"==e&&(j.marked=\"property\"),\"spread\"==e?V(me):\"}\"==e?M():V(q(\":\"),me,ve)):(A(t),V(ve))}function ve(e,t){if(\"=\"==t)return V(S)}function ye(e){if(\",\"==e)return V(pe)}function be(e,t){if(\"keyword b\"==e&&\"else\"==t)return V($(\"form\",\"else\"),O,C)}function we(e,t){return\"await\"==t?V(we):\"(\"==e?V($(\")\"),xe,q(\")\"),C):void 0}function xe(e){return\"var\"==e?V(pe,q(\";\"),ge):\";\"==e?V(ge):\"variable\"==e?V(he):M(P,q(\";\"),ge)}function he(e,t){return\"in\"==t||\"of\"==t?(j.marked=\"keyword\",V(P)):V(B,ge)}function ge(e,t){return\";\"==e?V(je):\"in\"==t||\"of\"==t?(j.marked=\"keyword\",V(P)):M(P,q(\";\"),je)}function je(e){\")\"!=e&&V(P)}function Me(e,t){return\"*\"==t?(j.marked=\"keyword\",V(Me)):\"variable\"==e?(A(t),V(Me)):\"(\"==e?V(I,$(\")\"),_(Ve,\")\"),C,ne,O,T):s&&\"<\"==t?V($(\">\"),_(le,\">\"),C,Me):void 0}function Ve(e,t){return\"@\"==t&&V(P,Ve),\"spread\"==e?V(Ve):s&&E(t)?(j.marked=\"keyword\",V(Ve)):M(me,re,ve)}function Ae(e,t){return\"variable\"==e?Ee(e,t):ze(e,t)}function Ee(e,t){if(\"variable\"==e)return A(t),V(ze)}function ze(e,t){return\"<\"==t?V($(\">\"),_(le,\">\"),C,ze):\"extends\"==t||\"implements\"==t||s&&\",\"==e?(\"implements\"==t&&(j.marked=\"keyword\"),V(s?ie:P,ze)):\"{\"==e?V($(\"}\"),Ie,C):void 0}function Ie(e,t){return\"async\"==e||\"variable\"==e&&(\"static\"==t||\"get\"==t||\"set\"==t||s&&E(t))&&j.stream.match(/^\\s+[\\w$\\xa1-\\uffff]/,!1)?(j.marked=\"keyword\",V(Ie)):\"variable\"==e||\"keyword\"==j.style?(j.marked=\"property\",V(s?Te:Me,Ie)):\"[\"==e?V(P,re,q(\"]\"),s?Te:Me,Ie):\"*\"==t?(j.marked=\"keyword\",V(Ie)):\";\"==e?V(Ie):\"}\"==e?V():\"@\"==t?V(P,Ie):void 0}function Te(e,t){return\"?\"==t?V(Te):\":\"==e?V(ie,ve):\"=\"==t?V(S):M(Me)}function $e(e,t){return\"*\"==t?(j.marked=\"keyword\",V(We,q(\";\"))):\"default\"==t?(j.marked=\"keyword\",V(P,q(\";\"))):\"{\"==e?V(_(Ce,\"}\"),We,q(\";\")):M(O)}function Ce(e,t){return\"as\"==t?(j.marked=\"keyword\",V(q(\"variable\"))):\"variable\"==e?M(S,Ce):void 0}function qe(e){return\"string\"==e?V():\"(\"==e?M(P):M(Oe,Pe,We)}function Oe(e,t){return\"{\"==e?ee(Oe,\"}\"):(\"variable\"==e&&A(t),\"*\"==t&&(j.marked=\"keyword\"),V(Se))}function Pe(e){if(\",\"==e)return V(Oe,Pe)}function Se(e,t){if(\"as\"==t)return j.marked=\"keyword\",V(Oe)}function We(e,t){if(\"from\"==t)return j.marked=\"keyword\",V(P)}function Ne(e){return\"]\"==e?V():M(_(S,\"]\"))}function Ue(){return M($(\"form\"),me,q(\"{\"),$(\"}\"),_(Be,\"}\"),C,C)}function Be(){return M(me,ve)}function He(e,t,r){return t.tokenize==k&&/^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\\[{}\\(,;:]|=>)$/.test(t.lastType)||\"quasi\"==t.lastType&&/\\{\\s*$/.test(e.string.slice(0,e.pos-(r||0)))}return C.lex=!0,{startState:function(e){var t={tokenize:k,lastType:\"sof\",cc:[],lexical:new h((e||0)-i,0,\"block\",!1),localVars:r.localVars,context:r.localVars&&{vars:r.localVars},indented:e||0};return r.globalVars&&\"object\"==typeof r.globalVars&&(t.globalVars=r.globalVars),t},token:function(e,t){if(e.sol()&&(t.lexical.hasOwnProperty(\"align\")||(t.lexical.align=!1),t.indented=e.indentation(),w(e,t)),t.tokenize!=v&&e.eatSpace())return null;var r=t.tokenize(e,t);return\"comment\"==n?r:(t.lastType=\"operator\"!=n||\"++\"!=a&&\"--\"!=a?n:\"incdec\",function(e,t,r,n,a){var i=e.cc;for(j.state=e,j.stream=a,j.marked=null,j.cc=i,j.style=t,e.lexical.hasOwnProperty(\"align\")||(e.lexical.align=!0);;)if((i.length?i.pop():u?P:O)(r,n)){for(;i.length&&i[i.length-1].lex;)i.pop()();return j.marked?j.marked:\"variable\"==r&&g(e,n)?\"variable-2\":t}}(t,r,n,a,e))},indent:function(t,n){if(t.tokenize==v)return e.Pass;if(t.tokenize!=k)return 0;var a,c=n&&n.charAt(0),u=t.lexical;if(!/^\\s*else\\b/.test(n))for(var s=t.cc.length-1;s>=0;--s){var f=t.cc[s];if(f==C)u=u.prev;else if(f!=be)break}for(;(\"stat\"==u.type||\"form\"==u.type)&&(\"}\"==c||(a=t.cc[t.cc.length-1])&&(a==B||a==H)&&!/^[,\\.=+\\-*:?[\\(]/.test(n));)u=u.prev;o&&\")\"==u.type&&\"stat\"==u.prev.type&&(u=u.prev);var l,p,m=u.type,y=c==m;return\"vardef\"==m?u.indented+(\"operator\"==t.lastType||\",\"==t.lastType?u.info+1:0):\"form\"==m&&\"{\"==c?u.indented:\"form\"==m?u.indented+i:\"stat\"==m?u.indented+(p=n,\"operator\"==(l=t).lastType||\",\"==l.lastType||d.test(p.charAt(0))||/[,.]/.test(p.charAt(0))?o||i:0):\"switch\"!=u.info||y||0==r.doubleIndentSwitch?u.align?u.column+(y?0:1):u.indented+(y?0:i):u.indented+(/^(?:case|default)\\b/.test(n)?i:2*i)},electricInput:/^\\s*(?:case .*?:|default:|\\{|\\})$/,blockCommentStart:u?null:\"/*\",blockCommentEnd:u?null:\"*/\",blockCommentContinue:u?null:\" * \",lineComment:u?null:\"//\",fold:\"brace\",closeBrackets:\"()[]{}''\\\"\\\"``\",helperType:u?\"json\":\"javascript\",jsonldMode:c,jsonMode:u,expressionAllowed:He,skipExpression:function(e){var t=e.cc[e.cc.length-1];t!=P&&t!=S||e.cc.pop()}}}),e.registerHelper(\"wordChars\",\"javascript\",/[\\w$]/),e.defineMIME(\"text/javascript\",\"javascript\"),e.defineMIME(\"text/ecmascript\",\"javascript\"),e.defineMIME(\"application/javascript\",\"javascript\"),e.defineMIME(\"application/x-javascript\",\"javascript\"),e.defineMIME(\"application/ecmascript\",\"javascript\"),e.defineMIME(\"application/json\",{name:\"javascript\",json:!0}),e.defineMIME(\"application/x-json\",{name:\"javascript\",json:!0}),e.defineMIME(\"application/ld+json\",{name:\"javascript\",jsonld:!0}),e.defineMIME(\"text/typescript\",{name:\"javascript\",typescript:!0}),e.defineMIME(\"application/typescript\",{name:\"javascript\",typescript:!0})});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/mode/javascript/javascript.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror-mode-javascript/readme": {
"title": "$:/plugins/tiddlywiki/codemirror-mode-javascript/readme",
"text": "This plugin adds Syntax Highlighting for Javascript tiddlers (application/javascript) to the [[CodeMirror|http://codemirror.net]] text editor. It needs the latest [[CodeMirror plugin|$:/plugins/tiddlywiki/codemirror]] to be installed\n\n"
}
}
}
{
"tiddlers": {
"$:/plugins/tiddlywiki/codemirror/mode/xml/xml.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(t){\"object\"==typeof exports&&\"object\"==typeof module?t(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],t):t(CodeMirror)}(function(t){\"use strict\";var e={autoSelfClosers:{area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},implicitlyClosed:{dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},contextGrabbers:{dd:{dd:!0,dt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}},doNotIndent:{pre:!0},allowUnquoted:!0,allowMissing:!0,caseFold:!0},n={autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!1,allowMissing:!1,allowMissingTagName:!1,caseFold:!1};t.defineMode(\"xml\",function(r,o){var a,i,l=r.indentUnit,u={},d=o.htmlMode?e:n;for(var c in d)u[c]=d[c];for(var c in o)u[c]=o[c];function s(t,e){function n(n){return e.tokenize=n,n(t,e)}var r=t.next();return\"<\"==r?t.eat(\"!\")?t.eat(\"[\")?t.match(\"CDATA[\")?n(m(\"atom\",\"]]>\")):null:t.match(\"--\")?n(m(\"comment\",\"--\\x3e\")):t.match(\"DOCTYPE\",!0,!0)?(t.eatWhile(/[\\w\\._\\-]/),n(function t(e){return function(n,r){for(var o;null!=(o=n.next());){if(\"<\"==o)return r.tokenize=t(e+1),r.tokenize(n,r);if(\">\"==o){if(1==e){r.tokenize=s;break}return r.tokenize=t(e-1),r.tokenize(n,r)}}return\"meta\"}}(1))):null:t.eat(\"?\")?(t.eatWhile(/[\\w\\._\\-]/),e.tokenize=m(\"meta\",\"?>\"),\"meta\"):(a=t.eat(\"/\")?\"closeTag\":\"openTag\",e.tokenize=f,\"tag bracket\"):\"&\"==r?(t.eat(\"#\")?t.eat(\"x\")?t.eatWhile(/[a-fA-F\\d]/)&&t.eat(\";\"):t.eatWhile(/[\\d]/)&&t.eat(\";\"):t.eatWhile(/[\\w\\.\\-:]/)&&t.eat(\";\"))?\"atom\":\"error\":(t.eatWhile(/[^&<]/),null)}function f(t,e){var n,r,o=t.next();if(\">\"==o||\"/\"==o&&t.eat(\">\"))return e.tokenize=s,a=\">\"==o?\"endTag\":\"selfcloseTag\",\"tag bracket\";if(\"=\"==o)return a=\"equals\",null;if(\"<\"==o){e.tokenize=s,e.state=h,e.tagName=e.tagStart=null;var i=e.tokenize(t,e);return i?i+\" tag error\":\"tag error\"}return/[\\'\\\"]/.test(o)?(e.tokenize=(n=o,(r=function(t,e){for(;!t.eol();)if(t.next()==n){e.tokenize=f;break}return\"string\"}).isInAttribute=!0,r),e.stringStartCol=t.column(),e.tokenize(t,e)):(t.match(/^[^\\s\\u00a0=<>\\\"\\']*[^\\s\\u00a0=<>\\\"\\'\\/]/),\"word\")}function m(t,e){return function(n,r){for(;!n.eol();){if(n.match(e)){r.tokenize=s;break}n.next()}return t}}function g(t){t.context&&(t.context=t.context.prev)}function p(t,e){for(var n;;){if(!t.context)return;if(n=t.context.tagName,!u.contextGrabbers.hasOwnProperty(n)||!u.contextGrabbers[n].hasOwnProperty(e))return;g(t)}}function h(t,e,n){return\"openTag\"==t?(n.tagStart=e.column(),x):\"closeTag\"==t?b:h}function x(t,e,n){return\"word\"==t?(n.tagName=e.current(),i=\"tag\",v):u.allowMissingTagName&&\"endTag\"==t?(i=\"tag bracket\",v(t,e,n)):(i=\"error\",x)}function b(t,e,n){if(\"word\"==t){var r=e.current();return n.context&&n.context.tagName!=r&&u.implicitlyClosed.hasOwnProperty(n.context.tagName)&&g(n),n.context&&n.context.tagName==r||!1===u.matchClosing?(i=\"tag\",k):(i=\"tag error\",w)}return u.allowMissingTagName&&\"endTag\"==t?(i=\"tag bracket\",k(t,e,n)):(i=\"error\",w)}function k(t,e,n){return\"endTag\"!=t?(i=\"error\",k):(g(n),h)}function w(t,e,n){return i=\"error\",k(t,0,n)}function v(t,e,n){if(\"word\"==t)return i=\"attribute\",T;if(\"endTag\"==t||\"selfcloseTag\"==t){var r=n.tagName,o=n.tagStart;return n.tagName=n.tagStart=null,\"selfcloseTag\"==t||u.autoSelfClosers.hasOwnProperty(r)?p(n,r):(p(n,r),n.context=new function(t,e,n){this.prev=t.context,this.tagName=e,this.indent=t.indented,this.startOfLine=n,(u.doNotIndent.hasOwnProperty(e)||t.context&&t.context.noIndent)&&(this.noIndent=!0)}(n,r,o==n.indented)),h}return i=\"error\",v}function T(t,e,n){return\"equals\"==t?y:(u.allowMissing||(i=\"error\"),v(t,0,n))}function y(t,e,n){return\"string\"==t?N:\"word\"==t&&u.allowUnquoted?(i=\"string\",v):(i=\"error\",v(t,0,n))}function N(t,e,n){return\"string\"==t?N:v(t,0,n)}return s.isInText=!0,{startState:function(t){var e={tokenize:s,state:h,indented:t||0,tagName:null,tagStart:null,context:null};return null!=t&&(e.baseIndent=t),e},token:function(t,e){if(!e.tagName&&t.sol()&&(e.indented=t.indentation()),t.eatSpace())return null;a=null;var n=e.tokenize(t,e);return(n||a)&&\"comment\"!=n&&(i=null,e.state=e.state(a||n,t,e),i&&(n=\"error\"==i?n+\" error\":i)),n},indent:function(e,n,r){var o=e.context;if(e.tokenize.isInAttribute)return e.tagStart==e.indented?e.stringStartCol+1:e.indented+l;if(o&&o.noIndent)return t.Pass;if(e.tokenize!=f&&e.tokenize!=s)return r?r.match(/^(\\s*)/)[0].length:0;if(e.tagName)return!1!==u.multilineTagIndentPastTag?e.tagStart+e.tagName.length+2:e.tagStart+l*(u.multilineTagIndentFactor||1);if(u.alignCDATA&&/<!\\[CDATA\\[/.test(n))return 0;var a=n&&/^<(\\/)?([\\w_:\\.-]*)/.exec(n);if(a&&a[1])for(;o;){if(o.tagName==a[2]){o=o.prev;break}if(!u.implicitlyClosed.hasOwnProperty(o.tagName))break;o=o.prev}else if(a)for(;o;){var i=u.contextGrabbers[o.tagName];if(!i||!i.hasOwnProperty(a[2]))break;o=o.prev}for(;o&&o.prev&&!o.startOfLine;)o=o.prev;return o?o.indent+l:e.baseIndent||0},electricInput:/<\\/[\\s\\w:]+>$/,blockCommentStart:\"\\x3c!--\",blockCommentEnd:\"--\\x3e\",configuration:u.htmlMode?\"html\":\"xml\",helperType:u.htmlMode?\"html\":\"xml\",skipAttribute:function(t){t.state==y&&(t.state=v)}}}),t.defineMIME(\"text/xml\",\"xml\"),t.defineMIME(\"application/xml\",\"xml\"),t.mimeModes.hasOwnProperty(\"text/html\")||t.defineMIME(\"text/html\",{name:\"xml\",htmlMode:!0})});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/mode/xml/xml.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror-mode-xml/readme": {
"title": "$:/plugins/tiddlywiki/codemirror-mode-xml/readme",
"text": "This plugin is a requirement for other Syntax-highlighting plugins and adds Highlighting for XML tiddlers (application/xml) to the [[CodeMirror|http://codemirror.net]] text editor. It needs the latest [[CodeMirror plugin|$:/plugins/tiddlywiki/codemirror]] to be installed\n\n"
}
}
}
{
"tiddlers": {
"$:/plugins/tiddlywiki/codemirror/addon/search/search.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\"),require(\"./searchcursor\"),require(\"../dialog/dialog\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"./searchcursor\",\"../dialog/dialog\"],e):e(CodeMirror)}(function(e){\"use strict\";function o(e){return e.state.search||(e.state.search=new function(){this.posFrom=this.posTo=this.lastQuery=this.query=null,this.overlay=null})}function n(e){return\"string\"==typeof e&&e==e.toLowerCase()}function r(e,o,r){return e.getSearchCursor(o,r,{caseFold:n(o),multiline:!0})}function t(e,o,n,r,t){e.openDialog?e.openDialog(o,t,{value:r,selectValueOnOpen:!0}):t(prompt(n,r))}function i(e){return e.replace(/\\\\(.)/g,function(e,o){return\"n\"==o?\"\\n\":\"r\"==o?\"\\r\":o})}function a(e){var o=e.match(/^\\/(.*)\\/([a-z]*)$/);if(o)try{e=new RegExp(o[1],-1==o[2].indexOf(\"i\")?\"\":\"i\")}catch(e){}else e=i(e);return(\"string\"==typeof e?\"\"==e:e.test(\"\"))&&(e=/x^/),e}var s='<span class=\"CodeMirror-search-label\">Search:</span> <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">(Use /re/ syntax for regexp search)</span>';function c(e,o,r){var t,i;o.queryText=r,o.query=a(r),e.removeOverlay(o.overlay,n(o.query)),o.overlay=(t=o.query,i=n(o.query),\"string\"==typeof t?t=new RegExp(t.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g,\"\\\\$&\"),i?\"gi\":\"g\"):t.global||(t=new RegExp(t.source,t.ignoreCase?\"gi\":\"g\")),{token:function(e){t.lastIndex=e.pos;var o=t.exec(e.string);if(o&&o.index==e.pos)return e.pos+=o[0].length||1,\"searching\";o?e.pos=o.index:e.skipToEnd()}}),e.addOverlay(o.overlay),e.showMatchesOnScrollbar&&(o.annotate&&(o.annotate.clear(),o.annotate=null),o.annotate=e.showMatchesOnScrollbar(o.query,n(o.query)))}function l(n,r,i,a){var l=o(n);if(l.query)return u(n,r);var p,d,y,m,g,h=n.getSelection()||l.lastQuery;if(h instanceof RegExp&&\"x^\"==h.source&&(h=null),i&&n.openDialog){var v=null,x=function(o,r){e.e_stop(r),o&&(o!=l.queryText&&(c(n,l,o),l.posFrom=l.posTo=n.getCursor()),v&&(v.style.opacity=1),u(n,r.shiftKey,function(e,o){var r;o.line<3&&document.querySelector&&(r=n.display.wrapper.querySelector(\".CodeMirror-dialog\"))&&r.getBoundingClientRect().bottom-4>n.cursorCoords(o,\"window\").top&&((v=r).style.opacity=.4)}))};d=s,y=h,m=x,g=function(r,t){var i=e.keyName(r),a=n.getOption(\"extraKeys\"),s=a&&a[i]||e.keyMap[n.getOption(\"keyMap\")][i];\"findNext\"==s||\"findPrev\"==s||\"findPersistentNext\"==s||\"findPersistentPrev\"==s?(e.e_stop(r),c(n,o(n),t),n.execCommand(s)):\"find\"!=s&&\"findPersistent\"!=s||(e.e_stop(r),x(t,r))},(p=n).openDialog(d,m,{value:y,selectValueOnOpen:!0,closeOnEnter:!1,onClose:function(){f(p)},onKeyDown:g}),a&&h&&(c(n,l,h),u(n,r))}else t(n,s,\"Search for:\",h,function(e){e&&!l.query&&n.operation(function(){c(n,l,e),l.posFrom=l.posTo=n.getCursor(),u(n,r)})})}function u(n,t,i){n.operation(function(){var a=o(n),s=r(n,a.query,t?a.posFrom:a.posTo);(s.find(t)||(s=r(n,a.query,t?e.Pos(n.lastLine()):e.Pos(n.firstLine(),0))).find(t))&&(n.setSelection(s.from(),s.to()),n.scrollIntoView({from:s.from(),to:s.to()},20),a.posFrom=s.from(),a.posTo=s.to(),i&&i(s.from(),s.to()))})}function f(e){e.operation(function(){var n=o(e);n.lastQuery=n.query,n.query&&(n.query=n.queryText=null,e.removeOverlay(n.overlay),n.annotate&&(n.annotate.clear(),n.annotate=null))})}var p=' <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">(Use /re/ syntax for regexp search)</span>',d='<span class=\"CodeMirror-search-label\">With:</span> <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/>',y='<span class=\"CodeMirror-search-label\">Replace?</span> <button>Yes</button> <button>No</button> <button>All</button> <button>Stop</button>';function m(e,o,n){e.operation(function(){for(var t=r(e,o);t.findNext();)if(\"string\"!=typeof o){var i=e.getRange(t.from(),t.to()).match(o);t.replace(n.replace(/\\$(\\d)/g,function(e,o){return i[o]}))}else t.replace(n)})}function g(e,n){if(!e.getOption(\"readOnly\")){var s=e.getSelection()||o(e).lastQuery,c='<span class=\"CodeMirror-search-label\">'+(n?\"Replace all:\":\"Replace:\")+\"</span>\";t(e,c+p,c,s,function(o){o&&(o=a(o),t(e,d,\"Replace with:\",\"\",function(t){if(t=i(t),n)m(e,o,t);else{f(e);var a=r(e,o,e.getCursor(\"from\")),s=function(){var n,i,l,u,f,p=a.from();!(n=a.findNext())&&(a=r(e,o),!(n=a.findNext())||p&&a.from().line==p.line&&a.from().ch==p.ch)||(e.setSelection(a.from(),a.to()),e.scrollIntoView({from:a.from(),to:a.to()}),l=y,u=\"Replace?\",f=[function(){c(n)},s,function(){m(e,o,t)}],(i=e).openConfirm?i.openConfirm(l,f):confirm(u)&&f[0]())},c=function(e){a.replace(\"string\"==typeof o?t:t.replace(/\\$(\\d)/g,function(o,n){return e[n]})),s()};s()}}))})}}e.commands.find=function(e){f(e),l(e)},e.commands.findPersistent=function(e){f(e),l(e,!1,!0)},e.commands.findPersistentNext=function(e){l(e,!1,!0,!0)},e.commands.findPersistentPrev=function(e){l(e,!0,!0,!0)},e.commands.findNext=l,e.commands.findPrev=function(e){l(e,!0)},e.commands.clearSearch=f,e.commands.replace=g,e.commands.replaceAll=function(e){g(e,!0)}});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/search/search.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/search/jump-to-line.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\"),require(\"../dialog/dialog\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../dialog/dialog\"],e):e(CodeMirror)}(function(e){\"use strict\";function o(e,o){var r=Number(o);return/^[-+]/.test(o)?e.getCursor().line+r:r-1}e.commands.jumpToLine=function(e){var r,i,t,s,n,l=e.getCursor();r=e,i='Jump to line: <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">(Use line:column or scroll% syntax)</span>',t=\"Jump to line:\",s=l.line+1+\":\"+l.ch,n=function(r){var i;if(r)if(i=/^\\s*([\\+\\-]?\\d+)\\s*\\:\\s*(\\d+)\\s*$/.exec(r))e.setCursor(o(e,i[1]),Number(i[2]));else if(i=/^\\s*([\\+\\-]?\\d+(\\.\\d+)?)\\%\\s*/.exec(r)){var t=Math.round(e.lineCount()*Number(i[1])/100);/^[-+]/.test(i[1])&&(t=l.line+t+1),e.setCursor(t-1,l.ch)}else(i=/^\\s*\\:?\\s*([\\+\\-]?\\d+)\\s*/.exec(r))&&e.setCursor(o(e,i[1]),l.ch)},r.openDialog?r.openDialog(i,n,{value:s,selectValueOnOpen:!0}):n(prompt(t,s))},e.keyMap.default[\"Alt-G\"]=\"jumpToLine\"});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/search/jump-to-line.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror/addon/search/searchcursor.js": {
"text": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n!function(t){\"object\"==typeof exports&&\"object\"==typeof module?t(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],t):t(CodeMirror)}(function(t){\"use strict\";var e,n,r=t.Pos;function i(t,e){for(var n,r,i=null!=(r=(n=t).flags)?r:(n.ignoreCase?\"i\":\"\")+(n.global?\"g\":\"\")+(n.multiline?\"m\":\"\"),o=i,l=0;l<e.length;l++)-1==o.indexOf(e.charAt(l))&&(o+=e.charAt(l));return i==o?t:new RegExp(t.source,o)}function o(t,e,n){e=i(e,\"g\");for(var o=n.line,l=n.ch,h=t.lastLine();o<=h;o++,l=0){e.lastIndex=l;var s=t.getLine(o),c=e.exec(s);if(c)return{from:r(o,c.index),to:r(o,c.index+c[0].length),match:c}}}function l(t,e){for(var n,r=0;;){e.lastIndex=r;var i=e.exec(t);if(!i)return n;if((r=(n=i).index+(n[0].length||1))==t.length)return n}}function h(t,e,n,r){if(t.length==e.length)return n;for(var i=0,o=n+Math.max(0,t.length-e.length);;){if(i==o)return i;var l=i+o>>1,h=r(t.slice(0,l)).length;if(h==n)return l;h>n?o=l:i=l+1}}function s(t,s,c,f){var u;this.atOccurrence=!1,this.doc=t,c=c?t.clipPos(c):r(0,0),this.pos={from:c,to:c},\"object\"==typeof f?u=f.caseFold:(u=f,f=null),\"string\"==typeof s?(null==u&&(u=!1),this.matches=function(i,o){return(i?function(t,i,o,l){if(!i.length)return null;var s=l?e:n,c=s(i).split(/\\r|\\n\\r?/);t:for(var f=o.line,u=o.ch,a=t.firstLine()-1+c.length;f>=a;f--,u=-1){var g=t.getLine(f);u>-1&&(g=g.slice(0,u));var m=s(g);if(1==c.length){var d=m.lastIndexOf(c[0]);if(-1==d)continue t;return{from:r(f,h(g,m,d,s)),to:r(f,h(g,m,d+c[0].length,s))}}var v=c[c.length-1];if(m.slice(0,v.length)==v){var p=1;for(o=f-c.length+1;p<c.length-1;p++)if(s(t.getLine(o+p))!=c[p])continue t;var x=t.getLine(f+1-c.length),L=s(x);if(L.slice(L.length-c[0].length)==c[0])return{from:r(f+1-c.length,h(x,L,x.length-c[0].length,s)),to:r(f,h(g,m,v.length,s))}}}}:function(t,i,o,l){if(!i.length)return null;var s=l?e:n,c=s(i).split(/\\r|\\n\\r?/);t:for(var f=o.line,u=o.ch,a=t.lastLine()+1-c.length;f<=a;f++,u=0){var g=t.getLine(f).slice(u),m=s(g);if(1==c.length){var d=m.indexOf(c[0]);if(-1==d)continue t;return o=h(g,m,d,s)+u,{from:r(f,h(g,m,d,s)+u),to:r(f,h(g,m,d+c[0].length,s)+u)}}var v=m.length-c[0].length;if(m.slice(v)==c[0]){for(var p=1;p<c.length-1;p++)if(s(t.getLine(f+p))!=c[p])continue t;var x=t.getLine(f+c.length-1),L=s(x),C=c[c.length-1];if(L.slice(0,C.length)==C)return{from:r(f,h(g,m,v,s)+u),to:r(f+c.length-1,h(x,L,C.length,s))}}}})(t,s,o,u)}):(s=i(s,\"gm\"),f&&!1===f.multiline?this.matches=function(e,n){return(e?function(t,e,n){e=i(e,\"g\");for(var o=n.line,h=n.ch,s=t.firstLine();o>=s;o--,h=-1){var c=t.getLine(o);h>-1&&(c=c.slice(0,h));var f=l(c,e);if(f)return{from:r(o,f.index),to:r(o,f.index+f[0].length),match:f}}}:o)(t,s,n)}:this.matches=function(e,n){return(e?function(t,e,n){e=i(e,\"gm\");for(var o,h=1,s=n.line,c=t.firstLine();s>=c;){for(var f=0;f<h;f++){var u=t.getLine(s--);o=null==o?u.slice(0,n.ch):u+\"\\n\"+o}h*=2;var a=l(o,e);if(a){var g=o.slice(0,a.index).split(\"\\n\"),m=a[0].split(\"\\n\"),d=s+g.length,v=g[g.length-1].length;return{from:r(d,v),to:r(d+m.length-1,1==m.length?v+m[0].length:m[m.length-1].length),match:a}}}}:function(t,e,n){if(!/\\\\s|\\\\n|\\n|\\\\W|\\\\D|\\[\\^/.test(e.source))return o(t,e,n);e=i(e,\"gm\");for(var l,h=1,s=n.line,c=t.lastLine();s<=c;){for(var f=0;f<h&&!(s>c);f++){var u=t.getLine(s++);l=null==l?u:l+\"\\n\"+u}h*=2,e.lastIndex=n.ch;var a=e.exec(l);if(a){var g=l.slice(0,a.index).split(\"\\n\"),m=a[0].split(\"\\n\"),d=n.line+g.length-1,v=g[g.length-1].length;return{from:r(d,v),to:r(d+m.length-1,1==m.length?v+m[0].length:m[m.length-1].length),match:a}}}})(t,s,n)})}String.prototype.normalize?(e=function(t){return t.normalize(\"NFD\").toLowerCase()},n=function(t){return t.normalize(\"NFD\")}):(e=function(t){return t.toLowerCase()},n=function(t){return t}),s.prototype={findNext:function(){return this.find(!1)},findPrevious:function(){return this.find(!0)},find:function(e){for(var n=this.matches(e,this.doc.clipPos(e?this.pos.from:this.pos.to));n&&0==t.cmpPos(n.from,n.to);)e?n.from.ch?n.from=r(n.from.line,n.from.ch-1):n=n.from.line==this.doc.firstLine()?null:this.matches(e,this.doc.clipPos(r(n.from.line-1))):n.to.ch<this.doc.getLine(n.to.line).length?n.to=r(n.to.line,n.to.ch+1):n=n.to.line==this.doc.lastLine()?null:this.matches(e,r(n.to.line+1,0));if(n)return this.pos=n,this.atOccurrence=!0,this.pos.match||!0;var i=r(e?this.doc.firstLine():this.doc.lastLine()+1,0);return this.pos={from:i,to:i},this.atOccurrence=!1},from:function(){if(this.atOccurrence)return this.pos.from},to:function(){if(this.atOccurrence)return this.pos.to},replace:function(e,n){if(this.atOccurrence){var i=t.splitLines(e);this.doc.replaceRange(i,this.pos.from,this.pos.to,n),this.pos.to=r(this.pos.from.line+i.length-1,i[i.length-1].length+(1==i.length?this.pos.from.ch:0))}}},t.defineExtension(\"getSearchCursor\",function(t,e,n){return new s(this.doc,t,e,n)}),t.defineDocExtension(\"getSearchCursor\",function(t,e,n){return new s(this,t,e,n)}),t.defineExtension(\"selectMatches\",function(e,n){for(var r=[],i=this.getSearchCursor(e,this.getCursor(\"from\"),n);i.findNext()&&!(t.cmpPos(i.to(),this.getCursor(\"to\"))>0);)r.push({anchor:i.from(),head:i.to()});r.length&&this.setSelections(r,0)})});",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/codemirror/addon/search/searchcursor.js",
"module-type": "codemirror"
},
"$:/plugins/tiddlywiki/codemirror-search-replace/readme": {
"title": "$:/plugins/tiddlywiki/codemirror-search-replace/readme",
"text": "This plugin enhances the [[CodeMirror|http://codemirror.net]] text editor with Search and Replace functionality. It needs the latest [[CodeMirror plugin|$:/plugins/tiddlywiki/codemirror]] to be installed\n\nIt adds these Keyboard Shortcuts to ~CodeMirror:\n\n|Shortcut |Function |h\n|Ctrl-F / Cmd-F |Start searching |\n|Ctrl-G / Cmd-G / Shift-F3 |Find next |\n|Shift-Ctrl-G / Shift-Cmd-G / F3 |Find previous |\n|Shift-Ctrl-F / Cmd-Option-F |Replace |\n|Shift-Ctrl-R / Shift-Cmd-Option-F |Replace all |\n|Alt-F |Persistent search (dialog doesn't autoclose, enter to find next, Shift-Enter to find previous) |\n|Alt-G |Jump to line |\n\n"
}
}
}
/* BASICS */
.CodeMirror {
/* Set height, width, borders, and global font properties here */
font-family: monospace;
height: 300px;
color: black;
}
/* PADDING */
.CodeMirror-lines {
padding: 4px 0; /* Vertical padding around content */
}
.CodeMirror pre {
padding: 0 4px; /* Horizontal padding of content */
}
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
background-color: white; /* The little square between H and V scrollbars */
}
/* GUTTER */
.CodeMirror-gutters {
border-right: 1px solid #ddd;
background-color: #f7f7f7;
white-space: nowrap;
}
.CodeMirror-linenumbers {}
.CodeMirror-linenumber {
padding: 0 3px 0 5px;
min-width: 20px;
text-align: right;
color: #999;
white-space: nowrap;
}
.CodeMirror-guttermarker { color: black; }
.CodeMirror-guttermarker-subtle { color: #999; }
/* CURSOR */
.CodeMirror-cursor {
border-left: 1px solid black;
border-right: none;
width: 0;
}
/* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor {
border-left: 1px solid silver;
}
.cm-fat-cursor .CodeMirror-cursor {
width: auto;
border: 0;
background: #7e7;
}
.cm-fat-cursor div.CodeMirror-cursors {
z-index: 1;
}
.cm-animate-fat-cursor {
width: auto;
border: 0;
-webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite;
animation: blink 1.06s steps(1) infinite;
background-color: #7e7;
}
@-moz-keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
@-webkit-keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
@keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
/* Can style cursor different in overwrite (non-insert) mode */
.CodeMirror-overwrite .CodeMirror-cursor {}
.cm-tab { display: inline-block; text-decoration: inherit; }
.CodeMirror-ruler {
border-left: 1px solid #ccc;
position: absolute;
}
/* LIQUIBYTE THEME */
.cm-s-liquibyte.CodeMirror {
background-color: #000;
color: #fff;
line-height: 1.2em;
font-size: 1em;
}
.cm-s-liquibyte .CodeMirror-focused .cm-matchhighlight {
text-decoration: underline;
text-decoration-color: #0f0;
text-decoration-style: wavy;
}
.cm-s-liquibyte .cm-trailingspace {
text-decoration: line-through;
text-decoration-color: #f00;
text-decoration-style: dotted;
}
.cm-s-liquibyte .cm-tab {
text-decoration: line-through;
text-decoration-color: #404040;
text-decoration-style: dotted;
}
.cm-s-liquibyte .CodeMirror-gutters { background-color: #262626; border-right: 1px solid #505050; padding-right: 0.8em; }
.cm-s-liquibyte .CodeMirror-gutter-elt div { font-size: 1.2em; }
.cm-s-liquibyte .CodeMirror-guttermarker { }
.cm-s-liquibyte .CodeMirror-guttermarker-subtle { }
.cm-s-liquibyte .CodeMirror-linenumber { color: #606060; padding-left: 0; }
.cm-s-liquibyte .CodeMirror-cursor { border-left: 1px solid #eee; }
.cm-s-liquibyte span.cm-comment { color: #008000; }
.cm-s-liquibyte span.cm-def { color: #ffaf40; font-weight: bold; }
.cm-s-liquibyte span.cm-keyword { color: #c080ff; font-weight: bold; }
.cm-s-liquibyte span.cm-builtin { color: #ffaf40; font-weight: bold; }
.cm-s-liquibyte span.cm-variable { color: #5967ff; font-weight: bold; }
.cm-s-liquibyte span.cm-string { color: #ff8000; }
.cm-s-liquibyte span.cm-number { color: #0f0; font-weight: bold; }
.cm-s-liquibyte span.cm-atom { color: #bf3030; font-weight: bold; }
.cm-s-liquibyte span.cm-variable-2 { color: #007f7f; font-weight: bold; }
.cm-s-liquibyte span.cm-variable-3, .cm-s-liquibyte span.cm-type { color: #c080ff; font-weight: bold; }
.cm-s-liquibyte span.cm-property { color: #999; font-weight: bold; }
.cm-s-liquibyte span.cm-operator { color: #fff; }
.cm-s-liquibyte span.cm-meta { color: #0f0; }
.cm-s-liquibyte span.cm-qualifier { color: #fff700; font-weight: bold; }
.cm-s-liquibyte span.cm-bracket { color: #cc7; }
.cm-s-liquibyte span.cm-tag { color: #ff0; font-weight: bold; }
.cm-s-liquibyte span.cm-attribute { color: #c080ff; font-weight: bold; }
.cm-s-liquibyte span.cm-error { color: #f00; }
.cm-s-liquibyte div.CodeMirror-selected { background-color: rgba(255, 0, 0, 0.25); }
.cm-s-liquibyte span.cm-compilation { background-color: rgba(255, 255, 255, 0.12); }
.cm-s-liquibyte .CodeMirror-activeline-background { background-color: rgba(0, 255, 0, 0.15); }
/* Default styles for common addons */
.cm-s-liquibyte .CodeMirror span.CodeMirror-matchingbracket { color: #0f0; font-weight: bold; }
.cm-s-liquibyte .CodeMirror span.CodeMirror-nonmatchingbracket { color: #f00; font-weight: bold; }
.CodeMirror-matchingtag { background-color: rgba(150, 255, 0, .3); }
/* Scrollbars */
/* Simple */
.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div:hover, .cm-s-liquibyte div.CodeMirror-simplescroll-vertical div:hover {
background-color: rgba(80, 80, 80, .7);
}
.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div, .cm-s-liquibyte div.CodeMirror-simplescroll-vertical div {
background-color: rgba(80, 80, 80, .3);
border: 1px solid #404040;
border-radius: 5px;
}
.cm-s-liquibyte div.CodeMirror-simplescroll-vertical div {
border-top: 1px solid #404040;
border-bottom: 1px solid #404040;
}
.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div {
border-left: 1px solid #404040;
border-right: 1px solid #404040;
}
.cm-s-liquibyte div.CodeMirror-simplescroll-vertical {
background-color: #262626;
}
.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal {
background-color: #262626;
border-top: 1px solid #404040;
}
/* Overlay */
.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div, div.CodeMirror-overlayscroll-vertical div {
background-color: #404040;
border-radius: 5px;
}
.cm-s-liquibyte div.CodeMirror-overlayscroll-vertical div {
border: 1px solid #404040;
}
.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div {
border: 1px solid #404040;
}
/* DEFAULT THEME */
.cm-s-default .cm-header {color: blue;}
.cm-s-default .cm-quote {color: #090;}
.cm-negative {color: #d44;}
.cm-positive {color: #292;}
.cm-header, .cm-strong {font-weight: bold;}
.cm-em {font-style: italic;}
.cm-link {text-decoration: underline;}
.cm-strikethrough {text-decoration: line-through;}
.cm-s-default .cm-keyword {color: #708;}
.cm-s-default .cm-atom {color: #219;}
.cm-s-default .cm-number {color: #164;}
.cm-s-default .cm-def {color: #00f;}
.cm-s-default .cm-variable,
.cm-s-default .cm-punctuation,
.cm-s-default .cm-property,
.cm-s-default .cm-operator {}
.cm-s-default .cm-variable-2 {color: #05a;}
.cm-s-default .cm-variable-3 {color: #085;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
.cm-s-default .cm-meta {color: #555;}
.cm-s-default .cm-qualifier {color: #555;}
.cm-s-default .cm-builtin {color: #30a;}
.cm-s-default .cm-bracket {color: #997;}
.cm-s-default .cm-tag {color: #170;}
.cm-s-default .cm-attribute {color: #00c;}
.cm-s-default .cm-hr {color: #999;}
.cm-s-default .cm-link {color: #00c;}
.cm-s-default .cm-error {color: #f00;}
.cm-invalidchar {color: #f00;}
.CodeMirror-composing { border-bottom: 2px solid; }
/* Default styles for common addons */
div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
.CodeMirror-activeline-background {background: #e8f2ff;}
/* STOP */
/* The rest of this file contains styles related to the mechanics of
the editor. You probably shouldn't touch them. */
.CodeMirror {
position: relative;
overflow: hidden;
background: white;
}
.CodeMirror-scroll {
overflow: scroll !important; /* Things will break if this is overridden */
/* 30px is the magic margin used to hide the element's real scrollbars */
/* See overflow: hidden in .CodeMirror */
margin-bottom: -30px; margin-right: -30px;
padding-bottom: 30px;
height: 100%;
outline: none; /* Prevent dragging from highlighting the element */
position: relative;
}
.CodeMirror-sizer {
position: relative;
border-right: 30px solid transparent;
}
/* The fake, visible scrollbars. Used to force redraw during scrolling
before actual scrolling happens, thus preventing shaking and
flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
position: absolute;
z-index: 6;
display: none;
}
.CodeMirror-vscrollbar {
right: 0; top: 0;
overflow-x: hidden;
overflow-y: scroll;
}
.CodeMirror-hscrollbar {
bottom: 0; left: 0;
overflow-y: hidden;
overflow-x: scroll;
}
.CodeMirror-scrollbar-filler {
right: 0; bottom: 0;
}
.CodeMirror-gutter-filler {
left: 0; bottom: 0;
}
.CodeMirror-gutters {
position: absolute; left: 0; top: 0;
min-height: 100%;
z-index: 3;
}
.CodeMirror-gutter {
white-space: normal;
height: 100%;
display: inline-block;
vertical-align: top;
margin-bottom: -30px;
/* Hack to make IE7 behave */
*zoom:1;
*display:inline;
}
.CodeMirror-gutter-wrapper {
position: absolute;
z-index: 4;
background: none !important;
border: none !important;
}
.CodeMirror-gutter-background {
position: absolute;
top: 0; bottom: 0;
z-index: 4;
}
.CodeMirror-gutter-elt {
position: absolute;
cursor: default;
z-index: 4;
}
.CodeMirror-gutter-wrapper {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.CodeMirror-lines {
cursor: text;
min-height: 1px; /* prevents collapsing before first draw */
}
.CodeMirror pre {
/* Reset some styles that the rest of the page might have set */
-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
border-width: 0;
background: transparent;
font-family: inherit;
font-size: inherit;
margin: 0;
white-space: pre;
word-wrap: normal;
line-height: inherit;
color: inherit;
z-index: 2;
position: relative;
overflow: visible;
-webkit-tap-highlight-color: transparent;
-webkit-font-variant-ligatures: none;
font-variant-ligatures: none;
}
.CodeMirror-wrap pre {
word-wrap: break-word;
white-space: pre-wrap;
word-break: normal;
}
.CodeMirror-linebackground {
position: absolute;
left: 0; right: 0; top: 0; bottom: 0;
z-index: 0;
}
.CodeMirror-linewidget {
position: relative;
z-index: 2;
overflow: auto;
}
.CodeMirror-widget {}
.CodeMirror-code {
outline: none;
}
/* Force content-box sizing for the elements where we expect it */
.CodeMirror-scroll,
.CodeMirror-sizer,
.CodeMirror-gutter,
.CodeMirror-gutters,
.CodeMirror-linenumber {
-moz-box-sizing: content-box;
box-sizing: content-box;
}
.CodeMirror-measure {
position: absolute;
width: 100%;
height: 0;
overflow: hidden;
visibility: hidden;
}
.CodeMirror-cursor { position: absolute; }
.CodeMirror-measure pre { position: static; }
div.CodeMirror-cursors {
visibility: hidden;
position: relative;
z-index: 3;
}
div.CodeMirror-dragcursors {
visibility: visible;
}
.CodeMirror-focused div.CodeMirror-cursors {
visibility: visible;
}
.CodeMirror-selected { background: #d9d9d9; }
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
.CodeMirror-crosshair { cursor: crosshair; }
.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
.cm-searching {
background: #ffa;
background: rgba(255, 255, 0, .4);
}
/* IE7 hack to prevent it from returning funny offsetTops on the spans */
.CodeMirror span { *vertical-align: text-bottom; }
/* Used to force a border model for a node */
.cm-force-border { padding-right: .1px; }
@media print {
/* Hide the cursor when printing */
.CodeMirror div.CodeMirror-cursors {
visibility: hidden;
}
}
/* See issue #2901 */
.cm-tab-wrap-hack:after { content: ''; }
/* Help users use markselection to safely style text background */
span.CodeMirror-selectedtext { background: none; }
{
"tiddlers": {
"$:/config/HighlightPlugin/TypeMappings/application/javascript": {
"title": "$:/config/HighlightPlugin/TypeMappings/application/javascript",
"text": "javascript"
},
"$:/config/HighlightPlugin/TypeMappings/application/json": {
"title": "$:/config/HighlightPlugin/TypeMappings/application/json",
"text": "json"
},
"$:/config/HighlightPlugin/TypeMappings/text/css": {
"title": "$:/config/HighlightPlugin/TypeMappings/text/css",
"text": "css"
},
"$:/config/HighlightPlugin/TypeMappings/text/html": {
"title": "$:/config/HighlightPlugin/TypeMappings/text/html",
"text": "html"
},
"$:/config/HighlightPlugin/TypeMappings/image/svg+xml": {
"title": "$:/config/HighlightPlugin/TypeMappings/image/svg+xml",
"text": "xml"
},
"$:/config/HighlightPlugin/TypeMappings/text/x-markdown": {
"title": "$:/config/HighlightPlugin/TypeMappings/text/x-markdown",
"text": "markdown"
},
"$:/plugins/tiddlywiki/highlight/highlight.js": {
"text": "var hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\n/*! highlight.js v9.18.1 | BSD3 License | git.io/hljslicense */\n!function(e){var n=\"object\"==typeof window&&window||\"object\"==typeof self&&self;\"undefined\"==typeof exports||exports.nodeType?n&&(n.hljs=e({}),\"function\"==typeof define&&define.amd&&define([],function(){return n.hljs})):e(exports)}(function(a){var f=[],i=Object.keys,_={},c={},C=!0,n=/^(no-?highlight|plain|text)$/i,l=/\\blang(?:uage)?-([\\w-]+)\\b/i,t=/((^(<[^>]+>|\\t|)+|(?:\\n)))/gm,r={case_insensitive:\"cI\",lexemes:\"l\",contains:\"c\",keywords:\"k\",subLanguage:\"sL\",className:\"cN\",begin:\"b\",beginKeywords:\"bK\",end:\"e\",endsWithParent:\"eW\",illegal:\"i\",excludeBegin:\"eB\",excludeEnd:\"eE\",returnBegin:\"rB\",returnEnd:\"rE\",variants:\"v\",IDENT_RE:\"IR\",UNDERSCORE_IDENT_RE:\"UIR\",NUMBER_RE:\"NR\",C_NUMBER_RE:\"CNR\",BINARY_NUMBER_RE:\"BNR\",RE_STARTERS_RE:\"RSR\",BACKSLASH_ESCAPE:\"BE\",APOS_STRING_MODE:\"ASM\",QUOTE_STRING_MODE:\"QSM\",PHRASAL_WORDS_MODE:\"PWM\",C_LINE_COMMENT_MODE:\"CLCM\",C_BLOCK_COMMENT_MODE:\"CBCM\",HASH_COMMENT_MODE:\"HCM\",NUMBER_MODE:\"NM\",C_NUMBER_MODE:\"CNM\",BINARY_NUMBER_MODE:\"BNM\",CSS_NUMBER_MODE:\"CSSNM\",REGEXP_MODE:\"RM\",TITLE_MODE:\"TM\",UNDERSCORE_TITLE_MODE:\"UTM\",COMMENT:\"C\",beginRe:\"bR\",endRe:\"eR\",illegalRe:\"iR\",lexemesRe:\"lR\",terminators:\"t\",terminator_end:\"tE\"},m=\"</span>\",O=\"Could not find the language '{}', did you forget to load/include a language module?\",B={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},o=\"of and for in not or if then\".split(\" \");function x(e){return e.replace(/&/g,\"&\").replace(/</g,\"<\").replace(/>/g,\">\")}function g(e){return e.nodeName.toLowerCase()}function u(e){return n.test(e)}function s(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function E(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:\"start\",offset:t,node:r}),t=e(r,t),g(r).match(/br|hr|img|input/)||a.push({event:\"stop\",offset:t,node:r}));return t}(e,0),a}function d(e,n,t){var r=0,a=\"\",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:\"start\"===n[0].event?e:n:e.length?e:n}function c(e){a+=\"<\"+g(e)+f.map.call(e.attributes,function(e){return\" \"+e.nodeName+'=\"'+x(e.value).replace(/\"/g,\""\")+'\"'}).join(\"\")+\">\"}function l(e){a+=\"</\"+g(e)+\">\"}function u(e){(\"start\"===e.event?c:l)(e.node)}for(;e.length||n.length;){var s=o();if(a+=x(t.substring(r,s[0].offset)),r=s[0].offset,s===e){for(i.reverse().forEach(l);u(s.splice(0,1)[0]),(s=o())===e&&s.length&&s[0].offset===r;);i.reverse().forEach(c)}else\"start\"===s[0].event?i.push(s[0].node):i.pop(),u(s.splice(0,1)[0])}return a+x(t.substr(r))}function R(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return s(n,{v:null},e)})),n.cached_variants?n.cached_variants:function e(n){return!!n&&(n.eW||e(n.starts))}(n)?[s(n,{starts:n.starts?s(n.starts):null})]:Object.isFrozen(n)?[s(n)]:[n]}function p(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(p)}}function v(n,r){var a={};return\"string\"==typeof n?t(\"keyword\",n):i(n).forEach(function(e){t(e,n[e])}),a;function t(t,e){r&&(e=e.toLowerCase()),e.split(\" \").forEach(function(e){var n=e.split(\"|\");a[n[0]]=[t,function(e,n){return n?Number(n):function(e){return-1!=o.indexOf(e.toLowerCase())}(e)?0:1}(n[0],n[1])]})}}function S(r){function s(e){return e&&e.source||e}function f(e,n){return new RegExp(s(e),\"m\"+(r.cI?\"i\":\"\")+(n?\"g\":\"\"))}function a(a){var i,e,o={},c=[],l={},t=1;function n(e,n){o[t]=e,c.push([e,n]),t+=function(e){return new RegExp(e.toString()+\"|\").exec(\"\").length-1}(n)+1}for(var r=0;r<a.c.length;r++){n(e=a.c[r],e.bK?\"\\\\.?(?:\"+e.b+\")\\\\.?\":e.b)}a.tE&&n(\"end\",a.tE),a.i&&n(\"illegal\",a.i);var u=c.map(function(e){return e[1]});return i=f(function(e,n){for(var t=/\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./,r=0,a=\"\",i=0;i<e.length;i++){var o=r+=1,c=s(e[i]);for(0<i&&(a+=n),a+=\"(\";0<c.length;){var l=t.exec(c);if(null==l){a+=c;break}a+=c.substring(0,l.index),c=c.substring(l.index+l[0].length),\"\\\\\"==l[0][0]&&l[1]?a+=\"\\\\\"+String(Number(l[1])+o):(a+=l[0],\"(\"==l[0]&&r++)}a+=\")\"}return a}(u,\"|\"),!0),l.lastIndex=0,l.exec=function(e){var n;if(0===c.length)return null;i.lastIndex=l.lastIndex;var t=i.exec(e);if(!t)return null;for(var r=0;r<t.length;r++)if(null!=t[r]&&null!=o[\"\"+r]){n=o[\"\"+r];break}return\"string\"==typeof n?(t.type=n,t.extra=[a.i,a.tE]):(t.type=\"begin\",t.rule=n),t},l}if(r.c&&-1!=r.c.indexOf(\"self\")){if(!C)throw new Error(\"ERR: contains `self` is not supported at the top-level of a language. See documentation.\");r.c=r.c.filter(function(e){return\"self\"!=e})}!function n(t,e){t.compiled||(t.compiled=!0,t.k=t.k||t.bK,t.k&&(t.k=v(t.k,r.cI)),t.lR=f(t.l||/\\w+/,!0),e&&(t.bK&&(t.b=\"\\\\b(\"+t.bK.split(\" \").join(\"|\")+\")\\\\b\"),t.b||(t.b=/\\B|\\b/),t.bR=f(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\\B|\\b/),t.e&&(t.eR=f(t.e)),t.tE=s(t.e)||\"\",t.eW&&e.tE&&(t.tE+=(t.e?\"|\":\"\")+e.tE)),t.i&&(t.iR=f(t.i)),null==t.relevance&&(t.relevance=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return R(\"self\"===e?t:e)})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e),t.t=a(t))}(r)}function T(n,e,a,t){var i=e;function o(e,n){if(function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}if(e.eW)return o(e.parent,n)}function c(e,n,t,r){if(!t&&\"\"===n)return\"\";if(!e)return n;var a='<span class=\"'+(r?\"\":B.classPrefix);return(a+=e+'\">')+n+(t?\"\":m)}function l(){p+=null!=d.sL?function(){var e=\"string\"==typeof d.sL;if(e&&!_[d.sL])return x(v);var n=e?T(d.sL,v,!0,R[d.sL]):w(v,d.sL.length?d.sL:void 0);return 0<d.relevance&&(M+=n.relevance),e&&(R[d.sL]=n.top),c(n.language,n.value,!1,!0)}():function(){var e,n,t,r,a,i,o;if(!d.k)return x(v);for(r=\"\",n=0,d.lR.lastIndex=0,t=d.lR.exec(v);t;)r+=x(v.substring(n,t.index)),a=d,i=t,void 0,o=g.cI?i[0].toLowerCase():i[0],(e=a.k.hasOwnProperty(o)&&a.k[o])?(M+=e[1],r+=c(e[0],x(t[0]))):r+=x(t[0]),n=d.lR.lastIndex,t=d.lR.exec(v);return r+x(v.substr(n))}(),v=\"\"}function u(e){p+=e.cN?c(e.cN,\"\",!0):\"\",d=Object.create(e,{parent:{value:d}})}function s(e){var n=e[0],t=e.rule;return t&&t.endSameAsBegin&&(t.eR=function(e){return new RegExp(e.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\"),\"m\")}(n)),t.skip?v+=n:(t.eB&&(v+=n),l(),t.rB||t.eB||(v=n)),u(t),t.rB?0:n.length}var f={};function r(e,n){var t=n&&n[0];if(v+=e,null==t)return l(),0;if(\"begin\"==f.type&&\"end\"==n.type&&f.index==n.index&&\"\"===t)return v+=i.slice(n.index,n.index+1),1;if(\"begin\"===(f=n).type)return s(n);if(\"illegal\"===n.type&&!a)throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(d.cN||\"<unnamed>\")+'\"');if(\"end\"===n.type){var r=function(e){var n=e[0],t=i.substr(e.index),r=o(d,t);if(r){var a=d;for(a.skip?v+=n:(a.rE||a.eE||(v+=n),l(),a.eE&&(v=n));d.cN&&(p+=m),d.skip||d.sL||(M+=d.relevance),(d=d.parent)!==r.parent;);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),u(r.starts)),a.rE?0:n.length}}(n);if(null!=r)return r}return v+=t,t.length}var g=D(n);if(!g)throw console.error(O.replace(\"{}\",n)),new Error('Unknown language: \"'+n+'\"');S(g);var E,d=t||g,R={},p=\"\";for(E=d;E!==g;E=E.parent)E.cN&&(p=c(E.cN,\"\",!0)+p);var v=\"\",M=0;try{for(var b,h,N=0;d.t.lastIndex=N,b=d.t.exec(i);)h=r(i.substring(N,b.index),b),N=b.index+h;for(r(i.substr(N)),E=d;E.parent;E=E.parent)E.cN&&(p+=m);return{relevance:M,value:p,i:!1,language:n,top:d}}catch(e){if(e.message&&-1!==e.message.indexOf(\"Illegal\"))return{i:!0,relevance:0,value:x(i)};if(C)return{relevance:0,value:x(i),language:n,top:d,errorRaised:e};throw e}}function w(t,e){e=e||B.languages||i(_);var r={relevance:0,value:x(t)},a=r;return e.filter(D).filter(L).forEach(function(e){var n=T(e,t,!1);n.language=e,n.relevance>a.relevance&&(a=n),n.relevance>r.relevance&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function M(e){return B.tabReplace||B.useBR?e.replace(t,function(e,n){return B.useBR&&\"\\n\"===e?\"<br>\":B.tabReplace?n.replace(/\\t/g,B.tabReplace):\"\"}):e}function b(e){var n,t,r,a,i,o=function(e){var n,t,r,a,i=e.className+\" \";if(i+=e.parentNode?e.parentNode.className:\"\",t=l.exec(i)){var o=D(t[1]);return o||(console.warn(O.replace(\"{}\",t[1])),console.warn(\"Falling back to no-highlight mode for this block.\",e)),o?t[1]:\"no-highlight\"}for(n=0,r=(i=i.split(/\\s+/)).length;n<r;n++)if(u(a=i[n])||D(a))return a}(e);u(o)||(B.useBR?(n=document.createElement(\"div\")).innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\"):n=e,i=n.textContent,r=o?T(o,i,!0):w(i),(t=E(n)).length&&((a=document.createElement(\"div\")).innerHTML=r.value,r.value=d(t,E(a),i)),r.value=M(r.value),e.innerHTML=r.value,e.className=function(e,n,t){var r=n?c[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}(e.className,o,r.language),e.result={language:r.language,re:r.relevance},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.relevance}))}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");f.forEach.call(e,b)}}var N={disableAutodetect:!0};function D(e){return e=(e||\"\").toLowerCase(),_[e]||_[c[e]]}function L(e){var n=D(e);return n&&!n.disableAutodetect}return a.highlight=T,a.highlightAuto=w,a.fixMarkup=M,a.highlightBlock=b,a.configure=function(e){B=s(B,e)},a.initHighlighting=h,a.initHighlightingOnLoad=function(){window.addEventListener(\"DOMContentLoaded\",h,!1),window.addEventListener(\"load\",h,!1)},a.registerLanguage=function(n,e){var t;try{t=e(a)}catch(e){if(console.error(\"Language definition for '{}' could not be registered.\".replace(\"{}\",n)),!C)throw e;console.error(e),t=N}p(_[n]=t),t.rawDefinition=e.bind(null,a),t.aliases&&t.aliases.forEach(function(e){c[e]=n})},a.listLanguages=function(){return i(_)},a.getLanguage=D,a.requireLanguage=function(e){var n=D(e);if(n)return n;throw new Error(\"The '{}' language is required, but not loaded.\".replace(\"{}\",e))},a.autoDetection=L,a.inherit=s,a.debugMode=function(){C=!1},a.IR=a.IDENT_RE=\"[a-zA-Z]\\\\w*\",a.UIR=a.UNDERSCORE_IDENT_RE=\"[a-zA-Z_]\\\\w*\",a.NR=a.NUMBER_RE=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",a.CNR=a.C_NUMBER_RE=\"(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",a.BNR=a.BINARY_NUMBER_RE=\"\\\\b(0b[01]+)\",a.RSR=a.RE_STARTERS_RE=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",a.BE=a.BACKSLASH_ESCAPE={b:\"\\\\\\\\[\\\\s\\\\S]\",relevance:0},a.ASM=a.APOS_STRING_MODE={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:\"comment\",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:\"doctag\",b:\"(?:TODO|FIXME|NOTE|BUG|XXX):\",relevance:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C(\"//\",\"$\"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C(\"/\\\\*\",\"\\\\*/\"),a.HCM=a.HASH_COMMENT_MODE=a.C(\"#\",\"$\"),a.NM=a.NUMBER_MODE={cN:\"number\",b:a.NR,relevance:0},a.CNM=a.C_NUMBER_MODE={cN:\"number\",b:a.CNR,relevance:0},a.BNM=a.BINARY_NUMBER_MODE={cN:\"number\",b:a.BNR,relevance:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:\"number\",b:a.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",relevance:0},a.RM=a.REGEXP_MODE={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[a.BE,{b:/\\[/,e:/\\]/,relevance:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:\"title\",b:a.IR,relevance:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:\"title\",b:a.UIR,relevance:0},a.METHOD_GUARD={b:\"\\\\.\\\\s*\"+a.UIR,relevance:0},[a.BE,a.ASM,a.QSM,a.PWM,a.C,a.CLCM,a.CBCM,a.HCM,a.NM,a.CNM,a.BNM,a.CSSNM,a.RM,a.TM,a.UTM,a.METHOD_GUARD].forEach(function(e){!function n(t){Object.freeze(t);var r=\"function\"==typeof t;Object.getOwnPropertyNames(t).forEach(function(e){!t.hasOwnProperty(e)||null===t[e]||\"object\"!=typeof t[e]&&\"function\"!=typeof t[e]||r&&(\"caller\"===e||\"callee\"===e||\"arguments\"===e)||Object.isFrozen(t[e])||n(t[e])});return t}(e)}),a});hljs.registerLanguage(\"swift\",function(e){var i={keyword:\"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet\",literal:\"true false nil\",built_in:\"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip\"},t=e.C(\"/\\\\*\",\"\\\\*/\",{c:[\"self\"]}),n={cN:\"subst\",b:/\\\\\\(/,e:\"\\\\)\",k:i,c:[]},r={cN:\"string\",c:[e.BE,n],v:[{b:/\"\"\"/,e:/\"\"\"/},{b:/\"/,e:/\"/}]},a={cN:\"number\",b:\"\\\\b([\\\\d_]+(\\\\.[\\\\deE_]+)?|0x[a-fA-F0-9_]+(\\\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\\\b\",relevance:0};return n.c=[a],{k:i,c:[r,e.CLCM,t,{cN:\"type\",b:\"\\\\b[A-Z][\\\\wÀ-ʸ']*[!?]\"},{cN:\"type\",b:\"\\\\b[A-Z][\\\\wÀ-ʸ']*\",relevance:0},a,{cN:\"function\",bK:\"func\",e:\"{\",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{b:/</,e:/>/},{cN:\"params\",b:/\\(/,e:/\\)/,endsParent:!0,k:i,c:[\"self\",a,r,e.CBCM,{b:\":\"}],i:/[\"']/}],i:/\\[|%/},{cN:\"class\",bK:\"struct protocol class extension enum\",k:i,e:\"\\\\{\",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][\\u00C0-\\u02B80-9A-Za-z$_]*/})]},{cN:\"meta\",b:\"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\"},{bK:\"import\",e:/$/,c:[e.CLCM,t]}]}});hljs.registerLanguage(\"less\",function(e){function r(e){return{cN:\"string\",b:\"~?\"+e+\".*?\"+e}}function t(e,r,t){return{cN:e,b:r,relevance:t}}var a=\"[\\\\w-]+\",c=\"(\"+a+\"|@{\"+a+\"})\",s=[],n=[],b={b:\"\\\\(\",e:\"\\\\)\",c:n,relevance:0};n.push(e.CLCM,e.CBCM,r(\"'\"),r('\"'),e.CSSNM,{b:\"(url|data-uri)\\\\(\",starts:{cN:\"string\",e:\"[\\\\)\\\\n]\",eE:!0}},t(\"number\",\"#[0-9A-Fa-f]+\\\\b\"),b,t(\"variable\",\"@@?\"+a,10),t(\"variable\",\"@{\"+a+\"}\"),t(\"built_in\",\"~?`[^`]*?`\"),{cN:\"attribute\",b:a+\"\\\\s*:\",e:\":\",rB:!0,eE:!0},{cN:\"meta\",b:\"!important\"});var i=n.concat({b:\"{\",e:\"}\",c:s}),l={bK:\"when\",eW:!0,c:[{bK:\"and not\"}].concat(n)},o={b:c+\"\\\\s*:\",rB:!0,e:\"[;}]\",relevance:0,c:[{cN:\"attribute\",b:c,e:\":\",eE:!0,starts:{eW:!0,i:\"[<=$]\",relevance:0,c:n}}]},u={cN:\"keyword\",b:\"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\\\b\",starts:{e:\"[;{}]\",rE:!0,c:n,relevance:0}},v={cN:\"variable\",v:[{b:\"@\"+a+\"\\\\s*:\",relevance:15},{b:\"@\"+a}],starts:{e:\"[;}]\",rE:!0,c:i}},C={v:[{b:\"[\\\\.#:&\\\\[>]\",e:\"[;{}]\"},{b:c,e:\"{\"}],rB:!0,rE:!0,i:\"[<='$\\\"]\",relevance:0,c:[e.CLCM,e.CBCM,l,t(\"keyword\",\"all\\\\b\"),t(\"variable\",\"@{\"+a+\"}\"),t(\"selector-tag\",c+\"%?\",0),t(\"selector-id\",\"#\"+c),t(\"selector-class\",\"\\\\.\"+c,0),t(\"selector-tag\",\"&\",0),{cN:\"selector-attr\",b:\"\\\\[\",e:\"\\\\]\"},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"\\\\(\",e:\"\\\\)\",c:i},{b:\"!important\"}]};return s.push(e.CLCM,e.CBCM,u,v,o,C),{cI:!0,i:\"[=>'/<($\\\"]\",c:s}});hljs.registerLanguage(\"armasm\",function(s){return{cI:!0,aliases:[\"arm\"],l:\"\\\\.?\"+s.IR,k:{meta:\".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND \",built_in:\"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @\"},c:[{cN:\"keyword\",b:\"\\\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?\",e:\"\\\\s\"},s.C(\"[;@]\",\"$\",{relevance:0}),s.CBCM,s.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",relevance:0},{cN:\"title\",b:\"\\\\|\",e:\"\\\\|\",i:\"\\\\n\",relevance:0},{cN:\"number\",v:[{b:\"[#$=]?0x[0-9a-f]+\"},{b:\"[#$=]?0b[01]+\"},{b:\"[#$=]\\\\d+\"},{b:\"\\\\b\\\\d+\"}],relevance:0},{cN:\"symbol\",v:[{b:\"^[a-z_\\\\.\\\\$][a-z0-9_\\\\.\\\\$]+\"},{b:\"^\\\\s*[a-z_\\\\.\\\\$][a-z0-9_\\\\.\\\\$]+:\"},{b:\"[=#]\\\\w+\"}],relevance:0}]}});hljs.registerLanguage(\"ruby\",function(e){var c=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\",b={keyword:\"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor\",literal:\"true false nil\"},r={cN:\"doctag\",b:\"@[A-Za-z]+\"},a={b:\"#<\",e:\">\"},n=[e.C(\"#\",\"$\",{c:[r]}),e.C(\"^\\\\=begin\",\"^\\\\=end\",{c:[r],relevance:10}),e.C(\"^__END__\",\"\\\\n$\")],s={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:b},t={cN:\"string\",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/`/,e:/`/},{b:\"%[qQwWx]?\\\\(\",e:\"\\\\)\"},{b:\"%[qQwWx]?\\\\[\",e:\"\\\\]\"},{b:\"%[qQwWx]?{\",e:\"}\"},{b:\"%[qQwWx]?<\",e:\">\"},{b:\"%[qQwWx]?/\",e:\"/\"},{b:\"%[qQwWx]?%\",e:\"%\"},{b:\"%[qQwWx]?-\",e:\"-\"},{b:\"%[qQwWx]?\\\\|\",e:\"\\\\|\"},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/},{b:/<<[-~]?'?(\\w+)(?:.|\\n)*?\\n\\s*\\1\\b/,rB:!0,c:[{b:/<<[-~]?'?/},{b:/\\w+/,endSameAsBegin:!0,c:[e.BE,s]}]}]},i={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",endsParent:!0,k:b},l=[t,a,{cN:\"class\",bK:\"class module\",e:\"$|;\",i:/=/,c:[e.inherit(e.TM,{b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\"}),{b:\"<\\\\s*\",c:[{b:\"(\"+e.IR+\"::)?\"+e.IR}]}].concat(n)},{cN:\"function\",bK:\"def\",e:\"$|;\",c:[e.inherit(e.TM,{b:c}),i].concat(n)},{b:e.IR+\"::\"},{cN:\"symbol\",b:e.UIR+\"(\\\\!|\\\\?)?:\",relevance:0},{cN:\"symbol\",b:\":(?!\\\\s)\",c:[t,{b:c}],relevance:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",relevance:0},{b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{cN:\"params\",b:/\\|/,e:/\\|/,k:b},{b:\"(\"+e.RSR+\"|unless)\\\\s*\",k:\"unless\",c:[a,{cN:\"regexp\",c:[e.BE,s],i:/\\n/,v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r{\",e:\"}[a-z]*\"},{b:\"%r\\\\(\",e:\"\\\\)[a-z]*\"},{b:\"%r!\",e:\"![a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}].concat(n),relevance:0}].concat(n);s.c=l;var d=[{b:/^\\s*=>/,starts:{e:\"$\",c:i.c=l}},{cN:\"meta\",b:\"^([>?]>|[\\\\w#]+\\\\(\\\\w+\\\\):\\\\d+:\\\\d+>|(\\\\w+-)?\\\\d+\\\\.\\\\d+\\\\.\\\\d(p\\\\d+)?[^>]+>)\",starts:{e:\"$\",c:l}}];return{aliases:[\"rb\",\"gemspec\",\"podspec\",\"thor\",\"irb\"],k:b,i:/\\/\\*/,c:n.concat(d).concat(l)}});hljs.registerLanguage(\"lua\",function(e){var t=\"\\\\[=*\\\\[\",a=\"\\\\]=*\\\\]\",n={b:t,e:a,c:[\"self\"]},l=[e.C(\"--(?!\"+t+\")\",\"$\"),e.C(\"--\"+t,a,{c:[n],relevance:10})];return{l:e.UIR,k:{literal:\"true false nil\",keyword:\"and break do else elseif end for goto if in local not or repeat return then until while\",built_in:\"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstringmodule next pairs pcall print rawequal rawget rawset require select setfenvsetmetatable tonumber tostring type unpack xpcall arg selfcoroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove\"},c:l.concat([{cN:\"function\",bK:\"function\",e:\"\\\\)\",c:[e.inherit(e.TM,{b:\"([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*\"}),{cN:\"params\",b:\"\\\\(\",eW:!0,c:l}].concat(l)},e.CNM,e.ASM,e.QSM,{cN:\"string\",b:t,e:a,c:[n],relevance:5}])}});hljs.registerLanguage(\"matlab\",function(e){var a=\"('|\\\\.')+\",s={relevance:0,c:[{b:a}]};return{k:{keyword:\"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while\",built_in:\"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson max min nanmax nanmin mean nanmean type table readtable writetable sortrows sort figure plot plot3 scatter scatter3 cellfun legend intersect ismember procrustes hold num2cell \"},i:'(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",bK:\"function\",e:\"$\",c:[e.UTM,{cN:\"params\",v:[{b:\"\\\\(\",e:\"\\\\)\"},{b:\"\\\\[\",e:\"\\\\]\"}]}]},{cN:\"built_in\",b:/true|false/,relevance:0,starts:s},{b:\"[a-zA-Z][a-zA-Z_0-9]*\"+a,relevance:0},{cN:\"number\",b:e.CNR,relevance:0,starts:s},{cN:\"string\",b:\"'\",e:\"'\",c:[e.BE,{b:\"''\"}]},{b:/\\]|}|\\)/,relevance:0,starts:s},{cN:\"string\",b:'\"',e:'\"',c:[e.BE,{b:'\"\"'}],starts:s},e.C(\"^\\\\s*\\\\%\\\\{\\\\s*$\",\"^\\\\s*\\\\%\\\\}\\\\s*$\"),e.C(\"\\\\%\",\"$\")]}});hljs.registerLanguage(\"apache\",function(e){var r={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{aliases:[\"apacheconf\"],cI:!0,c:[e.HCM,{cN:\"section\",b:\"</?\",e:\">\"},{cN:\"attribute\",b:/\\w+/,relevance:0,k:{nomarkup:\"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername\"},starts:{e:/$/,relevance:0,k:{literal:\"on off all\"},c:[{cN:\"meta\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"variable\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",r]},r,e.QSM]}}],i:/\\S/}});hljs.registerLanguage(\"yaml\",function(e){var b=\"true false yes no null\",a={cN:\"string\",relevance:0,v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/\\S+/}],c:[e.BE,{cN:\"template-variable\",v:[{b:\"{{\",e:\"}}\"},{b:\"%{\",e:\"}\"}]}]};return{cI:!0,aliases:[\"yml\",\"YAML\",\"yaml\"],c:[{cN:\"attr\",v:[{b:\"\\\\w[\\\\w :\\\\/.-]*:(?=[ \\t]|$)\"},{b:'\"\\\\w[\\\\w :\\\\/.-]*\":(?=[ \\t]|$)'},{b:\"'\\\\w[\\\\w :\\\\/.-]*':(?=[ \\t]|$)\"}]},{cN:\"meta\",b:\"^---s*$\",relevance:10},{cN:\"string\",b:\"[\\\\|>]([0-9]?[+-])?[ ]*\\\\n( *)[\\\\S ]+\\\\n(\\\\2[\\\\S ]+\\\\n?)*\"},{b:\"<%[%=-]?\",e:\"[%-]?%>\",sL:\"ruby\",eB:!0,eE:!0,relevance:0},{cN:\"type\",b:\"!\"+e.UIR},{cN:\"type\",b:\"!!\"+e.UIR},{cN:\"meta\",b:\"&\"+e.UIR+\"$\"},{cN:\"meta\",b:\"\\\\*\"+e.UIR+\"$\"},{cN:\"bullet\",b:\"\\\\-(?=[ ]|$)\",relevance:0},e.HCM,{bK:b,k:{literal:b}},{cN:\"number\",b:e.CNR+\"\\\\b\"},a]}});hljs.registerLanguage(\"plaintext\",function(e){return{disableAutodetect:!0}});hljs.registerLanguage(\"erlang-repl\",function(e){return{k:{built_in:\"spawn spawn_link self\",keyword:\"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor\"},c:[{cN:\"meta\",b:\"^[0-9]+> \",relevance:10},e.C(\"%\",\"$\"),{cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",relevance:0},e.ASM,e.QSM,{b:\"\\\\?(::)?([A-Z]\\\\w*(::)?)+\"},{b:\"->\"},{b:\"ok\"},{b:\"!\"},{b:\"(\\\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\\\b[a-z'][a-zA-Z0-9_']*)\",relevance:0},{b:\"[A-Z][a-zA-Z0-9_']*\",relevance:0}]}});hljs.registerLanguage(\"cmake\",function(e){return{aliases:[\"cmake.in\"],cI:!0,k:{keyword:\"break cmake_host_system_information cmake_minimum_required cmake_parse_arguments cmake_policy configure_file continue elseif else endforeach endfunction endif endmacro endwhile execute_process file find_file find_library find_package find_path find_program foreach function get_cmake_property get_directory_property get_filename_component get_property if include include_guard list macro mark_as_advanced math message option return separate_arguments set_directory_properties set_property set site_name string unset variable_watch while add_compile_definitions add_compile_options add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_link_options add_subdirectory add_test aux_source_directory build_command create_test_sourcelist define_property enable_language enable_testing export fltk_wrap_ui get_source_file_property get_target_property get_test_property include_directories include_external_msproject include_regular_expression install link_directories link_libraries load_cache project qt_wrap_cpp qt_wrap_ui remove_definitions set_source_files_properties set_target_properties set_tests_properties source_group target_compile_definitions target_compile_features target_compile_options target_include_directories target_link_directories target_link_libraries target_link_options target_sources try_compile try_run ctest_build ctest_configure ctest_coverage ctest_empty_binary_directory ctest_memcheck ctest_read_custom_files ctest_run_script ctest_sleep ctest_start ctest_submit ctest_test ctest_update ctest_upload build_name exec_program export_library_dependencies install_files install_programs install_targets load_command make_directory output_required_files remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or not command policy target test exists is_newer_than is_directory is_symlink is_absolute matches less greater equal less_equal greater_equal strless strgreater strequal strless_equal strgreater_equal version_less version_greater version_equal version_less_equal version_greater_equal in_list defined\"},c:[{cN:\"variable\",b:\"\\\\${\",e:\"}\"},e.HCM,e.QSM,e.NM]}});hljs.registerLanguage(\"kotlin\",function(e){var t={keyword:\"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default\",built_in:\"Byte Short Char Int Long Boolean Float Double Void Unit Nothing\",literal:\"true false null\"},a={cN:\"symbol\",b:e.UIR+\"@\"},n={cN:\"subst\",b:\"\\\\${\",e:\"}\",c:[e.CNM]},c={cN:\"variable\",b:\"\\\\$\"+e.UIR},r={cN:\"string\",v:[{b:'\"\"\"',e:'\"\"\"(?=[^\"])',c:[c,n]},{b:\"'\",e:\"'\",i:/\\n/,c:[e.BE]},{b:'\"',e:'\"',i:/\\n/,c:[e.BE,c,n]}]};n.c.push(r);var i={cN:\"meta\",b:\"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\\\s*:(?:\\\\s*\"+e.UIR+\")?\"},l={cN:\"meta\",b:\"@\"+e.UIR,c:[{b:/\\(/,e:/\\)/,c:[e.inherit(r,{cN:\"meta-string\"})]}]},s={cN:\"number\",b:\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",relevance:0},b=e.C(\"/\\\\*\",\"\\\\*/\",{c:[e.CBCM]}),o={v:[{cN:\"type\",b:e.UIR},{b:/\\(/,e:/\\)/,c:[]}]},d=o;return d.v[1].c=[o],o.v[1].c=[d],{aliases:[\"kt\"],k:t,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,b,{cN:\"keyword\",b:/\\b(break|continue|return|this)\\b/,starts:{c:[{cN:\"symbol\",b:/@\\w+/}]}},a,i,l,{cN:\"function\",bK:\"fun\",e:\"[(]|$\",rB:!0,eE:!0,k:t,i:/fun\\s+(<.*>)?[^\\s\\(]+(\\s+[^\\s\\(]+)\\s*=/,relevance:5,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,relevance:0,c:[e.UTM]},{cN:\"type\",b:/</,e:/>/,k:\"reified\",relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,endsParent:!0,k:t,relevance:0,c:[{b:/:/,e:/[=,\\/]/,eW:!0,c:[o,e.CLCM,b],relevance:0},e.CLCM,b,i,l,r,e.CNM]},b]},{cN:\"class\",bK:\"class interface trait\",e:/[:\\{(]|$/,eE:!0,i:\"extends implements\",c:[{bK:\"public protected internal private constructor\"},e.UTM,{cN:\"type\",b:/</,e:/>/,eB:!0,eE:!0,relevance:0},{cN:\"type\",b:/[,:]\\s*/,e:/[<\\(,]|$/,eB:!0,rE:!0},i,l]},r,{cN:\"meta\",b:\"^#!/usr/bin/env\",e:\"$\",i:\"\\n\"},s]}});hljs.registerLanguage(\"javascript\",function(e){var r=\"<>\",a=\"</>\",t={b:/<[A-Za-z0-9\\\\._:-]+/,e:/\\/[A-Za-z0-9\\\\._:-]+>|\\/>/},c=\"[A-Za-z$_][0-9A-Za-z$_]*\",n={keyword:\"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise\"},s={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)n?\"},{b:\"\\\\b(0[oO][0-7]+)n?\"},{b:e.CNR+\"n?\"}],relevance:0},o={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:n,c:[]},i={b:\"html`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"xml\"}},b={b:\"css`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"css\"}},l={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,o]};o.c=[e.ASM,e.QSM,i,b,l,s,e.RM];var u=o.c.concat([e.CBCM,e.CLCM]);return{aliases:[\"js\",\"jsx\",\"mjs\",\"cjs\"],k:n,c:[{cN:\"meta\",relevance:10,b:/^\\s*['\"]use (strict|asm)['\"]/},{cN:\"meta\",b:/^#!/,e:/$/},e.ASM,e.QSM,i,b,l,e.CLCM,e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{cN:\"doctag\",b:\"@[A-Za-z]+\",c:[{cN:\"type\",b:\"\\\\{\",e:\"\\\\}\",relevance:0},{cN:\"variable\",b:c+\"(?=\\\\s*(-)|$)\",endsParent:!0,relevance:0},{b:/(?=[^\\n])\\s/,relevance:0}]}]}),e.CBCM,s,{b:/[{,\\n]\\s*/,relevance:0,c:[{b:c+\"\\\\s*:\",rB:!0,relevance:0,c:[{cN:\"attr\",b:c,relevance:0}]}]},{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+c+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:c},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:n,c:u}]}]},{cN:\"\",b:/\\s/,e:/\\s*/,skip:!0},{v:[{b:r,e:a},{b:t.b,e:t.e}],sL:\"xml\",c:[{b:t.b,e:t.e,skip:!0,c:[\"self\"]}]}],relevance:0},{cN:\"function\",bK:\"function\",e:/\\{/,eE:!0,c:[e.inherit(e.TM,{b:c}),{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,c:u}],i:/\\[|%/},{b:/\\$[(.]/},e.METHOD_GUARD,{cN:\"class\",bK:\"class\",e:/[{;=]/,eE:!0,i:/[:\"\\[\\]]/,c:[{bK:\"extends\"},e.UTM]},{bK:\"constructor get set\",e:/\\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage(\"scss\",function(e){var t=\"@[a-z-]+\",r={cN:\"variable\",b:\"(\\\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\\\b\"},i={cN:\"number\",b:\"#[0-9A-Fa-f]+\"};e.CSSNM,e.QSM,e.ASM,e.CBCM;return{cI:!0,i:\"[=/|']\",c:[e.CLCM,e.CBCM,{cN:\"selector-id\",b:\"\\\\#[A-Za-z0-9_-]+\",relevance:0},{cN:\"selector-class\",b:\"\\\\.[A-Za-z0-9_-]+\",relevance:0},{cN:\"selector-attr\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"selector-tag\",b:\"\\\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\\\b\",relevance:0},{cN:\"selector-pseudo\",b:\":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)\"},{cN:\"selector-pseudo\",b:\"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)\"},r,{cN:\"attribute\",b:\"\\\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\\\b\",i:\"[^\\\\s]\"},{b:\"\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b\"},{b:\":\",e:\";\",c:[r,i,e.CSSNM,e.QSM,e.ASM,{cN:\"meta\",b:\"!important\"}]},{b:\"@(page|font-face)\",l:t,k:\"@page @font-face\"},{b:\"@\",e:\"[{;]\",rB:!0,k:\"and or not only\",c:[{b:t,cN:\"keyword\"},r,e.QSM,e.ASM,i,e.CSSNM]}]}});hljs.registerLanguage(\"perl\",function(e){var t=\"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when\",r={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:t},s={b:\"->{\",e:\"}\"},n={v:[{b:/\\$\\d/},{b:/[\\$%@](\\^\\w\\b|#\\w+(::\\w+)*|{\\w+}|\\w+(::\\w*)*)/},{b:/[\\$%@][^\\s\\w{]/,relevance:0}]},c=[e.BE,r,n],a=[n,e.HCM,e.C(\"^\\\\=\\\\w\",\"\\\\=cut\",{eW:!0}),s,{cN:\"string\",c:c,v:[{b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",relevance:5},{b:\"qw\\\\s+q\",e:\"q\",relevance:5},{b:\"'\",e:\"'\",c:[e.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[e.BE]},{b:\"{\\\\w+}\",c:[],relevance:0},{b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",c:[],relevance:0}]},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",relevance:0},{b:\"(\\\\/\\\\/|\"+e.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",relevance:0,c:[e.HCM,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",relevance:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[e.BE],relevance:0}]},{cN:\"function\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",eE:!0,relevance:5,c:[e.TM]},{b:\"-\\\\w\\\\b\",relevance:0},{b:\"^__DATA__$\",e:\"^__END__$\",sL:\"mojolicious\",c:[{b:\"^@@.*\",e:\"$\",cN:\"comment\"}]}];return r.c=a,{aliases:[\"pl\",\"pm\"],l:/[\\w\\.]+/,k:t,c:s.c=a}});hljs.registerLanguage(\"go\",function(e){var n={keyword:\"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune\",literal:\"true false iota nil\",built_in:\"append cap close complex copy imag len make new panic print println real recover delete\"};return{aliases:[\"golang\"],k:n,i:\"</\",c:[e.CLCM,e.CBCM,{cN:\"string\",v:[e.QSM,e.ASM,{b:\"`\",e:\"`\"}]},{cN:\"number\",v:[{b:e.CNR+\"[i]\",relevance:1},e.CNM]},{b:/:=/},{cN:\"function\",bK:\"func\",e:\"\\\\s*(\\\\{|$)\",eE:!0,c:[e.TM,{cN:\"params\",b:/\\(/,e:/\\)/,k:n,i:/[\"']/}]}]}});hljs.registerLanguage(\"x86asm\",function(s){return{cI:!0,l:\"[.%]?\"+s.IR,k:{keyword:\"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63\",built_in:\"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr\",meta:\"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__\"},c:[s.C(\";\",\"$\",{relevance:0}),{cN:\"number\",v:[{b:\"\\\\b(?:([0-9][0-9_]*)?\\\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\\\b\",relevance:0},{b:\"\\\\$[0-9][0-9A-Fa-f]*\",relevance:0},{b:\"\\\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\\\b\"},{b:\"\\\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\\\b\"}]},s.QSM,{cN:\"string\",v:[{b:\"'\",e:\"[^\\\\\\\\]'\"},{b:\"`\",e:\"[^\\\\\\\\]`\"}],relevance:0},{cN:\"symbol\",v:[{b:\"^\\\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\\\s+label)\"},{b:\"^\\\\s*%%[A-Za-z0-9_$#@~.?]*:\"}],relevance:0},{cN:\"subst\",b:\"%[0-9]+\",relevance:0},{cN:\"subst\",b:\"%!S+\",relevance:0},{cN:\"meta\",b:/^\\s*\\.[\\w_-]+/}]}});hljs.registerLanguage(\"cpp\",function(e){function t(e){return\"(?:\"+e+\")?\"}var r=\"decltype\\\\(auto\\\\)\",a=\"[a-zA-Z_]\\\\w*::\",i=\"(\"+r+\"|\"+t(a)+\"[a-zA-Z_]\\\\w*\"+t(\"<.*?>\")+\")\",c={cN:\"keyword\",b:\"\\\\b[a-z\\\\d_]*_t\\\\b\"},s={cN:\"string\",v:[{b:'(u8?|U|L)?\"',e:'\"',i:\"\\\\n\",c:[e.BE]},{b:\"(u8?|U|L)?'(\\\\\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\\\S)|.)\",e:\"'\",i:\".\"},{b:/(?:u8?|U|L)?R\"([^()\\\\ ]{0,16})\\((?:.|\\n)*?\\)\\1\"/}]},n={cN:\"number\",v:[{b:\"\\\\b(0b[01']+)\"},{b:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)(u|U|l|L|ul|UL|f|F|b|B)\"},{b:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"}],relevance:0},o={cN:\"meta\",b:/#\\s*[a-z]+\\b/,e:/$/,k:{\"meta-keyword\":\"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include\"},c:[{b:/\\\\\\n/,relevance:0},e.inherit(s,{cN:\"meta-string\"}),{cN:\"meta-string\",b:/<.*?>/,e:/$/,i:\"\\\\n\"},e.CLCM,e.CBCM]},l={cN:\"title\",b:t(a)+e.IR,relevance:0},u=t(a)+e.IR+\"\\\\s*\\\\(\",p={keyword:\"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_tshort reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq\",built_in:\"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary\",literal:\"true false nullptr NULL\"},m=[c,e.CLCM,e.CBCM,n,s],d={v:[{b:/=/,e:/;/},{b:/\\(/,e:/\\)/},{bK:\"new throw return else\",e:/;/}],k:p,c:m.concat([{b:/\\(/,e:/\\)/,k:p,c:m.concat([\"self\"]),relevance:0}]),relevance:0},b={cN:\"function\",b:\"(\"+i+\"[\\\\*&\\\\s]+)+\"+u,rB:!0,e:/[{;=]/,eE:!0,k:p,i:/[^\\w\\s\\*&:<>]/,c:[{b:r,k:p,relevance:0},{b:u,rB:!0,c:[l],relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,k:p,relevance:0,c:[e.CLCM,e.CBCM,s,n,c,{b:/\\(/,e:/\\)/,k:p,relevance:0,c:[\"self\",e.CLCM,e.CBCM,s,n,c]}]},c,e.CLCM,e.CBCM,o]};return{aliases:[\"c\",\"cc\",\"h\",\"c++\",\"h++\",\"hpp\",\"hh\",\"hxx\",\"cxx\"],k:p,i:\"</\",c:[].concat(d,b,m,[o,{b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:p,c:[\"self\",c]},{b:e.IR+\"::\",k:p},{cN:\"class\",bK:\"class struct\",e:/[{;:]/,c:[{b:/</,e:/>/,c:[\"self\"]},e.TM]}]),exports:{preprocessor:o,strings:s,k:p}}});hljs.registerLanguage(\"arduino\",function(e){var t=\"boolean byte word String\",r=\"setup loopKeyboardController MouseController SoftwareSerial EthernetServer EthernetClient LiquidCrystal RobotControl GSMVoiceCall EthernetUDP EsploraTFT HttpClient RobotMotor WiFiClient GSMScanner FileSystem Scheduler GSMServer YunClient YunServer IPAddress GSMClient GSMModem Keyboard Ethernet Console GSMBand Esplora Stepper Process WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage Client Server GSMPIN FileIO Bridge Serial EEPROM Stream Mouse Audio Servo File Task GPRS WiFi Wire TFT GSM SPI SD runShellCommandAsynchronously analogWriteResolution retrieveCallingNumber printFirmwareVersion analogReadResolution sendDigitalPortPair noListenOnLocalhost readJoystickButton setFirmwareVersion readJoystickSwitch scrollDisplayRight getVoiceCallStatus scrollDisplayLeft writeMicroseconds delayMicroseconds beginTransmission getSignalStrength runAsynchronously getAsynchronously listenOnLocalhost getCurrentCarrier readAccelerometer messageAvailable sendDigitalPorts lineFollowConfig countryNameWrite runShellCommand readStringUntil rewindDirectory readTemperature setClockDivider readLightSensor endTransmission analogReference detachInterrupt countryNameRead attachInterrupt encryptionType readBytesUntil robotNameWrite readMicrophone robotNameRead cityNameWrite userNameWrite readJoystickY readJoystickX mouseReleased openNextFile scanNetworks noInterrupts digitalWrite beginSpeaker mousePressed isActionDone mouseDragged displayLogos noAutoscroll addParameter remoteNumber getModifiers keyboardRead userNameRead waitContinue processInput parseCommand printVersion readNetworks writeMessage blinkVersion cityNameRead readMessage setDataMode parsePacket isListening setBitOrder beginPacket isDirectory motorsWrite drawCompass digitalRead clearScreen serialEvent rightToLeft setTextSize leftToRight requestFrom keyReleased compassRead analogWrite interrupts WiFiServer disconnect playMelody parseFloat autoscroll getPINUsed setPINUsed setTimeout sendAnalog readSlider analogRead beginWrite createChar motorsStop keyPressed tempoWrite readButton subnetMask debugPrint macAddress writeGreen randomSeed attachGPRS readString sendString remotePort releaseAll mouseMoved background getXChange getYChange answerCall getResult voiceCall endPacket constrain getSocket writeJSON getButton available connected findUntil readBytes exitValue readGreen writeBlue startLoop IPAddress isPressed sendSysex pauseMode gatewayIP setCursor getOemKey tuneWrite noDisplay loadImage switchPIN onRequest onReceive changePIN playFile noBuffer parseInt overflow checkPIN knobRead beginTFT bitClear updateIR bitWrite position writeRGB highByte writeRed setSpeed readBlue noStroke remoteIP transfer shutdown hangCall beginSMS endWrite attached maintain noCursor checkReg checkPUK shiftOut isValid shiftIn pulseIn connect println localIP pinMode getIMEI display noBlink process getBand running beginSD drawBMP lowByte setBand release bitRead prepare pointTo readRed setMode noFill remove listen stroke detach attach noTone exists buffer height bitSet circle config cursor random IRread setDNS endSMS getKey micros millis begin print write ready flush width isPIN blink clear press mkdir rmdir close point yield image BSSID click delay read text move peek beep rect line open seek fill size turn stop home find step tone sqrt RSSI SSID end bit tan cos sin pow map abs max min get run put\",i=\"DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL DEFAULT OUTPUT INPUT HIGH LOW\",o=e.requireLanguage(\"cpp\").rawDefinition(),a=o.k;return a.keyword+=\" \"+t,a.literal+=\" \"+i,a.built_in+=\" \"+r,o});hljs.registerLanguage(\"nginx\",function(e){var r={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+e.UIR}]},b={eW:!0,l:\"[a-z/_]+\",k:{literal:\"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll\"},relevance:0,i:\"=>\",c:[e.HCM,{cN:\"string\",c:[e.BE,r],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{b:\"([a-z]+):/\",e:\"\\\\s\",eW:!0,eE:!0,c:[r]},{cN:\"regexp\",c:[e.BE,r],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:!0},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:!0},{b:\"\\\\*(\\\\.[a-z\\\\-]+)+\"},{b:\"([a-z\\\\-]+\\\\.)+\\\\*\"}]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b\"},{cN:\"number\",b:\"\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b\",relevance:0},r]};return{aliases:[\"nginxconf\"],c:[e.HCM,{b:e.UIR+\"\\\\s+{\",rB:!0,e:\"{\",c:[{cN:\"section\",b:e.UIR}],relevance:0},{b:e.UIR+\"\\\\s\",e:\";|{\",rB:!0,c:[{cN:\"attribute\",b:e.UIR,starts:b}],relevance:0}],i:\"[^\\\\s\\\\}]\"}});hljs.registerLanguage(\"xml\",function(e){var c={cN:\"symbol\",b:\"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;\"},s={b:\"\\\\s\",c:[{cN:\"meta-keyword\",b:\"#?[a-z_][a-z1-9_-]+\",i:\"\\\\n\"}]},a=e.inherit(s,{b:\"\\\\(\",e:\"\\\\)\"}),t=e.inherit(e.ASM,{cN:\"meta-string\"}),l=e.inherit(e.QSM,{cN:\"meta-string\"}),r={eW:!0,i:/</,relevance:0,c:[{cN:\"attr\",b:\"[A-Za-z0-9\\\\._:-]+\",relevance:0},{b:/=\\s*/,relevance:0,c:[{cN:\"string\",endsParent:!0,v:[{b:/\"/,e:/\"/,c:[c]},{b:/'/,e:/'/,c:[c]},{b:/[^\\s\"'=<>`]+/}]}]}]};return{aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xjb\",\"xsd\",\"xsl\",\"plist\",\"wsf\",\"svg\"],cI:!0,c:[{cN:\"meta\",b:\"<![a-z]\",e:\">\",relevance:10,c:[s,l,t,a,{b:\"\\\\[\",e:\"\\\\]\",c:[{cN:\"meta\",b:\"<![a-z]\",e:\">\",c:[s,a,l,t]}]}]},e.C(\"\\x3c!--\",\"--\\x3e\",{relevance:10}),{b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",relevance:10},c,{cN:\"meta\",b:/<\\?xml/,e:/\\?>/,relevance:10},{b:/<\\?(php)?/,e:/\\?>/,sL:\"php\",c:[{b:\"/\\\\*\",e:\"\\\\*/\",skip:!0},{b:'b\"',e:'\"',skip:!0},{b:\"b'\",e:\"'\",skip:!0},e.inherit(e.ASM,{i:null,cN:null,c:null,skip:!0}),e.inherit(e.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:\"tag\",b:\"<style(?=\\\\s|>)\",e:\">\",k:{name:\"style\"},c:[r],starts:{e:\"</style>\",rE:!0,sL:[\"css\",\"xml\"]}},{cN:\"tag\",b:\"<script(?=\\\\s|>)\",e:\">\",k:{name:\"script\"},c:[r],starts:{e:\"<\\/script>\",rE:!0,sL:[\"actionscript\",\"javascript\",\"handlebars\",\"xml\"]}},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"name\",b:/[^\\/><\\s]+/,relevance:0},r]}]}});hljs.registerLanguage(\"markdown\",function(e){return{aliases:[\"md\",\"mkdown\",\"mkd\"],c:[{cN:\"section\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",relevance:0},{cN:\"bullet\",b:\"^\\\\s*([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",relevance:0}]},{cN:\"quote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"^```\\\\w*\\\\s*$\",e:\"^```[ ]*$\"},{b:\"`.+?`\"},{b:\"^( {4}|\\\\t)\",e:\"$\",relevance:0}]},{b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].*?[\\\\)\\\\]]\",rB:!0,c:[{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,rE:!0,relevance:0},{cN:\"link\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:!0,eE:!0},{cN:\"symbol\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:!0,eE:!0}],relevance:10},{b:/^\\[[^\\n]+\\]:/,rB:!0,c:[{cN:\"symbol\",b:/\\[/,e:/\\]/,eB:!0,eE:!0},{cN:\"link\",b:/:\\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage(\"properties\",function(e){var r=\"[ \\\\t\\\\f]*\",t=\"(\"+r+\"[:=]\"+r+\"|[ \\\\t\\\\f]+)\",n=\"([^\\\\\\\\\\\\W:= \\\\t\\\\f\\\\n]|\\\\\\\\.)+\",a=\"([^\\\\\\\\:= \\\\t\\\\f\\\\n]|\\\\\\\\.)+\",c={e:t,relevance:0,starts:{cN:\"string\",e:/$/,relevance:0,c:[{b:\"\\\\\\\\\\\\n\"}]}};return{cI:!0,i:/\\S/,c:[e.C(\"^\\\\s*[!#]\",\"$\"),{b:n+t,rB:!0,c:[{cN:\"attr\",b:n,endsParent:!0,relevance:0}],starts:c},{b:a+t,rB:!0,relevance:0,c:[{cN:\"meta\",b:a,endsParent:!0,relevance:0}],starts:c},{cN:\"attr\",relevance:0,b:a+r+\"$\"}]}});hljs.registerLanguage(\"bash\",function(e){var t={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},a={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,t,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[e.BE]}]};return{aliases:[\"sh\",\"zsh\"],l:/\\b-?[a-z\\._]+\\b/,k:{keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\",_:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"meta\",b:/^#![^\\n]+sh\\s*$/,relevance:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:!0,c:[e.inherit(e.TM,{b:/\\w[\\w\\d_]*/})],relevance:0},e.HCM,a,{cN:\"\",b:/\\\\\"/},{cN:\"string\",b:/'/,e:/'/},t]}});hljs.registerLanguage(\"dockerfile\",function(e){return{aliases:[\"docker\"],cI:!0,k:\"from maintainer expose env arg user onbuild stopsignal\",c:[e.HCM,e.ASM,e.QSM,e.NM,{bK:\"run cmd entrypoint volume add copy workdir label healthcheck shell\",starts:{e:/[^\\\\]$/,sL:\"bash\"}}],i:\"</\"}});hljs.registerLanguage(\"python\",function(e){var r={keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10\",built_in:\"Ellipsis NotImplemented\",literal:\"False None True\"},b={cN:\"meta\",b:/^(>>>|\\.\\.\\.) /},c={cN:\"subst\",b:/\\{/,e:/\\}/,k:r,i:/#/},a={b:/\\{\\{/,relevance:0},l={cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[e.BE,b],relevance:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[e.BE,b],relevance:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[e.BE,b,a,c]},{b:/(fr|rf|f)\"\"\"/,e:/\"\"\"/,c:[e.BE,b,a,c]},{b:/(u|r|ur)'/,e:/'/,relevance:10},{b:/(u|r|ur)\"/,e:/\"/,relevance:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},{b:/(fr|rf|f)'/,e:/'/,c:[e.BE,a,c]},{b:/(fr|rf|f)\"/,e:/\"/,c:[e.BE,a,c]},e.ASM,e.QSM]},n={cN:\"number\",relevance:0,v:[{b:e.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:e.CNR+\"[lLjJ]?\"}]},i={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",b,n,l,e.HCM]};return c.c=[l,n,b],{aliases:[\"py\",\"gyp\",\"ipython\"],k:r,i:/(<\\/|->|\\?)|=>/,c:[b,n,{bK:\"if\",relevance:0},l,e.HCM,{v:[{cN:\"function\",bK:\"def\"},{cN:\"class\",bK:\"class\"}],e:/:/,i:/[${=;\\n,]/,c:[e.UTM,i,{b:/->/,eW:!0,k:\"None\"}]},{cN:\"meta\",b:/^[\\t ]*@/,e:/$/},{b:/\\b(print|exec)\\(/}]}});hljs.registerLanguage(\"ini\",function(e){var b={cN:\"number\",relevance:0,v:[{b:/([\\+\\-]+)?[\\d]+_[\\d_]+/},{b:e.NR}]},a=e.C();a.v=[{b:/;/,e:/$/},{b:/#/,e:/$/}];var c={cN:\"variable\",v:[{b:/\\$[\\w\\d\"][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},r={cN:\"literal\",b:/\\bon|off|true|false|yes|no\\b/},n={cN:\"string\",c:[e.BE],v:[{b:\"'''\",e:\"'''\",relevance:10},{b:'\"\"\"',e:'\"\"\"',relevance:10},{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]};return{aliases:[\"toml\"],cI:!0,i:/\\S/,c:[a,{cN:\"section\",b:/\\[+/,e:/\\]+/},{b:/^[a-z0-9\\[\\]_\\.-]+(?=\\s*=\\s*)/,cN:\"attr\",starts:{e:/$/,c:[a,{b:/\\[/,e:/\\]/,c:[a,r,c,n,b,\"self\"],relevance:0},r,c,n,b]}}]}});hljs.registerLanguage(\"diff\",function(e){return{aliases:[\"patch\"],c:[{cN:\"meta\",relevance:10,v:[{b:/^@@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +@@$/},{b:/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},{b:/^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}]},{cN:\"comment\",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\\-{3}/,e:/$/},{b:/^\\*{3} /,e:/$/},{b:/^\\+{3}/,e:/$/},{b:/^\\*{15}$/}]},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"addition\",b:\"^\\\\!\",e:\"$\"}]}});hljs.registerLanguage(\"http\",function(e){var t=\"HTTP/[0-9\\\\.]+\";return{aliases:[\"https\"],i:\"\\\\S\",c:[{b:\"^\"+t,e:\"$\",c:[{cN:\"number\",b:\"\\\\b\\\\d{3}\\\\b\"}]},{b:\"^[A-Z]+ (.*?) \"+t+\"$\",rB:!0,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:!0,eE:!0},{b:t},{cN:\"keyword\",b:\"[A-Z]+\"}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:!0,i:\"\\\\n|\\\\s|=\",starts:{e:\"$\",relevance:0}},{b:\"\\\\n\\\\n\",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage(\"sql\",function(e){var t=e.C(\"--\",\"$\");return{cI:!0,i:/[<>{}*]/,c:[{bK:\"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with\",e:/;/,eW:!0,l:/[\\w\\.]+/,k:{keyword:\"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek\",literal:\"true false null unknown\",built_in:\"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\"},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage(\"vala\",function(e){return{k:{keyword:\"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override virtual delegate if while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var\",built_in:\"DBus GLib CCode Gee Object Gtk Posix\",literal:\"false true null\"},c:[{cN:\"class\",bK:\"class interface namespace\",e:\"{\",eE:!0,i:\"[^,:\\\\n\\\\s\\\\.]\",c:[e.UTM]},e.CLCM,e.CBCM,{cN:\"string\",b:'\"\"\"',e:'\"\"\"',relevance:5},e.ASM,e.QSM,e.CNM,{cN:\"meta\",b:\"^#\",e:\"$\",relevance:2}]}});hljs.registerLanguage(\"asciidoc\",function(e){return{aliases:[\"adoc\"],c:[e.C(\"^/{4,}\\\\n\",\"\\\\n/{4,}$\",{relevance:10}),e.C(\"^//\",\"$\",{relevance:0}),{cN:\"title\",b:\"^\\\\.\\\\w.*$\"},{b:\"^[=\\\\*]{4,}\\\\n\",e:\"\\\\n^[=\\\\*]{4,}$\",relevance:10},{cN:\"section\",relevance:10,v:[{b:\"^(={1,5}) .+?( \\\\1)?$\"},{b:\"^[^\\\\[\\\\]\\\\n]+?\\\\n[=\\\\-~\\\\^\\\\+]{2,}$\"}]},{cN:\"meta\",b:\"^:.+?:\",e:\"\\\\s\",eE:!0,relevance:10},{cN:\"meta\",b:\"^\\\\[.+?\\\\]$\",relevance:0},{cN:\"quote\",b:\"^_{4,}\\\\n\",e:\"\\\\n_{4,}$\",relevance:10},{cN:\"code\",b:\"^[\\\\-\\\\.]{4,}\\\\n\",e:\"\\\\n[\\\\-\\\\.]{4,}$\",relevance:10},{b:\"^\\\\+{4,}\\\\n\",e:\"\\\\n\\\\+{4,}$\",c:[{b:\"<\",e:\">\",sL:\"xml\",relevance:0}],relevance:10},{cN:\"bullet\",b:\"^(\\\\*+|\\\\-+|\\\\.+|[^\\\\n]+?::)\\\\s+\"},{cN:\"symbol\",b:\"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\\\s+\",relevance:10},{cN:\"strong\",b:\"\\\\B\\\\*(?![\\\\*\\\\s])\",e:\"(\\\\n{2}|\\\\*)\",c:[{b:\"\\\\\\\\*\\\\w\",relevance:0}]},{cN:\"emphasis\",b:\"\\\\B'(?!['\\\\s])\",e:\"(\\\\n{2}|')\",c:[{b:\"\\\\\\\\'\\\\w\",relevance:0}],relevance:0},{cN:\"emphasis\",b:\"_(?![_\\\\s])\",e:\"(\\\\n{2}|_)\",relevance:0},{cN:\"string\",v:[{b:\"``.+?''\"},{b:\"`.+?'\"}]},{cN:\"code\",b:\"(`.+?`|\\\\+.+?\\\\+)\",relevance:0},{cN:\"code\",b:\"^[ \\\\t]\",e:\"$\",relevance:0},{b:\"^'{3,}[ \\\\t]*$\",relevance:10},{b:\"(link:)?(http|https|ftp|file|irc|image:?):\\\\S+\\\\[.*?\\\\]\",rB:!0,c:[{b:\"(link|image:?):\",relevance:0},{cN:\"link\",b:\"\\\\w\",e:\"[^\\\\[]+\",relevance:0},{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,eE:!0,relevance:0}],relevance:10}]}});hljs.registerLanguage(\"json\",function(e){var i={literal:\"true false null\"},n=[e.CLCM,e.CBCM],c=[e.QSM,e.CNM],r={e:\",\",eW:!0,eE:!0,c:c,k:i},t={b:\"{\",e:\"}\",c:[{cN:\"attr\",b:/\"/,e:/\"/,c:[e.BE],i:\"\\\\n\"},e.inherit(r,{b:/:/})].concat(n),i:\"\\\\S\"},a={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(r)],i:\"\\\\S\"};return c.push(t,a),n.forEach(function(e){c.push(e)}),{c:c,k:i,i:\"\\\\S\"}});hljs.registerLanguage(\"rust\",function(e){var t=\"([ui](8|16|32|64|128|size)|f(32|64))?\",r=\"drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!\";return{aliases:[\"rs\"],k:{keyword:\"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield\",literal:\"true false Some None Ok Err\",built_in:r},l:e.IR+\"!?\",i:\"</\",c:[e.CLCM,e.C(\"/\\\\*\",\"\\\\*/\",{c:[\"self\"]}),e.inherit(e.QSM,{b:/b?\"/,i:null}),{cN:\"string\",v:[{b:/r(#*)\"(.|\\n)*?\"\\1(?!#)/},{b:/b?'\\\\?(x\\w{2}|u\\w{4}|U\\w{8}|.)'/}]},{cN:\"symbol\",b:/'[a-zA-Z_][a-zA-Z0-9_]*/},{cN:\"number\",v:[{b:\"\\\\b0b([01_]+)\"+t},{b:\"\\\\b0o([0-7_]+)\"+t},{b:\"\\\\b0x([A-Fa-f0-9_]+)\"+t},{b:\"\\\\b(\\\\d[\\\\d_]*(\\\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)\"+t}],relevance:0},{cN:\"function\",bK:\"fn\",e:\"(\\\\(|<)\",eE:!0,c:[e.UTM]},{cN:\"meta\",b:\"#\\\\!?\\\\[\",e:\"\\\\]\",c:[{cN:\"meta-string\",b:/\"/,e:/\"/}]},{cN:\"class\",bK:\"type\",e:\";\",c:[e.inherit(e.UTM,{endsParent:!0})],i:\"\\\\S\"},{cN:\"class\",bK:\"trait enum struct union\",e:\"{\",c:[e.inherit(e.UTM,{endsParent:!0})],i:\"[\\\\w\\\\d]\"},{b:e.IR+\"::\",k:{built_in:r}},{b:\"->\"}]}});hljs.registerLanguage(\"awk\",function(e){return{k:{keyword:\"BEGIN END if else while do for in break continue delete next nextfile function func exit|10\"},c:[{cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},{cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,relevance:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,relevance:10},{b:/(u|r|ur)'/,e:/'/,relevance:10},{b:/(u|r|ur)\"/,e:/\"/,relevance:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},e.ASM,e.QSM]},e.RM,e.HCM,e.NM]}});hljs.registerLanguage(\"java\",function(e){var a=\"false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do\",t={cN:\"number\",b:\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",relevance:0};return{aliases:[\"jsp\"],k:a,i:/<\\/|#/,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{b:/\\w+@/,relevance:0},{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:\"class\",bK:\"class interface\",e:/[{;=]/,eE:!0,k:\"class interface\",i:/[:\"\\[\\]]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"new throw return else\",relevance:0},{cN:\"function\",b:\"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\\\s*,\\\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\\\s+)+\"+e.UIR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,relevance:0,c:[e.UTM]},{cN:\"params\",b:/\\(/,e:/\\)/,k:a,relevance:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},t,{cN:\"meta\",b:\"@[A-Za-z]+\"}]}});hljs.registerLanguage(\"cs\",function(e){var a={keyword:\"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield\",literal:\"null false true\"},i={cN:\"number\",v:[{b:\"\\\\b(0b[01']+)\"},{b:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)(u|U|l|L|ul|UL|f|F|b|B)\"},{b:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"}],relevance:0},c={cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},r=e.inherit(c,{i:/\\n/}),n={cN:\"subst\",b:\"{\",e:\"}\",k:a},t=e.inherit(n,{i:/\\n/}),s={cN:\"string\",b:/\\$\"/,e:'\"',i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},e.BE,t]},l={cN:\"string\",b:/\\$@\"/,e:'\"',c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},n]},b=e.inherit(l,{i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},t]});n.c=[l,s,c,e.ASM,e.QSM,i,e.CBCM],t.c=[b,s,r,e.ASM,e.QSM,i,e.inherit(e.CBCM,{i:/\\n/})];var o={v:[l,s,c,e.ASM,e.QSM]},d=e.IR+\"(<\"+e.IR+\"(\\\\s*,\\\\s*\"+e.IR+\")*>)?(\\\\[\\\\])?\";return{aliases:[\"csharp\",\"c#\"],k:a,i:/::/,c:[e.C(\"///\",\"$\",{rB:!0,c:[{cN:\"doctag\",v:[{b:\"///\",relevance:0},{b:\"\\x3c!--|--\\x3e\"},{b:\"</?\",e:\">\"}]}]}),e.CLCM,e.CBCM,{cN:\"meta\",b:\"#\",e:\"$\",k:{\"meta-keyword\":\"if else elif endif define undef warning error line region endregion pragma checksum\"}},o,i,{bK:\"class interface\",e:/[{;=]/,i:/[^\\s:,]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:\"namespace\",e:/[{;=]/,i:/[^\\s:]/,c:[e.inherit(e.TM,{b:\"[a-zA-Z](\\\\.?\\\\w)*\"}),e.CLCM,e.CBCM]},{cN:\"meta\",b:\"^\\\\s*\\\\[\",eB:!0,e:\"\\\\]\",eE:!0,c:[{cN:\"meta-string\",b:/\"/,e:/\"/}]},{bK:\"new return throw await else\",relevance:0},{cN:\"function\",b:\"(\"+d+\"\\\\s+)+\"+e.IR+\"\\\\s*\\\\(\",rB:!0,e:/\\s*[{;=]/,eE:!0,k:a,c:[{b:e.IR+\"\\\\s*\\\\(\",rB:!0,c:[e.TM],relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:a,relevance:0,c:[o,i,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage(\"mathematica\",function(e){return{aliases:[\"mma\",\"wl\"],l:\"(\\\\$|\\\\b)\"+e.IR+\"\\\\b\",k:\"AASTriangle AbelianGroup Abort AbortKernels AbortProtect AbortScheduledTask Above Abs AbsArg AbsArgPlot Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AcceptanceThreshold AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Activate Active ActiveClassification ActiveClassificationObject ActiveItem ActivePrediction ActivePredictionObject ActiveStyle AcyclicGraphQ AddOnHelpPath AddSides AddTo AddToSearchIndex AddUsers AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AdministrativeDivisionData AffineHalfSpace AffineSpace AffineStateSpaceModel AffineTransform After AggregatedEntityClass AggregationLayer AircraftData AirportData AirPressureData AirTemperatureData AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowAdultContent AllowedCloudExtraParameters AllowedCloudParameterExtensions AllowedDimensions AllowedFrequencyRange AllowedHeads AllowGroupClose AllowIncomplete AllowInlineCells AllowKernelInitialization AllowLooseGrammar AllowReverseGroupClose AllowScriptLevelChange AllTrue Alphabet AlphabeticOrder AlphabeticSort AlphaChannel AlternateImage AlternatingFactorial AlternatingGroup AlternativeHypothesis Alternatives AltitudeMethod AmbientLight AmbiguityFunction AmbiguityList Analytic AnatomyData AnatomyForm AnatomyPlot3D AnatomySkinStyle AnatomyStyling AnchoredSearch And AndersonDarlingTest AngerJ AngleBisector AngleBracket AnglePath AnglePath3D AngleVector AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning AnimationRunTime AnimationTimeIndex Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotate Annotation AnnotationDelete AnnotationNames AnnotationRules AnnotationValue Annuity AnnuityDue Annulus AnomalyDetection AnomalyDetectorFunction Anonymous Antialiasing AntihermitianMatrixQ Antisymmetric AntisymmetricMatrixQ Antonyms AnyOrder AnySubset AnyTrue Apart ApartSquareFree APIFunction Appearance AppearanceElements AppearanceRules AppellF1 Append AppendCheck AppendLayer AppendTo ApplicationIdentificationKey Apply ApplySides ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcCurvature ARCHProcess ArcLength ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Area Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess Around AroundReplace ARProcess Array ArrayComponents ArrayDepth ArrayFilter ArrayFlatten ArrayMesh ArrayPad ArrayPlot ArrayQ ArrayResample ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads ASATriangle Ask AskAppend AskConfirm AskDisplay AskedQ AskedValue AskFunction AskState AskTemplateDisplay AspectRatio AspectRatioFixed Assert AssociateTo Association AssociationFormat AssociationMap AssociationQ AssociationThread AssumeDeterministic Assuming Assumptions AstronomicalData AsymptoticDSolveValue AsymptoticEqual AsymptoticEquivalent AsymptoticGreater AsymptoticGreaterEqual AsymptoticIntegrate AsymptoticLess AsymptoticLessEqual AsymptoticOutputTracker AsymptoticRSolveValue AsymptoticSolve AsymptoticSum Asynchronous AsynchronousTaskObject AsynchronousTasks Atom AtomCoordinates AtomCount AtomDiagramCoordinates AtomList AtomQ AttentionLayer Attributes Audio AudioAmplify AudioAnnotate AudioAnnotationLookup AudioBlockMap AudioCapture AudioChannelAssignment AudioChannelCombine AudioChannelMix AudioChannels AudioChannelSeparate AudioData AudioDelay AudioDelete AudioDevice AudioDistance AudioFade AudioFrequencyShift AudioGenerator AudioIdentify AudioInputDevice AudioInsert AudioIntervals AudioJoin AudioLabel AudioLength AudioLocalMeasurements AudioLooping AudioLoudness AudioMeasurements AudioNormalize AudioOutputDevice AudioOverlay AudioPad AudioPan AudioPartition AudioPause AudioPitchShift AudioPlay AudioPlot AudioQ AudioRecord AudioReplace AudioResample AudioReverb AudioSampleRate AudioSpectralMap AudioSpectralTransformation AudioSplit AudioStop AudioStream AudioStreams AudioTimeStretch AudioTrim AudioType AugmentedPolyhedron AugmentedSymmetricPolynomial Authenticate Authentication AuthenticationDialog AutoAction Autocomplete AutocompletionFunction AutoCopy AutocorrelationTest AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutoQuoteCharacters AutoRefreshed AutoRemove AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords AutoSubmitting Axes AxesEdge AxesLabel AxesOrigin AxesStyle AxiomaticTheory AxisBabyMonsterGroupB Back Background BackgroundAppearance BackgroundTasksSettings Backslash Backsubstitution Backward Ball Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarcodeImage BarcodeRecognize BaringhausHenzeTest BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseDecode BaseEncode BaseForm Baseline BaselinePosition BaseStyle BasicRecurrentLayer BatchNormalizationLayer BatchSize BatesDistribution BattleLemarieWavelet BayesianMaximization BayesianMaximizationObject BayesianMinimization BayesianMinimizationObject Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized Between BetweennessCentrality BeveledPolyhedron BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryDeserialize BinaryDistance BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinarySerialize BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BiquadraticFilterModel BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor BiweightLocation BiweightMidvariance Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockchainAddressData BlockchainBase BlockchainBlockData BlockchainContractValue BlockchainData BlockchainGet BlockchainKeyEncode BlockchainPut BlockchainTokenData BlockchainTransaction BlockchainTransactionData BlockchainTransactionSign BlockchainTransactionSubmit BlockMap BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bond BondCount BondList BondQ Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms BooleanQ BooleanRegion Booleans BooleanStrings BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryDiscretizeGraphics BoundaryDiscretizeRegion BoundaryMesh BoundaryMeshRegion BoundaryMeshRegionQ BoundaryStyle BoundedRegionQ BoundingRegion Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxObject BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break BridgeData BrightnessEqualize BroadcastStationData Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurve3DBoxOptions BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BSplineSurface3DBoxOptions BubbleChart BubbleChart3D BubbleScale BubbleSizes BuildingData BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteArray ByteArrayFormat ByteArrayQ ByteArrayToString ByteCount ByteOrderingC CachedValue CacheGraphics CachePersistence CalendarConvert CalendarData CalendarType Callout CalloutMarker CalloutStyle CallPacket CanberraDistance Cancel CancelButton CandlestickChart CanonicalGraph CanonicalizePolygon CanonicalizePolyhedron CanonicalName CanonicalWarpingCorrespondence CanonicalWarpingDistance CantorMesh CantorStaircase Cap CapForm CapitalDifferentialD Capitalize CapsuleShape CaptureRunning CardinalBSplineBasis CarlemanLinearize CarmichaelLambda CaseOrdering Cases CaseSensitive Cashflow Casoratian Catalan CatalanNumber Catch Catenate CatenateLayer CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling CelestialSystem Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEvaluationLanguage CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellLabelStyle CellLabelTemplate CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterArray CenterDot CentralFeature CentralMoment CentralMomentGeneratingFunction Cepstrogram CepstrogramArray CepstrumArray CForm ChampernowneNumber ChangeOptions ChannelBase ChannelBrokerAction ChannelDatabin ChannelHistoryLength ChannelListen ChannelListener ChannelListeners ChannelListenerWait ChannelObject ChannelPreSendFunction ChannelReceiverFunction ChannelSend ChannelSubscribers ChanVeseBinarize Character CharacterCounts CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterName CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop ChromaticityPlot ChromaticityPlot3D ChromaticPolynomial Circle CircleBox CircleDot CircleMinus CirclePlus CirclePoints CircleThrough CircleTimes CirculantGraph CircularOrthogonalMatrixDistribution CircularQuaternionMatrixDistribution CircularRealMatrixDistribution CircularSymplecticMatrixDistribution CircularUnitaryMatrixDistribution Circumsphere CityData ClassifierFunction ClassifierInformation ClassifierMeasurements ClassifierMeasurementsObject Classify ClassPriors Clear ClearAll ClearAttributes ClearCookies ClearPermissions ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipPlanesStyle ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent CloudAccountData CloudBase CloudConnect CloudDeploy CloudDirectory CloudDisconnect CloudEvaluate CloudExport CloudExpression CloudExpressions CloudFunction CloudGet CloudImport CloudLoggingData CloudObject CloudObjectInformation CloudObjectInformationData CloudObjectNameFormat CloudObjects CloudObjectURLType CloudPublish CloudPut CloudRenderingMethod CloudSave CloudShare CloudSubmit CloudSymbol CloudUnshare ClusterClassify ClusterDissimilarityFunction ClusteringComponents ClusteringTree CMYKColor Coarse CodeAssistOptions Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorBalance ColorCombine ColorConvert ColorCoverage ColorData ColorDataFunction ColorDetect ColorDistance ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQ ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorsNear ColorSpace ColorToneMapping Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CombinedEntityClass CombinerFunction CometData CommonDefaultFormatTypes Commonest CommonestFilter CommonName CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompanyData CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledCodeFunction CompiledFunction CompilerOptions Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComplexListPlot ComplexPlot ComplexPlot3D ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries CompositeQ Composition CompoundElement CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData ComputeUncertainty Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath ConformAudio ConformImages Congruent ConicHullRegion ConicHullRegion3DBox ConicHullRegionBox ConicOptimization Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphComponents ConnectedGraphQ ConnectedMeshComponents ConnectedMoleculeComponents ConnectedMoleculeQ ConnectionSettings ConnectLibraryCallbackFunction ConnectSystemModelComponents ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray ConstantArrayLayer ConstantImage ConstantPlusLayer ConstantRegionQ Constants ConstantTimesLayer ConstellationData ConstrainedMax ConstrainedMin Construct Containing ContainsAll ContainsAny ContainsExactly ContainsNone ContainsOnly ContentFieldOptions ContentLocationFunction ContentObject ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTask ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean ContrastiveLossLayer Control ControlActive ControlAlignment ControlGroupContentsBox ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket ConvexHullMesh ConvexPolygonQ ConvexPolyhedronQ ConvolutionLayer Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CookieFunction Cookies CoordinateBoundingBox CoordinateBoundingBoxArray CoordinateBounds CoordinateBoundsArray CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDatabin CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CountDistinct CountDistinctBy CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Counts CountsBy Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateCellID CreateChannel CreateCloudExpression CreateDatabin CreateDataSystemModel CreateDialog CreateDirectory CreateDocument CreateFile CreateIntermediateDirectories CreateManagedLibraryExpression CreateNotebook CreatePalette CreatePalettePacket CreatePermissionsGroup CreateScheduledTask CreateSearchIndex CreateSystemModel CreateTemporary CreateUUID CreateWindow CriterionFunction CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossEntropyLossLayer CrossingCount CrossingDetect CrossingPolygon CrossMatrix Csc Csch CTCLossLayer Cube CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrencyConvert CurrentDate CurrentImage CurrentlySpeakingPacket CurrentNotebookImage CurrentScreenImage CurrentValue Curry CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecompositionD DagumDistribution DamData DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DatabaseConnect DatabaseDisconnect DatabaseReference Databin DatabinAdd DatabinRemove Databins DatabinUpload DataCompression DataDistribution DataRange DataReversed Dataset Date DateBounds Dated DateDelimiters DateDifference DatedUnit DateFormat DateFunction DateHistogram DateList DateListLogPlot DateListPlot DateListStepPlot DateObject DateObjectQ DateOverlapsQ DatePattern DatePlus DateRange DateReduction DateString DateTicksFormat DateValue DateWithinQ DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayHemisphere DaylightQ DayMatchQ DayName DayNightTerminator DayPlus DayRange DayRound DeBruijnGraph DeBruijnSequence Debug DebugTag Decapitalize Decimal DecimalForm DeclareKnownSymbols DeclarePackage Decompose DeconvolutionLayer Decrement Decrypt DecryptFile DedekindEta DeepSpaceProbeData Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultPrintPrecision DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValue DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod DefineResourceFunction Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic DEigensystem DEigenvalues Deinitialization Del DelaunayMesh Delayed Deletable Delete DeleteAnomalies DeleteBorderComponents DeleteCases DeleteChannel DeleteCloudExpression DeleteContents DeleteDirectory DeleteDuplicates DeleteDuplicatesBy DeleteFile DeleteMissing DeleteObject DeletePermissionsKey DeleteSearchIndex DeleteSmallComponents DeleteStopwords DeleteWithContents DeletionWarning DelimitedArray DelimitedSequence Delimiter DelimiterFlashTime DelimiterMatching Delimiters DeliveryFunction Dendrogram Denominator DensityGraphics DensityHistogram DensityPlot DensityPlot3D DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DerivedKey DescriptorStateSpace DesignMatrix DestroyAfterEvaluation Det DeviceClose DeviceConfigure DeviceExecute DeviceExecuteAsynchronous DeviceObject DeviceOpen DeviceOpenQ DeviceRead DeviceReadBuffer DeviceReadLatest DeviceReadList DeviceReadTimeSeries Devices DeviceStreams DeviceWrite DeviceWriteBuffer DGaussianWavelet DiacriticalPositioning Diagonal DiagonalizableMatrixQ DiagonalMatrix DiagonalMatrixQ Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DictionaryWordQ DifferenceDelta DifferenceOrder DifferenceQuotient DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitalSignature DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralAngle DihedralGroup Dilation DimensionalCombinations DimensionalMeshComponents DimensionReduce DimensionReducerFunction DimensionReduction Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletBeta DirichletCharacter DirichletCondition DirichletConvolve DirichletDistribution DirichletEta DirichletL DirichletLambda DirichletTransform DirichletWindow DisableConsolePrintPacket DisableFormatting DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLimit DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscreteMaxLimit DiscreteMinLimit DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform DiscretizeGraphics DiscretizeRegion Discriminant DisjointQ Disjunction Disk DiskBox DiskMatrix DiskSegment Dispatch DispatchQ DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceMatrix DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers DivideSides Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentGenerator DocumentGeneratorInformation DocumentGeneratorInformationData DocumentGenerators DocumentNotebook DocumentWeightingRules Dodecahedron DomainRegistrationInformation DominantColors DOSTextFormat Dot DotDashed DotEqual DotLayer DotPlusLayer Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DropoutLayer DSolve DSolveValue Dt DualLinearProgramming DualPolyhedron DualSystemsModel DumpGet DumpSave DuplicateFreeQ Duration Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicGeoGraphics DynamicImage DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptionsE EarthImpactData EarthquakeData EccentricityCentrality Echo EchoFunction EclipseType EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeContract EdgeCost EdgeCount EdgeCoverQ EdgeCycleMatrix EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight EdgeWeightedGraphQ Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData ElementwiseLayer ElidedForms Eliminate EliminationOrder Ellipsoid EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmbedCode EmbeddedHTML EmbeddedService EmbeddingLayer EmbeddingObject EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EmptyRegion EnableConsolePrintPacket Enabled Encode Encrypt EncryptedObject EncryptFile End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfBuffer EndOfFile EndOfLine EndOfString EndPackage EngineEnvironment EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entity EntityClass EntityClassList EntityCopies EntityFunction EntityGroup EntityInstance EntityList EntityPrefetch EntityProperties EntityProperty EntityPropertyClass EntityRegister EntityStore EntityStores EntityTypeName EntityUnregister EntityValue Entropy EntropyFilter Environment Epilog EpilogFunction Equal EqualColumns EqualRows EqualTilde EqualTo EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EscapeRadius EstimatedBackground EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerAngles EulerCharacteristic EulerE EulerGamma EulerianGraphQ EulerMatrix EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluateScheduledTask EvaluationBox EvaluationCell EvaluationCompletionAction EvaluationData EvaluationElements EvaluationEnvironment EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels EventSeries ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludedLines ExcludedPhysicalQuantities ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog ExoplanetData Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi ExpirationDate Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportByteArray ExportForm ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpressionUUID ExpToTrig ExtendedEntityClass ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalBundle ExternalCall ExternalDataCharacterEncoding ExternalEvaluate ExternalFunction ExternalFunctionName ExternalObject ExternalOptions ExternalSessionObject ExternalSessions ExternalTypeSignature ExternalValue Extract ExtractArchive ExtractLayer ExtremeValueDistributionFaceForm FaceGrids FaceGridsStyle FacialFeatures Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail Failure FailureAction FailureDistribution FailureQ False FareySequence FARIMAProcess FeatureDistance FeatureExtract FeatureExtraction FeatureExtractor FeatureExtractorFunction FeatureNames FeatureNearest FeatureSpacePlot FeatureSpacePlot3D FeatureTypes FEDisableConsolePrintPacket FeedbackLinearize FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket FetalGrowthData Fibonacci Fibonorial FieldCompletionFunction FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileConvert FileDate FileExistsQ FileExtension FileFormat FileHandler FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameForms FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileSize FileSystemMap FileSystemScan FileTemplate FileTemplateApply FileType FilledCurve FilledCurveBox FilledCurveBoxOptions Filling FillingStyle FillingTransform FilteredEntityClass FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindAnomalies FindArgMax FindArgMin FindChannels FindClique FindClusters FindCookies FindCurvePath FindCycle FindDevices FindDistribution FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEdgeIndependentPaths FindEquationalProof FindEulerianCycle FindExternalEvaluators FindFaces FindFile FindFit FindFormula FindFundamentalCycles FindGeneratingFunction FindGeoLocation FindGeometricConjectures FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindHamiltonianPath FindHiddenMarkovStates FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMatchingColor FindMaximum FindMaximumFlow FindMaxValue FindMeshDefects FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindMoleculeSubstructure FindPath FindPeaks FindPermutation FindPostmanTour FindProcessParameters FindRepeat FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindSpanningTree FindSystemModelEquilibrium FindTextualAnswer FindThreshold FindTransientRepeat FindVertexCover FindVertexCut FindVertexIndependentPaths Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstCase FirstPassageTimeDistribution FirstPosition FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FitRegularization FittedModel FixedOrder FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlattenLayer FlatTopWindow FlipView Floor FlowPolynomial FlushPrintOutputPacket Fold FoldList FoldPair FoldPairList FollowRedirects Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FormControl FormFunction FormLayoutFunction FormObject FormPage FormTheme FormulaData FormulaLookup FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalGaussianNoiseProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameRate FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrenetSerretSystem FrequencySamplingFilterKernel FresnelC FresnelF FresnelG FresnelS Friday FrobeniusNumber FrobeniusSolve FromAbsoluteTime FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS FromEntity FromJulianDate FromLetterNumber FromPolarCoordinates FromRomanNumeral FromSphericalCoordinates FromUnixTime Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullInformationOutputRegulator FullOptions FullRegion FullSimplify Function FunctionCompile FunctionCompileExport FunctionCompileExportByteArray FunctionCompileExportLibrary FunctionCompileExportString FunctionDomain FunctionExpand FunctionInterpolation FunctionPeriod FunctionRange FunctionSpace FussellVeselyImportanceGaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins GalaxyData GalleryView Gamma GammaDistribution GammaRegularized GapPenalty GARCHProcess GatedRecurrentLayer Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianOrthogonalMatrixDistribution GaussianSymplecticMatrixDistribution GaussianUnitaryMatrixDistribution GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateAsymmetricKeyPair GenerateConditions GeneratedCell GeneratedDocumentBinding GenerateDerivedKey GenerateDigitalSignature GenerateDocument GeneratedParameters GeneratedQuantityMagnitudes GenerateHTTPResponse GenerateSecuredAuthenticationKey GenerateSymmetricKey GeneratingFunction GeneratorDescription GeneratorHistoryLength GeneratorOutputType Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeoAntipode GeoArea GeoArraySize GeoBackground GeoBoundingBox GeoBounds GeoBoundsRegion GeoBubbleChart GeoCenter GeoCircle GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDisk GeoDisplacement GeoDistance GeoDistanceList GeoElevationData GeoEntities GeoGraphics GeogravityModelData GeoGridDirectionDifference GeoGridLines GeoGridLinesStyle GeoGridPosition GeoGridRange GeoGridRangePadding GeoGridUnitArea GeoGridUnitDistance GeoGridVector GeoGroup GeoHemisphere GeoHemisphereBoundary GeoHistogram GeoIdentify GeoImage GeoLabels GeoLength GeoListPlot GeoLocation GeologicalPeriodData GeomagneticModelData GeoMarker GeometricAssertion GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricScene GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoModel GeoNearest GeoPath GeoPosition GeoPositionENU GeoPositionXYZ GeoProjection GeoProjectionData GeoRange GeoRangePadding GeoRegionValuePlot GeoResolution GeoScaleBar GeoServer GeoSmoothHistogram GeoStreamPlot GeoStyling GeoStylingImageFunction GeoVariant GeoVector GeoVectorENU GeoVectorPlot GeoVectorXYZ GeoVisibleRegion GeoVisibleRegionBoundary GeoWithinQ GeoZoomLevel GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenAngle GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter GrammarApply GrammarRules GrammarToken Graph Graph3D GraphAssortativity GraphAutomorphismGroup GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel Greater GreaterEqual GreaterEqualLess GreaterEqualThan GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterThan GreaterTilde Green GreenFunction Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupBy GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators Groupings GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain GroupTogetherGrouping GroupTogetherNestedGrouping GrowCutComponents Gudermannian GuidedFilter GumbelDistributionHaarWavelet HadamardMatrix HalfLine HalfNormalDistribution HalfPlane HalfSpace HamiltonianGraphQ HammingDistance HammingWindow HandlerFunctions HandlerFunctionsKeys HankelH1 HankelH2 HankelMatrix HankelTransform HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash Haversine HazardFunction Head HeadCompose HeaderLines Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings Here HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenMarkovProcess HiddenSurface Highlighted HighlightGraph HighlightImage HighlightMesh HighpassFilter HigmanSimsGroupHS HilbertCurve HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HistoricalPeriodData HitMissTransform HITSCentrality HjorthDistribution HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HostLookup HotellingTSquareDistribution HoytDistribution HTMLSave HTTPErrorResponse HTTPRedirect HTTPRequest HTTPRequestData HTTPResponse Hue HumanGrowthData HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyperplane Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestDataI IconData Iconize IconizedObject IconRules Icosahedron Identity IdentityMatrix If IgnoreCase IgnoreDiacritics IgnorePunctuation IgnoreSpellCheck IgnoringInactive Im Image Image3D Image3DProjection Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageApplyIndexed ImageAspectRatio ImageAssemble ImageAugmentationLayer ImageBoundingBoxes ImageCache ImageCacheValid ImageCapture ImageCaptureFunction ImageCases ImageChannels ImageClip ImageCollage ImageColorSpace ImageCompose ImageContainsQ ImageContents ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDisplacements ImageDistance ImageEffect ImageExposureCombine ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageFocusCombine ImageForestingComponents ImageFormattingWidth ImageForwardTransformation ImageGraphics ImageHistogram ImageIdentify ImageInstanceQ ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarker ImageMarkers ImageMeasurements ImageMesh ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImagePosition ImagePreviewFunction ImagePyramid ImagePyramidApply ImageQ ImageRangeCache ImageRecolor ImageReflect ImageRegion ImageResize ImageResolution ImageRestyle ImageRotate ImageRotated ImageSaliencyFilter ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions ImagingDevice ImplicitRegion Implies Import ImportAutoReplacements ImportByteArray ImportOptions ImportString ImprovementImportance In Inactivate Inactive IncidenceGraph IncidenceList IncidenceMatrix IncludeAromaticBonds IncludeConstantBasis IncludeDefinitions IncludeDirectories IncludeFileExtension IncludeGeneratorTasks IncludeHydrogens IncludeInflections IncludeMetaInformation IncludePods IncludeQuantities IncludeRelatedTables IncludeSingularTerm IncludeWindowTimes Increment IndefiniteMatrixQ Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentPhysicalQuantity IndependentUnit IndependentUnitDimension IndependentVertexSetQ Indeterminate IndeterminateThreshold IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers InfiniteLine InfinitePlane Infinity Infix InflationAdjust InflationMethod Information InformationData InformationDataGrid Inherited InheritScope InhomogeneousPoissonProcess InitialEvaluationHistory Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InitializationObjects InitializationValue Initialize InitialSeeding InlineCounterAssignments InlineCounterIncrements InlineRules Inner InnerPolygon InnerPolyhedron Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionFunction InsertionPointObject InsertLinebreaks InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Insphere Install InstallService InstanceNormalizationLayer InString Integer IntegerDigits IntegerExponent IntegerLength IntegerName IntegerPart IntegerPartitions IntegerQ IntegerReverse Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction Interpreter InterpretTemplate InterquartileRange Interrupt InterruptSettings IntersectingQ Intersection Interval IntervalIntersection IntervalMarkers IntervalMarkersStyle IntervalMemberQ IntervalSlider IntervalUnion Into Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHankelTransform InverseHaversine InverseImagePyramid InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InverseMellinTransform InversePermutation InverseRadon InverseRadonTransform InverseSeries InverseShortTimeFourier InverseSpectrogram InverseSurvivalFunction InverseTransformedRegion InverseWaveletTransform InverseWeierstrassP InverseWishartMatrixDistribution InverseZTransform Invisible InvisibleApplication InvisibleTimes IPAddress IrreduciblePolynomialQ IslandData IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemAspectRatio ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcessJaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join JoinAcross Joined JoinedCurve JoinedCurveBox JoinedCurveBoxOptions JoinForm JordanDecomposition JordanModelDecomposition JulianDate JuliaSetBoettcher JuliaSetIterationCount JuliaSetPlot JuliaSetPointsK KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KEdgeConnectedComponents KEdgeConnectedGraphQ KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelFunction KernelMixtureDistribution Kernels Ket Key KeyCollisionFunction KeyComplement KeyDrop KeyDropFrom KeyExistsQ KeyFreeQ KeyIntersection KeyMap KeyMemberQ KeypointStrength Keys KeySelect KeySort KeySortBy KeyTake KeyUnion KeyValueMap KeyValuePattern Khinchin KillProcess KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnapsackSolve KnightTourGraph KnotData KnownUnitQ KochCurve KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter KVertexConnectedComponents KVertexConnectedGraphQLABColor Label Labeled LabeledSlider LabelingFunction LabelingSize LabelStyle LabelVisibility LaguerreL LakeData LambdaComponents LambertW LaminaData LanczosWindow LandauDistribution Language LanguageCategory LanguageData LanguageIdentify LanguageOptions LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCHColor LCM LeaderSize LeafCount LeapYearQ LearnDistribution LearnedDistribution LearningRate LearningRateMultipliers LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessEqualThan LessFullEqual LessGreater LessLess LessSlantEqual LessThan LessTilde LetterCharacter LetterCounts LetterNumber LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryDataType LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox Line3DBoxOptions LinearFilter LinearFractionalOptimization LinearFractionalTransform LinearGradientImage LinearizingTransformationData LinearLayer LinearModelFit LinearOffsetFunction LinearOptimization LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBoxOptions LineBreak LinebreakAdjustments LineBreakChart LinebreakSemicolonWeighting LineBreakWithin LineColor LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRankCentrality LinkRead LinkReadHeld LinkReadyQ Links LinkService LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot ListDensityPlot3D Listen ListFormat ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListSliceContourPlot3D ListSliceDensityPlot3D ListSliceVectorPlot3D ListStepPlot ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalAdaptiveBinarize LocalCache LocalClusteringCoefficient LocalizeDefinitions LocalizeVariables LocalObject LocalObjects LocalResponseNormalizationLayer LocalSubmit LocalSymbol LocalTime LocalTimeZone LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogisticSigmoid LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongestOrderedSequence LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow LongShortTermMemoryLayer Lookup Loopback LoopFreeGraphQ LossFunction LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowerTriangularMatrixQ LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LunarEclipse LUVColor LyapunovSolve LyonsGroupLyMachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MailAddressValidation MailExecute MailFolder MailItem MailReceiverFunction MailResponseFunction MailSearch MailServerConnect MailServerConnection MailSettings MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules ManagedLibraryExpressionID ManagedLibraryExpressionQ MandelbrotSetBoettcher MandelbrotSetDistance MandelbrotSetIterationCount MandelbrotSetMemberQ MandelbrotSetPlot MangoldtLambda ManhattanDistance Manipulate Manipulator MannedSpaceMissionData MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarchenkoPasturDistribution MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicalFunctionData MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixNormalDistribution MatrixPlot MatrixPower MatrixPropertyDistribution MatrixQ MatrixRank MatrixTDistribution Max MaxBend MaxCellMeasure MaxColorDistance MaxDetect MaxDuration MaxExtraBandwidths MaxExtraConditions MaxFeatureDisplacement MaxFeatures MaxFilter MaximalBy Maximize MaxItems MaxIterations MaxLimit MaxMemoryUsed MaxMixtureKernels MaxOverlapFraction MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxTrainingRounds MaxValue MaxwellDistribution MaxWordGap McLaughlinGroupMcL Mean MeanAbsoluteLossLayer MeanAround MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter MeanSquaredLossLayer Median MedianDeviation MedianFilter MedicalTestData Medium MeijerG MeijerGReduce MeixnerDistribution MellinConvolve MellinTransform MemberQ MemoryAvailable MemoryConstrained MemoryConstraint MemoryInUse MengerMesh Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuList MenuPacket MenuSortingValue MenuStyle MenuView Merge MergeDifferences MergingFunction MersennePrimeExponent MersennePrimeExponentQ Mesh MeshCellCentroid MeshCellCount MeshCellHighlight MeshCellIndex MeshCellLabel MeshCellMarker MeshCellMeasure MeshCellQuality MeshCells MeshCellShapeFunction MeshCellStyle MeshCoordinates MeshFunctions MeshPrimitives MeshQualityGoal MeshRange MeshRefinementFunction MeshRegion MeshRegionQ MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageObject MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation MeteorShowerData Method MethodOptions MexicanHatWavelet MeyerWavelet Midpoint Min MinColorDistance MinDetect MineralData MinFilter MinimalBy MinimalPolynomial MinimalStateSpaceModel Minimize MinimumTimeIncrement MinIntervalSize MinkowskiQuestionMark MinLimit MinMax MinorPlanetData Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingBehavior MissingDataMethod MissingDataRules MissingQ MissingString MissingStyle MissingValuePattern MittagLefflerE MixedFractionParts MixedGraphQ MixedMagnitude MixedRadix MixedRadixQuantity MixedUnit MixtureDistribution Mod Modal Mode Modular ModularInverse ModularLambda Module Modulus MoebiusMu Molecule MoleculeContainsQ MoleculeEquivalentQ MoleculeGraph MoleculeModify MoleculePattern MoleculePlot MoleculePlot3D MoleculeProperty MoleculeQ MoleculeValue Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction MomentOfInertia Monday Monitor MonomialList MonomialOrder MonsterGroupM MoonPhase MoonPosition MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform MortalityData Most MountainData MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovieData MovingAverage MovingMap MovingMedian MoyalDistribution Multicolumn MultiedgeStyle MultigraphQ MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity MultiplySides Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistributionN NakagamiDistribution NameQ Names NamespaceBox NamespaceBoxOptions Nand NArgMax NArgMin NBernoulliB NBodySimulation NBodySimulationData NCache NDEigensystem NDEigenvalues NDSolve NDSolveValue Nearest NearestFunction NearestNeighborGraph NearestTo NebulaData NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeDefiniteMatrixQ NegativeIntegers NegativeMultinomialDistribution NegativeRationals NegativeReals NegativeSemidefiniteMatrixQ NeighborhoodData NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestGraph NestList NestWhile NestWhileList NetAppend NetBidirectionalOperator NetChain NetDecoder NetDelete NetDrop NetEncoder NetEvaluationMode NetExtract NetFlatten NetFoldOperator NetGraph NetInformation NetInitialize NetInsert NetInsertSharedArrays NetJoin NetMapOperator NetMapThreadOperator NetMeasurements NetModel NetNestOperator NetPairEmbeddingOperator NetPort NetPortGradient NetPrepend NetRename NetReplace NetReplacePart NetSharedArray NetStateObject NetTake NetTrain NetTrainResultsObject NetworkPacketCapture NetworkPacketRecording NetworkPacketRecordingDuring NetworkPacketTrace NeumannValue NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextCell NextDate NextPrime NextScheduledTaskTime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NightHemisphere NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants NondimensionalizationTransform None NoneTrue NonlinearModelFit NonlinearStateSpaceModel NonlocalMeansFilter NonNegative NonNegativeIntegers NonNegativeRationals NonNegativeReals NonPositive NonPositiveIntegers NonPositiveRationals NonPositiveReals Nor NorlundB Norm Normal NormalDistribution NormalGrouping NormalizationLayer Normalize Normalized NormalizedSquaredEuclideanDistance NormalMatrixQ NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookImport NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookTemplate NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde Nothing NotHumpDownHump NotHumpEqual NotificationFunction NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar Now NoWhitespace NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms NuclearExplosionData NuclearReactorData Null NullRecords NullSpace NullWords Number NumberCompose NumberDecompose NumberExpand NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberLinePlot NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumeratorDenominator NumericalOrder NumericalSort NumericArray NumericArrayQ NumericArrayType NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlotO ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OceanData Octahedron OddQ Off Offset OLEData On ONanGroupON Once OneIdentity Opacity OpacityFunction OpacityFunctionScaling Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionalElement OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering OrderingBy OrderingLayer Orderless OrderlessPatternSequence OrnsteinUhlenbeckProcess Orthogonalize OrthogonalMatrixQ Out Outer OuterPolygon OuterPolyhedron OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OverwriteTarget OwenT OwnValuesPackage PackingMethod PaddedForm Padding PaddingLayer PaddingSize PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageTheme PageWidth Pagination PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath PalindromeQ Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo Parallelepiped ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds Parallelogram ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParametricRegion ParentBox ParentCell ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParentNotebook ParetoDistribution ParetoPickandsDistribution ParkData Part PartBehavior PartialCorrelationFunction PartialD ParticleAcceleratorData ParticleData Partition PartitionGranularity PartitionsP PartitionsQ PartLayer PartOfSpeech PartProtection ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteAutoQuoteCharacters PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PeakDetect PeanoCurve PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PercentForm PerfectNumber PerfectNumberQ PerformanceGoal Perimeter PeriodicBoundaryCondition PeriodicInterpolation Periodogram PeriodogramArray Permanent Permissions PermissionsGroup PermissionsGroupMemberQ PermissionsGroups PermissionsKey PermissionsKeys PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PerpendicularBisector PersistenceLocation PersistenceTime PersistentObject PersistentObjects PersistentValue PersonData PERTDistribution PetersenGraph PhaseMargins PhaseRange PhysicalSystemData Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest PingTime Pink PitchRecognize Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarAngle PlanarGraph PlanarGraphQ PlanckRadiationLaw PlaneCurveData PlanetaryMoonData PlanetData PlantData Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLabels PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangeClipPlanesStyle PlotRangePadding PlotRegion PlotStyle PlotTheme Pluralize Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox Point3DBoxOptions PointBox PointBoxOptions PointFigureChart PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonalNumber PolygonAngle PolygonBox PolygonBoxOptions PolygonCoordinates PolygonDecomposition PolygonHoleScale PolygonIntersections PolygonScale Polyhedron PolyhedronAngle PolyhedronCoordinates PolyhedronData PolyhedronDecomposition PolyhedronGenus PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PoolingLayer PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position PositionIndex Positive PositiveDefiniteMatrixQ PositiveIntegers PositiveRationals PositiveReals PositiveSemidefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerRange PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement Predict PredictionRoot PredictorFunction PredictorInformation PredictorMeasurements PredictorMeasurementsObject PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependLayer PrependTo PreprocessingRules PreserveColor PreserveImageOptions Previous PreviousCell PreviousDate PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitivePolynomialQ PrimitiveRoot PrimitiveRootList PrincipalComponents PrincipalValue Print PrintableASCIIQ PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment Printout3D Printout3DPreviewer PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateKey PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessConnection ProcessDirectory ProcessEnvironment Processes ProcessEstimator ProcessInformation ProcessObject ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessStatus ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm ProofObject Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse PsychrometricPropertyData PublicKey PublisherID PulsarData PunctuationCharacter Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptionsQBinomial QFactorial QGamma QHypergeometricPFQ QnDispersion QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ QuadraticOptimization Quantile QuantilePlot Quantity QuantityArray QuantityDistribution QuantityForm QuantityMagnitude QuantityQ QuantityUnit QuantityVariable QuantityVariableCanonicalUnit QuantityVariableDimensions QuantityVariableIdentifier QuantityVariablePhysicalQuantity Quartics QuartileDeviation Quartiles QuartileSkewness Query QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainderRadialGradientImage RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RadonTransform RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Ramp Random RandomChoice RandomColor RandomComplex RandomEntity RandomFunction RandomGeoPosition RandomGraph RandomImage RandomInstance RandomInteger RandomPermutation RandomPoint RandomPolygon RandomPolyhedron RandomPrime RandomReal RandomSample RandomSeed RandomSeeding RandomVariate RandomWalkProcess RandomWord Range RangeFilter RangeSpecification RankedMax RankedMin RarerProbability Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadByteArray ReadLine ReadList ReadProtected ReadString Real RealAbs RealBlockDiagonalForm RealDigits RealExponent Reals RealSign Reap RecognitionPrior RecognitionThreshold Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RectangularRepeatingElement RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate Region RegionBinarize RegionBoundary RegionBounds RegionCentroid RegionDifference RegionDimension RegionDisjoint RegionDistance RegionDistanceFunction RegionEmbeddingDimension RegionEqual RegionFunction RegionImage RegionIntersection RegionMeasure RegionMember RegionMemberFunction RegionMoment RegionNearest RegionNearestFunction RegionPlot RegionPlot3D RegionProduct RegionQ RegionResize RegionSize RegionSymmetricDifference RegionUnion RegionWithin RegisterExternalEvaluator RegularExpression Regularization RegularlySampledQ RegularPolygon ReIm ReImLabels ReImPlot ReImStyle Reinstall RelationalDatabase RelationGraph Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot RemoteAuthorizationCaching RemoteConnect RemoteConnectionObject RemoteFile RemoteRun RemoteRunProcess Remove RemoveAlphaChannel RemoveAsynchronousTask RemoveAudioStream RemoveBackground RemoveChannelListener RemoveChannelSubscribers Removed RemoveDiacritics RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RemoveUsers RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart RepairMesh Repeated RepeatedNull RepeatedString RepeatedTiming RepeatingElement Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated ReplicateLayer RequiredPhysicalQuantities Resampling ResamplingAlgorithmData ResamplingMethod Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask ReshapeLayer Residue ResizeLayer Resolve ResourceAcquire ResourceData ResourceFunction ResourceObject ResourceRegister ResourceRemove ResourceSearch ResourceSubmissionObject ResourceSubmit ResourceSystemBase ResourceUpdate ResponseForm Rest RestartInterval Restricted Resultant ResumePacket Return ReturnEntersInput ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnReceiptFunction ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseSort ReverseSortBy ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ RiemannXi Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightComposition RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity RollPitchYawAngles RollPitchYawMatrix RomanNumeral Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RSolveValue RudinShapiro RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulePlot RulerUnits Run RunProcess RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilaritySameQ SameTest SampledEntityClass SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SASTriangle SatelliteData SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveConnection SaveDefinitions SavitzkyGolayMatrix SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTask ScheduledTaskActiveQ ScheduledTaskInformation ScheduledTaskInformationData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScientificNotationThreshold ScorerGi ScorerGiPrime ScorerHi ScorerHiPrime ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptForm ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition SearchAdjustment SearchIndexObject SearchIndices SearchQueryString SearchResultObject Sec Sech SechDistribution SecondOrderConeOptimization SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SecuredAuthenticationKey SecuredAuthenticationKeys SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook SelectFirst Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemanticImport SemanticImportString SemanticInterpretation SemialgebraicComponentInstances SemidefiniteOptimization SendMail SendMessage Sequence SequenceAlignment SequenceAttentionLayer SequenceCases SequenceCount SequenceFold SequenceFoldList SequenceForm SequenceHold SequenceLastLayer SequenceMostLayer SequencePosition SequencePredict SequencePredictorFunction SequenceReplace SequenceRestLayer SequenceReverseLayer SequenceSplit Series SeriesCoefficient SeriesData ServiceConnect ServiceDisconnect ServiceExecute ServiceObject ServiceRequest ServiceResponse ServiceSubmit SessionSubmit SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetCloudDirectory SetCookies SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPermissions SetPrecision SetProperty SetSecuredAuthenticationKey SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemModel SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetUsers SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share SharingList Sharpen ShearingMatrix ShearingTransform ShellRegion ShenCastanMatrix ShiftedGompertzDistribution ShiftRegisterSequence Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortTimeFourier ShortTimeFourierData ShortUpArrow Show ShowAutoConvert ShowAutoSpellCheck ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowCodeAssist ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiderealTime SiegelTheta SiegelTukeyTest SierpinskiCurve SierpinskiMesh Sign Signature SignedRankTest SignedRegionDistance SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ SimplePolygonQ SimplePolyhedronQ Simplex Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution SkinStyle Skip SliceContourPlot3D SliceDensityPlot3D SliceDistribution SliceVectorPlot3D Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDecomposition SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SnDispersion Snippet SnubPolyhedron SocialMediaData Socket SocketConnect SocketListen SocketListener SocketObject SocketOpen SocketReadMessage SocketReadyQ Sockets SocketWaitAll SocketWaitNext SoftmaxLayer SokalSneathDissimilarity SolarEclipse SolarSystemFeatureData SolidAngle SolidData SolidRegionQ Solve SolveAlways SolveDelayed Sort SortBy SortedBy SortedEntityClass Sound SoundAndGraphics SoundNote SoundVolume SourceLink Sow Space SpaceCurveData SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution SpatialMedian SpatialTransformationLayer Speak SpeakTextPacket SpearmanRankTest SpearmanRho SpeciesData SpecificityGoal SpectralLineData Spectrogram SpectrogramArray Specularity SpeechRecognize SpeechSynthesize SpellingCorrection SpellingCorrectionList SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SpherePoints SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SphericalShell SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquareMatrixQ SquareRepeatingElement SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave SSSTriangle StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackedDateListPlot StackedListPlot StackInhibit StadiumShape StandardAtmosphereData StandardDeviation StandardDeviationFilter StandardForm Standardize Standardized StandardOceanData StandbyDistribution Star StarClusterData StarData StarGraph StartAsynchronousTask StartExternalSession StartingStepSize StartOfLine StartOfString StartProcess StartScheduledTask StartupSound StartWebSession StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StateTransformationLinearize StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StereochemistryElements StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StoppingPowerData StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamMarkers StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringContainsQ StringCount StringDelete StringDrop StringEndsQ StringExpression StringExtract StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPadLeft StringPadRight StringPart StringPartition StringPosition StringQ StringRepeat StringReplace StringReplaceList StringReplacePart StringReverse StringRiffle StringRotateLeft StringRotateRight StringSkeleton StringSplit StringStartsQ StringTake StringTemplate StringToByteArray StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleData StyleDefinitions StyleForm StyleHints StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subdivide Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subsequences Subset SubsetEqual SubsetMap SubsetQ Subsets SubStar SubstitutionSystem Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubtractSides SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde Success SuchThat Sum SumConvergence SummationLayer Sunday SunPosition Sunrise Sunset SuperDagger SuperMinus SupernovaData SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceArea SurfaceColor SurfaceData SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricKey SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Synonyms Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SynthesizeMissingValues SystemDialogInput SystemException SystemGet SystemHelpPath SystemInformation SystemInformationData SystemInstall SystemModel SystemModeler SystemModelExamples SystemModelLinearize SystemModelParametricSimulate SystemModelPlot SystemModelProgressReporting SystemModelReliability SystemModels SystemModelSimulate SystemModelSimulateSensitivity SystemModelSimulationData SystemOpen SystemOptions SystemProcessData SystemProcesses SystemsConnectionsModel SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelLinearity SystemsModelMerge SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemsModelVectorRelativeOrders SystemStub SystemTestTab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TableViewBoxBackground TableViewBoxOptions TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeDrop TakeLargest TakeLargestBy TakeList TakeSmallest TakeSmallestBy TakeWhile Tally Tan Tanh TargetDevice TargetFunctions TargetSystem TargetUnits TaskAbort TaskExecute TaskObject TaskRemove TaskResume Tasks TaskSuspend TaskWait TautologyQ TelegraphProcess TemplateApply TemplateArgBox TemplateBox TemplateBoxOptions TemplateEvaluate TemplateExpression TemplateIf TemplateObject TemplateSequence TemplateSlot TemplateSlotSequence TemplateUnevaluated TemplateVerbatim TemplateWith TemporalData TemporalRegularity Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge TestID TestReport TestReportObject TestResultObject Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCases TextCell TextClipboardType TextContents TextData TextElement TextForm TextGrid TextJustification TextLine TextPacket TextParagraph TextPosition TextRecognize TextSearch TextSearchReport TextSentences TextString TextStructure TextStyle TextTranslation Texture TextureCoordinateFunction TextureCoordinateScaling TextWords Therefore ThermodynamicData ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreadingLayer ThreeJSymbol Threshold Through Throw ThueMorse Thumbnail Thursday Ticks TicksStyle TideData Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint TimeDirection TimeFormat TimeGoal TimelinePlot TimeObject TimeObjectQ Times TimesBy TimeSeries TimeSeriesAggregate TimeSeriesForecast TimeSeriesInsert TimeSeriesInvertibility TimeSeriesMap TimeSeriesMapThread TimeSeriesModel TimeSeriesModelFit TimeSeriesResample TimeSeriesRescale TimeSeriesShift TimeSeriesThread TimeSeriesWindow TimeUsed TimeValue TimeWarpingCorrespondence TimeWarpingDistance TimeZone TimeZoneConvert TimeZoneOffset Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate Today ToDiscreteTimeModel ToEntity ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase Tomorrow ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform ToPolarCoordinates TopologicalSort ToRadicals ToRules ToSphericalCoordinates ToString Total TotalHeight TotalLayer TotalVariationFilter TotalWidth TouchPosition TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TrackingFunction TracyWidomDistribution TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TrainingProgressCheckpointing TrainingProgressFunction TrainingProgressMeasurements TrainingProgressReporting TrainingStoppingCriterion TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationClass TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField TransformedProcess TransformedRegion TransitionDirection TransitionDuration TransitionEffect TransitiveClosureGraph TransitiveReductionGraph Translate TranslationOptions TranslationTransform Transliterate Transparent TransparentColor Transpose TransposeLayer TrapSelection TravelDirections TravelDirectionsData TravelDistance TravelDistanceList TravelMethod TravelTime TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle Triangle TriangleCenter TriangleConstruct TriangleMeasurement TriangleWave TriangularDistribution TriangulateMesh Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean TrimmedVariance TropicalStormData True TrueQ TruncatedDistribution TruncatedPolyhedron TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBoxOptions TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow TunnelData Tuples TuranGraph TuringMachine TuttePolynomial TwoWayRule Typed TypeSpecifierUnateQ Uncompress UnconstrainedParameters Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UnderseaFeatureData UndirectedEdge UndirectedGraph UndirectedGraphQ UndoOptions UndoTrackedVariables Unequal UnequalTo Unevaluated UniformDistribution UniformGraphDistribution UniformPolyhedron UniformSumDistribution Uninstall Union UnionPlus Unique UnitaryMatrixQ UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitSystem UnitTriangle UnitVector UnitVectorLayer UnityDimensions UniverseModelData UniversityData UnixTime Unprotect UnregisterExternalEvaluator UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpdateSearchIndex UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize UpperTriangularMatrixQ Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpTo UpValues URL URLBuild URLDecode URLDispatcher URLDownload URLDownloadSubmit URLEncode URLExecute URLExpand URLFetch URLFetchAsynchronous URLParse URLQueryDecode URLQueryEncode URLRead URLResponseTime URLSave URLSaveAsynchronous URLShorten URLSubmit UseGraphicsRange UserDefinedWavelet Using UsingFrontEnd UtilityFunctionV2Get ValenceErrorHandling ValidationLength ValidationSet Value ValueBox ValueBoxOptions ValueDimensions ValueForm ValuePreprocessingFunction ValueQ Values ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorAround VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorGreater VectorGreaterEqual VectorLess VectorLessEqual VectorMarkers VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerificationTest VerifyConvergence VerifyDerivedKey VerifyDigitalSignature VerifyInterpretation VerifySecurityCertificates VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexContract VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight VertexWeightedGraphQ Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewProjection ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoiceStyleData VoigtDistribution VolcanoData Volume VonMisesDistribution VoronoiMeshWaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WarpingCorrespondence WarpingDistance WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeatherForecastData WebAudioSearch WebElementObject WeberE WebExecute WebImage WebImageSearch WebSearch WebSessionObject WebSessions WebWindowObject Wedge Wednesday WeibullDistribution WeierstrassE1 WeierstrassE2 WeierstrassE3 WeierstrassEta1 WeierstrassEta2 WeierstrassEta3 WeierstrassHalfPeriods WeierstrassHalfPeriodW1 WeierstrassHalfPeriodW2 WeierstrassHalfPeriodW3 WeierstrassInvariantG2 WeierstrassInvariantG3 WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White WhiteNoiseProcess WhitePoint Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WikipediaData WikipediaSearch WilksW WilksWTest WindDirectionData WindingCount WindingPolygon WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowPersistentStyles WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth WindSpeedData WindVectorData WinsorizedMean WinsorizedVariance WishartMatrixDistribution With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult WolframLanguageData Word WordBoundary WordCharacter WordCloud WordCount WordCounts WordData WordDefinition WordFrequency WordFrequencyData WordList WordOrientation WordSearch WordSelectionFunction WordSeparators WordSpacings WordStem WordTranslation WorkingPrecision WrapAround Write WriteLine WriteString WronskianXMLElement XMLObject XMLTemplate Xnor Xor XYZColorYellow Yesterday YuleDissimilarityZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZIPCodeData ZipfDistribution ZoomCenter ZoomFactor ZTest ZTransform$Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AllowExternalChannelFunctions $AssertFunction $Assumptions $AsynchronousTask $AudioInputDevices $AudioOutputDevices $BaseDirectory $BatchInput $BatchOutput $BlockchainBase $BoxForms $ByteOrdering $CacheBaseDirectory $Canceled $ChannelBase $CharacterEncoding $CharacterEncodings $CloudBase $CloudConnected $CloudCreditsAvailable $CloudEvaluation $CloudExpressionBase $CloudObjectNameFormat $CloudObjectURLType $CloudRootDirectory $CloudSymbolBase $CloudUserID $CloudUserUUID $CloudVersion $CloudVersionNumber $CloudWolframEngineVersionNumber $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $Cookies $CookieStore $CreationDate $CurrentLink $CurrentTask $CurrentWebSession $DateStringFormat $DefaultAudioInputDevice $DefaultAudioOutputDevice $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultLocalBase $DefaultMailbox $DefaultNetworkInterface $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $EmbedCodeEnvironments $EmbeddableServices $EntityStores $Epilog $EvaluationCloudBase $EvaluationCloudObject $EvaluationEnvironment $ExportFormats $Failed $FinancialDataSource $FontFamilies $FormatType $FrontEnd $FrontEndSession $GeoEntityTypes $GeoLocation $GeoLocationCity $GeoLocationCountry $GeoLocationPrecision $GeoLocationSource $HistoryLength $HomeDirectory $HTMLExportRules $HTTPCookies $HTTPRequest $IgnoreEOF $ImageFormattingWidth $ImagingDevice $ImagingDevices $ImportFormats $IncomingMailSettings $InitialDirectory $Initialization $InitializationContexts $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $InterpreterTypes $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $LocalBase $LocalSymbolBase $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $MobilePhone $ModuleNumber $NetworkConnected $NetworkInterfaces $NetworkLicense $NewMessage $NewSymbol $Notebooks $NoValue $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $Permissions $PermissionsGroupBase $PersistenceBase $PersistencePath $PipeSupported $PlotTheme $Post $Pre $PreferencesDirectory $PreInitialization $PrePrint $PreRead $PrintForms $PrintLiteral $Printout3DPreviewer $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $PublisherID $RandomState $RecursionLimit $RegisteredDeviceClasses $RegisteredUserName $ReleaseNumber $RequesterAddress $RequesterWolframID $RequesterWolframUUID $ResourceSystemBase $RootDirectory $ScheduledTask $ScriptCommandLine $ScriptInputString $SecuredAuthenticationKeyTokens $ServiceCreditsAvailable $Services $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SourceLink $SSHAuthentication $SummaryBoxDataSizeLimit $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemMemory $SystemShell $SystemTimeZone $SystemWordLength $TemplatePath $TemporaryDirectory $TemporaryPrefix $TestFileName $TextStyle $TimedOut $TimeUnit $TimeZone $TimeZoneEntity $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $UnitSystem $Urgent $UserAddOnsDirectory $UserAgentLanguages $UserAgentMachine $UserAgentName $UserAgentOperatingSystem $UserAgentString $UserAgentVersion $UserBaseDirectory $UserDocumentsDirectory $Username $UserName $UserURLBase $Version $VersionNumber $VoiceStyles $WolframID $WolframUUID\",c:[e.C(\"\\\\(\\\\*\",\"\\\\*\\\\)\",{c:[\"self\"]}),e.QSM,e.CNM]}});hljs.registerLanguage(\"vim\",function(e){return{l:/[!#@\\w]+/,k:{keyword:\"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank\",built_in:\"synIDtrans atan2 range matcharg did_filetype asin feedkeys xor argv complete_check add getwinposx getqflist getwinposy screencol clearmatches empty extend getcmdpos mzeval garbagecollect setreg ceil sqrt diff_hlID inputsecret get getfperm getpid filewritable shiftwidth max sinh isdirectory synID system inputrestore winline atan visualmode inputlist tabpagewinnr round getregtype mapcheck hasmapto histdel argidx findfile sha256 exists toupper getcmdline taglist string getmatches bufnr strftime winwidth bufexists strtrans tabpagebuflist setcmdpos remote_read printf setloclist getpos getline bufwinnr float2nr len getcmdtype diff_filler luaeval resolve libcallnr foldclosedend reverse filter has_key bufname str2float strlen setline getcharmod setbufvar index searchpos shellescape undofile foldclosed setqflist buflisted strchars str2nr virtcol floor remove undotree remote_expr winheight gettabwinvar reltime cursor tabpagenr finddir localtime acos getloclist search tanh matchend rename gettabvar strdisplaywidth type abs py3eval setwinvar tolower wildmenumode log10 spellsuggest bufloaded synconcealed nextnonblank server2client complete settabwinvar executable input wincol setmatches getftype hlID inputsave searchpair or screenrow line settabvar histadd deepcopy strpart remote_peek and eval getftime submatch screenchar winsaveview matchadd mkdir screenattr getfontname libcall reltimestr getfsize winnr invert pow getbufline byte2line soundfold repeat fnameescape tagfiles sin strwidth spellbadword trunc maparg log lispindent hostname setpos globpath remote_foreground getchar synIDattr fnamemodify cscope_connection stridx winbufnr indent min complete_add nr2char searchpairpos inputdialog values matchlist items hlexists strridx browsedir expand fmod pathshorten line2byte argc count getwinvar glob foldtextresult getreg foreground cosh matchdelete has char2nr simplify histget searchdecl iconv winrestcmd pumvisible writefile foldlevel haslocaldir keys cos matchstr foldtext histnr tan tempname getcwd byteidx getbufvar islocked escape eventhandler remote_send serverlist winrestview synstack pyeval prevnonblank readfile cindent filereadable changenr exp\"},i:/;/,c:[e.NM,{cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\"},{cN:\"string\",b:/\"(\\\\\"|\\n\\\\|[^\"\\n])*\"/},e.C('\"',\"$\"),{cN:\"variable\",b:/[bwtglsav]:[\\w\\d_]*/},{cN:\"function\",bK:\"function function!\",e:\"$\",relevance:0,c:[e.TM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]},{cN:\"symbol\",b:/<[\\w-]+>/}]}});hljs.registerLanguage(\"makefile\",function(e){var i={cN:\"variable\",v:[{b:\"\\\\$\\\\(\"+e.UIR+\"\\\\)\",c:[e.BE]},{b:/\\$[@%<?\\^\\+\\*]/}]},r={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,i]},a={cN:\"variable\",b:/\\$\\([\\w-]+\\s/,e:/\\)/,k:{built_in:\"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value\"},c:[i]},n={b:\"^\"+e.UIR+\"\\\\s*(?=[:+?]?=)\"},t={cN:\"section\",b:/^[^\\s]+:/,e:/$/,c:[i]};return{aliases:[\"mk\",\"mak\"],k:\"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath\",l:/[\\w-]+/,c:[e.HCM,i,r,a,n,{cN:\"meta\",b:/^\\.PHONY:/,e:/$/,k:{\"meta-keyword\":\".PHONY\"},l:/[\\.\\w]+/},t]}});hljs.registerLanguage(\"objectivec\",function(e){var t=/[a-zA-Z@][a-zA-Z0-9_]*/,i=\"@interface @class @protocol @implementation\";return{aliases:[\"mm\",\"objc\",\"obj-c\"],k:{keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"},l:t,i:\"</\",c:[{cN:\"built_in\",b:\"\\\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\\\w+\"},e.CLCM,e.CBCM,e.CNM,e.QSM,e.ASM,{cN:\"string\",v:[{b:'@\"',e:'\"',i:\"\\\\n\",c:[e.BE]}]},{cN:\"meta\",b:/#\\s*[a-z]+\\b/,e:/$/,k:{\"meta-keyword\":\"if else elif endif define undef warning error line pragma ifdef ifndef include\"},c:[{b:/\\\\\\n/,relevance:0},e.inherit(e.QSM,{cN:\"meta-string\"}),{cN:\"meta-string\",b:/<.*?>/,e:/$/,i:\"\\\\n\"},e.CLCM,e.CBCM]},{cN:\"class\",b:\"(\"+i.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",eE:!0,k:i,l:t,c:[e.UTM]},{b:\"\\\\.\"+e.UIR,relevance:0}]}});hljs.registerLanguage(\"shell\",function(s){return{aliases:[\"console\"],c:[{cN:\"meta\",b:\"^\\\\s{0,3}[/\\\\w\\\\d\\\\[\\\\]()@-]*[>%$#]\",starts:{e:\"$\",sL:\"bash\"}}]}});hljs.registerLanguage(\"erlang\",function(e){var r=\"[a-z'][a-zA-Z0-9_']*\",c=\"(\"+r+\":\"+r+\"|\"+r+\")\",n={keyword:\"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor\",literal:\"false true\"},a=e.C(\"%\",\"$\"),b={cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",relevance:0},i={b:\"fun\\\\s+\"+r+\"/\\\\d+\"},l={b:c+\"\\\\(\",e:\"\\\\)\",rB:!0,relevance:0,c:[{b:c,relevance:0},{b:\"\\\\(\",e:\"\\\\)\",eW:!0,rE:!0,relevance:0}]},d={b:\"{\",e:\"}\",relevance:0},o={b:\"\\\\b_([A-Z][A-Za-z0-9_]*)?\",relevance:0},t={b:\"[A-Z][a-zA-Z0-9_]*\",relevance:0},v={b:\"#\"+e.UIR,relevance:0,rB:!0,c:[{b:\"#\"+e.UIR,relevance:0},{b:\"{\",e:\"}\",relevance:0}]},f={bK:\"fun receive if try case\",e:\"end\",k:n};f.c=[a,i,e.inherit(e.ASM,{cN:\"\"}),f,l,e.QSM,b,d,o,t,v];var s=[a,i,f,l,e.QSM,b,d,o,t,v];l.c[1].c=s,d.c=s;var u={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:v.c[1].c=s};return{aliases:[\"erl\"],k:n,i:\"(</|\\\\*=|\\\\+=|-=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))\",c:[{cN:\"function\",b:\"^\"+r+\"\\\\s*\\\\(\",e:\"->\",rB:!0,i:\"\\\\(|#|//|/\\\\*|\\\\\\\\|:|;\",c:[u,e.inherit(e.TM,{b:r})],starts:{e:\";|\\\\.\",k:n,c:s}},a,{b:\"^-\",e:\"\\\\.\",relevance:0,eE:!0,rB:!0,l:\"-\"+e.IR,k:\"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec\",c:[u]},b,e.QSM,v,o,t,d,{b:/\\.$/}]}});hljs.registerLanguage(\"powershell\",function(e){var t={keyword:\"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter\"},n={b:\"`[\\\\s\\\\S]\",relevance:0},c={cN:\"variable\",v:[{b:/\\$\\B/},{cN:\"keyword\",b:/\\$this/},{b:/\\$[\\w\\d][\\w\\d_:]*/}]},i={cN:\"string\",v:[{b:/\"/,e:/\"/},{b:/@\"/,e:/^\"@/}],c:[n,c,{cN:\"variable\",b:/\\$[A-z]/,e:/[^A-z]/}]},a={cN:\"string\",v:[{b:/'/,e:/'/},{b:/@'/,e:/^'@/}]},r=e.inherit(e.C(null,null),{v:[{b:/#/,e:/$/},{b:/<#/,e:/#>/}],c:[{cN:\"doctag\",v:[{b:/\\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{b:/\\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\\s+\\S+/}]}]}),o={cN:\"built_in\",v:[{b:\"(\".concat(\"Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|New|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Complete|Confirm|Deny|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where\",\")+(-)[\\\\w\\\\d]+\")}]},l={cN:\"class\",bK:\"class enum\",e:/\\s*[{]/,eE:!0,relevance:0,c:[e.TM]},s={cN:\"function\",b:/function\\s+/,e:/\\s*\\{|$/,eE:!0,rB:!0,relevance:0,c:[{b:\"function\",relevance:0,cN:\"keyword\"},{cN:\"title\",b:/\\w[\\w\\d]*((-)[\\w\\d]+)*/,relevance:0},{b:/\\(/,e:/\\)/,cN:\"params\",relevance:0,c:[c]}]},p={b:/using\\s/,e:/$/,rB:!0,c:[i,a,{cN:\"keyword\",b:/(using|assembly|command|module|namespace|type)/}]},b={v:[{cN:\"operator\",b:\"(\".concat(\"-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor\",\")\\\\b\")},{cN:\"literal\",b:/(-)[\\w\\d]+/,relevance:0}]},d={cN:\"function\",b:/\\[.*\\]\\s*[\\w]+[ ]??\\(/,e:/$/,rB:!0,relevance:0,c:[{cN:\"keyword\",b:\"(\".concat(t.keyword.toString().replace(/\\s/g,\"|\"),\")\\\\b\"),endsParent:!0,relevance:0},e.inherit(e.TM,{endsParent:!0})]},u=[d,r,n,e.NM,i,a,o,c,{cN:\"literal\",b:/\\$(null|true|false)\\b/},{cN:\"selector-tag\",b:/\\@\\B/,relevance:0}],m={b:/\\[/,e:/\\]/,eB:!0,eE:!0,relevance:0,c:[].concat(\"self\",u,{b:\"(\"+[\"string\",\"char\",\"byte\",\"int\",\"long\",\"bool\",\"decimal\",\"single\",\"double\",\"DateTime\",\"xml\",\"array\",\"hashtable\",\"void\"].join(\"|\")+\")\",cN:\"built_in\",relevance:0},{cN:\"type\",b:/[\\.\\w\\d]+/,relevance:0})};return d.c.unshift(m),{aliases:[\"ps\",\"ps1\"],l:/-?[A-z\\.\\-]+/,cI:!0,k:t,c:u.concat(l,s,p,b,m)}});hljs.registerLanguage(\"typescript\",function(e){var r=\"[A-Za-z$_][0-9A-Za-z$_]*\",t={keyword:\"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract as from extends async await\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void Promise\"},n={cN:\"meta\",b:\"@\"+r},a={b:\"\\\\(\",e:/\\)/,k:t,c:[\"self\",e.QSM,e.ASM,e.NM]},c={cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,c:[e.CLCM,e.CBCM,n,a]},s={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)n?\"},{b:\"\\\\b(0[oO][0-7]+)n?\"},{b:e.CNR+\"n?\"}],relevance:0},o={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:t,c:[]},i={b:\"html`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"xml\"}},l={b:\"css`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"css\"}},b={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,o]};return o.c=[e.ASM,e.QSM,i,l,b,s,e.RM],{aliases:[\"ts\"],k:t,c:[{cN:\"meta\",b:/^\\s*['\"]use strict['\"]/},e.ASM,e.QSM,i,l,b,e.CLCM,e.CBCM,s,{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+e.IR+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:e.IR},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,c:[\"self\",e.CLCM,e.CBCM]}]}]}],relevance:0},{cN:\"function\",bK:\"function\",e:/[\\{;]/,eE:!0,k:t,c:[\"self\",e.inherit(e.TM,{b:r}),c],i:/%/,relevance:0},{bK:\"constructor\",e:/[\\{;]/,eE:!0,c:[\"self\",c]},{b:/module\\./,k:{built_in:\"module\"},relevance:0},{bK:\"module\",e:/\\{/,eE:!0},{bK:\"interface\",e:/\\{/,eE:!0,k:\"interface extends\"},{b:/\\$[(.]/},{b:\"\\\\.\"+e.IR,relevance:0},n,a]}});hljs.registerLanguage(\"fortran\",function(e){return{cI:!0,aliases:[\"f90\",\"f95\"],k:{literal:\".False. .True.\",keyword:\"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then block endblock public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data\",built_in:\"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image\"},i:/\\/\\*/,c:[e.inherit(e.ASM,{cN:\"string\",relevance:0}),e.inherit(e.QSM,{cN:\"string\",relevance:0}),{cN:\"function\",bK:\"subroutine function program\",i:\"[${=\\\\n]\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]},e.C(\"!\",\"$\",{relevance:0}),{cN:\"number\",b:\"(?=\\\\b|\\\\+|\\\\-|\\\\.)(?=\\\\.\\\\d|\\\\d)(?:\\\\d+)?(?:\\\\.?\\\\d*)(?:[de][+-]?\\\\d+)?\\\\b\\\\.?\",relevance:0}]}});hljs.registerLanguage(\"php\",function(e){var c={b:\"\\\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*\"},i={cN:\"meta\",b:/<\\?(php)?|\\?>/},t={cN:\"string\",c:[e.BE,i],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:[\"php\",\"php3\",\"php4\",\"php5\",\"php6\",\"php7\"],cI:!0,k:\"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally\",c:[e.HCM,e.C(\"//\",\"$\",{c:[i]}),e.C(\"/\\\\*\",\"\\\\*/\",{c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.C(\"__halt_compiler.+?;\",!1,{eW:!0,k:\"__halt_compiler\",l:e.UIR}),{cN:\"string\",b:/<<<['\"]?\\w+['\"]?$/,e:/^\\w+;?$/,c:[e.BE,{cN:\"subst\",v:[{b:/\\$\\w+/},{b:/\\{\\$/,e:/\\}/}]}]},i,{cN:\"keyword\",b:/\\$this\\b/},c,{b:/(::|->)+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*/},{cN:\"function\",bK:\"function\",e:/[;{]/,eE:!0,i:\"\\\\$|\\\\[|%\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",c,e.CBCM,t,a]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",eE:!0,i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[e.UTM]},{bK:\"use\",e:\";\",c:[e.UTM]},{b:\"=>\"},t,a]}});hljs.registerLanguage(\"haskell\",function(e){var i={v:[e.C(\"--\",\"$\"),e.C(\"{-\",\"-}\",{c:[\"self\"]})]},a={cN:\"meta\",b:\"{-#\",e:\"#-}\"},l={cN:\"meta\",b:\"^#\",e:\"$\"},c={cN:\"type\",b:\"\\\\b[A-Z][\\\\w']*\",relevance:0},n={b:\"\\\\(\",e:\"\\\\)\",i:'\"',c:[a,l,{cN:\"type\",b:\"\\\\b[A-Z][\\\\w]*(\\\\((\\\\.\\\\.|,|\\\\w+)\\\\))?\"},e.inherit(e.TM,{b:\"[_a-z][\\\\w']*\"}),i]};return{aliases:[\"hs\"],k:\"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec\",c:[{bK:\"module\",e:\"where\",k:\"module where\",c:[n,i],i:\"\\\\W\\\\.|;\"},{b:\"\\\\bimport\\\\b\",e:\"$\",k:\"import qualified as hiding\",c:[n,i],i:\"\\\\W\\\\.|;\"},{cN:\"class\",b:\"^(\\\\s*)?(class|instance)\\\\b\",e:\"where\",k:\"class family instance where\",c:[c,n,i]},{cN:\"class\",b:\"\\\\b(data|(new)?type)\\\\b\",e:\"$\",k:\"data family type newtype deriving\",c:[a,c,n,{b:\"{\",e:\"}\",c:n.c},i]},{bK:\"default\",e:\"$\",c:[c,n,i]},{bK:\"infix infixl infixr\",e:\"$\",c:[e.CNM,i]},{b:\"\\\\bforeign\\\\b\",e:\"$\",k:\"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe\",c:[c,e.QSM,i]},{cN:\"meta\",b:\"#!\\\\/usr\\\\/bin\\\\/env runhaskell\",e:\"$\"},a,l,e.QSM,e.CNM,c,e.inherit(e.TM,{b:\"^[_a-z][\\\\w']*\"}),i,{b:\"->|<-\"}]}});hljs.registerLanguage(\"coffeescript\",function(e){var c={keyword:\"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not\",literal:\"true false null undefined yes no on off\",built_in:\"npm require console print module global window document\"},n=\"[A-Za-z$_][0-9A-Za-z$_]*\",r={cN:\"subst\",b:/#\\{/,e:/}/,k:c},i=[e.BNM,e.inherit(e.CNM,{starts:{e:\"(\\\\s*/)?\",relevance:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[e.BE,r]},{b:/\"/,e:/\"/,c:[e.BE,r]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[r,e.HCM]},{b:\"//[gim]{0,3}(?=\\\\W)\",relevance:0},{b:/\\/(?![ *]).*?(?![\\\\]).\\/[gim]{0,3}(?=\\W)/}]},{b:\"@\"+n},{sL:\"javascript\",eB:!0,eE:!0,v:[{b:\"```\",e:\"```\"},{b:\"`\",e:\"`\"}]}];r.c=i;var s=e.inherit(e.TM,{b:n}),t=\"(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",a={cN:\"params\",b:\"\\\\([^\\\\(]\",rB:!0,c:[{b:/\\(/,e:/\\)/,k:c,c:[\"self\"].concat(i)}]};return{aliases:[\"coffee\",\"cson\",\"iced\"],k:c,i:/\\/\\*/,c:i.concat([e.C(\"###\",\"###\"),e.HCM,{cN:\"function\",b:\"^\\\\s*\"+n+\"\\\\s*=\\\\s*\"+t,e:\"[-=]>\",rB:!0,c:[s,a]},{b:/[:\\(,=]\\s*/,relevance:0,c:[{cN:\"function\",b:t,e:\"[-=]>\",rB:!0,c:[a]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:!0,i:/[:=\"\\[\\]]/,c:[s]},s]},{b:n+\":\",e:\":\",rB:!0,rE:!0,relevance:0}])}});hljs.registerLanguage(\"r\",function(e){var r=\"([a-zA-Z]|\\\\.[a-zA-Z.])[a-zA-Z0-9._]*\";return{c:[e.HCM,{b:r,l:r,k:{keyword:\"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...\",literal:\"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10\"},relevance:0},{cN:\"number\",b:\"0[xX][0-9a-fA-F]+[Li]?\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\d+(?:[eE][+\\\\-]?\\\\d*)?L\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\d+\\\\.(?!\\\\d)(?:i\\\\b)?\",relevance:0},{cN:\"number\",b:\"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",relevance:0},{b:\"`\",e:\"`\",relevance:0},{cN:\"string\",c:[e.BE],v:[{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]}]}});hljs.registerLanguage(\"autohotkey\",function(e){var a={b:\"`[\\\\s\\\\S]\"};return{cI:!0,aliases:[\"ahk\"],k:{keyword:\"Break Continue Critical Exit ExitApp Gosub Goto New OnExit Pause return SetBatchLines SetTimer Suspend Thread Throw Until ahk_id ahk_class ahk_pid ahk_exe ahk_group\",literal:\"true false NOT AND OR\",built_in:\"ComSpec Clipboard ClipboardAll ErrorLevel\"},c:[a,e.inherit(e.QSM,{c:[a]}),e.C(\";\",\"$\",{relevance:0}),e.CBCM,{cN:\"number\",b:e.NR,relevance:0},{cN:\"variable\",b:\"%[a-zA-Z0-9#_$@]+%\"},{cN:\"built_in\",b:\"^\\\\s*\\\\w+\\\\s*(,|%)\"},{cN:\"title\",v:[{b:'^[^\\\\n\";]+::(?!=)'},{b:'^[^\\\\n\";]+:(?!=)',relevance:0}]},{cN:\"meta\",b:\"^\\\\s*#\\\\w+\",e:\"$\",relevance:0},{cN:\"built_in\",b:\"A_[a-zA-Z0-9]+\"},{b:\",\\\\s*,\"}]}});hljs.registerLanguage(\"elixir\",function(e){var b=\"[a-zA-Z_][a-zA-Z0-9_.]*(\\\\!|\\\\?)?\",c=\"and false then defined module in return redo retry end for true self when next until do begin unless nil break not case cond alias while ensure or include use alias fn quote require import with|0\",n={cN:\"subst\",b:\"#\\\\{\",e:\"}\",l:b,k:c},r=\"[/|([{<\\\"']\",a={cN:\"string\",b:\"~[a-z](?=\"+r+\")\",c:[{endsParent:!0,c:[{c:[e.BE,n],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/\\//,e:/\\//},{b:/\\|/,e:/\\|/},{b:/\\(/,e:/\\)/},{b:/\\[/,e:/\\]/},{b:/\\{/,e:/\\}/},{b:/</,e:/>/}]}]}]},i={cN:\"string\",b:\"~[A-Z](?=\"+r+\")\",c:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/\\//,e:/\\//},{b:/\\|/,e:/\\|/},{b:/\\(/,e:/\\)/},{b:/\\[/,e:/\\]/},{b:/\\{/,e:/\\}/},{b:/\\</,e:/\\>/}]},l={cN:\"string\",c:[e.BE,n],v:[{b:/\"\"\"/,e:/\"\"\"/},{b:/'''/,e:/'''/},{b:/~S\"\"\"/,e:/\"\"\"/,c:[]},{b:/~S\"/,e:/\"/,c:[]},{b:/~S'''/,e:/'''/,c:[]},{b:/~S'/,e:/'/,c:[]},{b:/'/,e:/'/},{b:/\"/,e:/\"/}]},s={cN:\"function\",bK:\"def defp defmacro\",e:/\\B\\b/,c:[e.inherit(e.TM,{b:b,endsParent:!0})]},t=e.inherit(s,{cN:\"class\",bK:\"defimpl defmodule defprotocol defrecord\",e:/\\bdo\\b|$|;/}),d=[l,i,a,e.HCM,t,s,{b:\"::\"},{cN:\"symbol\",b:\":(?![\\\\s:])\",c:[l,{b:\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\"}],relevance:0},{cN:\"symbol\",b:b+\":(?!:)\",relevance:0},{cN:\"number\",b:\"(\\\\b0o[0-7_]+)|(\\\\b0b[01_]+)|(\\\\b0x[0-9a-fA-F_]+)|(-?\\\\b[1-9][0-9_]*(.[0-9_]+([eE][-+]?[0-9]+)?)?)\",relevance:0},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{b:\"->\"},{b:\"(\"+e.RSR+\")\\\\s*\",c:[e.HCM,{cN:\"regexp\",i:\"\\\\n\",c:[e.BE,n],v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}],relevance:0}];return{l:b,k:c,c:n.c=d}});hljs.registerLanguage(\"gradle\",function(e){return{cI:!0,k:{keyword:\"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine\"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage(\"css\",function(e){var c={b:/(?:[A-Z\\_\\.\\-]+|--[a-zA-Z0-9_-]+)\\s*:/,rB:!0,e:\";\",eW:!0,c:[{cN:\"attribute\",b:/\\S/,e:\":\",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\\w-]+\\(/,rB:!0,c:[{cN:\"built_in\",b:/[\\w-]+/},{b:/\\(/,e:/\\)/,c:[e.ASM,e.QSM,e.CSSNM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:\"number\",b:\"#[0-9A-Fa-f]+\"},{cN:\"meta\",b:\"!important\"}]}}]};return{cI:!0,i:/[=\\/|'\\$]/,c:[e.CBCM,{cN:\"selector-id\",b:/#[A-Za-z0-9_-]+/},{cN:\"selector-class\",b:/\\.[A-Za-z0-9_-]+/},{cN:\"selector-attr\",b:/\\[/,e:/\\]/,i:\"$\",c:[e.ASM,e.QSM]},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"@(page|font-face)\",l:\"@[a-z-]+\",k:\"@page @font-face\"},{b:\"@\",e:\"[{;]\",i:/:/,rB:!0,c:[{cN:\"keyword\",b:/@\\-?\\w[\\w]*(\\-\\w+)*/},{b:/\\s/,eW:!0,eE:!0,relevance:0,k:\"and or not only\",c:[{b:/[a-z-]+:/,cN:\"attribute\"},e.ASM,e.QSM,e.CSSNM]}]},{cN:\"selector-tag\",b:\"[a-zA-Z-][a-zA-Z0-9_-]*\",relevance:0},{b:\"{\",e:\"}\",i:/\\S/,c:[e.CBCM,c]}]}});\n\nexports.hljs = hljs;\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/highlight/highlight.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/highlight/highlight.css": {
"text": "/*\n\nOriginal highlight.js style (c) Ivan Sagalaev <maniac@softwaremaniacs.org>\n\n*/\n\n.hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n background: #F0F0F0;\n}\n\n\n/* Base color: saturation 0; */\n\n.hljs,\n.hljs-subst {\n color: #444;\n}\n\n.hljs-comment {\n color: #888888;\n}\n\n.hljs-keyword,\n.hljs-attribute,\n.hljs-selector-tag,\n.hljs-meta-keyword,\n.hljs-doctag,\n.hljs-name {\n font-weight: bold;\n}\n\n\n/* User color: hue: 0 */\n\n.hljs-type,\n.hljs-string,\n.hljs-number,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-quote,\n.hljs-template-tag,\n.hljs-deletion {\n color: #880000;\n}\n\n.hljs-title,\n.hljs-section {\n color: #880000;\n font-weight: bold;\n}\n\n.hljs-regexp,\n.hljs-symbol,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-link,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n color: #BC6060;\n}\n\n\n/* Language color: hue: 90; */\n\n.hljs-literal {\n color: #78A960;\n}\n\n.hljs-built_in,\n.hljs-bullet,\n.hljs-code,\n.hljs-addition {\n color: #397300;\n}\n\n\n/* Meta color: hue: 200 */\n\n.hljs-meta {\n color: #1f7199;\n}\n\n.hljs-meta-string {\n color: #4d99bf;\n}\n\n\n/* Misc effects */\n\n.hljs-emphasis {\n font-style: italic;\n}\n\n.hljs-strong {\n font-weight: bold;\n}\n",
"type": "text/css",
"title": "$:/plugins/tiddlywiki/highlight/highlight.css",
"tags": "[[$:/tags/Stylesheet]]"
},
"$:/plugins/tiddlywiki/highlight/highlightblock.js": {
"title": "$:/plugins/tiddlywiki/highlight/highlightblock.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/highlight/highlightblock.js\ntype: application/javascript\nmodule-type: widget\n\nWraps up the fenced code blocks parser for highlight and use in TiddlyWiki5\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TYPE_MAPPINGS_BASE = \"$:/config/HighlightPlugin/TypeMappings/\";\n\nvar CodeBlockWidget = require(\"$:/core/modules/widgets/codeblock.js\").codeblock;\n\nvar hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\n\nhljs.configure({tabReplace: \" \"});\t\n\nCodeBlockWidget.prototype.postRender = function() {\n\tvar domNode = this.domNodes[0],\n\t\tlanguage = this.language,\n\t\ttiddler = this.wiki.getTiddler(TYPE_MAPPINGS_BASE + language);\n\tif(tiddler) {\n\t\tlanguage = tiddler.fields.text || \"\";\n\t}\n\tif(language && hljs.getLanguage(language)) {\n\t\tdomNode.className = language.toLowerCase() + \" hljs\";\n\t\tif($tw.browser && !domNode.isTiddlyWikiFakeDom) {\n\t\t\thljs.highlightBlock(domNode);\t\t\t\n\t\t} else {\n\t\t\tvar text = domNode.textContent;\n\t\t\tdomNode.children[0].innerHTML = hljs.fixMarkup(hljs.highlight(language,text).value);\n\t\t\t// If we're using the fakedom then specially save the original raw text\n\t\t\tif(domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tdomNode.children[0].textInnerHTML = text;\n\t\t\t}\n\t\t}\n\t}\t\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/tiddlywiki/highlight/howto": {
"title": "$:/plugins/tiddlywiki/highlight/howto",
"text": "! Supporting Additional Languages\n \nThe [[highlight.js|https://github.com/highlightjs/highlight.js]] project supports many languages. Only a subset of these languages are supported by the plugin. It is possible for users to change the set of languages supported by the plugin by following these steps:\n \n# Go to the highlight.js project [[download page|https://highlightjs.org/download/]], select the language definitions to include, and press the Download button to download a zip archive containing customised support files for a highlight.js syntax highlighting server.\n# Locate the `highlight.pack.js` file in the highlight plugin -- on a stock Debian 8 system running Tiddlywiki5 under node-js it is located at `/usr/local/lib/node_modules/tiddlywiki/plugins/tiddlywiki/highlight/files/highlight.pack.js`.\n# Replace the plugin `highlight.pack.js` file located in step 2 with the one from the downloaded archive obtained in step 1.\n# Restart the Tiddlywiki server.\n"
},
"$:/plugins/tiddlywiki/highlight/license": {
"title": "$:/plugins/tiddlywiki/highlight/license",
"type": "text/plain",
"text": "Copyright (c) 2006, Ivan Sagalaev\nAll rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of highlight.js nor the names of its contributors\n may be used to endorse or promote products derived from this software\n without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
},
"$:/plugins/tiddlywiki/highlight/readme": {
"title": "$:/plugins/tiddlywiki/highlight/readme",
"text": "This plugin provides syntax highlighting of code blocks using v9.18.1 of [[highlight.js|https://github.com/isagalaev/highlight.js]] from Ivan Sagalaev.\n\n! Usage\n\nWhen the plugin is installed it automatically applies highlighting to all codeblocks defined with triple backticks or with the CodeBlockWidget.\n\nThe language can optionally be specified after the opening triple braces:\n\n<$codeblock code=\"\"\"```css\n * { margin: 0; padding: 0; } /* micro reset */\n\nhtml { font-size: 62.5%; }\nbody { font-size: 14px; font-size: 1.4rem; } /* =14px */\nh1 { font-size: 24px; font-size: 2.4rem; } /* =24px */\n```\"\"\"/>\n\nIf no language is specified highlight.js will attempt to automatically detect the language.\n\n! Built-in Language Brushes\n\nThe plugin includes support for the following languages (referred to as \"brushes\" by highlight.js):\n\n* apache\n* arduino\n* arm assembly\n* asciidoc\n* autohotkey\n* awk\n* bash\n* cmake\n* coffeescript\n* cpp\n* cs\n* css\n* diff\n* dockerfile\n* erlang\n* elixir\n* fortran\n* go\n* gradle\n* haskell\n* html\n* http\n* ini\n* intel x86 assembly\n* java\n* javascript\n* json\n* kotlin\n* less\n* lua\n* makefile\n* markdown\n* mathematica\n* matlab\n* nginx\n* objectivec\n* perl\n* php\n* plaintext\n* powershell\n* properties\n* python\n* R\n* ruby\n* rust\n* scss\n* shell session\n* sql\n* swift\n* toml\n* typescript\n* vala\n* vim script\n* xml\n* yaml\n\nYou can also specify the language as a MIME content type (eg `text/html` or `text/css`). The mapping is accomplished via mapping tiddlers whose titles start with `$:/config/HighlightPlugin/TypeMappings/`.\n"
},
"$:/plugins/tiddlywiki/highlight/styles": {
"title": "$:/plugins/tiddlywiki/highlight/styles",
"tags": "[[$:/tags/Stylesheet]]",
"text": ".hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8;-webkit-text-size-adjust:none}.hljs-comment,.diff .hljs-header,.hljs-javadoc{color:#998;font-style:italic}.hljs-keyword,.css .rule .hljs-keyword,.hljs-winutils,.nginx .hljs-title,.hljs-subst,.hljs-request,.hljs-status{color:#333;font-weight:bold}.hljs-number,.hljs-hexcolor,.ruby .hljs-constant{color:teal}.hljs-string,.hljs-tag .hljs-value,.hljs-phpdoc,.hljs-dartdoc,.tex .hljs-formula{color:#d14}.hljs-title,.hljs-id,.scss .hljs-preprocessor{color:#900;font-weight:bold}.hljs-list .hljs-keyword,.hljs-subst{font-weight:normal}.hljs-class .hljs-title,.hljs-type,.vhdl .hljs-literal,.tex .hljs-command{color:#458;font-weight:bold}.hljs-tag,.hljs-tag .hljs-title,.hljs-rule .hljs-property,.django .hljs-tag .hljs-keyword{color:navy;font-weight:normal}.hljs-attribute,.hljs-variable,.lisp .hljs-body,.hljs-name{color:teal}.hljs-regexp{color:#009926}.hljs-symbol,.ruby .hljs-symbol .hljs-string,.lisp .hljs-keyword,.clojure .hljs-keyword,.scheme .hljs-keyword,.tex .hljs-special,.hljs-prompt{color:#990073}.hljs-built_in{color:#0086b3}.hljs-preprocessor,.hljs-pragma,.hljs-pi,.hljs-doctype,.hljs-shebang,.hljs-cdata{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.diff .hljs-change{background:#0086b3}.hljs-chunk{color:#aaa}"
},
"$:/plugins/tiddlywiki/highlight/usage": {
"title": "$:/plugins/tiddlywiki/highlight/usage",
"text": "! Usage\n\nFenced code blocks can have a language specifier added to trigger highlighting in a specific language. Otherwise heuristics are used to detect the language.\n\n```\n ```js\n var a = b + c; // Highlighted as JavaScript\n ```\n```\n! Adding Themes\n\nYou can add themes from highlight.js by copying the CSS to a new tiddler and tagging it with [[$:/tags/Stylesheet]]. The available themes can be found on GitHub:\n\nhttps://github.com/isagalaev/highlight.js/tree/master/src/styles\n"
}
}
}
{
"tiddlers": {
"$:/plugins/tiddlywiki/markdown/EditorToolbar/bold": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/bold",
"list-after": "$:/core/ui/EditorToolbar/bold",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/bold",
"caption": "{{$:/language/Buttons/Bold/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Bold/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((bold))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"**\"\n\tsuffix=\"**\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-1": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-1",
"list-after": "$:/core/ui/EditorToolbar/heading-1",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-1",
"caption": "{{$:/language/Buttons/Heading1/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading1/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((heading-1))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"1\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-2": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-2",
"list-after": "$:/core/ui/EditorToolbar/heading-2",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-2",
"caption": "{{$:/language/Buttons/Heading2/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading2/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((heading-2))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"2\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-3": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-3",
"list-after": "$:/core/ui/EditorToolbar/heading-3",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-3",
"caption": "{{$:/language/Buttons/Heading3/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading3/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((heading-3))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"3\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-4": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-4",
"list-after": "$:/core/ui/EditorToolbar/heading-4",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-4",
"caption": "{{$:/language/Buttons/Heading4/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading4/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((heading-4))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"4\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-5": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-5",
"list-after": "$:/core/ui/EditorToolbar/heading-5",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-5",
"caption": "{{$:/language/Buttons/Heading5/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading5/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((heading-5))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"5\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-6": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-6",
"list-after": "$:/core/ui/EditorToolbar/heading-6",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-6",
"caption": "{{$:/language/Buttons/Heading6/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Heading6/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((heading-6))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"6\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/italic": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/italic",
"list-after": "$:/core/ui/EditorToolbar/italic",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/italic",
"caption": "{{$:/language/Buttons/Italic/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Italic/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((italic))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"*\"\n\tsuffix=\"*\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/list-bullet": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/list-bullet",
"list-after": "$:/core/ui/EditorToolbar/list-bullet",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-bullet",
"caption": "{{$:/language/Buttons/ListBullet/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/ListBullet/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((list-bullet))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"*\"\n\tcount=\"1\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/list-number": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/list-number",
"list-after": "$:/core/ui/EditorToolbar/list-number",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-number",
"caption": "{{$:/language/Buttons/ListNumber/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/ListNumber/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((list-number))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"1.\"\n\tcount=\"1\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/mono-line": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/mono-line",
"list-after": "$:/core/ui/EditorToolbar/mono-line",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/mono-line",
"caption": "{{$:/language/Buttons/MonoLine/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/MonoLine/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((mono-line))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n/>\n"
},
"$:/plugins/tiddlywiki/markdown/EditorToolbar/quote": {
"title": "$:/plugins/tiddlywiki/markdown/EditorToolbar/quote",
"list-after": "$:/core/ui/EditorToolbar/quote",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/quote",
"caption": "{{$:/language/Buttons/Quote/Caption}} (Markdown)",
"description": "{{$:/language/Buttons/Quote/Hint}}",
"condition": "[<targetTiddler>type[text/x-markdown]]",
"shortcuts": "((quote))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\">\"\n\tcount=\"1\"\n/>\n"
},
"$:/config/markdown/breaks": {
"title": "$:/config/markdown/breaks",
"text": "false"
},
"$:/config/markdown/linkNewWindow": {
"title": "$:/config/markdown/linkNewWindow",
"text": "true"
},
"$:/config/markdown/linkify": {
"title": "$:/config/markdown/linkify",
"text": "false"
},
"$:/config/markdown/quotes": {
"title": "$:/config/markdown/quotes",
"text": "“”‘’"
},
"$:/config/markdown/renderWikiText": {
"title": "$:/config/markdown/renderWikiText",
"text": "true"
},
"$:/config/markdown/renderWikiTextPragma": {
"title": "$:/config/markdown/renderWikiTextPragma",
"text": "\\rules only html image macrocallinline syslink transcludeinline wikilink filteredtranscludeblock macrocallblock transcludeblock"
},
"$:/config/markdown/typographer": {
"title": "$:/config/markdown/typographer",
"text": "false"
},
"$:/language/Docs/Types/text/x-markdown": {
"title": "$:/language/Docs/Types/text/x-markdown",
"description": "Markdown",
"name": "text/x-markdown",
"group": "Text"
},
"$:/plugins/tiddlywiki/markdown/remarkable.js": {
"text": "!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=e||self).remarkable={})}(this,function(e){\"use strict\";var t={Aacute:\"Á\",aacute:\"á\",Abreve:\"Ă\",abreve:\"ă\",ac:\"∾\",acd:\"∿\",acE:\"∾̳\",Acirc:\"Â\",acirc:\"â\",acute:\"´\",Acy:\"А\",acy:\"а\",AElig:\"Æ\",aelig:\"æ\",af:\"\",Afr:\"𝔄\",afr:\"𝔞\",Agrave:\"À\",agrave:\"à\",alefsym:\"ℵ\",aleph:\"ℵ\",Alpha:\"Α\",alpha:\"α\",Amacr:\"Ā\",amacr:\"ā\",amalg:\"⨿\",AMP:\"&\",amp:\"&\",And:\"⩓\",and:\"∧\",andand:\"⩕\",andd:\"⩜\",andslope:\"⩘\",andv:\"⩚\",ang:\"∠\",ange:\"⦤\",angle:\"∠\",angmsd:\"∡\",angmsdaa:\"⦨\",angmsdab:\"⦩\",angmsdac:\"⦪\",angmsdad:\"⦫\",angmsdae:\"⦬\",angmsdaf:\"⦭\",angmsdag:\"⦮\",angmsdah:\"⦯\",angrt:\"∟\",angrtvb:\"⊾\",angrtvbd:\"⦝\",angsph:\"∢\",angst:\"Å\",angzarr:\"⍼\",Aogon:\"Ą\",aogon:\"ą\",Aopf:\"𝔸\",aopf:\"𝕒\",ap:\"≈\",apacir:\"⩯\",apE:\"⩰\",ape:\"≊\",apid:\"≋\",apos:\"'\",ApplyFunction:\"\",approx:\"≈\",approxeq:\"≊\",Aring:\"Å\",aring:\"å\",Ascr:\"𝒜\",ascr:\"𝒶\",Assign:\"≔\",ast:\"*\",asymp:\"≈\",asympeq:\"≍\",Atilde:\"Ã\",atilde:\"ã\",Auml:\"Ä\",auml:\"ä\",awconint:\"∳\",awint:\"⨑\",backcong:\"≌\",backepsilon:\"϶\",backprime:\"‵\",backsim:\"∽\",backsimeq:\"⋍\",Backslash:\"∖\",Barv:\"⫧\",barvee:\"⊽\",Barwed:\"⌆\",barwed:\"⌅\",barwedge:\"⌅\",bbrk:\"⎵\",bbrktbrk:\"⎶\",bcong:\"≌\",Bcy:\"Б\",bcy:\"б\",bdquo:\"„\",becaus:\"∵\",Because:\"∵\",because:\"∵\",bemptyv:\"⦰\",bepsi:\"϶\",bernou:\"ℬ\",Bernoullis:\"ℬ\",Beta:\"Β\",beta:\"β\",beth:\"ℶ\",between:\"≬\",Bfr:\"𝔅\",bfr:\"𝔟\",bigcap:\"⋂\",bigcirc:\"◯\",bigcup:\"⋃\",bigodot:\"⨀\",bigoplus:\"⨁\",bigotimes:\"⨂\",bigsqcup:\"⨆\",bigstar:\"★\",bigtriangledown:\"▽\",bigtriangleup:\"△\",biguplus:\"⨄\",bigvee:\"⋁\",bigwedge:\"⋀\",bkarow:\"⤍\",blacklozenge:\"⧫\",blacksquare:\"▪\",blacktriangle:\"▴\",blacktriangledown:\"▾\",blacktriangleleft:\"◂\",blacktriangleright:\"▸\",blank:\"␣\",blk12:\"▒\",blk14:\"░\",blk34:\"▓\",block:\"█\",bne:\"=⃥\",bnequiv:\"≡⃥\",bNot:\"⫭\",bnot:\"⌐\",Bopf:\"𝔹\",bopf:\"𝕓\",bot:\"⊥\",bottom:\"⊥\",bowtie:\"⋈\",boxbox:\"⧉\",boxDL:\"╗\",boxDl:\"╖\",boxdL:\"╕\",boxdl:\"┐\",boxDR:\"╔\",boxDr:\"╓\",boxdR:\"╒\",boxdr:\"┌\",boxH:\"═\",boxh:\"─\",boxHD:\"╦\",boxHd:\"╤\",boxhD:\"╥\",boxhd:\"┬\",boxHU:\"╩\",boxHu:\"╧\",boxhU:\"╨\",boxhu:\"┴\",boxminus:\"⊟\",boxplus:\"⊞\",boxtimes:\"⊠\",boxUL:\"╝\",boxUl:\"╜\",boxuL:\"╛\",boxul:\"┘\",boxUR:\"╚\",boxUr:\"╙\",boxuR:\"╘\",boxur:\"└\",boxV:\"║\",boxv:\"│\",boxVH:\"╬\",boxVh:\"╫\",boxvH:\"╪\",boxvh:\"┼\",boxVL:\"╣\",boxVl:\"╢\",boxvL:\"╡\",boxvl:\"┤\",boxVR:\"╠\",boxVr:\"╟\",boxvR:\"╞\",boxvr:\"├\",bprime:\"‵\",Breve:\"˘\",breve:\"˘\",brvbar:\"¦\",Bscr:\"ℬ\",bscr:\"𝒷\",bsemi:\"⁏\",bsim:\"∽\",bsime:\"⋍\",bsol:\"\\\\\",bsolb:\"⧅\",bsolhsub:\"⟈\",bull:\"•\",bullet:\"•\",bump:\"≎\",bumpE:\"⪮\",bumpe:\"≏\",Bumpeq:\"≎\",bumpeq:\"≏\",Cacute:\"Ć\",cacute:\"ć\",Cap:\"⋒\",cap:\"∩\",capand:\"⩄\",capbrcup:\"⩉\",capcap:\"⩋\",capcup:\"⩇\",capdot:\"⩀\",CapitalDifferentialD:\"ⅅ\",caps:\"∩︀\",caret:\"⁁\",caron:\"ˇ\",Cayleys:\"ℭ\",ccaps:\"⩍\",Ccaron:\"Č\",ccaron:\"č\",Ccedil:\"Ç\",ccedil:\"ç\",Ccirc:\"Ĉ\",ccirc:\"ĉ\",Cconint:\"∰\",ccups:\"⩌\",ccupssm:\"⩐\",Cdot:\"Ċ\",cdot:\"ċ\",cedil:\"¸\",Cedilla:\"¸\",cemptyv:\"⦲\",cent:\"¢\",CenterDot:\"·\",centerdot:\"·\",Cfr:\"ℭ\",cfr:\"𝔠\",CHcy:\"Ч\",chcy:\"ч\",check:\"✓\",checkmark:\"✓\",Chi:\"Χ\",chi:\"χ\",cir:\"○\",circ:\"ˆ\",circeq:\"≗\",circlearrowleft:\"↺\",circlearrowright:\"↻\",circledast:\"⊛\",circledcirc:\"⊚\",circleddash:\"⊝\",CircleDot:\"⊙\",circledR:\"®\",circledS:\"Ⓢ\",CircleMinus:\"⊖\",CirclePlus:\"⊕\",CircleTimes:\"⊗\",cirE:\"⧃\",cire:\"≗\",cirfnint:\"⨐\",cirmid:\"⫯\",cirscir:\"⧂\",ClockwiseContourIntegral:\"∲\",CloseCurlyDoubleQuote:\"”\",CloseCurlyQuote:\"’\",clubs:\"♣\",clubsuit:\"♣\",Colon:\"∷\",colon:\":\",Colone:\"⩴\",colone:\"≔\",coloneq:\"≔\",comma:\",\",commat:\"@\",comp:\"∁\",compfn:\"∘\",complement:\"∁\",complexes:\"ℂ\",cong:\"≅\",congdot:\"⩭\",Congruent:\"≡\",Conint:\"∯\",conint:\"∮\",ContourIntegral:\"∮\",Copf:\"ℂ\",copf:\"𝕔\",coprod:\"∐\",Coproduct:\"∐\",COPY:\"©\",copy:\"©\",copysr:\"℗\",CounterClockwiseContourIntegral:\"∳\",crarr:\"↵\",Cross:\"⨯\",cross:\"✗\",Cscr:\"𝒞\",cscr:\"𝒸\",csub:\"⫏\",csube:\"⫑\",csup:\"⫐\",csupe:\"⫒\",ctdot:\"⋯\",cudarrl:\"⤸\",cudarrr:\"⤵\",cuepr:\"⋞\",cuesc:\"⋟\",cularr:\"↶\",cularrp:\"⤽\",Cup:\"⋓\",cup:\"∪\",cupbrcap:\"⩈\",CupCap:\"≍\",cupcap:\"⩆\",cupcup:\"⩊\",cupdot:\"⊍\",cupor:\"⩅\",cups:\"∪︀\",curarr:\"↷\",curarrm:\"⤼\",curlyeqprec:\"⋞\",curlyeqsucc:\"⋟\",curlyvee:\"⋎\",curlywedge:\"⋏\",curren:\"¤\",curvearrowleft:\"↶\",curvearrowright:\"↷\",cuvee:\"⋎\",cuwed:\"⋏\",cwconint:\"∲\",cwint:\"∱\",cylcty:\"⌭\",Dagger:\"‡\",dagger:\"†\",daleth:\"ℸ\",Darr:\"↡\",dArr:\"⇓\",darr:\"↓\",dash:\"‐\",Dashv:\"⫤\",dashv:\"⊣\",dbkarow:\"⤏\",dblac:\"˝\",Dcaron:\"Ď\",dcaron:\"ď\",Dcy:\"Д\",dcy:\"д\",DD:\"ⅅ\",dd:\"ⅆ\",ddagger:\"‡\",ddarr:\"⇊\",DDotrahd:\"⤑\",ddotseq:\"⩷\",deg:\"°\",Del:\"∇\",Delta:\"Δ\",delta:\"δ\",demptyv:\"⦱\",dfisht:\"⥿\",Dfr:\"𝔇\",dfr:\"𝔡\",dHar:\"⥥\",dharl:\"⇃\",dharr:\"⇂\",DiacriticalAcute:\"´\",DiacriticalDot:\"˙\",DiacriticalDoubleAcute:\"˝\",DiacriticalGrave:\"`\",DiacriticalTilde:\"˜\",diam:\"⋄\",Diamond:\"⋄\",diamond:\"⋄\",diamondsuit:\"♦\",diams:\"♦\",die:\"¨\",DifferentialD:\"ⅆ\",digamma:\"ϝ\",disin:\"⋲\",div:\"÷\",divide:\"÷\",divideontimes:\"⋇\",divonx:\"⋇\",DJcy:\"Ђ\",djcy:\"ђ\",dlcorn:\"⌞\",dlcrop:\"⌍\",dollar:\"$\",Dopf:\"𝔻\",dopf:\"𝕕\",Dot:\"¨\",dot:\"˙\",DotDot:\"⃜\",doteq:\"≐\",doteqdot:\"≑\",DotEqual:\"≐\",dotminus:\"∸\",dotplus:\"∔\",dotsquare:\"⊡\",doublebarwedge:\"⌆\",DoubleContourIntegral:\"∯\",DoubleDot:\"¨\",DoubleDownArrow:\"⇓\",DoubleLeftArrow:\"⇐\",DoubleLeftRightArrow:\"⇔\",DoubleLeftTee:\"⫤\",DoubleLongLeftArrow:\"⟸\",DoubleLongLeftRightArrow:\"⟺\",DoubleLongRightArrow:\"⟹\",DoubleRightArrow:\"⇒\",DoubleRightTee:\"⊨\",DoubleUpArrow:\"⇑\",DoubleUpDownArrow:\"⇕\",DoubleVerticalBar:\"∥\",DownArrow:\"↓\",Downarrow:\"⇓\",downarrow:\"↓\",DownArrowBar:\"⤓\",DownArrowUpArrow:\"⇵\",DownBreve:\"̑\",downdownarrows:\"⇊\",downharpoonleft:\"⇃\",downharpoonright:\"⇂\",DownLeftRightVector:\"⥐\",DownLeftTeeVector:\"⥞\",DownLeftVector:\"↽\",DownLeftVectorBar:\"⥖\",DownRightTeeVector:\"⥟\",DownRightVector:\"⇁\",DownRightVectorBar:\"⥗\",DownTee:\"⊤\",DownTeeArrow:\"↧\",drbkarow:\"⤐\",drcorn:\"⌟\",drcrop:\"⌌\",Dscr:\"𝒟\",dscr:\"𝒹\",DScy:\"Ѕ\",dscy:\"ѕ\",dsol:\"⧶\",Dstrok:\"Đ\",dstrok:\"đ\",dtdot:\"⋱\",dtri:\"▿\",dtrif:\"▾\",duarr:\"⇵\",duhar:\"⥯\",dwangle:\"⦦\",DZcy:\"Џ\",dzcy:\"џ\",dzigrarr:\"⟿\",Eacute:\"É\",eacute:\"é\",easter:\"⩮\",Ecaron:\"Ě\",ecaron:\"ě\",ecir:\"≖\",Ecirc:\"Ê\",ecirc:\"ê\",ecolon:\"≕\",Ecy:\"Э\",ecy:\"э\",eDDot:\"⩷\",Edot:\"Ė\",eDot:\"≑\",edot:\"ė\",ee:\"ⅇ\",efDot:\"≒\",Efr:\"𝔈\",efr:\"𝔢\",eg:\"⪚\",Egrave:\"È\",egrave:\"è\",egs:\"⪖\",egsdot:\"⪘\",el:\"⪙\",Element:\"∈\",elinters:\"⏧\",ell:\"ℓ\",els:\"⪕\",elsdot:\"⪗\",Emacr:\"Ē\",emacr:\"ē\",empty:\"∅\",emptyset:\"∅\",EmptySmallSquare:\"◻\",emptyv:\"∅\",EmptyVerySmallSquare:\"▫\",emsp:\" \",emsp13:\" \",emsp14:\" \",ENG:\"Ŋ\",eng:\"ŋ\",ensp:\" \",Eogon:\"Ę\",eogon:\"ę\",Eopf:\"𝔼\",eopf:\"𝕖\",epar:\"⋕\",eparsl:\"⧣\",eplus:\"⩱\",epsi:\"ε\",Epsilon:\"Ε\",epsilon:\"ε\",epsiv:\"ϵ\",eqcirc:\"≖\",eqcolon:\"≕\",eqsim:\"≂\",eqslantgtr:\"⪖\",eqslantless:\"⪕\",Equal:\"⩵\",equals:\"=\",EqualTilde:\"≂\",equest:\"≟\",Equilibrium:\"⇌\",equiv:\"≡\",equivDD:\"⩸\",eqvparsl:\"⧥\",erarr:\"⥱\",erDot:\"≓\",Escr:\"ℰ\",escr:\"ℯ\",esdot:\"≐\",Esim:\"⩳\",esim:\"≂\",Eta:\"Η\",eta:\"η\",ETH:\"Ð\",eth:\"ð\",Euml:\"Ë\",euml:\"ë\",euro:\"€\",excl:\"!\",exist:\"∃\",Exists:\"∃\",expectation:\"ℰ\",ExponentialE:\"ⅇ\",exponentiale:\"ⅇ\",fallingdotseq:\"≒\",Fcy:\"Ф\",fcy:\"ф\",female:\"♀\",ffilig:\"ffi\",fflig:\"ff\",ffllig:\"ffl\",Ffr:\"𝔉\",ffr:\"𝔣\",filig:\"fi\",FilledSmallSquare:\"◼\",FilledVerySmallSquare:\"▪\",fjlig:\"fj\",flat:\"♭\",fllig:\"fl\",fltns:\"▱\",fnof:\"ƒ\",Fopf:\"𝔽\",fopf:\"𝕗\",ForAll:\"∀\",forall:\"∀\",fork:\"⋔\",forkv:\"⫙\",Fouriertrf:\"ℱ\",fpartint:\"⨍\",frac12:\"½\",frac13:\"⅓\",frac14:\"¼\",frac15:\"⅕\",frac16:\"⅙\",frac18:\"⅛\",frac23:\"⅔\",frac25:\"⅖\",frac34:\"¾\",frac35:\"⅗\",frac38:\"⅜\",frac45:\"⅘\",frac56:\"⅚\",frac58:\"⅝\",frac78:\"⅞\",frasl:\"⁄\",frown:\"⌢\",Fscr:\"ℱ\",fscr:\"𝒻\",gacute:\"ǵ\",Gamma:\"Γ\",gamma:\"γ\",Gammad:\"Ϝ\",gammad:\"ϝ\",gap:\"⪆\",Gbreve:\"Ğ\",gbreve:\"ğ\",Gcedil:\"Ģ\",Gcirc:\"Ĝ\",gcirc:\"ĝ\",Gcy:\"Г\",gcy:\"г\",Gdot:\"Ġ\",gdot:\"ġ\",gE:\"≧\",ge:\"≥\",gEl:\"⪌\",gel:\"⋛\",geq:\"≥\",geqq:\"≧\",geqslant:\"⩾\",ges:\"⩾\",gescc:\"⪩\",gesdot:\"⪀\",gesdoto:\"⪂\",gesdotol:\"⪄\",gesl:\"⋛︀\",gesles:\"⪔\",Gfr:\"𝔊\",gfr:\"𝔤\",Gg:\"⋙\",gg:\"≫\",ggg:\"⋙\",gimel:\"ℷ\",GJcy:\"Ѓ\",gjcy:\"ѓ\",gl:\"≷\",gla:\"⪥\",glE:\"⪒\",glj:\"⪤\",gnap:\"⪊\",gnapprox:\"⪊\",gnE:\"≩\",gne:\"⪈\",gneq:\"⪈\",gneqq:\"≩\",gnsim:\"⋧\",Gopf:\"𝔾\",gopf:\"𝕘\",grave:\"`\",GreaterEqual:\"≥\",GreaterEqualLess:\"⋛\",GreaterFullEqual:\"≧\",GreaterGreater:\"⪢\",GreaterLess:\"≷\",GreaterSlantEqual:\"⩾\",GreaterTilde:\"≳\",Gscr:\"𝒢\",gscr:\"ℊ\",gsim:\"≳\",gsime:\"⪎\",gsiml:\"⪐\",GT:\">\",Gt:\"≫\",gt:\">\",gtcc:\"⪧\",gtcir:\"⩺\",gtdot:\"⋗\",gtlPar:\"⦕\",gtquest:\"⩼\",gtrapprox:\"⪆\",gtrarr:\"⥸\",gtrdot:\"⋗\",gtreqless:\"⋛\",gtreqqless:\"⪌\",gtrless:\"≷\",gtrsim:\"≳\",gvertneqq:\"≩︀\",gvnE:\"≩︀\",Hacek:\"ˇ\",hairsp:\" \",half:\"½\",hamilt:\"ℋ\",HARDcy:\"Ъ\",hardcy:\"ъ\",hArr:\"⇔\",harr:\"↔\",harrcir:\"⥈\",harrw:\"↭\",Hat:\"^\",hbar:\"ℏ\",Hcirc:\"Ĥ\",hcirc:\"ĥ\",hearts:\"♥\",heartsuit:\"♥\",hellip:\"…\",hercon:\"⊹\",Hfr:\"ℌ\",hfr:\"𝔥\",HilbertSpace:\"ℋ\",hksearow:\"⤥\",hkswarow:\"⤦\",hoarr:\"⇿\",homtht:\"∻\",hookleftarrow:\"↩\",hookrightarrow:\"↪\",Hopf:\"ℍ\",hopf:\"𝕙\",horbar:\"―\",HorizontalLine:\"─\",Hscr:\"ℋ\",hscr:\"𝒽\",hslash:\"ℏ\",Hstrok:\"Ħ\",hstrok:\"ħ\",HumpDownHump:\"≎\",HumpEqual:\"≏\",hybull:\"⁃\",hyphen:\"‐\",Iacute:\"Í\",iacute:\"í\",ic:\"\",Icirc:\"Î\",icirc:\"î\",Icy:\"И\",icy:\"и\",Idot:\"İ\",IEcy:\"Е\",iecy:\"е\",iexcl:\"¡\",iff:\"⇔\",Ifr:\"ℑ\",ifr:\"𝔦\",Igrave:\"Ì\",igrave:\"ì\",ii:\"ⅈ\",iiiint:\"⨌\",iiint:\"∭\",iinfin:\"⧜\",iiota:\"℩\",IJlig:\"IJ\",ijlig:\"ij\",Im:\"ℑ\",Imacr:\"Ī\",imacr:\"ī\",image:\"ℑ\",ImaginaryI:\"ⅈ\",imagline:\"ℐ\",imagpart:\"ℑ\",imath:\"ı\",imof:\"⊷\",imped:\"Ƶ\",Implies:\"⇒\",in:\"∈\",incare:\"℅\",infin:\"∞\",infintie:\"⧝\",inodot:\"ı\",Int:\"∬\",int:\"∫\",intcal:\"⊺\",integers:\"ℤ\",Integral:\"∫\",intercal:\"⊺\",Intersection:\"⋂\",intlarhk:\"⨗\",intprod:\"⨼\",InvisibleComma:\"\",InvisibleTimes:\"\",IOcy:\"Ё\",iocy:\"ё\",Iogon:\"Į\",iogon:\"į\",Iopf:\"𝕀\",iopf:\"𝕚\",Iota:\"Ι\",iota:\"ι\",iprod:\"⨼\",iquest:\"¿\",Iscr:\"ℐ\",iscr:\"𝒾\",isin:\"∈\",isindot:\"⋵\",isinE:\"⋹\",isins:\"⋴\",isinsv:\"⋳\",isinv:\"∈\",it:\"\",Itilde:\"Ĩ\",itilde:\"ĩ\",Iukcy:\"І\",iukcy:\"і\",Iuml:\"Ï\",iuml:\"ï\",Jcirc:\"Ĵ\",jcirc:\"ĵ\",Jcy:\"Й\",jcy:\"й\",Jfr:\"𝔍\",jfr:\"𝔧\",jmath:\"ȷ\",Jopf:\"𝕁\",jopf:\"𝕛\",Jscr:\"𝒥\",jscr:\"𝒿\",Jsercy:\"Ј\",jsercy:\"ј\",Jukcy:\"Є\",jukcy:\"є\",Kappa:\"Κ\",kappa:\"κ\",kappav:\"ϰ\",Kcedil:\"Ķ\",kcedil:\"ķ\",Kcy:\"К\",kcy:\"к\",Kfr:\"𝔎\",kfr:\"𝔨\",kgreen:\"ĸ\",KHcy:\"Х\",khcy:\"х\",KJcy:\"Ќ\",kjcy:\"ќ\",Kopf:\"𝕂\",kopf:\"𝕜\",Kscr:\"𝒦\",kscr:\"𝓀\",lAarr:\"⇚\",Lacute:\"Ĺ\",lacute:\"ĺ\",laemptyv:\"⦴\",lagran:\"ℒ\",Lambda:\"Λ\",lambda:\"λ\",Lang:\"⟪\",lang:\"⟨\",langd:\"⦑\",langle:\"⟨\",lap:\"⪅\",Laplacetrf:\"ℒ\",laquo:\"«\",Larr:\"↞\",lArr:\"⇐\",larr:\"←\",larrb:\"⇤\",larrbfs:\"⤟\",larrfs:\"⤝\",larrhk:\"↩\",larrlp:\"↫\",larrpl:\"⤹\",larrsim:\"⥳\",larrtl:\"↢\",lat:\"⪫\",lAtail:\"⤛\",latail:\"⤙\",late:\"⪭\",lates:\"⪭︀\",lBarr:\"⤎\",lbarr:\"⤌\",lbbrk:\"❲\",lbrace:\"{\",lbrack:\"[\",lbrke:\"⦋\",lbrksld:\"⦏\",lbrkslu:\"⦍\",Lcaron:\"Ľ\",lcaron:\"ľ\",Lcedil:\"Ļ\",lcedil:\"ļ\",lceil:\"⌈\",lcub:\"{\",Lcy:\"Л\",lcy:\"л\",ldca:\"⤶\",ldquo:\"“\",ldquor:\"„\",ldrdhar:\"⥧\",ldrushar:\"⥋\",ldsh:\"↲\",lE:\"≦\",le:\"≤\",LeftAngleBracket:\"⟨\",LeftArrow:\"←\",Leftarrow:\"⇐\",leftarrow:\"←\",LeftArrowBar:\"⇤\",LeftArrowRightArrow:\"⇆\",leftarrowtail:\"↢\",LeftCeiling:\"⌈\",LeftDoubleBracket:\"⟦\",LeftDownTeeVector:\"⥡\",LeftDownVector:\"⇃\",LeftDownVectorBar:\"⥙\",LeftFloor:\"⌊\",leftharpoondown:\"↽\",leftharpoonup:\"↼\",leftleftarrows:\"⇇\",LeftRightArrow:\"↔\",Leftrightarrow:\"⇔\",leftrightarrow:\"↔\",leftrightarrows:\"⇆\",leftrightharpoons:\"⇋\",leftrightsquigarrow:\"↭\",LeftRightVector:\"⥎\",LeftTee:\"⊣\",LeftTeeArrow:\"↤\",LeftTeeVector:\"⥚\",leftthreetimes:\"⋋\",LeftTriangle:\"⊲\",LeftTriangleBar:\"⧏\",LeftTriangleEqual:\"⊴\",LeftUpDownVector:\"⥑\",LeftUpTeeVector:\"⥠\",LeftUpVector:\"↿\",LeftUpVectorBar:\"⥘\",LeftVector:\"↼\",LeftVectorBar:\"⥒\",lEg:\"⪋\",leg:\"⋚\",leq:\"≤\",leqq:\"≦\",leqslant:\"⩽\",les:\"⩽\",lescc:\"⪨\",lesdot:\"⩿\",lesdoto:\"⪁\",lesdotor:\"⪃\",lesg:\"⋚︀\",lesges:\"⪓\",lessapprox:\"⪅\",lessdot:\"⋖\",lesseqgtr:\"⋚\",lesseqqgtr:\"⪋\",LessEqualGreater:\"⋚\",LessFullEqual:\"≦\",LessGreater:\"≶\",lessgtr:\"≶\",LessLess:\"⪡\",lesssim:\"≲\",LessSlantEqual:\"⩽\",LessTilde:\"≲\",lfisht:\"⥼\",lfloor:\"⌊\",Lfr:\"𝔏\",lfr:\"𝔩\",lg:\"≶\",lgE:\"⪑\",lHar:\"⥢\",lhard:\"↽\",lharu:\"↼\",lharul:\"⥪\",lhblk:\"▄\",LJcy:\"Љ\",ljcy:\"љ\",Ll:\"⋘\",ll:\"≪\",llarr:\"⇇\",llcorner:\"⌞\",Lleftarrow:\"⇚\",llhard:\"⥫\",lltri:\"◺\",Lmidot:\"Ŀ\",lmidot:\"ŀ\",lmoust:\"⎰\",lmoustache:\"⎰\",lnap:\"⪉\",lnapprox:\"⪉\",lnE:\"≨\",lne:\"⪇\",lneq:\"⪇\",lneqq:\"≨\",lnsim:\"⋦\",loang:\"⟬\",loarr:\"⇽\",lobrk:\"⟦\",LongLeftArrow:\"⟵\",Longleftarrow:\"⟸\",longleftarrow:\"⟵\",LongLeftRightArrow:\"⟷\",Longleftrightarrow:\"⟺\",longleftrightarrow:\"⟷\",longmapsto:\"⟼\",LongRightArrow:\"⟶\",Longrightarrow:\"⟹\",longrightarrow:\"⟶\",looparrowleft:\"↫\",looparrowright:\"↬\",lopar:\"⦅\",Lopf:\"𝕃\",lopf:\"𝕝\",loplus:\"⨭\",lotimes:\"⨴\",lowast:\"∗\",lowbar:\"_\",LowerLeftArrow:\"↙\",LowerRightArrow:\"↘\",loz:\"◊\",lozenge:\"◊\",lozf:\"⧫\",lpar:\"(\",lparlt:\"⦓\",lrarr:\"⇆\",lrcorner:\"⌟\",lrhar:\"⇋\",lrhard:\"⥭\",lrm:\"\",lrtri:\"⊿\",lsaquo:\"‹\",Lscr:\"ℒ\",lscr:\"𝓁\",Lsh:\"↰\",lsh:\"↰\",lsim:\"≲\",lsime:\"⪍\",lsimg:\"⪏\",lsqb:\"[\",lsquo:\"‘\",lsquor:\"‚\",Lstrok:\"Ł\",lstrok:\"ł\",LT:\"<\",Lt:\"≪\",lt:\"<\",ltcc:\"⪦\",ltcir:\"⩹\",ltdot:\"⋖\",lthree:\"⋋\",ltimes:\"⋉\",ltlarr:\"⥶\",ltquest:\"⩻\",ltri:\"◃\",ltrie:\"⊴\",ltrif:\"◂\",ltrPar:\"⦖\",lurdshar:\"⥊\",luruhar:\"⥦\",lvertneqq:\"≨︀\",lvnE:\"≨︀\",macr:\"¯\",male:\"♂\",malt:\"✠\",maltese:\"✠\",Map:\"⤅\",map:\"↦\",mapsto:\"↦\",mapstodown:\"↧\",mapstoleft:\"↤\",mapstoup:\"↥\",marker:\"▮\",mcomma:\"⨩\",Mcy:\"М\",mcy:\"м\",mdash:\"—\",mDDot:\"∺\",measuredangle:\"∡\",MediumSpace:\" \",Mellintrf:\"ℳ\",Mfr:\"𝔐\",mfr:\"𝔪\",mho:\"℧\",micro:\"µ\",mid:\"∣\",midast:\"*\",midcir:\"⫰\",middot:\"·\",minus:\"−\",minusb:\"⊟\",minusd:\"∸\",minusdu:\"⨪\",MinusPlus:\"∓\",mlcp:\"⫛\",mldr:\"…\",mnplus:\"∓\",models:\"⊧\",Mopf:\"𝕄\",mopf:\"𝕞\",mp:\"∓\",Mscr:\"ℳ\",mscr:\"𝓂\",mstpos:\"∾\",Mu:\"Μ\",mu:\"μ\",multimap:\"⊸\",mumap:\"⊸\",nabla:\"∇\",Nacute:\"Ń\",nacute:\"ń\",nang:\"∠⃒\",nap:\"≉\",napE:\"⩰̸\",napid:\"≋̸\",napos:\"ʼn\",napprox:\"≉\",natur:\"♮\",natural:\"♮\",naturals:\"ℕ\",nbsp:\" \",nbump:\"≎̸\",nbumpe:\"≏̸\",ncap:\"⩃\",Ncaron:\"Ň\",ncaron:\"ň\",Ncedil:\"Ņ\",ncedil:\"ņ\",ncong:\"≇\",ncongdot:\"⩭̸\",ncup:\"⩂\",Ncy:\"Н\",ncy:\"н\",ndash:\"–\",ne:\"≠\",nearhk:\"⤤\",neArr:\"⇗\",nearr:\"↗\",nearrow:\"↗\",nedot:\"≐̸\",NegativeMediumSpace:\"\",NegativeThickSpace:\"\",NegativeThinSpace:\"\",NegativeVeryThinSpace:\"\",nequiv:\"≢\",nesear:\"⤨\",nesim:\"≂̸\",NestedGreaterGreater:\"≫\",NestedLessLess:\"≪\",NewLine:\"\\n\",nexist:\"∄\",nexists:\"∄\",Nfr:\"𝔑\",nfr:\"𝔫\",ngE:\"≧̸\",nge:\"≱\",ngeq:\"≱\",ngeqq:\"≧̸\",ngeqslant:\"⩾̸\",nges:\"⩾̸\",nGg:\"⋙̸\",ngsim:\"≵\",nGt:\"≫⃒\",ngt:\"≯\",ngtr:\"≯\",nGtv:\"≫̸\",nhArr:\"⇎\",nharr:\"↮\",nhpar:\"⫲\",ni:\"∋\",nis:\"⋼\",nisd:\"⋺\",niv:\"∋\",NJcy:\"Њ\",njcy:\"њ\",nlArr:\"⇍\",nlarr:\"↚\",nldr:\"‥\",nlE:\"≦̸\",nle:\"≰\",nLeftarrow:\"⇍\",nleftarrow:\"↚\",nLeftrightarrow:\"⇎\",nleftrightarrow:\"↮\",nleq:\"≰\",nleqq:\"≦̸\",nleqslant:\"⩽̸\",nles:\"⩽̸\",nless:\"≮\",nLl:\"⋘̸\",nlsim:\"≴\",nLt:\"≪⃒\",nlt:\"≮\",nltri:\"⋪\",nltrie:\"⋬\",nLtv:\"≪̸\",nmid:\"∤\",NoBreak:\"\",NonBreakingSpace:\" \",Nopf:\"ℕ\",nopf:\"𝕟\",Not:\"⫬\",not:\"¬\",NotCongruent:\"≢\",NotCupCap:\"≭\",NotDoubleVerticalBar:\"∦\",NotElement:\"∉\",NotEqual:\"≠\",NotEqualTilde:\"≂̸\",NotExists:\"∄\",NotGreater:\"≯\",NotGreaterEqual:\"≱\",NotGreaterFullEqual:\"≧̸\",NotGreaterGreater:\"≫̸\",NotGreaterLess:\"≹\",NotGreaterSlantEqual:\"⩾̸\",NotGreaterTilde:\"≵\",NotHumpDownHump:\"≎̸\",NotHumpEqual:\"≏̸\",notin:\"∉\",notindot:\"⋵̸\",notinE:\"⋹̸\",notinva:\"∉\",notinvb:\"⋷\",notinvc:\"⋶\",NotLeftTriangle:\"⋪\",NotLeftTriangleBar:\"⧏̸\",NotLeftTriangleEqual:\"⋬\",NotLess:\"≮\",NotLessEqual:\"≰\",NotLessGreater:\"≸\",NotLessLess:\"≪̸\",NotLessSlantEqual:\"⩽̸\",NotLessTilde:\"≴\",NotNestedGreaterGreater:\"⪢̸\",NotNestedLessLess:\"⪡̸\",notni:\"∌\",notniva:\"∌\",notnivb:\"⋾\",notnivc:\"⋽\",NotPrecedes:\"⊀\",NotPrecedesEqual:\"⪯̸\",NotPrecedesSlantEqual:\"⋠\",NotReverseElement:\"∌\",NotRightTriangle:\"⋫\",NotRightTriangleBar:\"⧐̸\",NotRightTriangleEqual:\"⋭\",NotSquareSubset:\"⊏̸\",NotSquareSubsetEqual:\"⋢\",NotSquareSuperset:\"⊐̸\",NotSquareSupersetEqual:\"⋣\",NotSubset:\"⊂⃒\",NotSubsetEqual:\"⊈\",NotSucceeds:\"⊁\",NotSucceedsEqual:\"⪰̸\",NotSucceedsSlantEqual:\"⋡\",NotSucceedsTilde:\"≿̸\",NotSuperset:\"⊃⃒\",NotSupersetEqual:\"⊉\",NotTilde:\"≁\",NotTildeEqual:\"≄\",NotTildeFullEqual:\"≇\",NotTildeTilde:\"≉\",NotVerticalBar:\"∤\",npar:\"∦\",nparallel:\"∦\",nparsl:\"⫽⃥\",npart:\"∂̸\",npolint:\"⨔\",npr:\"⊀\",nprcue:\"⋠\",npre:\"⪯̸\",nprec:\"⊀\",npreceq:\"⪯̸\",nrArr:\"⇏\",nrarr:\"↛\",nrarrc:\"⤳̸\",nrarrw:\"↝̸\",nRightarrow:\"⇏\",nrightarrow:\"↛\",nrtri:\"⋫\",nrtrie:\"⋭\",nsc:\"⊁\",nsccue:\"⋡\",nsce:\"⪰̸\",Nscr:\"𝒩\",nscr:\"𝓃\",nshortmid:\"∤\",nshortparallel:\"∦\",nsim:\"≁\",nsime:\"≄\",nsimeq:\"≄\",nsmid:\"∤\",nspar:\"∦\",nsqsube:\"⋢\",nsqsupe:\"⋣\",nsub:\"⊄\",nsubE:\"⫅̸\",nsube:\"⊈\",nsubset:\"⊂⃒\",nsubseteq:\"⊈\",nsubseteqq:\"⫅̸\",nsucc:\"⊁\",nsucceq:\"⪰̸\",nsup:\"⊅\",nsupE:\"⫆̸\",nsupe:\"⊉\",nsupset:\"⊃⃒\",nsupseteq:\"⊉\",nsupseteqq:\"⫆̸\",ntgl:\"≹\",Ntilde:\"Ñ\",ntilde:\"ñ\",ntlg:\"≸\",ntriangleleft:\"⋪\",ntrianglelefteq:\"⋬\",ntriangleright:\"⋫\",ntrianglerighteq:\"⋭\",Nu:\"Ν\",nu:\"ν\",num:\"#\",numero:\"№\",numsp:\" \",nvap:\"≍⃒\",nVDash:\"⊯\",nVdash:\"⊮\",nvDash:\"⊭\",nvdash:\"⊬\",nvge:\"≥⃒\",nvgt:\">⃒\",nvHarr:\"⤄\",nvinfin:\"⧞\",nvlArr:\"⤂\",nvle:\"≤⃒\",nvlt:\"<⃒\",nvltrie:\"⊴⃒\",nvrArr:\"⤃\",nvrtrie:\"⊵⃒\",nvsim:\"∼⃒\",nwarhk:\"⤣\",nwArr:\"⇖\",nwarr:\"↖\",nwarrow:\"↖\",nwnear:\"⤧\",Oacute:\"Ó\",oacute:\"ó\",oast:\"⊛\",ocir:\"⊚\",Ocirc:\"Ô\",ocirc:\"ô\",Ocy:\"О\",ocy:\"о\",odash:\"⊝\",Odblac:\"Ő\",odblac:\"ő\",odiv:\"⨸\",odot:\"⊙\",odsold:\"⦼\",OElig:\"Œ\",oelig:\"œ\",ofcir:\"⦿\",Ofr:\"𝔒\",ofr:\"𝔬\",ogon:\"˛\",Ograve:\"Ò\",ograve:\"ò\",ogt:\"⧁\",ohbar:\"⦵\",ohm:\"Ω\",oint:\"∮\",olarr:\"↺\",olcir:\"⦾\",olcross:\"⦻\",oline:\"‾\",olt:\"⧀\",Omacr:\"Ō\",omacr:\"ō\",Omega:\"Ω\",omega:\"ω\",Omicron:\"Ο\",omicron:\"ο\",omid:\"⦶\",ominus:\"⊖\",Oopf:\"𝕆\",oopf:\"𝕠\",opar:\"⦷\",OpenCurlyDoubleQuote:\"“\",OpenCurlyQuote:\"‘\",operp:\"⦹\",oplus:\"⊕\",Or:\"⩔\",or:\"∨\",orarr:\"↻\",ord:\"⩝\",order:\"ℴ\",orderof:\"ℴ\",ordf:\"ª\",ordm:\"º\",origof:\"⊶\",oror:\"⩖\",orslope:\"⩗\",orv:\"⩛\",oS:\"Ⓢ\",Oscr:\"𝒪\",oscr:\"ℴ\",Oslash:\"Ø\",oslash:\"ø\",osol:\"⊘\",Otilde:\"Õ\",otilde:\"õ\",Otimes:\"⨷\",otimes:\"⊗\",otimesas:\"⨶\",Ouml:\"Ö\",ouml:\"ö\",ovbar:\"⌽\",OverBar:\"‾\",OverBrace:\"⏞\",OverBracket:\"⎴\",OverParenthesis:\"⏜\",par:\"∥\",para:\"¶\",parallel:\"∥\",parsim:\"⫳\",parsl:\"⫽\",part:\"∂\",PartialD:\"∂\",Pcy:\"П\",pcy:\"п\",percnt:\"%\",period:\".\",permil:\"‰\",perp:\"⊥\",pertenk:\"‱\",Pfr:\"𝔓\",pfr:\"𝔭\",Phi:\"Φ\",phi:\"φ\",phiv:\"ϕ\",phmmat:\"ℳ\",phone:\"☎\",Pi:\"Π\",pi:\"π\",pitchfork:\"⋔\",piv:\"ϖ\",planck:\"ℏ\",planckh:\"ℎ\",plankv:\"ℏ\",plus:\"+\",plusacir:\"⨣\",plusb:\"⊞\",pluscir:\"⨢\",plusdo:\"∔\",plusdu:\"⨥\",pluse:\"⩲\",PlusMinus:\"±\",plusmn:\"±\",plussim:\"⨦\",plustwo:\"⨧\",pm:\"±\",Poincareplane:\"ℌ\",pointint:\"⨕\",Popf:\"ℙ\",popf:\"𝕡\",pound:\"£\",Pr:\"⪻\",pr:\"≺\",prap:\"⪷\",prcue:\"≼\",prE:\"⪳\",pre:\"⪯\",prec:\"≺\",precapprox:\"⪷\",preccurlyeq:\"≼\",Precedes:\"≺\",PrecedesEqual:\"⪯\",PrecedesSlantEqual:\"≼\",PrecedesTilde:\"≾\",preceq:\"⪯\",precnapprox:\"⪹\",precneqq:\"⪵\",precnsim:\"⋨\",precsim:\"≾\",Prime:\"″\",prime:\"′\",primes:\"ℙ\",prnap:\"⪹\",prnE:\"⪵\",prnsim:\"⋨\",prod:\"∏\",Product:\"∏\",profalar:\"⌮\",profline:\"⌒\",profsurf:\"⌓\",prop:\"∝\",Proportion:\"∷\",Proportional:\"∝\",propto:\"∝\",prsim:\"≾\",prurel:\"⊰\",Pscr:\"𝒫\",pscr:\"𝓅\",Psi:\"Ψ\",psi:\"ψ\",puncsp:\" \",Qfr:\"𝔔\",qfr:\"𝔮\",qint:\"⨌\",Qopf:\"ℚ\",qopf:\"𝕢\",qprime:\"⁗\",Qscr:\"𝒬\",qscr:\"𝓆\",quaternions:\"ℍ\",quatint:\"⨖\",quest:\"?\",questeq:\"≟\",QUOT:'\"',quot:'\"',rAarr:\"⇛\",race:\"∽̱\",Racute:\"Ŕ\",racute:\"ŕ\",radic:\"√\",raemptyv:\"⦳\",Rang:\"⟫\",rang:\"⟩\",rangd:\"⦒\",range:\"⦥\",rangle:\"⟩\",raquo:\"»\",Rarr:\"↠\",rArr:\"⇒\",rarr:\"→\",rarrap:\"⥵\",rarrb:\"⇥\",rarrbfs:\"⤠\",rarrc:\"⤳\",rarrfs:\"⤞\",rarrhk:\"↪\",rarrlp:\"↬\",rarrpl:\"⥅\",rarrsim:\"⥴\",Rarrtl:\"⤖\",rarrtl:\"↣\",rarrw:\"↝\",rAtail:\"⤜\",ratail:\"⤚\",ratio:\"∶\",rationals:\"ℚ\",RBarr:\"⤐\",rBarr:\"⤏\",rbarr:\"⤍\",rbbrk:\"❳\",rbrace:\"}\",rbrack:\"]\",rbrke:\"⦌\",rbrksld:\"⦎\",rbrkslu:\"⦐\",Rcaron:\"Ř\",rcaron:\"ř\",Rcedil:\"Ŗ\",rcedil:\"ŗ\",rceil:\"⌉\",rcub:\"}\",Rcy:\"Р\",rcy:\"р\",rdca:\"⤷\",rdldhar:\"⥩\",rdquo:\"”\",rdquor:\"”\",rdsh:\"↳\",Re:\"ℜ\",real:\"ℜ\",realine:\"ℛ\",realpart:\"ℜ\",reals:\"ℝ\",rect:\"▭\",REG:\"®\",reg:\"®\",ReverseElement:\"∋\",ReverseEquilibrium:\"⇋\",ReverseUpEquilibrium:\"⥯\",rfisht:\"⥽\",rfloor:\"⌋\",Rfr:\"ℜ\",rfr:\"𝔯\",rHar:\"⥤\",rhard:\"⇁\",rharu:\"⇀\",rharul:\"⥬\",Rho:\"Ρ\",rho:\"ρ\",rhov:\"ϱ\",RightAngleBracket:\"⟩\",RightArrow:\"→\",Rightarrow:\"⇒\",rightarrow:\"→\",RightArrowBar:\"⇥\",RightArrowLeftArrow:\"⇄\",rightarrowtail:\"↣\",RightCeiling:\"⌉\",RightDoubleBracket:\"⟧\",RightDownTeeVector:\"⥝\",RightDownVector:\"⇂\",RightDownVectorBar:\"⥕\",RightFloor:\"⌋\",rightharpoondown:\"⇁\",rightharpoonup:\"⇀\",rightleftarrows:\"⇄\",rightleftharpoons:\"⇌\",rightrightarrows:\"⇉\",rightsquigarrow:\"↝\",RightTee:\"⊢\",RightTeeArrow:\"↦\",RightTeeVector:\"⥛\",rightthreetimes:\"⋌\",RightTriangle:\"⊳\",RightTriangleBar:\"⧐\",RightTriangleEqual:\"⊵\",RightUpDownVector:\"⥏\",RightUpTeeVector:\"⥜\",RightUpVector:\"↾\",RightUpVectorBar:\"⥔\",RightVector:\"⇀\",RightVectorBar:\"⥓\",ring:\"˚\",risingdotseq:\"≓\",rlarr:\"⇄\",rlhar:\"⇌\",rlm:\"\",rmoust:\"⎱\",rmoustache:\"⎱\",rnmid:\"⫮\",roang:\"⟭\",roarr:\"⇾\",robrk:\"⟧\",ropar:\"⦆\",Ropf:\"ℝ\",ropf:\"𝕣\",roplus:\"⨮\",rotimes:\"⨵\",RoundImplies:\"⥰\",rpar:\")\",rpargt:\"⦔\",rppolint:\"⨒\",rrarr:\"⇉\",Rrightarrow:\"⇛\",rsaquo:\"›\",Rscr:\"ℛ\",rscr:\"𝓇\",Rsh:\"↱\",rsh:\"↱\",rsqb:\"]\",rsquo:\"’\",rsquor:\"’\",rthree:\"⋌\",rtimes:\"⋊\",rtri:\"▹\",rtrie:\"⊵\",rtrif:\"▸\",rtriltri:\"⧎\",RuleDelayed:\"⧴\",ruluhar:\"⥨\",rx:\"℞\",Sacute:\"Ś\",sacute:\"ś\",sbquo:\"‚\",Sc:\"⪼\",sc:\"≻\",scap:\"⪸\",Scaron:\"Š\",scaron:\"š\",sccue:\"≽\",scE:\"⪴\",sce:\"⪰\",Scedil:\"Ş\",scedil:\"ş\",Scirc:\"Ŝ\",scirc:\"ŝ\",scnap:\"⪺\",scnE:\"⪶\",scnsim:\"⋩\",scpolint:\"⨓\",scsim:\"≿\",Scy:\"С\",scy:\"с\",sdot:\"⋅\",sdotb:\"⊡\",sdote:\"⩦\",searhk:\"⤥\",seArr:\"⇘\",searr:\"↘\",searrow:\"↘\",sect:\"§\",semi:\";\",seswar:\"⤩\",setminus:\"∖\",setmn:\"∖\",sext:\"✶\",Sfr:\"𝔖\",sfr:\"𝔰\",sfrown:\"⌢\",sharp:\"♯\",SHCHcy:\"Щ\",shchcy:\"щ\",SHcy:\"Ш\",shcy:\"ш\",ShortDownArrow:\"↓\",ShortLeftArrow:\"←\",shortmid:\"∣\",shortparallel:\"∥\",ShortRightArrow:\"→\",ShortUpArrow:\"↑\",shy:\"\",Sigma:\"Σ\",sigma:\"σ\",sigmaf:\"ς\",sigmav:\"ς\",sim:\"∼\",simdot:\"⩪\",sime:\"≃\",simeq:\"≃\",simg:\"⪞\",simgE:\"⪠\",siml:\"⪝\",simlE:\"⪟\",simne:\"≆\",simplus:\"⨤\",simrarr:\"⥲\",slarr:\"←\",SmallCircle:\"∘\",smallsetminus:\"∖\",smashp:\"⨳\",smeparsl:\"⧤\",smid:\"∣\",smile:\"⌣\",smt:\"⪪\",smte:\"⪬\",smtes:\"⪬︀\",SOFTcy:\"Ь\",softcy:\"ь\",sol:\"/\",solb:\"⧄\",solbar:\"⌿\",Sopf:\"𝕊\",sopf:\"𝕤\",spades:\"♠\",spadesuit:\"♠\",spar:\"∥\",sqcap:\"⊓\",sqcaps:\"⊓︀\",sqcup:\"⊔\",sqcups:\"⊔︀\",Sqrt:\"√\",sqsub:\"⊏\",sqsube:\"⊑\",sqsubset:\"⊏\",sqsubseteq:\"⊑\",sqsup:\"⊐\",sqsupe:\"⊒\",sqsupset:\"⊐\",sqsupseteq:\"⊒\",squ:\"□\",Square:\"□\",square:\"□\",SquareIntersection:\"⊓\",SquareSubset:\"⊏\",SquareSubsetEqual:\"⊑\",SquareSuperset:\"⊐\",SquareSupersetEqual:\"⊒\",SquareUnion:\"⊔\",squarf:\"▪\",squf:\"▪\",srarr:\"→\",Sscr:\"𝒮\",sscr:\"𝓈\",ssetmn:\"∖\",ssmile:\"⌣\",sstarf:\"⋆\",Star:\"⋆\",star:\"☆\",starf:\"★\",straightepsilon:\"ϵ\",straightphi:\"ϕ\",strns:\"¯\",Sub:\"⋐\",sub:\"⊂\",subdot:\"⪽\",subE:\"⫅\",sube:\"⊆\",subedot:\"⫃\",submult:\"⫁\",subnE:\"⫋\",subne:\"⊊\",subplus:\"⪿\",subrarr:\"⥹\",Subset:\"⋐\",subset:\"⊂\",subseteq:\"⊆\",subseteqq:\"⫅\",SubsetEqual:\"⊆\",subsetneq:\"⊊\",subsetneqq:\"⫋\",subsim:\"⫇\",subsub:\"⫕\",subsup:\"⫓\",succ:\"≻\",succapprox:\"⪸\",succcurlyeq:\"≽\",Succeeds:\"≻\",SucceedsEqual:\"⪰\",SucceedsSlantEqual:\"≽\",SucceedsTilde:\"≿\",succeq:\"⪰\",succnapprox:\"⪺\",succneqq:\"⪶\",succnsim:\"⋩\",succsim:\"≿\",SuchThat:\"∋\",Sum:\"∑\",sum:\"∑\",sung:\"♪\",Sup:\"⋑\",sup:\"⊃\",sup1:\"¹\",sup2:\"²\",sup3:\"³\",supdot:\"⪾\",supdsub:\"⫘\",supE:\"⫆\",supe:\"⊇\",supedot:\"⫄\",Superset:\"⊃\",SupersetEqual:\"⊇\",suphsol:\"⟉\",suphsub:\"⫗\",suplarr:\"⥻\",supmult:\"⫂\",supnE:\"⫌\",supne:\"⊋\",supplus:\"⫀\",Supset:\"⋑\",supset:\"⊃\",supseteq:\"⊇\",supseteqq:\"⫆\",supsetneq:\"⊋\",supsetneqq:\"⫌\",supsim:\"⫈\",supsub:\"⫔\",supsup:\"⫖\",swarhk:\"⤦\",swArr:\"⇙\",swarr:\"↙\",swarrow:\"↙\",swnwar:\"⤪\",szlig:\"ß\",Tab:\"\\t\",target:\"⌖\",Tau:\"Τ\",tau:\"τ\",tbrk:\"⎴\",Tcaron:\"Ť\",tcaron:\"ť\",Tcedil:\"Ţ\",tcedil:\"ţ\",Tcy:\"Т\",tcy:\"т\",tdot:\"⃛\",telrec:\"⌕\",Tfr:\"𝔗\",tfr:\"𝔱\",there4:\"∴\",Therefore:\"∴\",therefore:\"∴\",Theta:\"Θ\",theta:\"θ\",thetasym:\"ϑ\",thetav:\"ϑ\",thickapprox:\"≈\",thicksim:\"∼\",ThickSpace:\" \",thinsp:\" \",ThinSpace:\" \",thkap:\"≈\",thksim:\"∼\",THORN:\"Þ\",thorn:\"þ\",Tilde:\"∼\",tilde:\"˜\",TildeEqual:\"≃\",TildeFullEqual:\"≅\",TildeTilde:\"≈\",times:\"×\",timesb:\"⊠\",timesbar:\"⨱\",timesd:\"⨰\",tint:\"∭\",toea:\"⤨\",top:\"⊤\",topbot:\"⌶\",topcir:\"⫱\",Topf:\"𝕋\",topf:\"𝕥\",topfork:\"⫚\",tosa:\"⤩\",tprime:\"‴\",TRADE:\"™\",trade:\"™\",triangle:\"▵\",triangledown:\"▿\",triangleleft:\"◃\",trianglelefteq:\"⊴\",triangleq:\"≜\",triangleright:\"▹\",trianglerighteq:\"⊵\",tridot:\"◬\",trie:\"≜\",triminus:\"⨺\",TripleDot:\"⃛\",triplus:\"⨹\",trisb:\"⧍\",tritime:\"⨻\",trpezium:\"⏢\",Tscr:\"𝒯\",tscr:\"𝓉\",TScy:\"Ц\",tscy:\"ц\",TSHcy:\"Ћ\",tshcy:\"ћ\",Tstrok:\"Ŧ\",tstrok:\"ŧ\",twixt:\"≬\",twoheadleftarrow:\"↞\",twoheadrightarrow:\"↠\",Uacute:\"Ú\",uacute:\"ú\",Uarr:\"↟\",uArr:\"⇑\",uarr:\"↑\",Uarrocir:\"⥉\",Ubrcy:\"Ў\",ubrcy:\"ў\",Ubreve:\"Ŭ\",ubreve:\"ŭ\",Ucirc:\"Û\",ucirc:\"û\",Ucy:\"У\",ucy:\"у\",udarr:\"⇅\",Udblac:\"Ű\",udblac:\"ű\",udhar:\"⥮\",ufisht:\"⥾\",Ufr:\"𝔘\",ufr:\"𝔲\",Ugrave:\"Ù\",ugrave:\"ù\",uHar:\"⥣\",uharl:\"↿\",uharr:\"↾\",uhblk:\"▀\",ulcorn:\"⌜\",ulcorner:\"⌜\",ulcrop:\"⌏\",ultri:\"◸\",Umacr:\"Ū\",umacr:\"ū\",uml:\"¨\",UnderBar:\"_\",UnderBrace:\"⏟\",UnderBracket:\"⎵\",UnderParenthesis:\"⏝\",Union:\"⋃\",UnionPlus:\"⊎\",Uogon:\"Ų\",uogon:\"ų\",Uopf:\"𝕌\",uopf:\"𝕦\",UpArrow:\"↑\",Uparrow:\"⇑\",uparrow:\"↑\",UpArrowBar:\"⤒\",UpArrowDownArrow:\"⇅\",UpDownArrow:\"↕\",Updownarrow:\"⇕\",updownarrow:\"↕\",UpEquilibrium:\"⥮\",upharpoonleft:\"↿\",upharpoonright:\"↾\",uplus:\"⊎\",UpperLeftArrow:\"↖\",UpperRightArrow:\"↗\",Upsi:\"ϒ\",upsi:\"υ\",upsih:\"ϒ\",Upsilon:\"Υ\",upsilon:\"υ\",UpTee:\"⊥\",UpTeeArrow:\"↥\",upuparrows:\"⇈\",urcorn:\"⌝\",urcorner:\"⌝\",urcrop:\"⌎\",Uring:\"Ů\",uring:\"ů\",urtri:\"◹\",Uscr:\"𝒰\",uscr:\"𝓊\",utdot:\"⋰\",Utilde:\"Ũ\",utilde:\"ũ\",utri:\"▵\",utrif:\"▴\",uuarr:\"⇈\",Uuml:\"Ü\",uuml:\"ü\",uwangle:\"⦧\",vangrt:\"⦜\",varepsilon:\"ϵ\",varkappa:\"ϰ\",varnothing:\"∅\",varphi:\"ϕ\",varpi:\"ϖ\",varpropto:\"∝\",vArr:\"⇕\",varr:\"↕\",varrho:\"ϱ\",varsigma:\"ς\",varsubsetneq:\"⊊︀\",varsubsetneqq:\"⫋︀\",varsupsetneq:\"⊋︀\",varsupsetneqq:\"⫌︀\",vartheta:\"ϑ\",vartriangleleft:\"⊲\",vartriangleright:\"⊳\",Vbar:\"⫫\",vBar:\"⫨\",vBarv:\"⫩\",Vcy:\"В\",vcy:\"в\",VDash:\"⊫\",Vdash:\"⊩\",vDash:\"⊨\",vdash:\"⊢\",Vdashl:\"⫦\",Vee:\"⋁\",vee:\"∨\",veebar:\"⊻\",veeeq:\"≚\",vellip:\"⋮\",Verbar:\"‖\",verbar:\"|\",Vert:\"‖\",vert:\"|\",VerticalBar:\"∣\",VerticalLine:\"|\",VerticalSeparator:\"❘\",VerticalTilde:\"≀\",VeryThinSpace:\" \",Vfr:\"𝔙\",vfr:\"𝔳\",vltri:\"⊲\",vnsub:\"⊂⃒\",vnsup:\"⊃⃒\",Vopf:\"𝕍\",vopf:\"𝕧\",vprop:\"∝\",vrtri:\"⊳\",Vscr:\"𝒱\",vscr:\"𝓋\",vsubnE:\"⫋︀\",vsubne:\"⊊︀\",vsupnE:\"⫌︀\",vsupne:\"⊋︀\",Vvdash:\"⊪\",vzigzag:\"⦚\",Wcirc:\"Ŵ\",wcirc:\"ŵ\",wedbar:\"⩟\",Wedge:\"⋀\",wedge:\"∧\",wedgeq:\"≙\",weierp:\"℘\",Wfr:\"𝔚\",wfr:\"𝔴\",Wopf:\"𝕎\",wopf:\"𝕨\",wp:\"℘\",wr:\"≀\",wreath:\"≀\",Wscr:\"𝒲\",wscr:\"𝓌\",xcap:\"⋂\",xcirc:\"◯\",xcup:\"⋃\",xdtri:\"▽\",Xfr:\"𝔛\",xfr:\"𝔵\",xhArr:\"⟺\",xharr:\"⟷\",Xi:\"Ξ\",xi:\"ξ\",xlArr:\"⟸\",xlarr:\"⟵\",xmap:\"⟼\",xnis:\"⋻\",xodot:\"⨀\",Xopf:\"𝕏\",xopf:\"𝕩\",xoplus:\"⨁\",xotime:\"⨂\",xrArr:\"⟹\",xrarr:\"⟶\",Xscr:\"𝒳\",xscr:\"𝓍\",xsqcup:\"⨆\",xuplus:\"⨄\",xutri:\"△\",xvee:\"⋁\",xwedge:\"⋀\",Yacute:\"Ý\",yacute:\"ý\",YAcy:\"Я\",yacy:\"я\",Ycirc:\"Ŷ\",ycirc:\"ŷ\",Ycy:\"Ы\",ycy:\"ы\",yen:\"¥\",Yfr:\"𝔜\",yfr:\"𝔶\",YIcy:\"Ї\",yicy:\"ї\",Yopf:\"𝕐\",yopf:\"𝕪\",Yscr:\"𝒴\",yscr:\"𝓎\",YUcy:\"Ю\",yucy:\"ю\",Yuml:\"Ÿ\",yuml:\"ÿ\",Zacute:\"Ź\",zacute:\"ź\",Zcaron:\"Ž\",zcaron:\"ž\",Zcy:\"З\",zcy:\"з\",Zdot:\"Ż\",zdot:\"ż\",zeetrf:\"ℨ\",ZeroWidthSpace:\"\",Zeta:\"Ζ\",zeta:\"ζ\",Zfr:\"ℨ\",zfr:\"𝔷\",ZHcy:\"Ж\",zhcy:\"ж\",zigrarr:\"⇝\",Zopf:\"ℤ\",zopf:\"𝕫\",Zscr:\"𝒵\",zscr:\"𝓏\",zwj:\"\",zwnj:\"\"},r=Object.prototype.hasOwnProperty;function n(e){return o=e,(n=t)&&r.call(n,o)?t[e]:e;var n,o}var o=Object.prototype.hasOwnProperty;function s(e,t){return!!e&&o.call(e,t)}function i(e){return[].slice.call(arguments,1).forEach(function(t){if(t){if(\"object\"!=typeof t)throw new TypeError(t+\"must be object\");Object.keys(t).forEach(function(r){e[r]=t[r]})}}),e}var a=/\\\\([\\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;function u(e){return e.indexOf(\"\\\\\")<0?e:e.replace(a,\"$1\")}function l(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function c(e){if(e>65535){var t=55296+((e-=65536)>>10),r=56320+(1023&e);return String.fromCharCode(t,r)}return String.fromCharCode(e)}var p=/&([a-z#][a-z0-9]{1,31});/gi,h=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i;function f(e,t){var r=0,o=n(t);return t!==o?o:35===t.charCodeAt(0)&&h.test(t)&&l(r=\"x\"===t[1].toLowerCase()?parseInt(t.slice(2),16):parseInt(t.slice(1),10))?c(r):e}function g(e){return e.indexOf(\"&\")<0?e:e.replace(p,f)}var d=/[&<>\"]/,m=/[&<>\"]/g,b={\"&\":\"&\",\"<\":\"<\",\">\":\">\",'\"':\""\"};function v(e){return b[e]}function k(e){return d.test(e)?e.replace(m,v):e}var A=Object.freeze({isString:function(e){return\"[object String]\"===function(e){return Object.prototype.toString.call(e)}(e)},has:s,assign:i,unescapeMd:u,isValidEntityCode:l,fromCodePoint:c,replaceEntities:g,escapeHtml:k}),y={};y.blockquote_open=function(){return\"<blockquote>\\n\"},y.blockquote_close=function(e,t){return\"</blockquote>\"+x(e,t)},y.code=function(e,t){return e[t].block?\"<pre><code>\"+k(e[t].content)+\"</code></pre>\"+x(e,t):\"<code>\"+k(e[t].content)+\"</code>\"},y.fence=function(e,t,r,n,o){var i,a,l=e[t],c=\"\",p=r.langPrefix;if(l.params){if(a=(i=l.params.split(/\\s+/g)).join(\" \"),s(o.rules.fence_custom,i[0]))return o.rules.fence_custom[i[0]](e,t,r,n,o);c=' class=\"'+p+k(g(u(a)))+'\"'}return\"<pre><code\"+c+\">\"+(r.highlight&&r.highlight.apply(r.highlight,[l.content].concat(i))||k(l.content))+\"</code></pre>\"+x(e,t)},y.fence_custom={},y.heading_open=function(e,t){return\"<h\"+e[t].hLevel+\">\"},y.heading_close=function(e,t){return\"</h\"+e[t].hLevel+\">\\n\"},y.hr=function(e,t,r){return(r.xhtmlOut?\"<hr />\":\"<hr>\")+x(e,t)},y.bullet_list_open=function(){return\"<ul>\\n\"},y.bullet_list_close=function(e,t){return\"</ul>\"+x(e,t)},y.list_item_open=function(){return\"<li>\"},y.list_item_close=function(){return\"</li>\\n\"},y.ordered_list_open=function(e,t){var r=e[t];return\"<ol\"+(r.order>1?' start=\"'+r.order+'\"':\"\")+\">\\n\"},y.ordered_list_close=function(e,t){return\"</ol>\"+x(e,t)},y.paragraph_open=function(e,t){return e[t].tight?\"\":\"<p>\"},y.paragraph_close=function(e,t){var r=!(e[t].tight&&t&&\"inline\"===e[t-1].type&&!e[t-1].content);return(e[t].tight?\"\":\"</p>\")+(r?x(e,t):\"\")},y.link_open=function(e,t,r){var n=e[t].title?' title=\"'+k(g(e[t].title))+'\"':\"\",o=r.linkTarget?' target=\"'+r.linkTarget+'\"':\"\";return'<a href=\"'+k(e[t].href)+'\"'+n+o+\">\"},y.link_close=function(){return\"</a>\"},y.image=function(e,t,r){var n=' src=\"'+k(e[t].src)+'\"',o=e[t].title?' title=\"'+k(g(e[t].title))+'\"':\"\";return\"<img\"+n+(' alt=\"'+(e[t].alt?k(g(u(e[t].alt))):\"\")+'\"')+o+(r.xhtmlOut?\" /\":\"\")+\">\"},y.table_open=function(){return\"<table>\\n\"},y.table_close=function(){return\"</table>\\n\"},y.thead_open=function(){return\"<thead>\\n\"},y.thead_close=function(){return\"</thead>\\n\"},y.tbody_open=function(){return\"<tbody>\\n\"},y.tbody_close=function(){return\"</tbody>\\n\"},y.tr_open=function(){return\"<tr>\"},y.tr_close=function(){return\"</tr>\\n\"},y.th_open=function(e,t){var r=e[t];return\"<th\"+(r.align?' style=\"text-align:'+r.align+'\"':\"\")+\">\"},y.th_close=function(){return\"</th>\"},y.td_open=function(e,t){var r=e[t];return\"<td\"+(r.align?' style=\"text-align:'+r.align+'\"':\"\")+\">\"},y.td_close=function(){return\"</td>\"},y.strong_open=function(){return\"<strong>\"},y.strong_close=function(){return\"</strong>\"},y.em_open=function(){return\"<em>\"},y.em_close=function(){return\"</em>\"},y.del_open=function(){return\"<del>\"},y.del_close=function(){return\"</del>\"},y.ins_open=function(){return\"<ins>\"},y.ins_close=function(){return\"</ins>\"},y.mark_open=function(){return\"<mark>\"},y.mark_close=function(){return\"</mark>\"},y.sub=function(e,t){return\"<sub>\"+k(e[t].content)+\"</sub>\"},y.sup=function(e,t){return\"<sup>\"+k(e[t].content)+\"</sup>\"},y.hardbreak=function(e,t,r){return r.xhtmlOut?\"<br />\\n\":\"<br>\\n\"},y.softbreak=function(e,t,r){return r.breaks?r.xhtmlOut?\"<br />\\n\":\"<br>\\n\":\"\\n\"},y.text=function(e,t){return k(e[t].content)},y.htmlblock=function(e,t){return e[t].content},y.htmltag=function(e,t){return e[t].content},y.abbr_open=function(e,t){return'<abbr title=\"'+k(g(e[t].title))+'\">'},y.abbr_close=function(){return\"</abbr>\"},y.footnote_ref=function(e,t){var r=Number(e[t].id+1).toString(),n=\"fnref\"+r;return e[t].subId>0&&(n+=\":\"+e[t].subId),'<sup class=\"footnote-ref\"><a href=\"#fn'+r+'\" id=\"'+n+'\">['+r+\"]</a></sup>\"},y.footnote_block_open=function(e,t,r){return(r.xhtmlOut?'<hr class=\"footnotes-sep\" />\\n':'<hr class=\"footnotes-sep\">\\n')+'<section class=\"footnotes\">\\n<ol class=\"footnotes-list\">\\n'},y.footnote_block_close=function(){return\"</ol>\\n</section>\\n\"},y.footnote_open=function(e,t){return'<li id=\"fn'+Number(e[t].id+1).toString()+'\" class=\"footnote-item\">'},y.footnote_close=function(){return\"</li>\\n\"},y.footnote_anchor=function(e,t){var r=\"fnref\"+Number(e[t].id+1).toString();return e[t].subId>0&&(r+=\":\"+e[t].subId),' <a href=\"#'+r+'\" class=\"footnote-backref\">↩</a>'},y.dl_open=function(){return\"<dl>\\n\"},y.dt_open=function(){return\"<dt>\"},y.dd_open=function(){return\"<dd>\"},y.dl_close=function(){return\"</dl>\\n\"},y.dt_close=function(){return\"</dt>\\n\"},y.dd_close=function(){return\"</dd>\\n\"};var x=y.getBreak=function(e,t){return(t=function e(t,r){return++r>=t.length-2?r:\"paragraph_open\"===t[r].type&&t[r].tight&&\"inline\"===t[r+1].type&&0===t[r+1].content.length&&\"paragraph_close\"===t[r+2].type&&t[r+2].tight?e(t,r+2):r}(e,t))<e.length&&\"list_item_close\"===e[t].type?\"\":\"\\n\"};function w(){this.rules=i({},y),this.getBreak=y.getBreak}function C(){this.__rules__=[],this.__cache__=null}function E(e,t,r,n,o){this.src=e,this.env=n,this.options=r,this.parser=t,this.tokens=o,this.pos=0,this.posMax=this.src.length,this.level=0,this.pending=\"\",this.pendingLevel=0,this.cache=[],this.isInLabel=!1,this.linkLevel=0,this.linkContent=\"\",this.labelUnmatchedScopes=0}function D(e,t){var r,n,o,s=-1,i=e.posMax,a=e.pos,u=e.isInLabel;if(e.isInLabel)return-1;if(e.labelUnmatchedScopes)return e.labelUnmatchedScopes--,-1;for(e.pos=t+1,e.isInLabel=!0,r=1;e.pos<i;){if(91===(o=e.src.charCodeAt(e.pos)))r++;else if(93===o&&0===--r){n=!0;break}e.parser.skipToken(e)}return n?(s=e.pos,e.labelUnmatchedScopes=0):e.labelUnmatchedScopes=r-1,e.pos=a,e.isInLabel=u,s}function _(e,t,r,n){var o,s,i,a,u,l;if(42!==e.charCodeAt(0))return-1;if(91!==e.charCodeAt(1))return-1;if(-1===e.indexOf(\"]:\"))return-1;if((s=D(o=new E(e,t,r,n,[]),1))<0||58!==e.charCodeAt(s+1))return-1;for(a=o.posMax,i=s+2;i<a&&10!==o.src.charCodeAt(i);i++);return u=e.slice(2,s),0===(l=e.slice(s+2,i).trim()).length?-1:(n.abbreviations||(n.abbreviations={}),void 0===n.abbreviations[\":\"+u]&&(n.abbreviations[\":\"+u]=l),i)}function B(e){var t=g(e);try{t=decodeURI(t)}catch(e){}return encodeURI(t)}function q(e,t){var r,n,o,s=t,i=e.posMax;if(60===e.src.charCodeAt(t)){for(t++;t<i;){if(10===(r=e.src.charCodeAt(t)))return!1;if(62===r)return o=B(u(e.src.slice(s+1,t))),!!e.parser.validateLink(o)&&(e.pos=t+1,e.linkContent=o,!0);92===r&&t+1<i?t+=2:t++}return!1}for(n=0;t<i&&32!==(r=e.src.charCodeAt(t))&&!(r<32||127===r);)if(92===r&&t+1<i)t+=2;else{if(40===r&&++n>1)break;if(41===r&&--n<0)break;t++}return s!==t&&(o=u(e.src.slice(s,t)),!!e.parser.validateLink(o)&&(e.linkContent=o,e.pos=t,!0))}function F(e,t){var r,n=t,o=e.posMax,s=e.src.charCodeAt(t);if(34!==s&&39!==s&&40!==s)return!1;for(t++,40===s&&(s=41);t<o;){if((r=e.src.charCodeAt(t))===s)return e.pos=t+1,e.linkContent=u(e.src.slice(n+1,t)),!0;92===r&&t+1<o?t+=2:t++}return!1}function M(e){return e.trim().replace(/\\s+/g,\" \").toUpperCase()}function S(e,t,r,n){var o,s,i,a,u,l,c,p,h;if(91!==e.charCodeAt(0))return-1;if(-1===e.indexOf(\"]:\"))return-1;if((s=D(o=new E(e,t,r,n,[]),0))<0||58!==e.charCodeAt(s+1))return-1;for(a=o.posMax,i=s+2;i<a&&(32===(u=o.src.charCodeAt(i))||10===u);i++);if(!q(o,i))return-1;for(c=o.linkContent,l=i=o.pos,i+=1;i<a&&(32===(u=o.src.charCodeAt(i))||10===u);i++);for(i<a&&l!==i&&F(o,i)?(p=o.linkContent,i=o.pos):(p=\"\",i=l);i<a&&32===o.src.charCodeAt(i);)i++;return i<a&&10!==o.src.charCodeAt(i)?-1:(h=M(e.slice(1,s)),void 0===n.references[h]&&(n.references[h]={title:p,href:c}),i)}w.prototype.renderInline=function(e,t,r){for(var n=this.rules,o=e.length,s=0,i=\"\";o--;)i+=n[e[s].type](e,s++,t,r,this);return i},w.prototype.render=function(e,t,r){for(var n=this.rules,o=e.length,s=-1,i=\"\";++s<o;)\"inline\"===e[s].type?i+=this.renderInline(e[s].children,t,r):i+=n[e[s].type](e,s,t,r,this);return i},C.prototype.__find__=function(e){for(var t=this.__rules__.length,r=-1;t--;)if(this.__rules__[++r].name===e)return r;return-1},C.prototype.__compile__=function(){var e=this,t=[\"\"];e.__rules__.forEach(function(e){e.enabled&&e.alt.forEach(function(e){t.indexOf(e)<0&&t.push(e)})}),e.__cache__={},t.forEach(function(t){e.__cache__[t]=[],e.__rules__.forEach(function(r){r.enabled&&(t&&r.alt.indexOf(t)<0||e.__cache__[t].push(r.fn))})})},C.prototype.at=function(e,t,r){var n=this.__find__(e),o=r||{};if(-1===n)throw new Error(\"Parser rule not found: \"+e);this.__rules__[n].fn=t,this.__rules__[n].alt=o.alt||[],this.__cache__=null},C.prototype.before=function(e,t,r,n){var o=this.__find__(e),s=n||{};if(-1===o)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(o,0,{name:t,enabled:!0,fn:r,alt:s.alt||[]}),this.__cache__=null},C.prototype.after=function(e,t,r,n){var o=this.__find__(e),s=n||{};if(-1===o)throw new Error(\"Parser rule not found: \"+e);this.__rules__.splice(o+1,0,{name:t,enabled:!0,fn:r,alt:s.alt||[]}),this.__cache__=null},C.prototype.push=function(e,t,r){var n=r||{};this.__rules__.push({name:e,enabled:!0,fn:t,alt:n.alt||[]}),this.__cache__=null},C.prototype.enable=function(e,t){e=Array.isArray(e)?e:[e],t&&this.__rules__.forEach(function(e){e.enabled=!1}),e.forEach(function(e){var t=this.__find__(e);if(t<0)throw new Error(\"Rules manager: invalid rule name \"+e);this.__rules__[t].enabled=!0},this),this.__cache__=null},C.prototype.disable=function(e){(e=Array.isArray(e)?e:[e]).forEach(function(e){var t=this.__find__(e);if(t<0)throw new Error(\"Rules manager: invalid rule name \"+e);this.__rules__[t].enabled=!1},this),this.__cache__=null},C.prototype.getRules=function(e){return null===this.__cache__&&this.__compile__(),this.__cache__[e]||[]},E.prototype.pushPending=function(){this.tokens.push({type:\"text\",content:this.pending,level:this.pendingLevel}),this.pending=\"\"},E.prototype.push=function(e){this.pending&&this.pushPending(),this.tokens.push(e),this.pendingLevel=this.level},E.prototype.cacheSet=function(e,t){for(var r=this.cache.length;r<=e;r++)this.cache.push(0);this.cache[e]=t},E.prototype.cacheGet=function(e){return e<this.cache.length?this.cache[e]:0};var T=\" \\n()[]'\\\".,!?-\";function L(e){return e.replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g,\"\\\\$1\")}var R=/\\+-|\\.\\.|\\?\\?\\?\\?|!!!!|,,|--/,N=/\\((c|tm|r|p)\\)/gi,z={c:\"©\",r:\"®\",p:\"§\",tm:\"™\"};var P=/['\"]/,j=/['\"]/g,I=/[-\\s()\\[\\]]/,O=\"’\";function U(e,t){return!(t<0||t>=e.length)&&!I.test(e[t])}function H(e,t,r){return e.substr(0,t)+r+e.substr(t+1)}var V=[[\"block\",function(e){e.inlineMode?e.tokens.push({type:\"inline\",content:e.src.replace(/\\n/g,\" \").trim(),level:0,lines:[0,1],children:[]}):e.block.parse(e.src,e.options,e.env,e.tokens)}],[\"abbr\",function(e){var t,r,n,o,s=e.tokens;if(!e.inlineMode)for(t=1,r=s.length-1;t<r;t++)if(\"paragraph_open\"===s[t-1].type&&\"inline\"===s[t].type&&\"paragraph_close\"===s[t+1].type){for(n=s[t].content;n.length&&!((o=_(n,e.inline,e.options,e.env))<0);)n=n.slice(o).trim();s[t].content=n,n.length||(s[t-1].tight=!0,s[t+1].tight=!0)}}],[\"references\",function(e){var t,r,n,o,s=e.tokens;if(e.env.references=e.env.references||{},!e.inlineMode)for(t=1,r=s.length-1;t<r;t++)if(\"inline\"===s[t].type&&\"paragraph_open\"===s[t-1].type&&\"paragraph_close\"===s[t+1].type){for(n=s[t].content;n.length&&!((o=S(n,e.inline,e.options,e.env))<0);)n=n.slice(o).trim();s[t].content=n,n.length||(s[t-1].tight=!0,s[t+1].tight=!0)}}],[\"inline\",function(e){var t,r,n,o=e.tokens;for(r=0,n=o.length;r<n;r++)\"inline\"===(t=o[r]).type&&e.inline.parse(t.content,e.options,e.env,t.children)}],[\"footnote_tail\",function(e){var t,r,n,o,s,i,a,u,l,c=0,p=!1,h={};if(e.env.footnotes&&(e.tokens=e.tokens.filter(function(e){return\"footnote_reference_open\"===e.type?(p=!0,u=[],l=e.label,!1):\"footnote_reference_close\"===e.type?(p=!1,h[\":\"+l]=u,!1):(p&&u.push(e),!p)}),e.env.footnotes.list)){for(i=e.env.footnotes.list,e.tokens.push({type:\"footnote_block_open\",level:c++}),t=0,r=i.length;t<r;t++){for(e.tokens.push({type:\"footnote_open\",id:t,level:c++}),i[t].tokens?((a=[]).push({type:\"paragraph_open\",tight:!1,level:c++}),a.push({type:\"inline\",content:\"\",level:c,children:i[t].tokens}),a.push({type:\"paragraph_close\",tight:!1,level:--c})):i[t].label&&(a=h[\":\"+i[t].label]),e.tokens=e.tokens.concat(a),s=\"paragraph_close\"===e.tokens[e.tokens.length-1].type?e.tokens.pop():null,o=i[t].count>0?i[t].count:1,n=0;n<o;n++)e.tokens.push({type:\"footnote_anchor\",id:t,subId:n,level:c});s&&e.tokens.push(s),e.tokens.push({type:\"footnote_close\",level:--c})}e.tokens.push({type:\"footnote_block_close\",level:--c})}}],[\"abbr2\",function(e){var t,r,n,o,s,i,a,u,l,c,p,h,f=e.tokens;if(e.env.abbreviations)for(e.env.abbrRegExp||(h=\"(^|[\"+T.split(\"\").map(L).join(\"\")+\"])(\"+Object.keys(e.env.abbreviations).map(function(e){return e.substr(1)}).sort(function(e,t){return t.length-e.length}).map(L).join(\"|\")+\")($|[\"+T.split(\"\").map(L).join(\"\")+\"])\",e.env.abbrRegExp=new RegExp(h,\"g\")),c=e.env.abbrRegExp,r=0,n=f.length;r<n;r++)if(\"inline\"===f[r].type)for(t=(o=f[r].children).length-1;t>=0;t--)if(\"text\"===(s=o[t]).type){for(u=0,i=s.content,c.lastIndex=0,l=s.level,a=[];p=c.exec(i);)c.lastIndex>u&&a.push({type:\"text\",content:i.slice(u,p.index+p[1].length),level:l}),a.push({type:\"abbr_open\",title:e.env.abbreviations[\":\"+p[2]],level:l++}),a.push({type:\"text\",content:p[2],level:l}),a.push({type:\"abbr_close\",level:--l}),u=c.lastIndex-p[3].length;a.length&&(u<i.length&&a.push({type:\"text\",content:i.slice(u),level:l}),f[r].children=o=[].concat(o.slice(0,t),a,o.slice(t+1)))}}],[\"replacements\",function(e){var t,r,n,o,s,i;if(e.options.typographer)for(s=e.tokens.length-1;s>=0;s--)if(\"inline\"===e.tokens[s].type)for(t=(o=e.tokens[s].children).length-1;t>=0;t--)\"text\"===(r=o[t]).type&&(n=r.content,n=(i=n).indexOf(\"(\")<0?i:i.replace(N,function(e,t){return z[t.toLowerCase()]}),R.test(n)&&(n=n.replace(/\\+-/g,\"±\").replace(/\\.{2,}/g,\"…\").replace(/([?!])…/g,\"$1..\").replace(/([?!]){4,}/g,\"$1$1$1\").replace(/,{2,}/g,\",\").replace(/(^|[^-])---([^-]|$)/gm,\"$1—$2\").replace(/(^|\\s)--(\\s|$)/gm,\"$1–$2\").replace(/(^|[^-\\s])--([^-\\s]|$)/gm,\"$1–$2\")),r.content=n)}],[\"smartquotes\",function(e){var t,r,n,o,s,i,a,u,l,c,p,h,f,g,d,m,b;if(e.options.typographer)for(b=[],d=e.tokens.length-1;d>=0;d--)if(\"inline\"===e.tokens[d].type)for(m=e.tokens[d].children,b.length=0,t=0;t<m.length;t++)if(\"text\"===(r=m[t]).type&&!P.test(r.text)){for(a=m[t].level,f=b.length-1;f>=0&&!(b[f].level<=a);f--);b.length=f+1,s=0,i=(n=r.content).length;e:for(;s<i&&(j.lastIndex=s,o=j.exec(n));)if(u=!U(n,o.index-1),s=o.index+1,g=\"'\"===o[0],(l=!U(n,s))||u){if(p=!l,h=!u)for(f=b.length-1;f>=0&&(c=b[f],!(b[f].level<a));f--)if(c.single===g&&b[f].level===a){c=b[f],g?(m[c.token].content=H(m[c.token].content,c.pos,e.options.quotes[2]),r.content=H(r.content,o.index,e.options.quotes[3])):(m[c.token].content=H(m[c.token].content,c.pos,e.options.quotes[0]),r.content=H(r.content,o.index,e.options.quotes[1])),b.length=f;continue e}p?b.push({token:t,pos:o.index,single:g,level:a}):h&&g&&(r.content=H(r.content,o.index,O))}else g&&(r.content=H(r.content,o.index,O))}}]];function G(){this.options={},this.ruler=new C;for(var e=0;e<V.length;e++)this.ruler.push(V[e][0],V[e][1])}function $(e,t,r,n,o){var s,i,a,u,l,c,p;for(this.src=e,this.parser=t,this.options=r,this.env=n,this.tokens=o,this.bMarks=[],this.eMarks=[],this.tShift=[],this.blkIndent=0,this.line=0,this.lineMax=0,this.tight=!1,this.parentType=\"root\",this.ddIndent=-1,this.level=0,this.result=\"\",c=0,p=!1,a=u=c=0,l=(i=this.src).length;u<l;u++){if(s=i.charCodeAt(u),!p){if(32===s){c++;continue}p=!0}10!==s&&u!==l-1||(10!==s&&u++,this.bMarks.push(a),this.eMarks.push(u),this.tShift.push(c),p=!1,c=0,a=u+1)}this.bMarks.push(i.length),this.eMarks.push(i.length),this.tShift.push(0),this.lineMax=this.bMarks.length-1}function Z(e,t){var r,n,o;return(n=e.bMarks[t]+e.tShift[t])>=(o=e.eMarks[t])?-1:42!==(r=e.src.charCodeAt(n++))&&45!==r&&43!==r?-1:n<o&&32!==e.src.charCodeAt(n)?-1:n}function W(e,t){var r,n=e.bMarks[t]+e.tShift[t],o=e.eMarks[t];if(n+1>=o)return-1;if((r=e.src.charCodeAt(n++))<48||r>57)return-1;for(;;){if(n>=o)return-1;if(!((r=e.src.charCodeAt(n++))>=48&&r<=57)){if(41===r||46===r)break;return-1}}return n<o&&32!==e.src.charCodeAt(n)?-1:n}G.prototype.process=function(e){var t,r,n;for(t=0,r=(n=this.ruler.getRules(\"\")).length;t<r;t++)n[t](e)},$.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]},$.prototype.skipEmptyLines=function(e){for(var t=this.lineMax;e<t&&!(this.bMarks[e]+this.tShift[e]<this.eMarks[e]);e++);return e},$.prototype.skipSpaces=function(e){for(var t=this.src.length;e<t&&32===this.src.charCodeAt(e);e++);return e},$.prototype.skipChars=function(e,t){for(var r=this.src.length;e<r&&this.src.charCodeAt(e)===t;e++);return e},$.prototype.skipCharsBack=function(e,t,r){if(e<=r)return e;for(;e>r;)if(t!==this.src.charCodeAt(--e))return e+1;return e},$.prototype.getLines=function(e,t,r,n){var o,s,i,a,u,l=e;if(e>=t)return\"\";if(l+1===t)return s=this.bMarks[l]+Math.min(this.tShift[l],r),i=n?this.eMarks[l]+1:this.eMarks[l],this.src.slice(s,i);for(a=new Array(t-e),o=0;l<t;l++,o++)(u=this.tShift[l])>r&&(u=r),u<0&&(u=0),s=this.bMarks[l]+u,i=l+1<t||n?this.eMarks[l]+1:this.eMarks[l],a[o]=this.src.slice(s,i);return a.join(\"\")};var J={};[\"article\",\"aside\",\"button\",\"blockquote\",\"body\",\"canvas\",\"caption\",\"col\",\"colgroup\",\"dd\",\"div\",\"dl\",\"dt\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"hgroup\",\"hr\",\"iframe\",\"li\",\"map\",\"object\",\"ol\",\"output\",\"p\",\"pre\",\"progress\",\"script\",\"section\",\"style\",\"table\",\"tbody\",\"td\",\"textarea\",\"tfoot\",\"th\",\"tr\",\"thead\",\"ul\",\"video\"].forEach(function(e){J[e]=!0});var Y=/^<([a-zA-Z]{1,15})[\\s\\/>]/,K=/^<\\/([a-zA-Z]{1,15})[\\s>]/;function Q(e,t){var r=e.bMarks[t]+e.blkIndent,n=e.eMarks[t];return e.src.substr(r,n-r)}function X(e,t){var r,n,o=e.bMarks[t]+e.tShift[t],s=e.eMarks[t];return o>=s?-1:126!==(n=e.src.charCodeAt(o++))&&58!==n?-1:o===(r=e.skipSpaces(o))?-1:r>=s?-1:r}var ee=[[\"code\",function(e,t,r){var n,o;if(e.tShift[t]-e.blkIndent<4)return!1;for(o=n=t+1;n<r;)if(e.isEmpty(n))n++;else{if(!(e.tShift[n]-e.blkIndent>=4))break;o=++n}return e.line=n,e.tokens.push({type:\"code\",content:e.getLines(t,o,4+e.blkIndent,!0),block:!0,lines:[t,e.line],level:e.level}),!0}],[\"fences\",function(e,t,r,n){var o,s,i,a,u,l=!1,c=e.bMarks[t]+e.tShift[t],p=e.eMarks[t];if(c+3>p)return!1;if(126!==(o=e.src.charCodeAt(c))&&96!==o)return!1;if(u=c,(s=(c=e.skipChars(c,o))-u)<3)return!1;if((i=e.src.slice(c,p).trim()).indexOf(\"`\")>=0)return!1;if(n)return!0;for(a=t;!(++a>=r||(c=u=e.bMarks[a]+e.tShift[a])<(p=e.eMarks[a])&&e.tShift[a]<e.blkIndent);)if(e.src.charCodeAt(c)===o&&!(e.tShift[a]-e.blkIndent>=4||(c=e.skipChars(c,o))-u<s||(c=e.skipSpaces(c))<p)){l=!0;break}return s=e.tShift[t],e.line=a+(l?1:0),e.tokens.push({type:\"fence\",params:i,content:e.getLines(t+1,a,s,!0),lines:[t,e.line],level:e.level}),!0},[\"paragraph\",\"blockquote\",\"list\"]],[\"blockquote\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d=e.bMarks[t]+e.tShift[t],m=e.eMarks[t];if(d>m)return!1;if(62!==e.src.charCodeAt(d++))return!1;if(e.level>=e.options.maxNesting)return!1;if(n)return!0;for(32===e.src.charCodeAt(d)&&d++,u=e.blkIndent,e.blkIndent=0,a=[e.bMarks[t]],e.bMarks[t]=d,s=(d=d<m?e.skipSpaces(d):d)>=m,i=[e.tShift[t]],e.tShift[t]=d-e.bMarks[t],p=e.parser.ruler.getRules(\"blockquote\"),o=t+1;o<r&&!((d=e.bMarks[o]+e.tShift[o])>=(m=e.eMarks[o]));o++)if(62!==e.src.charCodeAt(d++)){if(s)break;for(g=!1,h=0,f=p.length;h<f;h++)if(p[h](e,o,r,!0)){g=!0;break}if(g)break;a.push(e.bMarks[o]),i.push(e.tShift[o]),e.tShift[o]=-1337}else 32===e.src.charCodeAt(d)&&d++,a.push(e.bMarks[o]),e.bMarks[o]=d,s=(d=d<m?e.skipSpaces(d):d)>=m,i.push(e.tShift[o]),e.tShift[o]=d-e.bMarks[o];for(l=e.parentType,e.parentType=\"blockquote\",e.tokens.push({type:\"blockquote_open\",lines:c=[t,0],level:e.level++}),e.parser.tokenize(e,t,o),e.tokens.push({type:\"blockquote_close\",level:--e.level}),e.parentType=l,c[1]=e.line,h=0;h<i.length;h++)e.bMarks[h+t]=a[h],e.tShift[h+t]=i[h];return e.blkIndent=u,!0},[\"paragraph\",\"blockquote\",\"list\"]],[\"hr\",function(e,t,r,n){var o,s,i,a=e.bMarks[t],u=e.eMarks[t];if((a+=e.tShift[t])>u)return!1;if(42!==(o=e.src.charCodeAt(a++))&&45!==o&&95!==o)return!1;for(s=1;a<u;){if((i=e.src.charCodeAt(a++))!==o&&32!==i)return!1;i===o&&s++}return!(s<3||!n&&(e.line=t+1,e.tokens.push({type:\"hr\",lines:[t,e.line],level:e.level}),0))},[\"paragraph\",\"blockquote\",\"list\"]],[\"list\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d,m,b,v,k,A,y,x,w,C,E=!0;if((p=W(e,t))>=0)d=!0;else{if(!((p=Z(e,t))>=0))return!1;d=!1}if(e.level>=e.options.maxNesting)return!1;if(g=e.src.charCodeAt(p-1),n)return!0;for(b=e.tokens.length,d?(c=e.bMarks[t]+e.tShift[t],f=Number(e.src.substr(c,p-c-1)),e.tokens.push({type:\"ordered_list_open\",order:f,lines:k=[t,0],level:e.level++})):e.tokens.push({type:\"bullet_list_open\",lines:k=[t,0],level:e.level++}),o=t,v=!1,y=e.parser.ruler.getRules(\"list\");!(!(o<r)||((h=(m=e.skipSpaces(p))>=e.eMarks[o]?1:m-p)>4&&(h=1),h<1&&(h=1),s=p-e.bMarks[o]+h,e.tokens.push({type:\"list_item_open\",lines:A=[t,0],level:e.level++}),a=e.blkIndent,u=e.tight,i=e.tShift[t],l=e.parentType,e.tShift[t]=m-e.bMarks[t],e.blkIndent=s,e.tight=!0,e.parentType=\"list\",e.parser.tokenize(e,t,r,!0),e.tight&&!v||(E=!1),v=e.line-t>1&&e.isEmpty(e.line-1),e.blkIndent=a,e.tShift[t]=i,e.tight=u,e.parentType=l,e.tokens.push({type:\"list_item_close\",level:--e.level}),o=t=e.line,A[1]=o,m=e.bMarks[t],o>=r)||e.isEmpty(o)||e.tShift[o]<e.blkIndent);){for(C=!1,x=0,w=y.length;x<w;x++)if(y[x](e,o,r,!0)){C=!0;break}if(C)break;if(d){if((p=W(e,o))<0)break}else if((p=Z(e,o))<0)break;if(g!==e.src.charCodeAt(p-1))break}return e.tokens.push({type:d?\"ordered_list_close\":\"bullet_list_close\",level:--e.level}),k[1]=o,e.line=o,E&&function(e,t){var r,n,o=e.level+2;for(r=t+2,n=e.tokens.length-2;r<n;r++)e.tokens[r].level===o&&\"paragraph_open\"===e.tokens[r].type&&(e.tokens[r+2].tight=!0,e.tokens[r].tight=!0,r+=2)}(e,b),!0},[\"paragraph\",\"blockquote\"]],[\"footnote\",function(e,t,r,n){var o,s,i,a,u,l=e.bMarks[t]+e.tShift[t],c=e.eMarks[t];if(l+4>c)return!1;if(91!==e.src.charCodeAt(l))return!1;if(94!==e.src.charCodeAt(l+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(a=l+2;a<c;a++){if(32===e.src.charCodeAt(a))return!1;if(93===e.src.charCodeAt(a))break}return!(a===l+2||a+1>=c||58!==e.src.charCodeAt(++a)||!n&&(a++,e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.refs||(e.env.footnotes.refs={}),u=e.src.slice(l+2,a-2),e.env.footnotes.refs[\":\"+u]=-1,e.tokens.push({type:\"footnote_reference_open\",label:u,level:e.level++}),o=e.bMarks[t],s=e.tShift[t],i=e.parentType,e.tShift[t]=e.skipSpaces(a)-a,e.bMarks[t]=a,e.blkIndent+=4,e.parentType=\"footnote\",e.tShift[t]<e.blkIndent&&(e.tShift[t]+=e.blkIndent,e.bMarks[t]-=e.blkIndent),e.parser.tokenize(e,t,r,!0),e.parentType=i,e.blkIndent-=4,e.tShift[t]=s,e.bMarks[t]=o,e.tokens.push({type:\"footnote_reference_close\",level:--e.level}),0))},[\"paragraph\"]],[\"heading\",function(e,t,r,n){var o,s,i,a=e.bMarks[t]+e.tShift[t],u=e.eMarks[t];if(a>=u)return!1;if(35!==(o=e.src.charCodeAt(a))||a>=u)return!1;for(s=1,o=e.src.charCodeAt(++a);35===o&&a<u&&s<=6;)s++,o=e.src.charCodeAt(++a);return!(s>6||a<u&&32!==o||!n&&(u=e.skipCharsBack(u,32,a),(i=e.skipCharsBack(u,35,a))>a&&32===e.src.charCodeAt(i-1)&&(u=i),e.line=t+1,e.tokens.push({type:\"heading_open\",hLevel:s,lines:[t,e.line],level:e.level}),a<u&&e.tokens.push({type:\"inline\",content:e.src.slice(a,u).trim(),level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:\"heading_close\",hLevel:s,level:e.level}),0))},[\"paragraph\",\"blockquote\"]],[\"lheading\",function(e,t,r){var n,o,s,i=t+1;return!(i>=r||e.tShift[i]<e.blkIndent||e.tShift[i]-e.blkIndent>3||(o=e.bMarks[i]+e.tShift[i])>=(s=e.eMarks[i])||45!==(n=e.src.charCodeAt(o))&&61!==n||(o=e.skipChars(o,n),(o=e.skipSpaces(o))<s||(o=e.bMarks[t]+e.tShift[t],e.line=i+1,e.tokens.push({type:\"heading_open\",hLevel:61===n?1:2,lines:[t,e.line],level:e.level}),e.tokens.push({type:\"inline\",content:e.src.slice(o,e.eMarks[t]).trim(),level:e.level+1,lines:[t,e.line-1],children:[]}),e.tokens.push({type:\"heading_close\",hLevel:61===n?1:2,level:e.level}),0)))}],[\"htmlblock\",function(e,t,r,n){var o,s,i,a=e.bMarks[t],u=e.eMarks[t],l=e.tShift[t];if(a+=l,!e.options.html)return!1;if(l>3||a+2>=u)return!1;if(60!==e.src.charCodeAt(a))return!1;if(33===(o=e.src.charCodeAt(a+1))||63===o){if(n)return!0}else{if(47!==o&&!function(e){var t=32|e;return t>=97&&t<=122}(o))return!1;if(47===o){if(!(s=e.src.slice(a,u).match(K)))return!1}else if(!(s=e.src.slice(a,u).match(Y)))return!1;if(!0!==J[s[1].toLowerCase()])return!1;if(n)return!0}for(i=t+1;i<e.lineMax&&!e.isEmpty(i);)i++;return e.line=i,e.tokens.push({type:\"htmlblock\",level:e.level,lines:[t,e.line],content:e.getLines(t,i,0,!0)}),!0},[\"paragraph\",\"blockquote\"]],[\"table\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g;if(t+2>r)return!1;if(u=t+1,e.tShift[u]<e.blkIndent)return!1;if((i=e.bMarks[u]+e.tShift[u])>=e.eMarks[u])return!1;if(124!==(o=e.src.charCodeAt(i))&&45!==o&&58!==o)return!1;if(s=Q(e,t+1),!/^[-:| ]+$/.test(s))return!1;if((l=s.split(\"|\"))<=2)return!1;for(p=[],a=0;a<l.length;a++){if(!(h=l[a].trim())){if(0===a||a===l.length-1)continue;return!1}if(!/^:?-+:?$/.test(h))return!1;58===h.charCodeAt(h.length-1)?p.push(58===h.charCodeAt(0)?\"center\":\"right\"):58===h.charCodeAt(0)?p.push(\"left\"):p.push(\"\")}if(-1===(s=Q(e,t).trim()).indexOf(\"|\"))return!1;if(l=s.replace(/^\\||\\|$/g,\"\").split(\"|\"),p.length!==l.length)return!1;if(n)return!0;for(e.tokens.push({type:\"table_open\",lines:f=[t,0],level:e.level++}),e.tokens.push({type:\"thead_open\",lines:[t,t+1],level:e.level++}),e.tokens.push({type:\"tr_open\",lines:[t,t+1],level:e.level++}),a=0;a<l.length;a++)e.tokens.push({type:\"th_open\",align:p[a],lines:[t,t+1],level:e.level++}),e.tokens.push({type:\"inline\",content:l[a].trim(),lines:[t,t+1],level:e.level,children:[]}),e.tokens.push({type:\"th_close\",level:--e.level});for(e.tokens.push({type:\"tr_close\",level:--e.level}),e.tokens.push({type:\"thead_close\",level:--e.level}),e.tokens.push({type:\"tbody_open\",lines:g=[t+2,0],level:e.level++}),u=t+2;u<r&&!(e.tShift[u]<e.blkIndent)&&-1!==(s=Q(e,u).trim()).indexOf(\"|\");u++){for(l=s.replace(/^\\||\\|$/g,\"\").split(\"|\"),e.tokens.push({type:\"tr_open\",level:e.level++}),a=0;a<l.length;a++)e.tokens.push({type:\"td_open\",align:p[a],level:e.level++}),c=l[a].substring(124===l[a].charCodeAt(0)?1:0,124===l[a].charCodeAt(l[a].length-1)?l[a].length-1:l[a].length).trim(),e.tokens.push({type:\"inline\",content:c,level:e.level,children:[]}),e.tokens.push({type:\"td_close\",level:--e.level});e.tokens.push({type:\"tr_close\",level:--e.level})}return e.tokens.push({type:\"tbody_close\",level:--e.level}),e.tokens.push({type:\"table_close\",level:--e.level}),f[1]=g[1]=u,e.line=u,!0},[\"paragraph\"]],[\"deflist\",function(e,t,r,n){var o,s,i,a,u,l,c,p,h,f,g,d,m,b;if(n)return!(e.ddIndent<0)&&X(e,t)>=0;if(c=t+1,e.isEmpty(c)&&++c>r)return!1;if(e.tShift[c]<e.blkIndent)return!1;if((o=X(e,c))<0)return!1;if(e.level>=e.options.maxNesting)return!1;l=e.tokens.length,e.tokens.push({type:\"dl_open\",lines:u=[t,0],level:e.level++}),i=t,s=c;e:for(;;){for(b=!0,m=!1,e.tokens.push({type:\"dt_open\",lines:[i,i],level:e.level++}),e.tokens.push({type:\"inline\",content:e.getLines(i,i+1,e.blkIndent,!1).trim(),level:e.level+1,lines:[i,i],children:[]}),e.tokens.push({type:\"dt_close\",level:--e.level});;){if(e.tokens.push({type:\"dd_open\",lines:a=[c,0],level:e.level++}),d=e.tight,h=e.ddIndent,p=e.blkIndent,g=e.tShift[s],f=e.parentType,e.blkIndent=e.ddIndent=e.tShift[s]+2,e.tShift[s]=o-e.bMarks[s],e.tight=!0,e.parentType=\"deflist\",e.parser.tokenize(e,s,r,!0),e.tight&&!m||(b=!1),m=e.line-s>1&&e.isEmpty(e.line-1),e.tShift[s]=g,e.tight=d,e.parentType=f,e.blkIndent=p,e.ddIndent=h,e.tokens.push({type:\"dd_close\",level:--e.level}),a[1]=c=e.line,c>=r)break e;if(e.tShift[c]<e.blkIndent)break e;if((o=X(e,c))<0)break;s=c}if(c>=r)break;if(i=c,e.isEmpty(i))break;if(e.tShift[i]<e.blkIndent)break;if((s=i+1)>=r)break;if(e.isEmpty(s)&&s++,s>=r)break;if(e.tShift[s]<e.blkIndent)break;if((o=X(e,s))<0)break}return e.tokens.push({type:\"dl_close\",level:--e.level}),u[1]=c,e.line=c,b&&function(e,t){var r,n,o=e.level+2;for(r=t+2,n=e.tokens.length-2;r<n;r++)e.tokens[r].level===o&&\"paragraph_open\"===e.tokens[r].type&&(e.tokens[r+2].tight=!0,e.tokens[r].tight=!0,r+=2)}(e,l),!0},[\"paragraph\"]],[\"paragraph\",function(e,t){var r,n,o,s,i,a,u=t+1;if(u<(r=e.lineMax)&&!e.isEmpty(u))for(a=e.parser.ruler.getRules(\"paragraph\");u<r&&!e.isEmpty(u);u++)if(!(e.tShift[u]-e.blkIndent>3)){for(o=!1,s=0,i=a.length;s<i;s++)if(a[s](e,u,r,!0)){o=!0;break}if(o)break}return n=e.getLines(t,u,e.blkIndent,!1).trim(),e.line=u,n.length&&(e.tokens.push({type:\"paragraph_open\",tight:!1,lines:[t,e.line],level:e.level}),e.tokens.push({type:\"inline\",content:n,level:e.level+1,lines:[t,e.line],children:[]}),e.tokens.push({type:\"paragraph_close\",tight:!1,level:e.level})),!0}]];function te(){this.ruler=new C;for(var e=0;e<ee.length;e++)this.ruler.push(ee[e][0],ee[e][1],{alt:(ee[e][2]||[]).slice()})}te.prototype.tokenize=function(e,t,r){for(var n,o=this.ruler.getRules(\"\"),s=o.length,i=t,a=!1;i<r&&(e.line=i=e.skipEmptyLines(i),!(i>=r))&&!(e.tShift[i]<e.blkIndent);){for(n=0;n<s&&!o[n](e,i,r,!1);n++);if(e.tight=!a,e.isEmpty(e.line-1)&&(a=!0),(i=e.line)<r&&e.isEmpty(i)){if(a=!0,++i<r&&\"list\"===e.parentType&&e.isEmpty(i))break;e.line=i}}};var re=/[\\n\\t]/g,ne=/\\r[\\n\\u0085]|[\\u2424\\u2028\\u0085]/g,oe=/\\u00a0/g;function se(e){switch(e){case 10:case 92:case 96:case 42:case 95:case 94:case 91:case 93:case 33:case 38:case 60:case 62:case 123:case 125:case 36:case 37:case 64:case 126:case 43:case 61:case 58:return!0;default:return!1}}te.prototype.parse=function(e,t,r,n){var o,s=0,i=0;if(!e)return[];(e=(e=e.replace(oe,\" \")).replace(ne,\"\\n\")).indexOf(\"\\t\")>=0&&(e=e.replace(re,function(t,r){var n;return 10===e.charCodeAt(r)?(s=r+1,i=0,t):(n=\" \".slice((r-s-i)%4),i=r-s+1,n)})),o=new $(e,this,t,r,n),this.tokenize(o,o.line,o.lineMax)};for(var ie=[],ae=0;ae<256;ae++)ie.push(0);function ue(e){return e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122}function le(e,t){var r,n,o,s=t,i=!0,a=!0,u=e.posMax,l=e.src.charCodeAt(t);for(r=t>0?e.src.charCodeAt(t-1):-1;s<u&&e.src.charCodeAt(s)===l;)s++;return s>=u&&(i=!1),(o=s-t)>=4?i=a=!1:(32!==(n=s<u?e.src.charCodeAt(s):-1)&&10!==n||(i=!1),32!==r&&10!==r||(a=!1),95===l&&(ue(r)&&(i=!1),ue(n)&&(a=!1))),{can_open:i,can_close:a,delims:o}}\"\\\\!\\\"#$%&'()*+,./:;<=>?@[]^_`{|}~-\".split(\"\").forEach(function(e){ie[e.charCodeAt(0)]=1});var ce=/\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;var pe=/\\\\([ \\\\!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-])/g;var he=[\"coap\",\"doi\",\"javascript\",\"aaa\",\"aaas\",\"about\",\"acap\",\"cap\",\"cid\",\"crid\",\"data\",\"dav\",\"dict\",\"dns\",\"file\",\"ftp\",\"geo\",\"go\",\"gopher\",\"h323\",\"http\",\"https\",\"iax\",\"icap\",\"im\",\"imap\",\"info\",\"ipp\",\"iris\",\"iris.beep\",\"iris.xpc\",\"iris.xpcs\",\"iris.lwz\",\"ldap\",\"mailto\",\"mid\",\"msrp\",\"msrps\",\"mtqp\",\"mupdate\",\"news\",\"nfs\",\"ni\",\"nih\",\"nntp\",\"opaquelocktoken\",\"pop\",\"pres\",\"rtsp\",\"service\",\"session\",\"shttp\",\"sieve\",\"sip\",\"sips\",\"sms\",\"snmp\",\"soap.beep\",\"soap.beeps\",\"tag\",\"tel\",\"telnet\",\"tftp\",\"thismessage\",\"tn3270\",\"tip\",\"tv\",\"urn\",\"vemmi\",\"ws\",\"wss\",\"xcon\",\"xcon-userid\",\"xmlrpc.beep\",\"xmlrpc.beeps\",\"xmpp\",\"z39.50r\",\"z39.50s\",\"adiumxtra\",\"afp\",\"afs\",\"aim\",\"apt\",\"attachment\",\"aw\",\"beshare\",\"bitcoin\",\"bolo\",\"callto\",\"chrome\",\"chrome-extension\",\"com-eventbrite-attendee\",\"content\",\"cvs\",\"dlna-playsingle\",\"dlna-playcontainer\",\"dtn\",\"dvb\",\"ed2k\",\"facetime\",\"feed\",\"finger\",\"fish\",\"gg\",\"git\",\"gizmoproject\",\"gtalk\",\"hcp\",\"icon\",\"ipn\",\"irc\",\"irc6\",\"ircs\",\"itms\",\"jar\",\"jms\",\"keyparc\",\"lastfm\",\"ldaps\",\"magnet\",\"maps\",\"market\",\"message\",\"mms\",\"ms-help\",\"msnim\",\"mumble\",\"mvn\",\"notes\",\"oid\",\"palm\",\"paparazzi\",\"platform\",\"proxy\",\"psyc\",\"query\",\"res\",\"resource\",\"rmi\",\"rsync\",\"rtmp\",\"secondlife\",\"sftp\",\"sgn\",\"skype\",\"smb\",\"soldat\",\"spotify\",\"ssh\",\"steam\",\"svn\",\"teamspeak\",\"things\",\"udp\",\"unreal\",\"ut2004\",\"ventrilo\",\"view-source\",\"webcal\",\"wtai\",\"wyciwyg\",\"xfire\",\"xri\",\"ymsgr\"],fe=/^<([a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,ge=/^<([a-zA-Z.\\-]{1,25}):([^<>\\x00-\\x20]*)>/;function de(e,t){return e=e.source,t=t||\"\",function r(n,o){return n?(o=o.source||o,e=e.replace(n,o),r):new RegExp(e,t)}}var me=de(/(?:unquoted|single_quoted|double_quoted)/)(\"unquoted\",/[^\"'=<>`\\x00-\\x20]+/)(\"single_quoted\",/'[^']*'/)(\"double_quoted\",/\"[^\"]*\"/)(),be=de(/(?:\\s+attr_name(?:\\s*=\\s*attr_value)?)/)(\"attr_name\",/[a-zA-Z_:][a-zA-Z0-9:._-]*/)(\"attr_value\",me)(),ve=de(/<[A-Za-z][A-Za-z0-9]*attribute*\\s*\\/?>/)(\"attribute\",be)(),ke=de(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)(\"open_tag\",ve)(\"close_tag\",/<\\/[A-Za-z][A-Za-z0-9]*\\s*>/)(\"comment\",/<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->/)(\"processing\",/<[?].*?[?]>/)(\"declaration\",/<![A-Z]+\\s+[^>]*>/)(\"cdata\",/<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/)();var Ae=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,ye=/^&([a-z][a-z0-9]{1,31});/i;var xe=[[\"text\",function(e,t){for(var r=e.pos;r<e.posMax&&!se(e.src.charCodeAt(r));)r++;return r!==e.pos&&(t||(e.pending+=e.src.slice(e.pos,r)),e.pos=r,!0)}],[\"newline\",function(e,t){var r,n,o=e.pos;if(10!==e.src.charCodeAt(o))return!1;if(r=e.pending.length-1,n=e.posMax,!t)if(r>=0&&32===e.pending.charCodeAt(r))if(r>=1&&32===e.pending.charCodeAt(r-1)){for(var s=r-2;s>=0;s--)if(32!==e.pending.charCodeAt(s)){e.pending=e.pending.substring(0,s+1);break}e.push({type:\"hardbreak\",level:e.level})}else e.pending=e.pending.slice(0,-1),e.push({type:\"softbreak\",level:e.level});else e.push({type:\"softbreak\",level:e.level});for(o++;o<n&&32===e.src.charCodeAt(o);)o++;return e.pos=o,!0}],[\"escape\",function(e,t){var r,n=e.pos,o=e.posMax;if(92!==e.src.charCodeAt(n))return!1;if(++n<o){if((r=e.src.charCodeAt(n))<256&&0!==ie[r])return t||(e.pending+=e.src[n]),e.pos+=2,!0;if(10===r){for(t||e.push({type:\"hardbreak\",level:e.level}),n++;n<o&&32===e.src.charCodeAt(n);)n++;return e.pos=n,!0}}return t||(e.pending+=\"\\\\\"),e.pos++,!0}],[\"backticks\",function(e,t){var r,n,o,s,i,a=e.pos;if(96!==e.src.charCodeAt(a))return!1;for(r=a,a++,n=e.posMax;a<n&&96===e.src.charCodeAt(a);)a++;for(o=e.src.slice(r,a),s=i=a;-1!==(s=e.src.indexOf(\"`\",i));){for(i=s+1;i<n&&96===e.src.charCodeAt(i);)i++;if(i-s===o.length)return t||e.push({type:\"code\",content:e.src.slice(a,s).replace(/[ \\n]+/g,\" \").trim(),block:!1,level:e.level}),e.pos=i,!0}return t||(e.pending+=o),e.pos+=o.length,!0}],[\"del\",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(126!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(126!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),126===s)return!1;if(126===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&126===e.src.charCodeAt(n);)n++;if(n>u+3)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(126===e.src.charCodeAt(e.pos)&&126===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),126!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&126!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"del_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"del_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],[\"ins\",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(43!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(43!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),43===s)return!1;if(43===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&43===e.src.charCodeAt(n);)n++;if(n!==u+2)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(43===e.src.charCodeAt(e.pos)&&43===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),43!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&43!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"ins_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"ins_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],[\"mark\",function(e,t){var r,n,o,s,i,a=e.posMax,u=e.pos;if(61!==e.src.charCodeAt(u))return!1;if(t)return!1;if(u+4>=a)return!1;if(61!==e.src.charCodeAt(u+1))return!1;if(e.level>=e.options.maxNesting)return!1;if(s=u>0?e.src.charCodeAt(u-1):-1,i=e.src.charCodeAt(u+2),61===s)return!1;if(61===i)return!1;if(32===i||10===i)return!1;for(n=u+2;n<a&&61===e.src.charCodeAt(n);)n++;if(n!==u+2)return e.pos+=n-u,t||(e.pending+=e.src.slice(u,n)),!0;for(e.pos=u+2,o=1;e.pos+1<a;){if(61===e.src.charCodeAt(e.pos)&&61===e.src.charCodeAt(e.pos+1)&&(s=e.src.charCodeAt(e.pos-1),61!==(i=e.pos+2<a?e.src.charCodeAt(e.pos+2):-1)&&61!==s&&(32!==s&&10!==s?o--:32!==i&&10!==i&&o++,o<=0))){r=!0;break}e.parser.skipToken(e)}return r?(e.posMax=e.pos,e.pos=u+2,t||(e.push({type:\"mark_open\",level:e.level++}),e.parser.tokenize(e),e.push({type:\"mark_close\",level:--e.level})),e.pos=e.posMax+2,e.posMax=a,!0):(e.pos=u,!1)}],[\"emphasis\",function(e,t){var r,n,o,s,i,a,u,l=e.posMax,c=e.pos,p=e.src.charCodeAt(c);if(95!==p&&42!==p)return!1;if(t)return!1;if(r=(u=le(e,c)).delims,!u.can_open)return e.pos+=r,t||(e.pending+=e.src.slice(c,e.pos)),!0;if(e.level>=e.options.maxNesting)return!1;for(e.pos=c+r,a=[r];e.pos<l;)if(e.src.charCodeAt(e.pos)!==p)e.parser.skipToken(e);else{if(n=(u=le(e,e.pos)).delims,u.can_close){for(s=a.pop(),i=n;s!==i;){if(i<s){a.push(s-i);break}if(i-=s,0===a.length)break;e.pos+=s,s=a.pop()}if(0===a.length){r=s,o=!0;break}e.pos+=n;continue}u.can_open&&a.push(n),e.pos+=n}return o?(e.posMax=e.pos,e.pos=c+r,t||(2!==r&&3!==r||e.push({type:\"strong_open\",level:e.level++}),1!==r&&3!==r||e.push({type:\"em_open\",level:e.level++}),e.parser.tokenize(e),1!==r&&3!==r||e.push({type:\"em_close\",level:--e.level}),2!==r&&3!==r||e.push({type:\"strong_close\",level:--e.level})),e.pos=e.posMax+r,e.posMax=l,!0):(e.pos=c,!1)}],[\"sub\",function(e,t){var r,n,o=e.posMax,s=e.pos;if(126!==e.src.charCodeAt(s))return!1;if(t)return!1;if(s+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=s+1;e.pos<o;){if(126===e.src.charCodeAt(e.pos)){r=!0;break}e.parser.skipToken(e)}return r&&s+1!==e.pos?(n=e.src.slice(s+1,e.pos)).match(/(^|[^\\\\])(\\\\\\\\)*\\s/)?(e.pos=s,!1):(e.posMax=e.pos,e.pos=s+1,t||e.push({type:\"sub\",level:e.level,content:n.replace(ce,\"$1\")}),e.pos=e.posMax+1,e.posMax=o,!0):(e.pos=s,!1)}],[\"sup\",function(e,t){var r,n,o=e.posMax,s=e.pos;if(94!==e.src.charCodeAt(s))return!1;if(t)return!1;if(s+2>=o)return!1;if(e.level>=e.options.maxNesting)return!1;for(e.pos=s+1;e.pos<o;){if(94===e.src.charCodeAt(e.pos)){r=!0;break}e.parser.skipToken(e)}return r&&s+1!==e.pos?(n=e.src.slice(s+1,e.pos)).match(/(^|[^\\\\])(\\\\\\\\)*\\s/)?(e.pos=s,!1):(e.posMax=e.pos,e.pos=s+1,t||e.push({type:\"sup\",level:e.level,content:n.replace(pe,\"$1\")}),e.pos=e.posMax+1,e.posMax=o,!0):(e.pos=s,!1)}],[\"links\",function(e,t){var r,n,o,s,i,a,u,l,c=!1,p=e.pos,h=e.posMax,f=e.pos,g=e.src.charCodeAt(f);if(33===g&&(c=!0,g=e.src.charCodeAt(++f)),91!==g)return!1;if(e.level>=e.options.maxNesting)return!1;if(r=f+1,(n=D(e,f))<0)return!1;if((a=n+1)<h&&40===e.src.charCodeAt(a)){for(a++;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a>=h)return!1;for(f=a,q(e,a)?(s=e.linkContent,a=e.pos):s=\"\",f=a;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a<h&&f!==a&&F(e,a))for(i=e.linkContent,a=e.pos;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);else i=\"\";if(a>=h||41!==e.src.charCodeAt(a))return e.pos=p,!1;a++}else{if(e.linkLevel>0)return!1;for(;a<h&&(32===(l=e.src.charCodeAt(a))||10===l);a++);if(a<h&&91===e.src.charCodeAt(a)&&(f=a+1,(a=D(e,a))>=0?o=e.src.slice(f,a++):a=f-1),o||(void 0===o&&(a=n+1),o=e.src.slice(r,n)),!(u=e.env.references[M(o)]))return e.pos=p,!1;s=u.href,i=u.title}return t||(e.pos=r,e.posMax=n,c?e.push({type:\"image\",src:s,title:i,alt:e.src.substr(r,n-r),level:e.level}):(e.push({type:\"link_open\",href:s,title:i,level:e.level++}),e.linkLevel++,e.parser.tokenize(e),e.linkLevel--,e.push({type:\"link_close\",level:--e.level}))),e.pos=a,e.posMax=h,!0}],[\"footnote_inline\",function(e,t){var r,n,o,s,i=e.posMax,a=e.pos;return!(a+2>=i||94!==e.src.charCodeAt(a)||91!==e.src.charCodeAt(a+1)||e.level>=e.options.maxNesting||(r=a+2,(n=D(e,a+1))<0||(t||(e.env.footnotes||(e.env.footnotes={}),e.env.footnotes.list||(e.env.footnotes.list=[]),o=e.env.footnotes.list.length,e.pos=r,e.posMax=n,e.push({type:\"footnote_ref\",id:o,level:e.level}),e.linkLevel++,s=e.tokens.length,e.parser.tokenize(e),e.env.footnotes.list[o]={tokens:e.tokens.splice(s)},e.linkLevel--),e.pos=n+1,e.posMax=i,0)))}],[\"footnote_ref\",function(e,t){var r,n,o,s,i=e.posMax,a=e.pos;if(a+3>i)return!1;if(!e.env.footnotes||!e.env.footnotes.refs)return!1;if(91!==e.src.charCodeAt(a))return!1;if(94!==e.src.charCodeAt(a+1))return!1;if(e.level>=e.options.maxNesting)return!1;for(n=a+2;n<i;n++){if(32===e.src.charCodeAt(n))return!1;if(10===e.src.charCodeAt(n))return!1;if(93===e.src.charCodeAt(n))break}return!(n===a+2||n>=i||(n++,r=e.src.slice(a+2,n-1),void 0===e.env.footnotes.refs[\":\"+r]||(t||(e.env.footnotes.list||(e.env.footnotes.list=[]),e.env.footnotes.refs[\":\"+r]<0?(o=e.env.footnotes.list.length,e.env.footnotes.list[o]={label:r,count:0},e.env.footnotes.refs[\":\"+r]=o):o=e.env.footnotes.refs[\":\"+r],s=e.env.footnotes.list[o].count,e.env.footnotes.list[o].count++,e.push({type:\"footnote_ref\",id:o,subId:s,level:e.level})),e.pos=n,e.posMax=i,0)))}],[\"autolink\",function(e,t){var r,n,o,s,i,a=e.pos;return!(60!==e.src.charCodeAt(a)||(r=e.src.slice(a)).indexOf(\">\")<0||((n=r.match(ge))?he.indexOf(n[1].toLowerCase())<0||(i=B(s=n[0].slice(1,-1)),!e.parser.validateLink(s)||(t||(e.push({type:\"link_open\",href:i,level:e.level}),e.push({type:\"text\",content:s,level:e.level+1}),e.push({type:\"link_close\",level:e.level})),e.pos+=n[0].length,0)):!(o=r.match(fe))||(i=B(\"mailto:\"+(s=o[0].slice(1,-1))),!e.parser.validateLink(i)||(t||(e.push({type:\"link_open\",href:i,level:e.level}),e.push({type:\"text\",content:s,level:e.level+1}),e.push({type:\"link_close\",level:e.level})),e.pos+=o[0].length,0))))}],[\"htmltag\",function(e,t){var r,n,o,s=e.pos;return!(!e.options.html||(o=e.posMax,60!==e.src.charCodeAt(s)||s+2>=o||33!==(r=e.src.charCodeAt(s+1))&&63!==r&&47!==r&&!function(e){var t=32|e;return t>=97&&t<=122}(r)||!(n=e.src.slice(s).match(ke))||(t||e.push({type:\"htmltag\",content:e.src.slice(s,s+n[0].length),level:e.level}),e.pos+=n[0].length,0)))}],[\"entity\",function(e,t){var r,o,s=e.pos,i=e.posMax;if(38!==e.src.charCodeAt(s))return!1;if(s+1<i)if(35===e.src.charCodeAt(s+1)){if(o=e.src.slice(s).match(Ae))return t||(r=\"x\"===o[1][0].toLowerCase()?parseInt(o[1].slice(1),16):parseInt(o[1],10),e.pending+=l(r)?c(r):c(65533)),e.pos+=o[0].length,!0}else if(o=e.src.slice(s).match(ye)){var a=n(o[1]);if(o[1]!==a)return t||(e.pending+=a),e.pos+=o[0].length,!0}return t||(e.pending+=\"&\"),e.pos++,!0}]];function we(){this.ruler=new C;for(var e=0;e<xe.length;e++)this.ruler.push(xe[e][0],xe[e][1]);this.validateLink=Ce}function Ce(e){var t=e.trim().toLowerCase();return-1===(t=g(t)).indexOf(\":\")||-1===[\"vbscript\",\"javascript\",\"file\",\"data\"].indexOf(t.split(\":\")[0])}we.prototype.skipToken=function(e){var t,r,n=this.ruler.getRules(\"\"),o=n.length,s=e.pos;if((r=e.cacheGet(s))>0)e.pos=r;else{for(t=0;t<o;t++)if(n[t](e,!0))return void e.cacheSet(s,e.pos);e.pos++,e.cacheSet(s,e.pos)}},we.prototype.tokenize=function(e){for(var t,r,n=this.ruler.getRules(\"\"),o=n.length,s=e.posMax;e.pos<s;){for(r=0;r<o&&!(t=n[r](e,!1));r++);if(t){if(e.pos>=s)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},we.prototype.parse=function(e,t,r,n){var o=new E(e,this,t,r,n);this.tokenize(o)};var Ee={default:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{rules:[\"block\",\"inline\",\"references\",\"replacements\",\"smartquotes\",\"references\",\"abbr2\",\"footnote_tail\"]},block:{rules:[\"blockquote\",\"code\",\"fences\",\"footnote\",\"heading\",\"hr\",\"htmlblock\",\"lheading\",\"list\",\"paragraph\",\"table\"]},inline:{rules:[\"autolink\",\"backticks\",\"del\",\"emphasis\",\"entity\",\"escape\",\"footnote_ref\",\"htmltag\",\"links\",\"newline\",\"text\"]}}},full:{options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{},block:{},inline:{}}},commonmark:{options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:\"language-\",linkTarget:\"\",typographer:!1,quotes:\"“”‘’\",highlight:null,maxNesting:20},components:{core:{rules:[\"block\",\"inline\",\"references\",\"abbr2\"]},block:{rules:[\"blockquote\",\"code\",\"fences\",\"heading\",\"hr\",\"htmlblock\",\"lheading\",\"list\",\"paragraph\"]},inline:{rules:[\"autolink\",\"backticks\",\"emphasis\",\"entity\",\"escape\",\"htmltag\",\"links\",\"newline\",\"text\"]}}}};function De(e,t,r){this.src=t,this.env=r,this.options=e.options,this.tokens=[],this.inlineMode=!1,this.inline=e.inline,this.block=e.block,this.renderer=e.renderer,this.typographer=e.typographer}function _e(e,t){\"string\"!=typeof e&&(t=e,e=\"default\"),t&&null!=t.linkify&&console.warn(\"linkify option is removed. Use linkify plugin instead:\\n\\nimport Remarkable from 'remarkable';\\nimport linkify from 'remarkable/linkify';\\nnew Remarkable().use(linkify)\\n\"),this.inline=new we,this.block=new te,this.core=new G,this.renderer=new w,this.ruler=new C,this.options={},this.configure(Ee[e]),this.set(t||{})}function Be(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var r=0,n=e.length;r<n;r++)if(e[r]===t)return r;return-1}function qe(e,t){for(var r=e.length-1;r>=0;r--)!0===t(e[r])&&e.splice(r,1)}function Fe(e){throw new Error(\"Unhandled case for value: '\"+e+\"'\")}_e.prototype.set=function(e){i(this.options,e)},_e.prototype.configure=function(e){var t=this;if(!e)throw new Error(\"Wrong `remarkable` preset, check name/content\");e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(r){e.components[r].rules&&t[r].ruler.enable(e.components[r].rules,!0)})},_e.prototype.use=function(e,t){return e(this,t),this},_e.prototype.parse=function(e,t){var r=new De(this,e,t);return this.core.process(r),r.tokens},_e.prototype.render=function(e,t){return t=t||{},this.renderer.render(this.parse(e,t),this.options,t)},_e.prototype.parseInline=function(e,t){var r=new De(this,e,t);return r.inlineMode=!0,this.core.process(r),r.tokens},_e.prototype.renderInline=function(e,t){return t=t||{},this.renderer.render(this.parseInline(e,t),this.options,t)};var Me=function(){function e(e){void 0===e&&(e={}),this.tagName=\"\",this.attrs={},this.innerHTML=\"\",this.whitespaceRegex=/\\s+/,this.tagName=e.tagName||\"\",this.attrs=e.attrs||{},this.innerHTML=e.innerHtml||e.innerHTML||\"\"}return e.prototype.setTagName=function(e){return this.tagName=e,this},e.prototype.getTagName=function(){return this.tagName||\"\"},e.prototype.setAttr=function(e,t){return this.getAttrs()[e]=t,this},e.prototype.getAttr=function(e){return this.getAttrs()[e]},e.prototype.setAttrs=function(e){return Object.assign(this.getAttrs(),e),this},e.prototype.getAttrs=function(){return this.attrs||(this.attrs={})},e.prototype.setClass=function(e){return this.setAttr(\"class\",e)},e.prototype.addClass=function(e){for(var t,r=this.getClass(),n=this.whitespaceRegex,o=r?r.split(n):[],s=e.split(n);t=s.shift();)-1===Be(o,t)&&o.push(t);return this.getAttrs().class=o.join(\" \"),this},e.prototype.removeClass=function(e){for(var t,r=this.getClass(),n=this.whitespaceRegex,o=r?r.split(n):[],s=e.split(n);o.length&&(t=s.shift());){var i=Be(o,t);-1!==i&&o.splice(i,1)}return this.getAttrs().class=o.join(\" \"),this},e.prototype.getClass=function(){return this.getAttrs().class||\"\"},e.prototype.hasClass=function(e){return-1!==(\" \"+this.getClass()+\" \").indexOf(\" \"+e+\" \")},e.prototype.setInnerHTML=function(e){return this.innerHTML=e,this},e.prototype.setInnerHtml=function(e){return this.setInnerHTML(e)},e.prototype.getInnerHTML=function(){return this.innerHTML||\"\"},e.prototype.getInnerHtml=function(){return this.getInnerHTML()},e.prototype.toAnchorString=function(){var e=this.getTagName(),t=this.buildAttrsStr();return[\"<\",e,t=t?\" \"+t:\"\",\">\",this.getInnerHtml(),\"</\",e,\">\"].join(\"\")},e.prototype.buildAttrsStr=function(){if(!this.attrs)return\"\";var e=this.getAttrs(),t=[];for(var r in e)e.hasOwnProperty(r)&&t.push(r+'=\"'+e[r]+'\"');return t.join(\" \")},e}();var Se=function(){function e(e){void 0===e&&(e={}),this.newWindow=!1,this.truncate={},this.className=\"\",this.newWindow=e.newWindow||!1,this.truncate=e.truncate||{},this.className=e.className||\"\"}return e.prototype.build=function(e){return new Me({tagName:\"a\",attrs:this.createAttrs(e),innerHtml:this.processAnchorText(e.getAnchorText())})},e.prototype.createAttrs=function(e){var t={href:e.getAnchorHref()},r=this.createCssClass(e);return r&&(t.class=r),this.newWindow&&(t.target=\"_blank\",t.rel=\"noopener noreferrer\"),this.truncate&&this.truncate.length&&this.truncate.length<e.getAnchorText().length&&(t.title=e.getAnchorHref()),t},e.prototype.createCssClass=function(e){var t=this.className;if(t){for(var r=[t],n=e.getCssClassSuffixes(),o=0,s=n.length;o<s;o++)r.push(t+\"-\"+n[o]);return r.join(\" \")}return\"\"},e.prototype.processAnchorText=function(e){return e=this.doTruncate(e)},e.prototype.doTruncate=function(e){var t=this.truncate;if(!t||!t.length)return e;var r=t.length,n=t.location;return\"smart\"===n?function(e,t,r){var n,o;null==r?(r=\"…\",o=3,n=8):(o=r.length,n=r.length);var s=function(e){var t=\"\";return e.scheme&&e.host&&(t+=e.scheme+\"://\"),e.host&&(t+=e.host),e.path&&(t+=\"/\"+e.path),e.query&&(t+=\"?\"+e.query),e.fragment&&(t+=\"#\"+e.fragment),t},i=function(e,t){var n=t/2,o=Math.ceil(n),s=-1*Math.floor(n),i=\"\";return s<0&&(i=e.substr(s)),e.substr(0,o)+r+i};if(e.length<=t)return e;var a=t-o,u=function(e){var t={},r=e,n=r.match(/^([a-z]+):\\/\\//i);return n&&(t.scheme=n[1],r=r.substr(n[0].length)),(n=r.match(/^(.*?)(?=(\\?|#|\\/|$))/i))&&(t.host=n[1],r=r.substr(n[0].length)),(n=r.match(/^\\/(.*?)(?=(\\?|#|$))/i))&&(t.path=n[1],r=r.substr(n[0].length)),(n=r.match(/^\\?(.*?)(?=(#|$))/i))&&(t.query=n[1],r=r.substr(n[0].length)),(n=r.match(/^#(.*?)$/i))&&(t.fragment=n[1]),t}(e);if(u.query){var l=u.query.match(/^(.*?)(?=(\\?|\\#))(.*?)$/i);l&&(u.query=u.query.substr(0,l[1].length),e=s(u))}if(e.length<=t)return e;if(u.host&&(u.host=u.host.replace(/^www\\./,\"\"),e=s(u)),e.length<=t)return e;var c=\"\";if(u.host&&(c+=u.host),c.length>=a)return u.host.length==t?(u.host.substr(0,t-o)+r).substr(0,a+n):i(c,a).substr(0,a+n);var p=\"\";if(u.path&&(p+=\"/\"+u.path),u.query&&(p+=\"?\"+u.query),p){if((c+p).length>=a)return(c+p).length==t?(c+p).substr(0,t):(c+i(p,a-c.length)).substr(0,a+n);c+=p}if(u.fragment){var h=\"#\"+u.fragment;if((c+h).length>=a)return(c+h).length==t?(c+h).substr(0,t):(c+i(h,a-c.length)).substr(0,a+n);c+=h}if(u.scheme&&u.host){var f=u.scheme+\"://\";if((c+f).length<a)return(f+c).substr(0,t)}if(c.length<=t)return c;var g=\"\";return a>0&&(g=c.substr(-1*Math.floor(a/2))),(c.substr(0,Math.ceil(a/2))+r+g).substr(0,a+n)}(e,r):\"middle\"===n?function(e,t,r){if(e.length<=t)return e;var n,o;null==r?(r=\"…\",n=8,o=3):(n=r.length,o=r.length);var s=t-o,i=\"\";return s>0&&(i=e.substr(-1*Math.floor(s/2))),(e.substr(0,Math.ceil(s/2))+r+i).substr(0,s+n)}(e,r):function(e,t,r){return function(e,t,r){var n;return e.length>t&&(null==r?(r=\"…\",n=3):n=r.length,e=e.substring(0,t-n)+r),e}(e,t,r)}(e,r)},e}(),Te=function(){function e(e){this.__jsduckDummyDocProp=null,this.matchedText=\"\",this.offset=0,this.tagBuilder=e.tagBuilder,this.matchedText=e.matchedText,this.offset=e.offset}return e.prototype.getMatchedText=function(){return this.matchedText},e.prototype.setOffset=function(e){this.offset=e},e.prototype.getOffset=function(){return this.offset},e.prototype.getCssClassSuffixes=function(){return[this.getType()]},e.prototype.buildTag=function(){return this.tagBuilder.build(this)},e}(),Le=function(e,t){return(Le=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};function Re(e,t){function r(){this.constructor=e}Le(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var Ne=function(){return(Ne=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)},ze=function(e){function t(t){var r=e.call(this,t)||this;return r.email=\"\",r.email=t.email,r}return Re(t,e),t.prototype.getType=function(){return\"email\"},t.prototype.getEmail=function(){return this.email},t.prototype.getAnchorHref=function(){return\"mailto:\"+this.email},t.prototype.getAnchorText=function(){return this.email},t}(Te),Pe=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"\",r.hashtag=\"\",r.serviceName=t.serviceName,r.hashtag=t.hashtag,r}return Re(t,e),t.prototype.getType=function(){return\"hashtag\"},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getHashtag=function(){return this.hashtag},t.prototype.getAnchorHref=function(){var e=this.serviceName,t=this.hashtag;switch(e){case\"twitter\":return\"https://twitter.com/hashtag/\"+t;case\"facebook\":return\"https://www.facebook.com/hashtag/\"+t;case\"instagram\":return\"https://instagram.com/explore/tags/\"+t;default:throw new Error(\"Unknown service name to point hashtag to: \"+e)}},t.prototype.getAnchorText=function(){return\"#\"+this.hashtag},t}(Te),je=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"twitter\",r.mention=\"\",r.mention=t.mention,r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.getType=function(){return\"mention\"},t.prototype.getMention=function(){return this.mention},t.prototype.getServiceName=function(){return this.serviceName},t.prototype.getAnchorHref=function(){switch(this.serviceName){case\"twitter\":return\"https://twitter.com/\"+this.mention;case\"instagram\":return\"https://instagram.com/\"+this.mention;case\"soundcloud\":return\"https://soundcloud.com/\"+this.mention;default:throw new Error(\"Unknown service name to point mention to: \"+this.serviceName)}},t.prototype.getAnchorText=function(){return\"@\"+this.mention},t.prototype.getCssClassSuffixes=function(){var t=e.prototype.getCssClassSuffixes.call(this),r=this.getServiceName();return r&&t.push(r),t},t}(Te),Ie=function(e){function t(t){var r=e.call(this,t)||this;return r.number=\"\",r.plusSign=!1,r.number=t.number,r.plusSign=t.plusSign,r}return Re(t,e),t.prototype.getType=function(){return\"phone\"},t.prototype.getPhoneNumber=function(){return this.number},t.prototype.getNumber=function(){return this.getPhoneNumber()},t.prototype.getAnchorHref=function(){return\"tel:\"+(this.plusSign?\"+\":\"\")+this.number},t.prototype.getAnchorText=function(){return this.matchedText},t}(Te),Oe=function(e){function t(t){var r=e.call(this,t)||this;return r.url=\"\",r.urlMatchType=\"scheme\",r.protocolUrlMatch=!1,r.protocolRelativeMatch=!1,r.stripPrefix={scheme:!0,www:!0},r.stripTrailingSlash=!0,r.decodePercentEncoding=!0,r.schemePrefixRegex=/^(https?:\\/\\/)?/i,r.wwwPrefixRegex=/^(https?:\\/\\/)?(www\\.)?/i,r.protocolRelativeRegex=/^\\/\\//,r.protocolPrepended=!1,r.urlMatchType=t.urlMatchType,r.url=t.url,r.protocolUrlMatch=t.protocolUrlMatch,r.protocolRelativeMatch=t.protocolRelativeMatch,r.stripPrefix=t.stripPrefix,r.stripTrailingSlash=t.stripTrailingSlash,r.decodePercentEncoding=t.decodePercentEncoding,r}return Re(t,e),t.prototype.getType=function(){return\"url\"},t.prototype.getUrlMatchType=function(){return this.urlMatchType},t.prototype.getUrl=function(){var e=this.url;return this.protocolRelativeMatch||this.protocolUrlMatch||this.protocolPrepended||(e=this.url=\"http://\"+e,this.protocolPrepended=!0),e},t.prototype.getAnchorHref=function(){return this.getUrl().replace(/&/g,\"&\")},t.prototype.getAnchorText=function(){var e=this.getMatchedText();return this.protocolRelativeMatch&&(e=this.stripProtocolRelativePrefix(e)),this.stripPrefix.scheme&&(e=this.stripSchemePrefix(e)),this.stripPrefix.www&&(e=this.stripWwwPrefix(e)),this.stripTrailingSlash&&(e=this.removeTrailingSlash(e)),this.decodePercentEncoding&&(e=this.removePercentEncoding(e)),e},t.prototype.stripSchemePrefix=function(e){return e.replace(this.schemePrefixRegex,\"\")},t.prototype.stripWwwPrefix=function(e){return e.replace(this.wwwPrefixRegex,\"$1\")},t.prototype.stripProtocolRelativePrefix=function(e){return e.replace(this.protocolRelativeRegex,\"\")},t.prototype.removeTrailingSlash=function(e){return\"/\"===e.charAt(e.length-1)&&(e=e.slice(0,-1)),e},t.prototype.removePercentEncoding=function(e){var t=e.replace(/%22/gi,\""\").replace(/%26/gi,\"&\").replace(/%27/gi,\"'\").replace(/%3C/gi,\"<\").replace(/%3E/gi,\">\");try{return decodeURIComponent(t)}catch(e){return t}},t}(Te),Ue=function(e){this.__jsduckDummyDocProp=null,this.tagBuilder=e.tagBuilder},He=/[A-Za-z]/,Ve=/[0-9]/,Ge=/\\s/,$e=/['\"]/,Ze=/[\\x00-\\x1F\\x7F]/,We=/A-Za-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC/.source,Je=We+/\\u00a9\\u00ae\\u2000-\\u3300\\ud83c\\ud000-\\udfff\\ud83d\\ud000-\\udfff\\ud83e\\ud000-\\udfff/.source+/\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08D4-\\u08E1\\u08E3-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u1885\\u1886\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFB-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69E\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C5\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2F/.source,Ye=/0-9\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19/.source,Ke=Je+Ye,Qe=Je+Ye,Xe=\"(?:[\"+Ye+\"]{1,3}\\\\.){3}[\"+Ye+\"]{1,3}\",et=\"[\"+Qe+\"](?:[\"+Qe+\"\\\\-]{0,61}[\"+Qe+\"])?\",tt=function(e){return\"(?=(\"+et+\"))\\\\\"+e},rt=function(e){return\"(?:\"+tt(e)+\"(?:\\\\.\"+tt(e+1)+\"){0,126}|\"+Xe+\")\"},nt=new RegExp(\"[\"+Qe+\"]\"),ot=/(?:xn--vermgensberatung-pwb|xn--vermgensberater-ctb|xn--clchc0ea0b2g2a9gcd|xn--w4r85el8fhu5dnra|northwesternmutual|travelersinsurance|vermögensberatung|xn--3oq18vl8pn36a|xn--5su34j936bgsg|xn--bck1b9a5dre4c|xn--mgbai9azgqp6j|xn--mgberp4a5d4ar|xn--xkc2dl3a5ee0h|vermögensberater|xn--fzys8d69uvgm|xn--mgba7c0bbn0a|xn--xkc2al3hye2a|americanexpress|kerryproperties|sandvikcoromant|xn--i1b6b1a6a2e|xn--kcrx77d1x4a|xn--lgbbat1ad8j|xn--mgba3a4f16a|xn--mgbaakc7dvf|xn--mgbc0a9azcg|xn--nqv7fs00ema|afamilycompany|americanfamily|bananarepublic|cancerresearch|cookingchannel|kerrylogistics|weatherchannel|xn--54b7fta0cc|xn--6qq986b3xl|xn--80aqecdr1a|xn--b4w605ferd|xn--fiq228c5hs|xn--h2breg3eve|xn--jlq61u9w7b|xn--mgba3a3ejt|xn--mgbaam7a8h|xn--mgbayh7gpa|xn--mgbb9fbpob|xn--mgbbh1a71e|xn--mgbca7dzdo|xn--mgbi4ecexp|xn--mgbx4cd0ab|xn--rvc1e0am3e|international|lifeinsurance|spreadbetting|travelchannel|wolterskluwer|xn--eckvdtc9d|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--h2brj9c8c|xn--tiq49xqyj|xn--yfro4i67o|xn--ygbi2ammx|construction|lplfinancial|scholarships|versicherung|xn--3e0b707e|xn--45br5cyl|xn--80adxhks|xn--80asehdb|xn--8y0a063a|xn--gckr3f0f|xn--mgb9awbf|xn--mgbab2bd|xn--mgbgu82a|xn--mgbpl2fh|xn--mgbt3dhd|xn--mk1bu44c|xn--ngbc5azd|xn--ngbe9e0a|xn--ogbpf8fl|xn--qcka1pmc|accountants|barclaycard|blackfriday|blockbuster|bridgestone|calvinklein|contractors|creditunion|engineering|enterprises|foodnetwork|investments|kerryhotels|lamborghini|motorcycles|olayangroup|photography|playstation|productions|progressive|redumbrella|rightathome|williamhill|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--3bst00m|xn--3ds443g|xn--3hcrj9c|xn--42c2d9a|xn--45brj9c|xn--55qw42g|xn--6frz82g|xn--80ao21a|xn--9krt00a|xn--cck2b3b|xn--czr694b|xn--d1acj3b|xn--efvy88h|xn--estv75g|xn--fct429k|xn--fjq720a|xn--flw351e|xn--g2xx48c|xn--gecrj9c|xn--gk3at1e|xn--h2brj9c|xn--hxt814e|xn--imr513n|xn--j6w193g|xn--jvr189m|xn--kprw13d|xn--kpry57d|xn--kpu716f|xn--mgbbh1a|xn--mgbtx2b|xn--mix891f|xn--nyqy26a|xn--otu796d|xn--pbt977c|xn--pgbs0dh|xn--q9jyb4c|xn--rhqv96g|xn--rovu88b|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--vuq861b|xn--w4rs40l|xn--xhq521b|xn--zfr164b|சிங்கப்பூர்|accountant|apartments|associates|basketball|bnpparibas|boehringer|capitalone|consulting|creditcard|cuisinella|eurovision|extraspace|foundation|healthcare|immobilien|industries|management|mitsubishi|nationwide|newholland|nextdirect|onyourside|properties|protection|prudential|realestate|republican|restaurant|schaeffler|swiftcover|tatamotors|technology|telefonica|university|vistaprint|vlaanderen|volkswagen|xn--30rr7y|xn--3pxu8k|xn--45q11c|xn--4gbrim|xn--55qx5d|xn--5tzm5g|xn--80aswg|xn--90a3ac|xn--9dbq2a|xn--9et52u|xn--c2br7g|xn--cg4bki|xn--czrs0t|xn--czru2d|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--io0a7i|xn--kput3i|xn--mxtq1m|xn--o3cw4h|xn--pssy2u|xn--unup4y|xn--wgbh1c|xn--wgbl6a|xn--y9a3aq|accenture|alfaromeo|allfinanz|amsterdam|analytics|aquarelle|barcelona|bloomberg|christmas|community|directory|education|equipment|fairwinds|financial|firestone|fresenius|frontdoor|fujixerox|furniture|goldpoint|hisamitsu|homedepot|homegoods|homesense|honeywell|institute|insurance|kuokgroup|ladbrokes|lancaster|landrover|lifestyle|marketing|marshalls|melbourne|microsoft|panasonic|passagens|pramerica|richardli|scjohnson|shangrila|solutions|statebank|statefarm|stockholm|travelers|vacations|xn--90ais|xn--c1avg|xn--d1alf|xn--e1a4c|xn--fhbei|xn--j1aef|xn--j1amh|xn--l1acc|xn--ngbrx|xn--nqv7f|xn--p1acf|xn--tckwe|xn--vhquv|yodobashi|abudhabi|airforce|allstate|attorney|barclays|barefoot|bargains|baseball|boutique|bradesco|broadway|brussels|budapest|builders|business|capetown|catering|catholic|chrysler|cipriani|cityeats|cleaning|clinique|clothing|commbank|computer|delivery|deloitte|democrat|diamonds|discount|discover|download|engineer|ericsson|esurance|etisalat|everbank|exchange|feedback|fidelity|firmdale|football|frontier|goodyear|grainger|graphics|guardian|hdfcbank|helsinki|holdings|hospital|infiniti|ipiranga|istanbul|jpmorgan|lighting|lundbeck|marriott|maserati|mckinsey|memorial|merckmsd|mortgage|movistar|observer|partners|pharmacy|pictures|plumbing|property|redstone|reliance|saarland|samsclub|security|services|shopping|showtime|softbank|software|stcgroup|supplies|symantec|training|uconnect|vanguard|ventures|verisign|woodside|xn--90ae|xn--node|xn--p1ai|xn--qxam|yokohama|السعودية|abogado|academy|agakhan|alibaba|android|athleta|auction|audible|auspost|avianca|banamex|bauhaus|bentley|bestbuy|booking|brother|bugatti|capital|caravan|careers|cartier|channel|charity|chintai|citadel|clubmed|college|cologne|comcast|company|compare|contact|cooking|corsica|country|coupons|courses|cricket|cruises|dentist|digital|domains|exposed|express|farmers|fashion|ferrari|ferrero|finance|fishing|fitness|flights|florist|flowers|forsale|frogans|fujitsu|gallery|genting|godaddy|grocery|guitars|hamburg|hangout|hitachi|holiday|hosting|hoteles|hotmail|hyundai|iselect|ismaili|jewelry|juniper|kitchen|komatsu|lacaixa|lancome|lanxess|lasalle|latrobe|leclerc|liaison|limited|lincoln|markets|metlife|monster|netbank|netflix|network|neustar|okinawa|oldnavy|organic|origins|philips|pioneer|politie|realtor|recipes|rentals|reviews|rexroth|samsung|sandvik|schmidt|schwarz|science|shiksha|shriram|singles|staples|starhub|storage|support|surgery|systems|temasek|theater|theatre|tickets|tiffany|toshiba|trading|walmart|wanggou|watches|weather|website|wedding|whoswho|windows|winners|xfinity|yamaxun|youtube|zuerich|католик|اتصالات|الجزائر|العليان|پاکستان|كاثوليك|موبايلي|இந்தியா|abarth|abbott|abbvie|active|africa|agency|airbus|airtel|alipay|alsace|alstom|anquan|aramco|author|bayern|beauty|berlin|bharti|blanco|bostik|boston|broker|camera|career|caseih|casino|center|chanel|chrome|church|circle|claims|clinic|coffee|comsec|condos|coupon|credit|cruise|dating|datsun|dealer|degree|dental|design|direct|doctor|dunlop|dupont|durban|emerck|energy|estate|events|expert|family|flickr|futbol|gallup|garden|george|giving|global|google|gratis|health|hermes|hiphop|hockey|hotels|hughes|imamat|insure|intuit|jaguar|joburg|juegos|kaufen|kinder|kindle|kosher|lancia|latino|lawyer|lefrak|living|locker|london|luxury|madrid|maison|makeup|market|mattel|mobile|mobily|monash|mormon|moscow|museum|mutual|nagoya|natura|nissan|nissay|norton|nowruz|office|olayan|online|oracle|orange|otsuka|pfizer|photos|physio|piaget|pictet|quebec|racing|realty|reisen|repair|report|review|rocher|rogers|ryukyu|safety|sakura|sanofi|school|schule|search|secure|select|shouji|soccer|social|stream|studio|supply|suzuki|swatch|sydney|taipei|taobao|target|tattoo|tennis|tienda|tjmaxx|tkmaxx|toyota|travel|unicom|viajes|viking|villas|virgin|vision|voting|voyage|vuelos|walter|warman|webcam|xihuan|yachts|yandex|zappos|москва|онлайн|ابوظبي|ارامكو|الاردن|المغرب|امارات|فلسطين|مليسيا|भारतम्|இலங்கை|ファッション|actor|adult|aetna|amfam|amica|apple|archi|audio|autos|azure|baidu|beats|bible|bingo|black|boats|bosch|build|canon|cards|chase|cheap|cisco|citic|click|cloud|coach|codes|crown|cymru|dabur|dance|deals|delta|dodge|drive|dubai|earth|edeka|email|epost|epson|faith|fedex|final|forex|forum|gallo|games|gifts|gives|glade|glass|globo|gmail|green|gripe|group|gucci|guide|homes|honda|horse|house|hyatt|ikano|intel|irish|iveco|jetzt|koeln|kyoto|lamer|lease|legal|lexus|lilly|linde|lipsy|lixil|loans|locus|lotte|lotto|lupin|macys|mango|media|miami|money|mopar|movie|nadex|nexus|nikon|ninja|nokia|nowtv|omega|osaka|paris|parts|party|phone|photo|pizza|place|poker|praxi|press|prime|promo|quest|radio|rehab|reise|ricoh|rocks|rodeo|rugby|salon|sener|seven|sharp|shell|shoes|skype|sling|smart|smile|solar|space|sport|stada|store|study|style|sucks|swiss|tatar|tires|tirol|tmall|today|tokyo|tools|toray|total|tours|trade|trust|tunes|tushu|ubank|vegas|video|vodka|volvo|wales|watch|weber|weibo|works|world|xerox|yahoo|zippo|ایران|بازار|بھارت|سودان|سورية|همراه|भारोत|संगठन|বাংলা|భారత్|ഭാരതം|嘉里大酒店|aarp|able|adac|aero|aigo|akdn|ally|amex|arab|army|arpa|arte|asda|asia|audi|auto|baby|band|bank|bbva|beer|best|bike|bing|blog|blue|bofa|bond|book|buzz|cafe|call|camp|care|cars|casa|case|cash|cbre|cern|chat|citi|city|club|cool|coop|cyou|data|date|dclk|deal|dell|desi|diet|dish|docs|doha|duck|duns|dvag|erni|fage|fail|fans|farm|fast|fiat|fido|film|fire|fish|flir|food|ford|free|fund|game|gbiz|gent|ggee|gift|gmbh|gold|golf|goog|guge|guru|hair|haus|hdfc|help|here|hgtv|host|hsbc|icbc|ieee|imdb|immo|info|itau|java|jeep|jobs|jprs|kddi|kiwi|kpmg|kred|land|lego|lgbt|lidl|life|like|limo|link|live|loan|loft|love|ltda|luxe|maif|meet|meme|menu|mini|mint|mobi|moda|moto|name|navy|news|next|nico|nike|ollo|open|page|pars|pccw|pics|ping|pink|play|plus|pohl|porn|post|prod|prof|qpon|raid|read|reit|rent|rest|rich|rmit|room|rsvp|ruhr|safe|sale|sarl|save|saxo|scor|scot|seat|seek|sexy|shaw|shia|shop|show|silk|sina|site|skin|sncf|sohu|song|sony|spot|star|surf|talk|taxi|team|tech|teva|tiaa|tips|town|toys|tube|vana|visa|viva|vivo|vote|voto|wang|weir|wien|wiki|wine|work|xbox|yoga|zara|zero|zone|дети|сайт|بارت|بيتك|ڀارت|تونس|شبكة|عراق|عمان|موقع|भारत|ভারত|ভাৰত|ਭਾਰਤ|ભારત|ଭାରତ|ಭಾರತ|ලංකා|グーグル|クラウド|ポイント|大众汽车|组织机构|電訊盈科|香格里拉|aaa|abb|abc|aco|ads|aeg|afl|aig|anz|aol|app|art|aws|axa|bar|bbc|bbt|bcg|bcn|bet|bid|bio|biz|bms|bmw|bnl|bom|boo|bot|box|buy|bzh|cab|cal|cam|car|cat|cba|cbn|cbs|ceb|ceo|cfa|cfd|com|crs|csc|dad|day|dds|dev|dhl|diy|dnp|dog|dot|dtv|dvr|eat|eco|edu|esq|eus|fan|fit|fly|foo|fox|frl|ftr|fun|fyi|gal|gap|gdn|gea|gle|gmo|gmx|goo|gop|got|gov|hbo|hiv|hkt|hot|how|ibm|ice|icu|ifm|inc|ing|ink|int|ist|itv|jcb|jcp|jio|jll|jmp|jnj|jot|joy|kfh|kia|kim|kpn|krd|lat|law|lds|llc|lol|lpl|ltd|man|map|mba|med|men|mil|mit|mlb|mls|mma|moe|moi|mom|mov|msd|mtn|mtr|nab|nba|nec|net|new|nfl|ngo|nhk|now|nra|nrw|ntt|nyc|obi|off|one|ong|onl|ooo|org|ott|ovh|pay|pet|phd|pid|pin|pnc|pro|pru|pub|pwc|qvc|red|ren|ril|rio|rip|run|rwe|sap|sas|sbi|sbs|sca|scb|ses|sew|sex|sfr|ski|sky|soy|srl|srt|stc|tab|tax|tci|tdk|tel|thd|tjx|top|trv|tui|tvs|ubs|uno|uol|ups|vet|vig|vin|vip|wed|win|wme|wow|wtc|wtf|xin|xxx|xyz|you|yun|zip|бел|ком|қаз|мкд|мон|орг|рус|срб|укр|հայ|קום|عرب|قطر|كوم|مصر|कॉम|नेट|คอม|ไทย|ストア|セール|みんな|中文网|天主教|我爱你|新加坡|淡马锡|诺基亚|飞利浦|ac|ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw|ελ|бг|ею|рф|გე|닷넷|닷컴|삼성|한국|コム|世界|中信|中国|中國|企业|佛山|信息|健康|八卦|公司|公益|台湾|台灣|商城|商店|商标|嘉里|在线|大拿|娱乐|家電|工行|广东|微博|慈善|手机|手表|招聘|政务|政府|新闻|时尚|書籍|机构|游戏|澳門|点看|珠宝|移动|网址|网店|网站|网络|联通|谷歌|购物|通販|集团|食品|餐厅|香港)/,st=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.localPartCharRegex=new RegExp(\"[\"+Qe+\"!#$%&'*+/=?^_`{|}~-]\"),t.strictTldRegex=new RegExp(\"^\"+ot.source+\"$\"),t}return Re(t,e),t.prototype.parseMatches=function(e){for(var t=this.tagBuilder,r=this.localPartCharRegex,n=this.strictTldRegex,o=[],s=e.length,i=new it,a={m:\"a\",a:\"i\",i:\"l\",l:\"t\",t:\"o\",o:\":\"},u=0,l=0,c=i;u<s;){var p=e.charAt(u);switch(l){case 0:h(p);break;case 1:f(e.charAt(u-1),p);break;case 2:g(p);break;case 3:d(p);break;case 4:m(p);break;case 5:b(p);break;case 6:v(p);break;case 7:k(p);break;default:Fe(l)}u++}return x(),o;function h(e){\"m\"===e?A(1):r.test(e)&&A()}function f(e,t){\":\"===e?r.test(t)?(l=2,c=new it(Ne({},c,{hasMailtoPrefix:!0}))):y():a[e]===t||(r.test(t)?l=2:\".\"===t?l=3:\"@\"===t?l=4:y())}function g(e){\".\"===e?l=3:\"@\"===e?l=4:r.test(e)||y()}function d(e){\".\"===e?y():\"@\"===e?y():r.test(e)?l=2:y()}function m(e){nt.test(e)?l=5:y()}function b(e){\".\"===e?l=7:\"-\"===e?l=6:nt.test(e)||x()}function v(e){\"-\"===e||\".\"===e?x():nt.test(e)?l=5:x()}function k(e){\".\"===e||\"-\"===e?x():nt.test(e)?(l=5,c=new it(Ne({},c,{hasDomainDot:!0}))):x()}function A(e){void 0===e&&(e=2),l=e,c=new it({idx:u})}function y(){l=0,c=i}function x(){if(c.hasDomainDot){var r=e.slice(c.idx,u);/[-.]$/.test(r)&&(r=r.slice(0,-1));var s=c.hasMailtoPrefix?r.slice(\"mailto:\".length):r;(function(e){var t=(e.split(\".\").pop()||\"\").toLowerCase();return n.test(t)})(s)&&o.push(new ze({tagBuilder:t,matchedText:r,offset:c.idx,email:s}))}y()}},t}(Ue),it=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.hasMailtoPrefix=!!e.hasMailtoPrefix,this.hasDomainDot=!!e.hasDomainDot},at=function(){function e(){}return e.isValid=function(e,t){return!(t&&!this.isValidUriScheme(t)||this.urlMatchDoesNotHaveProtocolOrDot(e,t)||this.urlMatchDoesNotHaveAtLeastOneWordChar(e,t)&&!this.isValidIpAddress(e)||this.containsMultipleDots(e))},e.isValidIpAddress=function(e){var t=new RegExp(this.hasFullProtocolRegex.source+this.ipRegex.source);return null!==e.match(t)},e.containsMultipleDots=function(e){var t=e;return this.hasFullProtocolRegex.test(e)&&(t=e.split(\"://\")[1]),t.split(\"/\")[0].indexOf(\"..\")>-1},e.isValidUriScheme=function(e){var t=e.match(this.uriSchemeRegex),r=t&&t[0].toLowerCase();return\"javascript:\"!==r&&\"vbscript:\"!==r},e.urlMatchDoesNotHaveProtocolOrDot=function(e,t){return!(!e||t&&this.hasFullProtocolRegex.test(t)||-1!==e.indexOf(\".\"))},e.urlMatchDoesNotHaveAtLeastOneWordChar=function(e,t){return!(!e||!t)&&!this.hasWordCharAfterProtocolRegex.test(e)},e.hasFullProtocolRegex=/^[A-Za-z][-.+A-Za-z0-9]*:\\/\\//,e.uriSchemeRegex=/^[A-Za-z][-.+A-Za-z0-9]*:/,e.hasWordCharAfterProtocolRegex=new RegExp(\":[^\\\\s]*?[\"+We+\"]\"),e.ipRegex=/[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?\\.[0-9][0-9]?[0-9]?(:[0-9]*)?\\/?$/,e}(),ut=function(e){function t(t){var r,n=e.call(this,t)||this;return n.stripPrefix={scheme:!0,www:!0},n.stripTrailingSlash=!0,n.decodePercentEncoding=!0,n.matcherRegex=(r=new RegExp(\"[/?#](?:[\"+Qe+\"\\\\-+&@#/%=~_()|'$*\\\\[\\\\]?!:,.;✓]*[\"+Qe+\"\\\\-+&@#/%=~_()|'$*\\\\[\\\\]✓])?\"),new RegExp([\"(?:\",\"(\",/(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\\/\\/)(?!\\d+\\/?)(?:\\/\\/)?)/.source,rt(2),\")\",\"|\",\"(\",\"(//)?\",/(?:www\\.)/.source,rt(6),\")\",\"|\",\"(\",\"(//)?\",rt(10)+\"\\\\.\",ot.source,\"(?![-\"+Ke+\"])\",\")\",\")\",\"(?::[0-9]+)?\",\"(?:\"+r.source+\")?\"].join(\"\"),\"gi\")),n.wordCharRegExp=new RegExp(\"[\"+Qe+\"]\"),n.stripPrefix=t.stripPrefix,n.stripTrailingSlash=t.stripTrailingSlash,n.decodePercentEncoding=t.decodePercentEncoding,n}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.stripPrefix,o=this.stripTrailingSlash,s=this.decodePercentEncoding,i=this.tagBuilder,a=[],u=function(){var r=t[0],u=t[1],c=t[4],p=t[5],h=t[9],f=t.index,g=p||h,d=e.charAt(f-1);if(!at.isValid(r,u))return\"continue\";if(f>0&&\"@\"===d)return\"continue\";if(f>0&&g&&l.wordCharRegExp.test(d))return\"continue\";if(/\\?$/.test(r)&&(r=r.substr(0,r.length-1)),l.matchHasUnbalancedClosingParen(r))r=r.substr(0,r.length-1);else{var m=l.matchHasInvalidCharAfterTld(r,u);m>-1&&(r=r.substr(0,m))}var b=[\"http://\",\"https://\"].find(function(e){return!!u&&-1!==u.indexOf(e)});if(b){var v=r.indexOf(b);r=r.substr(v),u=u.substr(v),f+=v}var k=u?\"scheme\":c?\"www\":\"tld\",A=!!u;a.push(new Oe({tagBuilder:i,matchedText:r,offset:f,urlMatchType:k,url:r,protocolUrlMatch:A,protocolRelativeMatch:!!g,stripPrefix:n,stripTrailingSlash:o,decodePercentEncoding:s}))},l=this;null!==(t=r.exec(e));)u();return a},t.prototype.matchHasUnbalancedClosingParen=function(e){var t,r=e.charAt(e.length-1);if(\")\"===r)t=\"(\";else{if(\"]\"!==r)return!1;t=\"[\"}for(var n=0,o=0,s=e.length-1;o<s;o++){var i=e.charAt(o);i===t?n++:i===r&&(n=Math.max(n-1,0))}return 0===n},t.prototype.matchHasInvalidCharAfterTld=function(e,t){if(!e)return-1;var r=0;t&&(r=e.indexOf(\":\"),e=e.slice(r));var n=new RegExp(\"^((.?//)?[-.\"+Qe+\"]*[-\"+Qe+\"]\\\\.[-\"+Qe+\"]+)\").exec(e);return null===n?-1:(r+=n[1].length,e=e.slice(n[1].length),/^[^-.A-Za-z0-9:\\/?#]/.test(e)?r:-1)},t}(Ue),lt=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"twitter\",r.matcherRegex=new RegExp(\"#[_\"+Qe+\"]{1,139}(?![_\"+Qe+\"])\",\"g\"),r.nonWordCharRegex=new RegExp(\"[^\"+Qe+\"]\"),r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.nonWordCharRegex,o=this.serviceName,s=this.tagBuilder,i=[];null!==(t=r.exec(e));){var a=t.index,u=e.charAt(a-1);if(0===a||n.test(u)){var l=t[0],c=t[0].slice(1);i.push(new Pe({tagBuilder:s,matchedText:l,offset:a,serviceName:o,hashtag:c}))}}return i},t}(Ue),ct=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.matcherRegex=/(?:(?:(?:(\\+)?\\d{1,3}[-\\040.]?)?\\(?\\d{3}\\)?[-\\040.]?\\d{3}[-\\040.]?\\d{4})|(?:(\\+)(?:9[976]\\d|8[987530]\\d|6[987]\\d|5[90]\\d|42\\d|3[875]\\d|2[98654321]\\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\\040.]?(?:\\d[-\\040.]?){6,12}\\d+))([,;]+[0-9]+#?)*/g,t}return Re(t,e),t.prototype.parseMatches=function(e){for(var t,r=this.matcherRegex,n=this.tagBuilder,o=[];null!==(t=r.exec(e));){var s=t[0],i=s.replace(/[^0-9,;#]/g,\"\"),a=!(!t[1]&&!t[2]),u=0==t.index?\"\":e.substr(t.index-1,1),l=e.substr(t.index+s.length,1),c=!u.match(/\\d/)&&!l.match(/\\d/);this.testMatch(t[3])&&this.testMatch(s)&&c&&o.push(new Ie({tagBuilder:n,matchedText:s,offset:t.index,number:i,plusSign:a}))}return o},t.prototype.testMatch=function(e){return/\\D/.test(e)},t}(Ue),pt=function(e){function t(t){var r=e.call(this,t)||this;return r.serviceName=\"twitter\",r.matcherRegexes={twitter:new RegExp(\"@[_\"+Qe+\"]{1,50}(?![_\"+Qe+\"])\",\"g\"),instagram:new RegExp(\"@[_.\"+Qe+\"]{1,30}(?![_\"+Qe+\"])\",\"g\"),soundcloud:new RegExp(\"@[-_.\"+Qe+\"]{1,50}(?![-_\"+Qe+\"])\",\"g\")},r.nonWordCharRegex=new RegExp(\"[^\"+Qe+\"]\"),r.serviceName=t.serviceName,r}return Re(t,e),t.prototype.parseMatches=function(e){var t,r=this.serviceName,n=this.matcherRegexes[this.serviceName],o=this.nonWordCharRegex,s=this.tagBuilder,i=[];if(!n)return i;for(;null!==(t=n.exec(e));){var a=t.index,u=e.charAt(a-1);if(0===a||o.test(u)){var l=t[0].replace(/\\.+$/g,\"\"),c=l.slice(1);i.push(new je({tagBuilder:s,matchedText:l,offset:a,serviceName:r,mention:c}))}}return i},t}(Ue);function ht(e,t){for(var r=t.onOpenTag,n=t.onCloseTag,o=t.onText,s=t.onComment,i=t.onDoctype,a=new ft,u=0,l=e.length,c=0,p=0,h=a;u<l;){var f=e.charAt(u);switch(c){case 0:g(f);break;case 1:d(f);break;case 2:b(f);break;case 3:m(f);break;case 4:v(f);break;case 5:k(f);break;case 6:A(f);break;case 7:y(f);break;case 8:x(f);break;case 9:w(f);break;case 10:C(f);break;case 11:E(f);break;case 12:D(f);break;case 13:_();break;case 14:B(f);break;case 15:q(f);break;case 16:F(f);break;case 17:M(f);break;case 18:S(f);break;case 19:T(f);break;case 20:L(f);break;default:Fe(c)}u++}function g(e){\"<\"===e&&N()}function d(e){\"!\"===e?c=13:\"/\"===e?(c=2,h=new ft(Ne({},h,{isClosing:!0}))):\"<\"===e?N():He.test(e)?(c=3,h=new ft(Ne({},h,{isOpening:!0}))):(c=0,h=a)}function m(e){Ge.test(e)?(h=new ft(Ne({},h,{name:P()})),c=4):\"<\"===e?N():\"/\"===e?(h=new ft(Ne({},h,{name:P()})),c=12):\">\"===e?(h=new ft(Ne({},h,{name:P()})),z()):He.test(e)||Ve.test(e)||\":\"===e||R()}function b(e){\">\"===e?R():He.test(e)?c=3:R()}function v(e){Ge.test(e)||(\"/\"===e?c=12:\">\"===e?z():\"<\"===e?N():\"=\"===e||$e.test(e)||Ze.test(e)?R():c=5)}function k(e){Ge.test(e)?c=6:\"/\"===e?c=12:\"=\"===e?c=7:\">\"===e?z():\"<\"===e?N():$e.test(e)&&R()}function A(e){Ge.test(e)||(\"/\"===e?c=12:\"=\"===e?c=7:\">\"===e?z():\"<\"===e?N():$e.test(e)?R():c=5)}function y(e){Ge.test(e)||('\"'===e?c=8:\"'\"===e?c=9:/[>=`]/.test(e)?R():\"<\"===e?N():c=10)}function x(e){'\"'===e&&(c=11)}function w(e){\"'\"===e&&(c=11)}function C(e){Ge.test(e)?c=4:\">\"===e?z():\"<\"===e&&N()}function E(e){Ge.test(e)?c=4:\"/\"===e?c=12:\">\"===e?z():\"<\"===e?N():(c=4,u--)}function D(e){\">\"===e?(h=new ft(Ne({},h,{isClosing:!0})),z()):c=4}function _(t){\"--\"===e.substr(u,2)?(u+=2,h=new ft(Ne({},h,{type:\"comment\"})),c=14):\"DOCTYPE\"===e.substr(u,7).toUpperCase()?(u+=7,h=new ft(Ne({},h,{type:\"doctype\"})),c=20):R()}function B(e){\"-\"===e?c=15:\">\"===e?R():c=16}function q(e){\"-\"===e?c=18:\">\"===e?R():c=16}function F(e){\"-\"===e&&(c=17)}function M(e){c=\"-\"===e?18:16}function S(e){\">\"===e?z():\"!\"===e?c=19:\"-\"===e||(c=16)}function T(e){\"-\"===e?c=17:\">\"===e?z():c=16}function L(e){\">\"===e?z():\"<\"===e&&N()}function R(){c=0,h=a}function N(){c=1,h=new ft({idx:u})}function z(){var t=e.slice(p,h.idx);t&&o(t,p),\"comment\"===h.type?s(h.idx):\"doctype\"===h.type?i(h.idx):(h.isOpening&&r(h.name,h.idx),h.isClosing&&n(h.name,h.idx)),R(),p=u+1}function P(){var t=h.idx+(h.isClosing?2:1);return e.slice(t,u).toLowerCase()}p<u&&function(){var t=e.slice(p,u);o(t,p),p=u+1}()}var ft=function(e){void 0===e&&(e={}),this.idx=void 0!==e.idx?e.idx:-1,this.type=e.type||\"tag\",this.name=e.name||\"\",this.isOpening=!!e.isOpening,this.isClosing=!!e.isClosing},gt=function(){function e(t){void 0===t&&(t={}),this.version=e.version,this.urls={},this.email=!0,this.phone=!0,this.hashtag=!1,this.mention=!1,this.newWindow=!0,this.stripPrefix={scheme:!0,www:!0},this.stripTrailingSlash=!0,this.decodePercentEncoding=!0,this.truncate={length:0,location:\"end\"},this.className=\"\",this.replaceFn=null,this.context=void 0,this.matchers=null,this.tagBuilder=null,this.urls=this.normalizeUrlsCfg(t.urls),this.email=\"boolean\"==typeof t.email?t.email:this.email,this.phone=\"boolean\"==typeof t.phone?t.phone:this.phone,this.hashtag=t.hashtag||this.hashtag,this.mention=t.mention||this.mention,this.newWindow=\"boolean\"==typeof t.newWindow?t.newWindow:this.newWindow,this.stripPrefix=this.normalizeStripPrefixCfg(t.stripPrefix),this.stripTrailingSlash=\"boolean\"==typeof t.stripTrailingSlash?t.stripTrailingSlash:this.stripTrailingSlash,this.decodePercentEncoding=\"boolean\"==typeof t.decodePercentEncoding?t.decodePercentEncoding:this.decodePercentEncoding;var r=this.mention;if(!1!==r&&\"twitter\"!==r&&\"instagram\"!==r&&\"soundcloud\"!==r)throw new Error(\"invalid `mention` cfg - see docs\");var n=this.hashtag;if(!1!==n&&\"twitter\"!==n&&\"facebook\"!==n&&\"instagram\"!==n)throw new Error(\"invalid `hashtag` cfg - see docs\");this.truncate=this.normalizeTruncateCfg(t.truncate),this.className=t.className||this.className,this.replaceFn=t.replaceFn||this.replaceFn,this.context=t.context||this}return e.link=function(t,r){return new e(r).link(t)},e.parse=function(t,r){return new e(r).parse(t)},e.prototype.normalizeUrlsCfg=function(e){return null==e&&(e=!0),\"boolean\"==typeof e?{schemeMatches:e,wwwMatches:e,tldMatches:e}:{schemeMatches:\"boolean\"!=typeof e.schemeMatches||e.schemeMatches,wwwMatches:\"boolean\"!=typeof e.wwwMatches||e.wwwMatches,tldMatches:\"boolean\"!=typeof e.tldMatches||e.tldMatches}},e.prototype.normalizeStripPrefixCfg=function(e){return null==e&&(e=!0),\"boolean\"==typeof e?{scheme:e,www:e}:{scheme:\"boolean\"!=typeof e.scheme||e.scheme,www:\"boolean\"!=typeof e.www||e.www}},e.prototype.normalizeTruncateCfg=function(e){return\"number\"==typeof e?{length:e,location:\"end\"}:function(e,t){for(var r in t)t.hasOwnProperty(r)&&void 0===e[r]&&(e[r]=t[r]);return e}(e||{},{length:Number.POSITIVE_INFINITY,location:\"end\"})},e.prototype.parse=function(e){var t=this,r=[\"a\",\"style\",\"script\"],n=0,o=[];return ht(e,{onOpenTag:function(e){r.indexOf(e)>=0&&n++},onText:function(e,r){if(0===n){var s=function(e,t){if(!t.global)throw new Error(\"`splitRegex` must have the 'g' flag set\");for(var r,n=[],o=0;r=t.exec(e);)n.push(e.substring(o,r.index)),n.push(r[0]),o=r.index+r[0].length;return n.push(e.substring(o)),n}(e,/( | |<|<|>|>|"|"|')/gi),i=r;s.forEach(function(e,r){if(r%2==0){var n=t.parseText(e,i);o.push.apply(o,n)}i+=e.length})}},onCloseTag:function(e){r.indexOf(e)>=0&&(n=Math.max(n-1,0))},onComment:function(e){},onDoctype:function(e){}}),o=this.compactMatches(o),o=this.removeUnwantedMatches(o)},e.prototype.compactMatches=function(e){e.sort(function(e,t){return e.getOffset()-t.getOffset()});for(var t=0;t<e.length-1;t++){var r=e[t],n=r.getOffset(),o=r.getMatchedText().length,s=n+o;if(t+1<e.length){if(e[t+1].getOffset()===n){var i=e[t+1].getMatchedText().length>o?t:t+1;e.splice(i,1);continue}e[t+1].getOffset()<s&&e.splice(t+1,1)}}return e},e.prototype.removeUnwantedMatches=function(e){return this.hashtag||qe(e,function(e){return\"hashtag\"===e.getType()}),this.email||qe(e,function(e){return\"email\"===e.getType()}),this.phone||qe(e,function(e){return\"phone\"===e.getType()}),this.mention||qe(e,function(e){return\"mention\"===e.getType()}),this.urls.schemeMatches||qe(e,function(e){return\"url\"===e.getType()&&\"scheme\"===e.getUrlMatchType()}),this.urls.wwwMatches||qe(e,function(e){return\"url\"===e.getType()&&\"www\"===e.getUrlMatchType()}),this.urls.tldMatches||qe(e,function(e){return\"url\"===e.getType()&&\"tld\"===e.getUrlMatchType()}),e},e.prototype.parseText=function(e,t){void 0===t&&(t=0),t=t||0;for(var r=this.getMatchers(),n=[],o=0,s=r.length;o<s;o++){for(var i=r[o].parseMatches(e),a=0,u=i.length;a<u;a++)i[a].setOffset(t+i[a].getOffset());n.push.apply(n,i)}return n},e.prototype.link=function(e){if(!e)return\"\";for(var t=this.parse(e),r=[],n=0,o=0,s=t.length;o<s;o++){var i=t[o];r.push(e.substring(n,i.getOffset())),r.push(this.createMatchReturnVal(i)),n=i.getOffset()+i.getMatchedText().length}return r.push(e.substring(n)),r.join(\"\")},e.prototype.createMatchReturnVal=function(e){var t;return this.replaceFn&&(t=this.replaceFn.call(this.context,e)),\"string\"==typeof t?t:!1===t?e.getMatchedText():t instanceof Me?t.toAnchorString():e.buildTag().toAnchorString()},e.prototype.getMatchers=function(){if(this.matchers)return this.matchers;var e=this.getTagBuilder(),t=[new lt({tagBuilder:e,serviceName:this.hashtag}),new st({tagBuilder:e}),new ct({tagBuilder:e}),new pt({tagBuilder:e,serviceName:this.mention}),new ut({tagBuilder:e,stripPrefix:this.stripPrefix,stripTrailingSlash:this.stripTrailingSlash,decodePercentEncoding:this.decodePercentEncoding})];return this.matchers=t},e.prototype.getTagBuilder=function(){var e=this.tagBuilder;return e||(e=this.tagBuilder=new Se({newWindow:this.newWindow,truncate:this.truncate,className:this.className})),e},e.version=\"3.11.0\",e.AnchorTagBuilder=Se,e.HtmlTag=Me,e.matcher={Email:st,Hashtag:lt,Matcher:Ue,Mention:pt,Phone:ct,Url:ut},e.match={Email:ze,Hashtag:Pe,Match:Te,Mention:je,Phone:Ie,Url:Oe},e}(),dt=/www|@|\\:\\/\\//;function mt(e){return/^<\\/a\\s*>/i.test(e)}function bt(){var e=[],t=new gt({stripPrefix:!1,url:!0,email:!0,replaceFn:function(t){switch(t.getType()){case\"url\":e.push({text:t.matchedText,url:t.getUrl()});break;case\"email\":e.push({text:t.matchedText,url:\"mailto:\"+t.getEmail().replace(/^mailto:/i,\"\")})}return!1}});return{links:e,autolinker:t}}function vt(e){var t,r,n,o,s,i,a,u,l,c,p,h,f,g,d=e.tokens,m=null;for(r=0,n=d.length;r<n;r++)if(\"inline\"===d[r].type)for(p=0,t=(o=d[r].children).length-1;t>=0;t--)if(\"link_close\"!==(s=o[t]).type){if(\"htmltag\"===s.type&&(g=s.content,/^<a[>\\s]/i.test(g)&&p>0&&p--,mt(s.content)&&p++),!(p>0)&&\"text\"===s.type&&dt.test(s.content)){if(m||(h=(m=bt()).links,f=m.autolinker),i=s.content,h.length=0,f.link(i),!h.length)continue;for(a=[],c=s.level,u=0;u<h.length;u++)e.inline.validateLink(h[u].url)&&((l=i.indexOf(h[u].text))&&a.push({type:\"text\",content:i.slice(0,l),level:c}),a.push({type:\"link_open\",href:h[u].url,title:\"\",level:c++}),a.push({type:\"text\",content:h[u].text,level:c}),a.push({type:\"link_close\",level:--c}),i=i.slice(l+h[u].text.length));i.length&&a.push({type:\"text\",content:i,level:c}),d[r].children=o=[].concat(o.slice(0,t),a,o.slice(t+1))}}else for(t--;o[t].level!==s.level&&\"link_open\"!==o[t].type;)t--}e.Remarkable=_e,e.linkify=function(e){e.core.ruler.push(\"linkify\",vt)},e.utils=A,Object.defineProperty(e,\"__esModule\",{value:!0})});\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/markdown/remarkable.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/markdown/images/new-markdown-button": {
"title": "$:/plugins/tiddlywiki/markdown/images/new-markdown-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-markdown-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <rect x=\"80\" y=\"96\" width=\"48\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"96\" y=\"80\" width=\"16\" height=\"48\" rx=\"8\"></rect>\n <path d=\"M3.23876972,39.5396716 C3.23876972,35.9653274 6.13586353,33.0691646 9.7141757,33.0691646 L98.1283744,33.0691646 C101.706101,33.0691646 104.60378,35.9646626 104.60378,39.5396716 L104.60378,84.8296213 C104.60378,88.4039654 101.706687,91.3001282 98.1283744,91.3001282 L9.7141757,91.3001282 C6.13644944,91.3001282 3.23876972,88.4046302 3.23876972,84.8296213 L3.23876972,39.5396716 L3.23876972,39.5396716 Z M-2.15298617,39.5396716 L-2.15298617,84.8296213 C-2.15298617,91.3833243 3.15957363,96.6918841 9.7141757,96.6918841 L98.1283744,96.6918841 C104.684083,96.6918841 109.995536,91.382138 109.995536,84.8296213 L109.995536,39.5396716 C109.995536,32.9859686 104.682977,27.6774087 98.1283744,27.6774087 L9.7141757,27.6774087 C3.15846686,27.6774087 -2.15298617,32.9871549 -2.15298617,39.5396716 Z M14.0222815,80.5166164 L14.0222815,43.8526764 L24.8057933,43.8526764 L35.589305,57.3320661 L46.3728168,43.8526764 L57.1563286,43.8526764 L57.1563286,80.5166164 L46.3728168,80.5166164 L46.3728168,59.4887685 L35.589305,72.9681582 L24.8057933,59.4887685 L24.8057933,80.5166164 L14.0222815,80.5166164 Z M81.4192301,80.5166164 L65.2439624,62.723822 L76.0274742,62.723822 L76.0274742,43.8526764 L86.810986,43.8526764 L86.810986,62.723822 L97.5944978,62.723822 L81.4192301,80.5166164 Z\"transform=\"translate(53.921275, 62.184646) rotate(-60.000000) translate(-53.921275, -62.184646) \"></path>\n </g>\n</svg>"
},
"$:/plugins/tiddlywiki/markdown/new-markdown-button": {
"title": "$:/plugins/tiddlywiki/markdown/new-markdown-button",
"tags": "$:/tags/PageControls",
"caption": "{{$:/plugins/tiddlywiki/markdown/images/new-markdown-button}} {{$:/language/Buttons/NewMarkdown/Caption}}",
"description": "{{$:/language/Buttons/NewMarkdown/Hint}}",
"list-after": "$:/core/ui/Buttons/new-tiddler",
"text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/NewMarkdown/Hint}} aria-label={{$:/language/Buttons/NewMarkdown/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=\"text/x-markdown\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/plugins/tiddlywiki/markdown/images/new-markdown-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewMarkdown/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/plugins/tiddlywiki/markdown/readme": {
"title": "$:/plugins/tiddlywiki/markdown/readme",
"text": "This is a TiddlyWiki plugin for parsing Markdown text, using the [[Remarkable|https://github.com/jonschlinkert/remarkable]] library.\n\nIt is completely self-contained, and doesn't need an Internet connection in order to work. It works both in the browser and under Node.js.\n\n[[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/markdown]]\n"
},
"$:/plugins/tiddlywiki/markdown/usage": {
"title": "$:/plugins/tiddlywiki/markdown/usage",
"text": "! Plugin Configuration\n\n|!Config |!Default |!Description |\n| <code>[[breaks|$:/config/markdown/breaks]]</code>| ``false``|Remarkable library config: Convert '\\n' in paragraphs into ``<br>`` |\n| <code>[[linkify|$:/config/markdown/linkify]]</code>| ``false``|Remarkable library config: Autoconvert URL-like text to links |\n| <code>[[linkNewWindow|$:/config/markdown/linkNewWindow]]</code>| ``true``|For external links, should clicking on them open a new window/tab automatically? |\n| <code>[[quotes|$:/config/markdown/quotes]]</code>| ``“”‘’``|Remarkable library config: Double + single quotes replacement pairs, when ``typographer`` enabled |\n| <code>[[renderWikiText|$:/config/markdown/renderWikiText]]</code>| ``true``|After Markdown is parsed, should any text elements be handed off to the ~WikiText parser for further processing? |\n| <code>[[renderWikiTextPragma|$:/config/markdown/renderWikiTextPragma]]</code>| ``\\rules only html image macrocallinline syslink transcludeinline wikilink filteredtranscludeblock macrocallblock transcludeblock``|When handing off to the ~WikiText parser, what pragma rules should it follow? |\n| <code>[[typographer|$:/config/markdown/typographer]]</code>| ``false``|Remarkable library config: Enable some language-neutral replacement + quotes beautification |\n\n! Creating ~WikiLinks\n\nCreate wiki links with the usual Markdown link syntax targeting `#` and the target tiddler title:\n\n```\n[link text](#TiddlerTitle)\n```\n\nIf the target tiddler has a space in its name, that name must be URL-escaped to be detected as a URL:\n\n```\n[link text](#Test%20Tiddler)\n```\n\n! Images\n\nMarkdown image syntax can be used to reference images by tiddler title or an external URI. For example:\n\n```\n\n\n\n```\n"
},
"$:/plugins/tiddlywiki/markdown/wrapper.js": {
"title": "$:/plugins/tiddlywiki/markdown/wrapper.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/markdown/wrapper.js\ntype: application/javascript\nmodule-type: parser\n\nWraps up the remarkable parser for use as a Parser in TiddlyWiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar r = require(\"$:/plugins/tiddlywiki/markdown/remarkable.js\");\n\nvar Remarkable = r.Remarkable,\n\tlinkify = r.linkify,\n\tutils = r.utils;\n\n///// Set up configuration options /////\nfunction parseAsBoolean(tiddlerName) {\n\treturn $tw.wiki.getTiddlerText(tiddlerName).toLowerCase() === \"true\";\n}\nvar pluginOpts = {\n\tlinkNewWindow: parseAsBoolean(\"$:/config/markdown/linkNewWindow\"),\n\trenderWikiText: parseAsBoolean(\"$:/config/markdown/renderWikiText\"),\n\trenderWikiTextPragma: $tw.wiki.getTiddlerText(\"$:/config/markdown/renderWikiTextPragma\").trim()\n};\nvar remarkableOpts = {\n\tbreaks: parseAsBoolean(\"$:/config/markdown/breaks\"),\n\tquotes: $tw.wiki.getTiddlerText(\"$:/config/markdown/quotes\"),\n\ttypographer: parseAsBoolean(\"$:/config/markdown/typographer\")\n};\n\nvar md = new Remarkable(remarkableOpts);\n\nif (parseAsBoolean(\"$:/config/markdown/linkify\")) {\n\tmd = md.use(linkify);\n}\n\nfunction findTagWithType(nodes, startPoint, type, level) {\n\tfor (var i = startPoint; i < nodes.length; i++) {\n\t\tif (nodes[i].type === type && nodes[i].level === level) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Remarkable creates nodes that look like:\n * [\n * { type: 'paragraph_open'},\n * { type: 'inline', content: 'Hello World', children:[{type: 'text', content: 'Hello World'}]},\n * { type: 'paragraph_close'}\n * ]\n *\n * But TiddlyWiki wants the Parser (https://tiddlywiki.com/dev/static/Parser.html) to emit nodes like:\n *\n * [\n * { type: 'element', tag: 'p', children: [{type: 'text', text: 'Hello World'}]}\n * ]\n */\nfunction convertNodes(remarkableTree, isStartOfInline) {\n\tlet out = [];\n\n\tfunction wrappedElement(elementTag, currentIndex, currentLevel, closingType, nodes) {\n\t\tvar j = findTagWithType(nodes, currentIndex + 1, closingType, currentLevel);\n\t\tif (j === false) {\n\t\t\tconsole.error(\"Failed to find a \" + closingType + \" node after position \" + currentIndex);\n\t\t\tconsole.log(nodes);\n\t\t\treturn currentIndex + 1;\n\t\t}\n\t\tlet children = convertNodes(nodes.slice(currentIndex + 1, j));\n\n\t\tout.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: elementTag,\n\t\t\tchildren: children\n\t\t});\n\t\treturn j;\n\t}\n\n\tfor (var i = 0; i < remarkableTree.length; i++) {\n\t\tvar currentNode = remarkableTree[i];\n\t\tif (currentNode.type === \"paragraph_open\") {\n\t\t\ti = wrappedElement(\"p\", i, currentNode.level, \"paragraph_close\", remarkableTree);\n\t\t} else if (currentNode.type === \"heading_open\") {\n\t\t\ti = wrappedElement(\"h\" + currentNode.hLevel, i, currentNode.level, \"heading_close\", remarkableTree);\n\t\t} else if (currentNode.type === \"bullet_list_open\") {\n\t\t\ti = wrappedElement(\"ul\", i, currentNode.level, \"bullet_list_close\", remarkableTree);\n\t\t} else if (currentNode.type == 'ordered_list_open') {\n\t\t\ti = wrappedElement('ol', i, currentNode.level,'ordered_list_close', remarkableTree);\n\t\t} else if (currentNode.type === \"list_item_open\") {\n\t\t\ti = wrappedElement(\"li\", i, currentNode.level, \"list_item_close\", remarkableTree);\n\t\t} else if (currentNode.type === \"link_open\") {\n\t\t\tvar j = findTagWithType(remarkableTree, i + 1, \"link_close\", currentNode.level);\n\n\t\t\tif (currentNode.href[0] !== \"#\") {\n\t\t\t\t// External link\n\t\t\t\tvar attributes = {\n\t\t\t\t\thref: { type: \"string\", value: currentNode.href }\n\t\t\t\t};\n\t\t\t\tif (pluginOpts.linkNewWindow) {\n\t\t\t\t\tattributes.target = { type: \"string\", value: \"_blank\" };\n\t\t\t\t}\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"element\",\n\t\t\t\t\ttag: \"a\",\n\t\t\t\t\tattributes: attributes,\n\t\t\t\t\tchildren: convertNodes(remarkableTree.slice(i + 1, j))\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Internal link\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"link\",\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tto: { type: \"string\", value: decodeURI(currentNode.href.substr(1)) }\n\t\t\t\t\t},\n\t\t\t\t\tchildren: convertNodes(remarkableTree.slice(i + 1, j))\n\t\t\t\t});\n\t\t\t}\n\t\t\ti = j;\n\t\t} else if (currentNode.type.substr(currentNode.type.length - 5) === \"_open\") {\n\t\t\tvar tagName = currentNode.type.substr(0, currentNode.type.length - 5);\n\t\t\ti = wrappedElement(tagName, i, currentNode.level, tagName + \"_close\", remarkableTree);\n\t\t} else if (currentNode.type === \"code\") {\n\t\t\tout.push({\n\t\t\t\ttype: \"element\",\n\t\t\t\ttag: currentNode.block ? \"pre\" : \"code\",\n\t\t\t\tchildren: [{ type: \"text\", text: currentNode.content }]\n\t\t\t});\n\t\t} else if (currentNode.type === \"fence\") {\n\t\t\tout.push({\n\t\t\t\ttype: \"codeblock\",\n\t\t\t\tattributes: {\n\t\t\t\t\tlanguage: { type: \"string\", value: currentNode.params },\n\t\t\t\t\tcode: { type: \"string\", value: currentNode.content }\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (currentNode.type === \"image\") {\n\t\t\tout.push({\n\t\t\t\ttype: \"image\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttooltip: { type: \"string\", value: currentNode.alt },\n\t\t\t\t\tsource: { type: \"string\", value: currentNode.src }\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (currentNode.type === \"softbreak\") {\n\t\t\tout.push({\n\t\t\t\ttype: \"element\",\n\t\t\t\ttag: \"br\",\n\t\t\t});\n\t\t} else if (currentNode.type == 'hr') {\n\t\t\tout.push({\n\t\t\t\ttype: 'element',\n\t\t\t\ttag: 'hr',\n\t\t\t});\n\t\t} else if (currentNode.type === \"inline\") {\n\t\t\tout = out.concat(convertNodes(currentNode.children, true));\n\t\t} else if (currentNode.type === \"text\") {\n\t\t\tif (!pluginOpts.renderWikiText) {\n\t\t\t\tout.push({\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: currentNode.content\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// The Markdown compiler thinks this is just text.\n\t\t\t\t// Hand off to the WikiText parser to see if there's more to render\n\n\t\t\t\t// If we're inside a block element (div, p, td, h1), and this is the first child in the tree,\n\t\t\t\t// handle as a block-level parse. Otherwise not.\n\t\t\t\tvar parseAsInline = !(isStartOfInline && i === 0);\n\t\t\t\tvar textToParse = currentNode.content;\n\t\t\t\tif (pluginOpts.renderWikiTextPragma !== \"\") {\n\t\t\t\t\ttextToParse = pluginOpts.renderWikiTextPragma + \"\\n\" + textToParse;\n\t\t\t\t}\n\t\t\t\tvar wikiParser = $tw.wiki.parseText(\"text/vnd.tiddlywiki\", textToParse, {\n\t\t\t\t\tparseAsInline: parseAsInline\n\t\t\t\t});\n\t\t\t\tvar rs = wikiParser.tree;\n\n\t\t\t\t// If we parsed as a block, but the root element the WikiText parser gave is a paragraph,\n\t\t\t\t// we should discard the paragraph, since the way Remarkable nests its nodes, this \"inline\"\n\t\t\t\t// node is always inside something else that's a block-level element\n\t\t\t\tif (!parseAsInline\n\t\t\t\t\t&& rs.length === 1\n\t\t\t\t\t&& rs[0].type === \"element\"\n\t\t\t\t\t&& rs[0].tag === \"p\"\n\t\t\t\t) {\n\t\t\t\t\trs = rs[0].children;\n\t\t\t\t}\n\n\t\t\t\t// If the original text element started with a space, add it back in\n\t\t\t\tif (rs.length > 0\n\t\t\t\t\t&& rs[0].type === \"text\"\n\t\t\t\t\t&& currentNode.content[0] === \" \"\n\t\t\t\t) {\n\t\t\t\t\trs[0].text = \" \" + rs[0].text;\n\t\t\t\t}\n\t\t\t\tout = out.concat(rs);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.error(\"Unknown node type: \" + currentNode.type, currentNode);\n\t\t\tout.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: currentNode.content\n\t\t\t});\n\t\t}\n\t}\n\treturn out;\n}\n\nvar MarkdownParser = function(type, text, options) {\n\tvar tree = md.parse(text, {});\n\t//console.debug(tree);\n\ttree = convertNodes(tree);\n\t//console.debug(tree);\n\n\tthis.tree = tree;\n};\n\nexports[\"text/x-markdown\"] = MarkdownParser;\n\n})();\n",
"type": "application/javascript",
"module-type": "parser"
}
}
}
\whitespace trim
<$button tooltip={{$:/language/Buttons/NewMarkdown/Hint}} aria-label={{$:/language/Buttons/NewMarkdown/Caption}} class=<<tv-config-toolbar-class>>>
<$action-sendmessage $message="tm-new-tiddler" type="text/x-markdown"/>
<$list filter="[<tv-config-toolbar-icons>match[yes]]">
{{$:/plugins/tiddlywiki/markdown/images/new-markdown-button}}
</$list>
<$list filter="[<tv-config-toolbar-text>match[yes]]">
<span class="tc-btn-text"><$text text={{$:/language/Buttons/NewMarkdown/Caption}}/></span>
</$list>
</$button>
{
"tiddlers": {
"$:/plugins/tobibeer/appear/widget.js": {
"title": "$:/plugins/tobibeer/appear/widget.js",
"text": "/*\\\r\ntitle: $:/plugins/tobibeer/appear/widget.js\r\ntype: application/javascript\r\nmodule-type: widget\r\n\r\nUse the appear widget for popups, sliders, accordion menus\r\n\r\n@preserve\r\n\\*/\n(function(){\"use strict\";var t=require(\"$:/core/modules/widgets/widget.js\").widget,e=function(t,e){this.initialise(t,e)},i={};e.prototype=new t;e.prototype.render=function(t,e){this.parentDomNode=t;this.nextSibling=e;this.computeAttributes();this.execute();var i,s,r,a,h,n,l=[];if(this.handle){this.getHandlerCache(this.handle,1);this.refreshHandler()}else{s={type:\"button\"};s.attributes=this.setAttributes(s,\"button\");i=s.attributes[\"class\"].value.trim();s.attributes[\"class\"].value=i+\" appear-show\"+(this.handler?\" tc-popup-absolute\":\"\");s.children=this.wiki.parseText(\"text/vnd.tiddlywiki\",this.show,{parseAsInline:true}).tree;h={type:\"reveal\",children:this.parseTreeNode.children};h.attributes=this.setAttributes(h,\"reveal\");h.isBlock=!(this.mode&&this.mode===\"inline\");if(h.attributes.type&&h.attributes.type.value===\"popup\"){s.attributes.popup=h.attributes.state;l.push(s);if(!this.handler){l.push(h)}else{s.attributes.handler=this.handler}}else{h.attributes.type={type:\"string\",value:\"match\"};h.attributes.text={type:\"string\",value:this.currentTiddler};s.attributes.set=h.attributes.state;s.attributes.setTo={type:\"string\",value:this.currentTiddler};a={type:\"reveal\",isBlock:this.block,children:[s],attributes:{type:{type:\"string\",value:\"nomatch\"},state:h.attributes.state,text:{type:\"string\",value:this.currentTiddler}}};if(!this.once){r=$tw.utils.deepCopy(s);r.attributes[\"class\"].value=i+\" appear-hide \"+(this.attr.button.selectedClass?this.attr.button.selectedClass:\"\");r.attributes.setTo={type:\"string\",value:\"\"};r.children=this.wiki.parseText(\"text/vnd.tiddlywiki\",this.hide,{parseAsInline:true}).tree}n=$tw.utils.deepCopy(a);n.children=[];if(!this.once){n.children.push(r)}if(!this.handler){n.children.push(h)}n.attributes.type.value=\"match\";l.push(a,n)}this.makeChildWidgets(l);this.renderChildren(this.parentDomNode,e);if(this.handler){this.addToHandlerCache(h)}}};e.prototype.execute=function(){var t=this;this.attr={map:{reveal:{\"class\":1,position:1,retain:1,state:1,style:1,tag:1,type:1},button:{\"button-class\":1,\"button-style\":1,\"button-tag\":1,tooltip:1,selectedClass:1}},rename:{\"button-class\":\"class\",\"button-style\":\"style\",\"button-tag\":\"tag\"},button:{},reveal:{}};$tw.utils.each(this.attributes,function(e,i){var s;$tw.utils.each(t.attr.map,function(r,a){$tw.utils.each(Object.keys(r),function(r){if(r==i){t.attr[a][i]=e;s=false;return false}});return s})});this.currentTiddler=this.getVariable(\"currentTiddler\");this.show=this.getValue(this.attributes.show,\"show\");this.hide=this.getValue(this.attributes.hide,\"hide\");if(!this.hide){this.hide=this.show}this.once=this.attributes.once&&this.attributes.once!==\"false\";this.$state=this.attributes.$state;this.mode=this.getValue(this.attributes.mode,\"mode\");this.handle=this.attributes.handle;this.handler=this.attributes.handler;this.handlerVariables=(this.attributes.variables||\"\")+\" currentTiddler\";this.keep=[\"yes\",\"true\"].indexOf((this.getValue(this.attributes.keep,\"keep\")||\"\").toLocaleLowerCase())>-1;if(!this.attr.reveal.state){this.attr.reveal.state=this.getValue(undefined,\"default-state\")+this.currentTiddler+this.getStateQualifier()+\"/\"+(this.attr.reveal.type?this.attr.reveal.type+\"/\":\"\")+(this.mode?this.mode+\"/\":\"\")+(this.once?\"once/\":\"\")+(this.$state?\"/\"+this.$state:\"\")}};e.prototype.refresh=function(t){var e=this.computeAttributes();if(Object.keys(e).length){this.refreshSelf();return true}if(this.handle){this.refreshHandler()}return this.refreshChildren(t)};e.prototype.getValue=function(t,e){var i,s,r={show:\"»\",\"default-state\":\"$:/temp/appear/\"};if(t===undefined){i=this.wiki.getTiddler(\"$:/plugins/tobibeer/appear/defaults/\"+e);if(i){s=i.getFieldString(\"undefined\");if(!s||s===\"false\"){t=i.getFieldString(\"text\")}}}if(t===undefined){t=r[e]}return t};e.prototype.setAttributes=function(t,e){var i=this,s={};$tw.utils.each(Object.keys(this.attr.map[e]),function(r){var a,h=i.attr.rename[r];if(!h){h=r}a=i.getValue(i.attr[e][r],r);if(h===\"class\"){a=[\"appear\",\"appear-\"+e,e===\"reveal\"&&i.keep?\"tc-popup-keep\":\"\",i.mode?\"appear-\"+i.mode:\"\",i.once?\"appear-once\":\"\",a||\"\"].join(\" \")}if(a!==undefined){if(h===\"tag\"){t.tag=a}else{s[h]={type:\"string\",value:a}}}});return s};e.prototype.getHandlerCache=function(t,e){var s=i[t];if(!s||e){i[t]={handled:{},handle:{}};s=i[t]}return s};e.prototype.refreshHandler=function(){var t=this,e=this.getHandlerCache(this.handle),s=e.handle;if(Object.keys(s).length){$tw.utils.each(s,function(e,i){t.removeChildNode(i);t.children.push(t.makeChildWidget(e));t.children[t.children.length-1].render(t.parentDomNode,t.nextSibling)});i[this.handle].handle={}}};e.prototype.removeChildNode=function(t){var e=this;$tw.utils.each(this.children,function(i,s){if(i.children[0].state===t){i.removeChildDomNodes();e.children.splice(s);return false}})};e.prototype.addToHandlerCache=function(t){var e=this,i=t.attributes.state.value,s=this.getHandlerCache(this.handler),r=s.handled[i],a={type:\"vars\",children:[t],attributes:{}};$tw.utils.each((this.handlerVariables||\"\").split(\" \"),function(t){t=t.trim();if(t){a.attributes[t]={type:\"string\",value:(e.getVariable(t)||\"\").toString()}}});if(a!==r){s.handle[i]=a;this.wiki.setText(\"$:/temp/appear-handler/\"+this.handler,\"text\",undefined,i)}};exports.appear=e})();",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/tobibeer/appear/defaults/show": {
"title": "$:/plugins/tobibeer/appear/defaults/show",
"text": "»"
},
"$:/plugins/tobibeer/appear/defaults/mode": {
"title": "$:/plugins/tobibeer/appear/defaults/mode",
"text": "block"
},
"$:/plugins/tobibeer/appear/defaults/keep": {
"title": "$:/plugins/tobibeer/appear/defaults/keep",
"text": "yes"
},
"$:/plugins/tobibeer/appear/defaults/button-class": {
"title": "$:/plugins/tobibeer/appear/defaults/button-class",
"text": "tc-btn-invisible tc-tiddlylink"
},
"$:/plugins/tobibeer/appear/defaults/default-state": {
"title": "$:/plugins/tobibeer/appear/defaults/default-state",
"text": "$:/temp/appear/"
},
"$:/plugins/tobibeer/appear/popup.js": {
"title": "$:/plugins/tobibeer/appear/popup.js",
"text": "/*\\\r\ntitle: $:/plugins/tobibeer/appear/popup.js\r\ntype: application/javascript\r\nmodule-type: utils\r\n\r\nAn enhanced version of the core Popup to support:\r\n* absolute popups\r\n* preview popups\r\n* popup z-index\r\n\r\n@preserve\r\n\\*/\n(function(){\"use strict\";var t=require(\"$:/core/modules/utils/dom/popup.js\").Popup,e=require(\"$:/core/modules/widgets/reveal.js\").reveal,s=e.prototype.refresh;t.prototype.show=function(t){var e,s=t.domNode,p=$tw.utils.hasClass(s,\"tc-popup-absolute\"),o=this.popupInfo(s),i=function(t){var e=t,s=0,p=0;do{s+=e.offsetLeft||0;p+=e.offsetTop||0;e=e.offsetParent}while(e);return{left:s,top:p}},l={left:s.offsetLeft,top:s.offsetTop};e=o.popupLevel;if(o.isHandle){e++}this.cancel(e);if(this.findPopup(t.title)===-1){this.popups.push({title:t.title,wiki:t.wiki,domNode:s})}l=p?i(s):l;t.wiki.setTextReference(t.title,\"(\"+l.left+\",\"+l.top+\",\"+s.offsetWidth+\",\"+s.offsetHeight+\")\");if(this.popups.length>0){this.rootElement.addEventListener(\"click\",this,true)}};t.prototype.popupInfo=function(t){var e,s=false,p=t;while(p&&e===undefined){if($tw.utils.hasClass(p,\"tc-popup-handle\")||$tw.utils.hasClass(p,\"tc-popup-keep\")){s=true}if($tw.utils.hasClass(p,\"tc-reveal\")&&($tw.utils.hasClass(p,\"tc-popup\")||$tw.utils.hasClass(p,\"tc-popup-handle\"))){e=parseInt(p.style.zIndex)-1e3}p=p.parentNode}var o={popupLevel:e||0,isHandle:s};return o};t.prototype.handleEvent=function(t){if(t.type===\"click\"){var e=this.popupInfo(t.target),s=e.popupLevel-1;if(e.isHandle){if(s<0){s=1}else{s++}}this.cancel(s)}};e.prototype.refresh=function(){var t,e,p=this.isOpen;e=s.apply(this,arguments);t=this.domNodes[0];if(this.isOpen&&(p!==this.isOpen||!t.style.zIndex)&&t&&(this.type===\"popup\"||$tw.utils.hasClass(t,\"tc-block-dropdown\")&&$tw.utils.hasClass(t,\"tc-reveal\"))){t.style.zIndex=1e3+$tw.popup.popups.length}return e}})();",
"type": "application/javascript",
"module-type": "utils"
},
"$:/plugins/tobibeer/appear/readme": {
"title": "$:/plugins/tobibeer/appear/readme",
"text": "This plugin provides the ''$appear'' widget that can render popups and sliders (inline or block) as well as accordion menus.\n\n!! Attributes\r\n; type\r\n: set to `popup` to have the content appear as a popup\r\n; show\r\n: the button label\r\n; hide\r\n: the hide button label\r\n; mode\r\n: either `block` or `inline`, with respect to the inner content\r\n: any other mode is interpreted as block mode, without the default styles applying, e.g. drop-shadows\r\n; once\r\n: allows to click the button once, then hides it (unless the state is deleted)\r\n; $state\r\n: the widget calculates a state for you, use this to append a simple id\r\n; state\r\n: alternatively, specify a fully qualified state\r\n; keep\r\n: make popups sticky when `yes` or `true`\r\n; handle / handler / variables\r\n: allows to take the popup contents out of the flow and render them elsewhere on the page\r\n: required to properly create popups in table cells and other constained elements\r\n: specify variables to take along\n\n<br>\n\n; documentation / examples / demos...\r\n: http://tobibeer.github.io/tw5-plugins#appear\r\n"
},
"$:/plugins/tobibeer/appear/styles": {
"title": "$:/plugins/tobibeer/appear/styles",
"tags": "$:/tags/Stylesheet",
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline html\n\n<pre>.tc-reveal.appear-block,\r\n.tc-popup.appear {\r\n\tborder-radius: 5px;\r\n\tpadding: 1px 1em;\r\n\t<<box-shadow \"2px 2px 4px rgba(0,0,0,0.3)\">>;\r\n}\r\n.tc-popup.appear {\r\n\tpadding: 0 1em;\r\n\tbackground: <<colour background>>;\r\n}\r\n.appear-reveal.appear-inline{\r\nmargin-left:5px;\r\n}\r\n.appear-reveal.appear-inline.appear-once{\r\nmargin-left:0;\r\n}</pre>"
}
}
}
{
"tiddlers": {
"$:/plugins/tobibeer/preview/config": {
"title": "$:/plugins/tobibeer/preview/config",
"text": "\\define default()\r\n<dt>$(defaults)$$(option)$</dt>\r\n<dd>\r\n//{{$:/plugins/tobibeer/preview/lingo/$(option)$}}<$list\r\nfilter=\"[[$(option)$]prefix[template]]\">\r\n{{$(defaults)$$(option)$}}</$list>://<br>\r\n<$edit-text tag=input tiddler=\"$(defaults)$$(option)$\"/>\r\n</dd>\r\n\\end\n\n<dl class=\"preview-defaults\">\r\n<$vars defaults=\"$:/plugins/tobibeer/preview/defaults/\">\r\n<$list filter=\"[all[tiddlers+shadows]removeprefix<defaults>sort[title]]\" variable=\"option\">\r\n<<default>>\r\n</$list>\r\n</$vars>\r\n</dl>\r\n<style>.preview-defaults input {width:90%;}</style>"
},
"$:/plugins/tobibeer/preview/lingo/keys": {
"title": "$:/plugins/tobibeer/preview/lingo/keys",
"text": "modifier keys to trigger popup directly on-hover (ctrl, alt+shift, meta, etc...)"
},
"$:/plugins/tobibeer/preview/defaults/keys": {
"title": "$:/plugins/tobibeer/preview/defaults/keys",
"text": "CTRL"
},
"$:/plugins/tobibeer/preview/lingo/delay": {
"title": "$:/plugins/tobibeer/preview/lingo/delay",
"text": "delay popup for this many milliseconds"
},
"$:/plugins/tobibeer/preview/defaults/delay": {
"title": "$:/plugins/tobibeer/preview/defaults/delay",
"text": "1500"
},
"$:/plugins/tobibeer/preview/lingo/class": {
"title": "$:/plugins/tobibeer/preview/lingo/class",
"text": "css classes applied to the popup"
},
"$:/plugins/tobibeer/preview/defaults/class": {
"title": "$:/plugins/tobibeer/preview/defaults/class",
"text": "tc-popup-keep"
},
"$:/plugins/tobibeer/preview/lingo/not": {
"title": "$:/plugins/tobibeer/preview/lingo/not",
"text": "no preview for links inside elements with these classes"
},
"$:/plugins/tobibeer/preview/defaults/not": {
"title": "$:/plugins/tobibeer/preview/defaults/not",
"text": "tc-drop-down tc-sidebar-scrollable tc-topbar tc-tiddler-title"
},
"$:/plugins/tobibeer/preview/lingo/exclude": {
"title": "$:/plugins/tobibeer/preview/lingo/exclude",
"text": "no preview for links to tiddlers matching this filter"
},
"$:/plugins/tobibeer/preview/defaults/exclude": {
"title": "$:/plugins/tobibeer/preview/defaults/exclude",
"text": "[is[system]] [all[shadows]] [!has[text]]"
},
"$:/plugins/tobibeer/preview/lingo/template": {
"title": "$:/plugins/tobibeer/preview/lingo/template",
"text": "the preview template"
},
"$:/plugins/tobibeer/preview/defaults/template": {
"title": "$:/plugins/tobibeer/preview/defaults/template",
"text": "$:/plugins/tobibeer/preview/template"
},
"$:/plugins/tobibeer/preview/lingo/open": {
"title": "$:/plugins/tobibeer/preview/lingo/open",
"text": "view at ''<<WIKI>>''"
},
"$:/plugins/tobibeer/preview/keyboard.js": {
"title": "$:/plugins/tobibeer/preview/keyboard.js",
"text": "/*\\\r\ntitle: $:/plugins/tobibeer/preview/keyboard.js\r\ntype: application/javascript\r\nmodule-type: utils\r\n\r\nFixes $:/core/modules/utils/dom/keyboard.js by providing an alternative.\r\nDo not use as an API, let's fix the core.\r\n\r\n@preserve\r\n\\*/\n(function(){\"use strict\";var e={BACKSPACE:8,TAB:9,ENTER:13,ESCAPE:27,PAGEUP:33,PAGEDOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,INSERT:45,DELETE:46};exports.parseKeyDescriptorTB=function(t){var l,r,y,s=t.toUpperCase().split(\"+\"),K={keyCode:null,shiftKey:false,altKey:false,ctrlKey:false};for(y=0;y<s.length;y++){l=false;r=s[y];if(r.substr(0,1)===\"!\"){l=true;r=r.substr(1)}if(r===\"CTRL\"){K.ctrlKey=l?null:true}else if(r===\"SHIFT\"){K.shiftKey=l?null:true}else if(r===\"ALT\"){K.altKey=l?null:true}else if(r===\"META\"){K.metaKey=l?null:true}else if(e[r]){K.keyCode=e[r]}else{K.keyCode=r.charCodeAt(0)}}return K};exports.checkKeyDescriptorTB=function(e,t){var l=!!t.metaKey;return(t.keyCode===null||e.keyCode===t.keyCode)&&(t.shiftKey===null?!e.shiftKey:e.shiftKey===t.shiftKey)&&(t.altKey===null?!e.altKey:e.altKey===t.altKey)&&(t.ctrlKey===null?!e.ctrlKey:e.ctrlKey===t.ctrlKey)&&(t.metaKey===null?!e.metaKey:e.metaKey===l)}})();",
"type": "application/javascript",
"module-type": "utils"
},
"$:/plugins/tobibeer/preview/link.js": {
"title": "$:/plugins/tobibeer/preview/link.js",
"text": "/*\\\r\ntitle: $:/plugins/tobibeer/preview/link.js\r\ntype: application/javascript\r\nmodule-type: startup\r\n\r\nEnhances the link widget for on-hover previews\r\n\r\n@preserve\r\n\\*/\n(function(){var e,t=require(\"$:/core/modules/widgets/link.js\").link,i=t.prototype.render,o=t.prototype.handleClickEvent;t.prototype.render=function(){i.apply(this,arguments);var t=this,o=this.wiki,p=this.domNodes[0],r=o.getTiddler(t.to),n=\"$:/plugins/tobibeer/preview/defaults/\",u=\"$:/temp/tobibeer/preview-\",l=$tw.utils.parseKeyDescriptorTB(o.getTextReference(n+\"keys\",\"\").toUpperCase()),s=o.getTextReference(n+\"delay\").toUpperCase(),a=function(e){var i=$tw.popup.popupInfo(e),p=i.popupLevel;return o.getTextReference(u+p)&&o.getTextReference(u+p+\"-tiddler\")===t.to?null:i},f=function(){var i,r=a(p);if(r){i=r.popupLevel;clearTimeout(t.previewTimeout);$tw.popup.cancel(i);i++;o.setText(u+i+\"-tiddler\",\"text\",null,t.to);if($tw.popup.findPopup(u+i)===-1){setTimeout(function(){$tw.popup.triggerPopup({domNode:p,title:u+i,wiki:o});e=0},50)}}},d=function(){var e,i,r=1,u=o.getTextReference(n+\"not\",\"\");if(u){$tw.utils.each(u.split(\" \"),function(e){var t=p;while(t&&r){if($tw.utils.hasClass(t,e)){r=0;return false}t=t.parentNode}})}if(r){i=o.getTextReference(n+\"exclude\",\"\");e=i?o.filterTiddlers(i):[];if(e.indexOf(t.to)>=0){r=0}}return r};s=s!==undefined?parseInt(s):null;if(s!==null&&isNaN(s)){s=0}if(r){$tw.utils.addClass(p,\"tc-popup-handle\");$tw.utils.addClass(p,\"tc-popup-absolute\");[\"mouseover\",\"mouseout\"].forEach(function(i){p.addEventListener(i,function(o){var p=o||window.event;if(i===\"mouseover\"){if(d()){if(!p.keyCode){p.keyCode=0}if($tw.utils.checkKeyDescriptorTB(p,l)){if(!e){e=1;f()}}else if(s!==null){e=0;t.previewTimeout=setTimeout(f,s)}}}else{e=0;clearTimeout(t.previewTimeout)}})})}};t.prototype.handleClickEvent=function(){o.apply(this,arguments);clearTimeout(this.previewTimeout);$tw.popup.cancel(Math.max(0,$tw.popup.popupInfo(this.domNodes[0]).popupLevel))}})();",
"type": "application/javascript",
"module-type": "startup"
},
"$:/plugins/tobibeer/preview/popups": {
"title": "$:/plugins/tobibeer/preview/popups",
"tags": "$:/tags/PageTemplate",
"text": "\\define state(num)\n$:/temp/tobibeer/preview-$num$\n\\end\n\n\\define classes(num)\ntc-popup appear appear-block appear-reveal tc-preview-tiddler tc-preview-tiddler-$num$ $(default-classes)$\n\\end\n\n\\define level(num)\n<$reveal tag=\"div\" type=\"popup\" state=<<state $num$>> class=<<classes $num$>>>\n<$tiddler tiddler={{$:/temp/tobibeer/preview-$num$-tiddler}}>\n<$transclude tiddler={{$:/plugins/tobibeer/preview/defaults/template}} mode=\"block\"/>\n</$tiddler>\n</$reveal>\n\\end\n\n<$vars default-classes={{$:/plugins/tobibeer/preview/defaults/class}}>\n<$list filter=\"1 2 3 4 5 6 7 8 9\">\n<$macrocall $name=\"level\" num={{!!title}}/>\n</$list>\n</$vars>"
},
"$:/plugins/tobibeer/preview/readme": {
"title": "$:/plugins/tobibeer/preview/readme",
"text": "The plugin $:/plugins/tobibeer/preview enhances the core <<x LinkWidget>> to display a preview of tiddlers when hovering an internal link.\n\n<br>\n\n; documentation / examples / demos...\r\n: http://tobibeer.github.io/tw5-plugins#preview"
},
"$:/plugins/tobibeer/preview/styles": {
"title": "$:/plugins/tobibeer/preview/styles",
"tags": "$:/tags/Stylesheet",
"text": ".tc-popup.tc-preview-tiddler{\r\n\tmax-width:600px;\r\n\twidth:100%;\r\n\tpadding:1em;\r\n}"
},
"$:/plugins/tobibeer/preview/template": {
"title": "$:/plugins/tobibeer/preview/template",
"text": "{{||$:/core/ui/ViewTemplate/tags}}\n\n<$transclude mode=\"block\"/>"
}
}
}
{
"tiddlers": {
"$:/plugins/tutorial-maker/tutorial.js": {
"created": "20180902101508937",
"text": "(function () {\n /*jslint node: true, browser: true */\n /*global $tw: false */\n \"use strict\";\n\n var Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n var TutorialWidget = function(parseTreeNode,options) {\n this.initialise(parseTreeNode,options);\n };\n\n /*\n Inherit from the base widget class\n */\n TutorialWidget.prototype = new Widget();\n \n TutorialWidget.prototype.render = function (parent,nextSibling) {\n this.parentDomNode = parent;\n this.computeAttributes();\n this.execute();\n };\n \n TutorialWidget.prototype.execute = function () {\n var t = this.getAttribute(\"tiddler\");\n var trigger = this.getAttribute(\"trigger\") || \"start-tutorial\";\n var o = $tw.wiki.getTiddlerData(t) || {};\n $tw.rootWidget.addEventListener(trigger, function () {\n try {\n hopscotch.startTour(o);\n } catch (err) {\n return $tw.utils.error(err);\n }\n });\n };\n \n TutorialWidget.prototype.refresh = function (changedTiddlers) {\n this.refreshSelf();\n return true;\n };\n \n exports.tutorial = TutorialWidget;\n})();",
"type": "application/javascript",
"title": "$:/plugins/tutorial-maker/tutorial.js",
"tags": "",
"module-type": "widget",
"modified": "20180902160020077"
},
"$:/plugins/tutorial-maker/hopscotch.js": {
"created": "20180902124949628",
"text": "<script src=\"https://cdnjs.cloudflare.com/ajax/libs/hopscotch/0.3.1/js/hopscotch.min.js\"></script>",
"title": "$:/plugins/tutorial-maker/hopscotch.js",
"tags": "$:/tags/RawMarkup",
"modified": "20180902125231313"
},
"$:/plugins/tutorial-maker/hopscotch.css": {
"created": "20180902124832216",
"text": "<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/hopscotch/0.3.1/css/hopscotch.min.css\" />",
"title": "$:/plugins/tutorial-maker/hopscotch.css",
"tags": "$:/tags/RawMarkup",
"modified": "20180902124941258"
},
"$:/plugins/tutorial-maker/readme": {
"created": "20180902153847242",
"text": "This plugins enables the creation of interactive tutorials in ~TiddlyWiki using ~HopScotchjs. \n\n__Widget Attributes__\n\n|!Attribute|!Description|\n|''Tiddler''|Name of tiddler containing JSON tutorial|\n|''Trigger''|The widget message that will trigger this tutorial. Defaults to //start-tutorial//|\n\n__Basic Usage__\n\nThe widget accepts a \n\n# tiddler that contains a JSON object that instructs ~HopScotchjs, a framework product tours, how to step through a tutorial. The documentation for ~HopScotch's API can be found [[here|http://linkedin.github.io/hopscotch/]].\n# A trigger message that the widget should listen out for to start the defined tutorial. This is usually sent by a button widget.\n\nTriggering the tutorial requires a simple `start-tutorial` or any other defined, custom widget message.\n\n__Example__\n\n```\n<$button message=\"start-this-tutorial\">\nStart Tutorial\n</$button>\n\n<$tutorial tiddler=\"Example\" message=\"start-this-tutorial\" />\n```\n",
"title": "$:/plugins/tutorial-maker/readme",
"tags": "",
"modified": "20180902170645667"
},
"$:/plugins/tutorial-maker/license": {
"created": "20180902163113894",
"text": "The Tutorial Maker plugin is covered by the following licenses:\n\nMIT License\n\nCopyright (c) 2018 Abraham B. Samma\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
"title": "$:/plugins/tutorial-maker/license",
"tags": "",
"modified": "20180902163219905"
}
}
}
{
"tiddlers": {
"$:/plugins/wikilabs/uni-link/aka-footer/template": {
"title": "$:/plugins/wikilabs/uni-link/aka-footer/template",
"type": "text/vnd.tiddlywiki",
"text": "''Note'': This tiddler has the following aliases || <<showAliases delim:\" ||\">>"
},
"$:/plugins/wikilabs/uni-link/aka-footer": {
"title": "$:/plugins/wikilabs/uni-link/aka-footer",
"tags": "$:/tags/ViewTemplate",
"type": "text/vnd.tiddlywiki",
"text": "<$list filter=\"[all[current]has[aliases]]\">\n<br/>\n<hr>\n\n{{||$:/plugins/wikilabs/uni-link/aka-footer/template}}\n</$list>"
},
"$:/plugins/wikilabs/uni-link/aka-macros": {
"title": "$:/plugins/wikilabs/uni-link/aka-macros",
"tags": "$:/tags/Macro",
"type": "text/vnd.tiddlywiki",
"text": "\\define tooltip() Tiddler -> <<currentTiddler>>\n\\define aka(target, field:X)\n\\whitespace trim\n<$list filter=\"[[$target$]is[alias]]\" variable=ali emptyMessage=\"\"\"<$link tooltip=\"Alias not defined!\" to=\"?\"><span class=\"uni-alias-missing\">$target$</span></$link>\"\"\">\n<$list filter=\"[has[aliases]!has[draft.of]]\">\n <$list filter=\"[enlist{!!aliases}regexp[^$target$$(?i)]]\" variable=\"dummy\">\n <$link tooltip=<<tooltip>> >\n <span class=\"uni-alias\">\n <$set name=\"tv-wikilinks\" value=\"no\">\n <$view field=$field$ mode=text>$target$</$view>\n </$set>\n </span>\n </$link>\n </$list>\n</$list>\n</$list>\n\\end\n\n\\define aka-no-links(target)\n\\whitespace trim\n<$list filter=\"[[$target$]is[alias]]\" variable=ali emptyMessage=\"\"\"<$link tooltip=\"Alias not defined!\" to=\"?\">$target$</$link>\"\"\">\n<$list filter=\"[has[aliases]!has[draft.of]]\">\n <$list filter=\"[enlist{!!aliases}regexp[^$target$$(?i)]]\" variable=\"dummy\">\n <span><<currentTiddler>></span>\n </$list>\n</$list>\n</$list>\n\\end\n\n\\define showAliases(delim:\",\")\n<$list filter=\"[list[!!aliases]butlast[]]\"><$view field=title/>$delim$ </$list><$list filter=\"[list[!!aliases]last[]]\"><$view field=title/></$list>\n\\end\n\n\\define listAliases()\n<$list filter=\"[has[aliases]]\"><$link to=<<currentTiddler>> ><<currentTiddler>></$link> - <<showAliases>><br/></$list>\n\\end\n\n<pre><$view field=\"text\"/></pre>"
},
"$:/plugins/wikilabs/uni-link/alias-list": {
"title": "$:/plugins/wikilabs/uni-link/alias-list",
"type": "text/vnd.tiddlywiki",
"text": "<<listAliases>>"
},
"$:/plugins/wikilabs/uni-link/backlinks-template": {
"title": "$:/plugins/wikilabs/uni-link/backlinks-template",
"text": "!!! Uni-links\n\nUse the following field as link text, if available. It defaults to tiddler ''title''!\n\n<<<\n<$tiddler tiddler=\"$:/config/wikilabs/uni-link/field\">\n<$radio value=\"caption\"> caption</$radio><br>\n<$radio value=\"subtitle\"> subtitle</$radio><br>\n<$radio value=\"title\"> title</$radio><br>\n</$tiddler>\n<<<\n\nThis setting can be found at the $:/ControPanel uni-links tab! The configuration tiddler is: [[$:/config/wikilabs/uni-link/field]]\n\n| Link | Result |h\n|`[[default prettylink|tiddler-with-caption]]` |[[default prettylink|tiddler-with-caption]] |\n|`[[tiddler-with-caption]]` |[[tiddler-with-caption]] |\n|`[[tiddler-with-subtitle]]` |[[tiddler-with-subtitle]] |\n|`[[tiddler-with-subtitle-and-caption]]` |[[tiddler-with-subtitle-and-caption]] |\n|`[[tiddler-with-subtitle-and-caption|]]` |[[tiddler-with-subtitle-and-caption|]] ... but don't use them!|\n|`[[tiddler doesn't exist]]` |[[tiddler doesn't exist]] |\n\n!!! Alias Links\n\n| Link | Result |h\n|`[[alias|?]]` |[[alias|?]] |\n|`[[AliaS|?]]` |[[AliaS|?]] |\n|`[[alias|?t]]` |[[alias|?t]] |\n|`[[alias|?c]]` |[[alias|?c]] |\n|`[[alias|?s]]` |[[alias|?s]] |\n|`[[alias|?my-field]]` |[[alias|?my-field]] |\n|`[[doesn't exist|?]]` |[[doesn't exist|?]] |\n"
},
"$:/config/ShortcutInfo/aliasify": {
"title": "$:/config/ShortcutInfo/aliasify",
"type": "text/vnd.tiddlywiki",
"text": "{{$:/language/Buttons/Aliasify/Hint}}"
},
"$:/config/ShortcutInfo/alias-link": {
"title": "$:/config/ShortcutInfo/alias-link",
"type": "text/vnd.tiddlywiki",
"text": "{{$:/language/Buttons/Make/Alias/Hint}}"
},
"$:/config/shortcuts/alias-link": {
"title": "$:/config/shortcuts/alias-link",
"created": "20190210193620358",
"modified": "20190210193621514",
"type": "text/vnd.tiddlywiki",
"text": "ctrl-? ctrl-Space"
},
"$:/config/shortcuts/aliasify": {
"title": "$:/config/shortcuts/aliasify",
"type": "text/vnd.tiddlywiki",
"text": "ctrl-K"
},
"$:/config/wikilabs/uni-link/field": {
"title": "$:/config/wikilabs/uni-link/field",
"type": "text/vnd.tiddlywiki",
"text": "title"
},
"$:/language/Buttons/Aliasify/Caption": {
"title": "$:/language/Buttons/Aliasify/Caption",
"text": "alias-link"
},
"$:/language/Buttons/Aliasify/Hint": {
"title": "$:/language/Buttons/Aliasify/Hint",
"text": "Wrap selection in square brackets and add alias postfix"
},
"$:/language/Buttons/Make/Alias/Caption": {
"title": "$:/language/Buttons/Make/Alias/Caption",
"text": "make alias"
},
"$:/language/Buttons/Make/Alias/Hint": {
"title": "$:/language/Buttons/Make/Alias/Hint",
"text": "Create a wikitext alias-link"
},
"$:/plugins/wikilabs/uni-link/history": {
"title": "$:/plugins/wikilabs/uni-link/history",
"text": "V 2.1.0 - 2021.03.16\n\n* add `[[tiddler title case insensitve|??]]` ... will show the text, but search for a case insensitve title.\n* fix uni-link-macro default title styling\n* renamed and moved some tiddlers\n\nV 2.0.1 - 2020.12.25\n\n* update license\n\nV 2.0.0 - 2020.06.11\n\n* Compatible with ~TiddlyWiki >= V5.1.22\n* Fix a \"backlinking\" problem introduced with TW V5.1.22\n** Adjusted uni-link \"backlinker\" to use new indexer `.extractLinks()` function\n* More info can be found in the [[readme|$:/plugins/wikilabs/uni-link/readme]]\n\n--------------\n\nCompatible with ~TiddlyWiki <= V5.1.21\n\nV 1.2.1 - 2020.05.22\n\n* Fix a compatibility problem with relink plugin, reported by flibbles.\n\nV 1.2.0 - 2020.03.26\n\n* Make uni-link plugin compatible with relink-plugin from flibbles\n** see: https://github.com/flibbles/tw5-relink\n\nV 1.1.2 - 2020.03.16\n\n* Fix issue #44 problem with backlink cases sensitivity\n\nV 1.1.1 - 2020.01.19\n\n* Update license link/text\n\nV 1.1.0 - 2019.08.13\n\n* Fixed problem introduced with TW V 5.1.20 link-widget core changes\n\nV 1.0.0 - 2019.02.09\n\n* Add `[[alias|?t]]`, `[[alias|?c]]` and `[[alias|?s]]`, that show the tiddler ''title'', ''caption'' and ''subtitle'' field as the link text\n* Add `[[alias|?my-field]]` shows the content of the field named: `my-filed` as the link text\n* Add a new editor toolbar button, which opens an alias search menue. \n** Default keyboard shortcut is to Ctrl-Space\n\n``Incompatible changes``\n\n* There is a new $:/ControlPanel setting, that defines the default behaviour of the uni-link macro ''globally''. \n* uni-link now only shows the tiddler title, ''or'' the caption ''or'' the subtitle field. \n* If you need different behaviour, you'll need to use the alias mechanism!\n\nV 0.3.4 - 2018.09.09\n\n* Add \"aliasify\" button to tiddler editor toolbar\n* Add ctrl-k to activate \"aliasify\"\n\nV 0.3.3 - 2018.08.06\n\n* fix [[issue 19|https://github.com/wikilabs/plugins/issues/19]] Alias References behaviour\n\nV 0.3.2 - 2018.02.02\n\n* new Undefined Aliases Sidebar tab under More: Aliases\n* `[[?]aliasbacklinks[]sort[title]]` shows a list of tiddlers that contain undefined alias links\n\nV 0.3.1 - 2018.01.31\n\n* fixed: [[CamelCase]] or [[$:/system]] tiddler \"double linking\"\n* [[NaturaL sElEcTiOn|?]] .. is a valid alias now. Same problem as above!\n\nV 0.3.0 - 2018.01.27\n\n* add: styling possibility for missing aliases\n* improve: history and copyright\n\nV 0.2.1 - 2018.01.27\n\n* fix: uni-link creates an unused a-element\n\nV 0.2.0 - 2017.12.15\n\n* added: [[alias|?]] link syntax\n** using aka-makros for tiddler alias handling\n\n* added: Alias backlinks\n** open the tiddler (i)nfo area: References\n\n* added filter operators:\n** is[alias] ... extends the core is operator see: https://tiddlywiki.com/#is Operator\n** all[aliases] ... extends the core all operator see: https://tiddlywiki.com/#all Operator\n\n* added: Right-Sidebar: More tab: \"Aliases\"\n** Sorted by Alias\n** Sorted by Tiddler Title\n\n* added: uni-link $:/ControlPanel setting\n* added: different colors for title, caption, subtitle and alias links\n\nV0.1.0 - 2017.07.25\n\n* fix \"backlink\" and \"missing\" issue\n\nV0.0.1 - 2017.07.23\n\n* initial release\n\nalso see: https://wikilabs.github.io/editions/uni-link/#History\n"
},
"$:/plugins/wikilabs/uni-link/license": {
"title": "$:/plugins/wikilabs/uni-link/license",
"text": "[[Uni-Link Plugin|https://wikilabs.github.io/#uni-link]] (C) Mario Pietsch - 2017-2021\n\nhttps://opensource.org/licenses/BSD-3-Clause\n"
},
"$:/plugins/wikilabs/uni-link/readme": {
"title": "$:/plugins/wikilabs/uni-link/readme",
"subtitle": "\"uni-link\" readme",
"text": "\\define createExampleTiddlers()\n<$button>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=\"tiddler-with-caption\" caption=\"Short Caption\"/>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=\"tiddler-with-subtitle\" subtitle=\"Tiddler With Subtitle Only Defined\"/>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=\"tiddler-with-subtitle-and-caption\" subtitle=\"Tiddler With Subtitle And Caption - using subtitle\" caption=\"capt.ion\"/>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=\"tiddler-with-alias\" aliases=\"alias\" caption=\"alias-caption\" subtitle=\"alias-subtitle\" my-field=\"alias my-field\"/>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=\"test-links\" text={{$:/plugins/wikilabs/uni-link/backlinks-template!!text}}/>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=\"This is a Test\" text=\"This tiddler is used as an example for [[uni-link-search]]\"/>\nCreate \"uni-link\" example tiddlers!\n</$button>\n\\end\n\\define deleteExampleTiddlers()\n<$button>\n<$action-deletetiddler $tiddler=\"tiddler-with-caption\"/>\n<$action-deletetiddler $tiddler=\"tiddler-with-subtitle\"/>\n<$action-deletetiddler $tiddler=\"tiddler-with-subtitle-and-caption\"/>\n<$action-deletetiddler $tiddler=\"tiddler-with-alias\"/>\n<$action-deletetiddler $tiddler=\"test-links\"/>\n<$action-deletetiddler $tiddler=\"This is a Test\"/>\nDelete example tiddlers!\n</$button>\n\\end\n\n! Important\n\nThis plugin overwrites the core tiddler: $:/core/ui/TiddlerInfo/References\n\n''This uni-link version is compatible with ~TiddlyWiki >= V5.1.22''\n\nIf you need to use it with TW <= V5.1.21 you'll need to use an older version, which is available at: https://wikilabs.github.io/#GettingStarted\n\n! Video\n\n* See: https://wikilabs.github.io/editions/uni-link/#GettingStarted\n\n! Uni-link\n<<<\n* A new wikitext parsing rule, that calls the global [[\"uni-link\" macro|$:/plugins/wikilabs/uni-link/uni-link-macro]], instead of referencing the tiddler name. \n\n* It substitues the following tiddler fields: ''subtitle'', ''caption'' and ''title''. The $:/ControlPanel contains a new tab, that lets you define the behaviour of the uni-link macro. Default is ''title''. So there is no difference between the default setting of the plugin and the default behaviour in unmodified ~TiddlyWiki.\n<<<\n\n! Uni-link Search\n<<<\n`[[case insensitive title|??]]` will do a ''literal, case-insensitive'' title search. It will return ''the first'' tiddler it finds. \n\n''Examples'':\n\n|`[[This is a Test|??]]`|[[this is a test|??]]|\n|`[[doesn't exist|??]]`|[[doesn't exist|??]]|\n\n''Warning''\n\n* uni-link V2.1.0 does ''not'' contain a \"relink plugin\" addOn!\n* So if you change the tiddler name, those links won't be changed!\n<<<\n\n! Alias\n<<<\n* Alias Link Syntax\n** `[[anything|?]]` ... link to the tiddler that contains the alias: `anything`\n** `[[anything|?t]]` ... link to alias anything, but display the tiddler ''title''\n** `[[anything|?c]]` ... link to alias anything, but display the tiddler ''caption''\n** `[[anything|?s]]` ... link to alias anything, but display the tiddler ''subtitle''\n** `[[anything|?my-field]]` ... link to alias anything, but display the tiddler-field named ''my-field''\n** If a field doesn't exist, it shows the \"alias-text\" as used with `[[anything|?]]`\n** using [[aka-makros|$:/plugins/wikilabs/uni-link/aka-macros]] for tiddler alias handling\n\n* Alias Backlinks\n** open the tiddler (i)nfo area: References\n\n* Filter Operators:\n** `is[alias]` ... extends the core `is` operator see: [[https://tiddlywiki.com/#is Operator]]\n** `all[aliases]` ... extends the core `all` operator see: [ext[https://tiddlywiki.com/#all Operator]]\n** `[aliasbacklinks[]]` ... shows a list of all tiddlers that contain alias links\n** `[[?]aliasbacklinks[]sort[title]]` ... shows a list of tiddlers that contain undefined alias links\n\n* Right-Sidebar: More tab: [[Aliases|$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases]]\n** [[Sorted by Alias|$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases/byAlias]]\n** [[Sorted by Tiddler Title|$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases/byTitle]]\n** [[Undefined Aliases|$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases/undefined]]\n\n* uni-link $:/ControlPanel setting\n\n* [[uni-fields|$:/plugins/wikilabs/uni-link/uni-fields.js]] widget, that allows us to assign CSS classes based on tiddler fields existence.\n<<<\n\n! Installation\n<<<\n* You can drag & drop import this link: $:/plugins/wikilabs/uni-link<br>\n<<<\n\n! Link Styling\n<<<\n* Uni-links are styled like this: $:/plugins/wikilabs/uni-link/styles\n<<<\n\n! Examples\n<<<\nYou can use the following buttons to create example tiddlers!\n\n<<createExampleTiddlers>> -- <<deleteExampleTiddlers>>\n<<<"
},
"$:/plugins/wikilabs/uni-link/filters/aliasbacklinks.js": {
"title": "$:/plugins/wikilabs/uni-link/filters/aliasbacklinks.js",
"text": "/*\\\ntitle: $:/plugins/wikilabs/uni-link/filters/aliasbacklinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.aliasbacklinks = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerAliasBacklinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/plugins/wikilabs/uni-link/filters/all/aliases.js": {
"title": "$:/plugins/wikilabs/uni-link/filters/all/aliases.js",
"text": "/*\\\ntitle: $:/plugins/wikilabs/uni-link/filters/all/aliases.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[aliases]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.aliases = function(source,prefix,options) {\n\treturn options.wiki.getAllAliases();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/plugins/wikilabs/uni-link/filters/is/alias.js": {
"title": "$:/plugins/wikilabs/uni-link/filters/is/alias.js",
"text": "/*\\\ntitle: $:/plugins/wikilabs/uni-link/filters/is/alias.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[alias]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.alias = function(source,prefix,options) {\n\tvar results = [],\n\t\taliases = options.wiki.getAllAliases();\n\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = title.toLowerCase();\n\t\t\tif (aliases.indexOf(title) === -1) results.push(title);\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = title.toLowerCase();\n\t\t\tif (aliases.indexOf(title) !== -1) results.push(title);\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/plugins/wikilabs/uni-link/make-alias-link.js": {
"title": "$:/plugins/wikilabs/uni-link/make-alias-link.js",
"text": "/*\\\ntitle: $:/plugins/wikilabs/uni-link/make-alias-link.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to make an alias-link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"make-alias-link\"] = function(event,operation) {\n\tif(operation.selection) {\n\t\toperation.replacement = \"[[\" + operation.selection + \"|?\" + event.paramObject.text + \"]] \";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t} else {\n\t\toperation.replacement = \"[[\" + event.paramObject.text + \"|?]] \";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t}\n\toperation.newSelStart = operation.selStart + operation.replacement.length;\n\toperation.newSelEnd = operation.newSelStart;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/plugins/wikilabs/uni-link/relinkoperations/text/wikitext/unilink.js": {
"title": "$:/plugins/wikilabs/uni-link/relinkoperations/text/wikitext/unilink.js",
"text": "/*\\\ntitle: $:/plugins/wikilabs/uni-link/relinkoperations/text/wikitext/unilink.js\ntype: application/javascript\nmodule-type: relinkwikitextrule\n\nHandles replacement in wiki text inline rules, like,\n\n[[Introduction]]\n\n[[link description|TiddlerTitle]]\n\n\\*/\n\n\"use strict\";\n\nvar prettylink = require('$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/prettylink.js');\n\nfunction Unilink() {}\n\nUnilink.prototype = prettylink;\n\nmodule.exports = new Unilink();\nmodule.exports.name = \"unilink\";\n\nmodule.exports.relink = function(text_or_tiddler) {\n // Check that this version of Relink supports [object] return.\n if (typeof text_or_tiddler === \"string\") {\n if (this.match[3] == \"?\") {\n this.parser.pos = this.matchRegExp.lastIndex;\n // Ignore this unilink. The link portion has a \"?\", so it's an alias.\n return undefined;\n }\n if (this.match[2] == \"|\" && !this.match[3] && !this.match[4]) {\n this.parser.pos = this.matchRegExp.lastIndex;\n return { name: \"unilink\", impossible: true};\n }\n }\n // The underlying prettylink rule expects everything after the \"|\" to\n // be the link. We'll just swap it in from the 4th position before we\n // apply prettylink relinking.\n this.match[2] = this.match[4];\n return prettylink.relink.apply(this, arguments);\n};\n",
"type": "application/javascript",
"module-type": "relinkwikitextrule"
},
"$:/plugins/wikilabs/uni-link/uni-fields.js": {
"title": "$:/plugins/wikilabs/uni-link/uni-fields.js",
"text": "/*\\\ntitle: $:/plugins/wikilabs/uni-link/uni-fields.js\ntype: application/javascript\nmodule-type: widget\n\nunifields widget, derived from Fields Widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, require:false, exports:false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.sort = this.getAttribute(\"sort\",\"yes\") === \"yes\";\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.include = this.getAttribute(\"include\",null);\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\tthis.sortReverse = this.getAttribute(\"sortReverse\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\n\t// Get the inclusion and exclusion list\n\tvar exclude = (this.exclude) ? this.exclude.split(\" \") : [\"text\"];\n\t// If inclusion is defined, everything else is auto excluded\n\tvar include = (this.include) ? this.include.split(\" \") : null;\n\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tif (include) {\n\t\t\tfor(var i=0; i<include.length; i++) {\n\t\t\t\tif(tiddler.fields[include[i]]) {\n\t\t\t\t\tfields.push(include[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\tif(exclude.indexOf(fieldName) === -1) {\n\t\t\t\t\tfields.push(fieldName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.sort) fields.sort();\n\t\tif (this.sortReverse) fields.reverse();\n\t\tfor(var f=0, fmax=fields.length; f<fmax; f++) {\n\t\t\tfieldName = fields[f];\n//\t\t\tif(exclude.indexOf(fieldName) === -1) {\n\t\t\tvar row = this.template,\n\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\tif(reMatch) {\n\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t}\n\t\t\t}\n\t\t\trow = $tw.utils.replaceString(row,\"$name$\",fieldName);\n\t\t\trow = $tw.utils.replaceString(row,\"$value$\",value);\n\t\t\trow = $tw.utils.replaceString(row,\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\ttext.push(row);\n//\t\t\t}\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude || changedAttributes.stripTitlePrefix || changedTiddlers[this.tiddlerTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports[\"uni-fields\"] = FieldsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/wikilabs/uni-link/uni-link.js": {
"title": "$:/plugins/wikilabs/uni-link/uni-link.js",
"text": "/*\\\ntitle: $:/plugins/wikilabs/uni-link/uni-link.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for uni link macros. For example:\n\n```\n[[Introduction]] ... uni-link\n\n[[Link description|?]] ... alias-link\n[[Link description|?t]] ... alias-link - show title\n[[Link description|?c]] ... alias-link - show caption\n[[Link description|?s]] ... alias-link - show subtitle\n[[Link description|?my-field]] ... alias-link - show any field-name as link text\n\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"unilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n//\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n\tthis.matchRegExp = /\\[\\[(.*?)(?:(\\|)(\\?)?(.*?))?\\]\\]/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Process the link\n\tvar text = this.match[1],\n\t\tlink = this.match[4] || text,\n\t\tcheckAlias = this.match[3] === \"?\",\n\t\tuseUniLink = !(this.match[2] === \"|\");\n\n\tif($tw.utils.isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else if (checkAlias && link === \"?\") {\n\t\tvar results = $tw.wiki.search(text,{caseSensitive:false, field: \"title\", invert:false, literal:true});\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: (results[0]) ? results[0] : text}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else if(checkAlias) {\n\t\tvar field = \"X\"; // field names are alwayse lowercase!\n\n\t\tif(link === \"c\") {\n\t\t\tfield = \"caption\"\n\t\t} else if(link === \"s\") {\n\t\t\tfield = \"subtitle\"\n\t\t} else if(link === \"t\") {\n\t\t\tfield = \"title\"\n\t\t} else if (text != link) {\n\t\t\tfield = link;\n\t\t}\n\n\t\treturn [{\n\t\t\ttype: \"macrocall\",\n\t\t\tname: \"aka\",\n\t\t\tparams: [\n\t\t\t\t{name: \"target\", value: text},\n\t\t\t\t{name: \"field\", value: field},\n\t\t\t\t]\n\t\t\t}\n\t\t];\n\t} else if((text === link) && useUniLink) {\n\t\t// Since V 1.1.0 new link-backlink detection implemented\n\t\t// Overwrites the core $tw.wiki.getTiddlerLinks() method with own version\n\t\treturn [{\n\t\t\ttype: \"macrocall\",\n\t\t\tname: \"uni-link\",\n\t\t\tparams: [\n\t\t\t\t{name: \"tid\", value: text}\n\t\t\t\t]\n\t\t\t}\n\t\t];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/plugins/wikilabs/uni-link/wiki-ext.js": {
"title": "$:/plugins/wikilabs/uni-link/wiki-ext.js",
"text": "/*\\\ntitle: $:/plugins/wikilabs/uni-link/wiki-ext.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\nexports.getTiddlerAliasLinks = function(title) {\nexports.getTiddlerAliasBacklinks = function(targetTitle) {\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n//var widget = require(\"$:/core/modules/widgets/widget.js\");\n\n\n/*\nReturn an array of tiddler titles that are directly linked within the given parse tree\n */\nexports.extractLinks = function(parseTreeRoot) {\n\t// Count up the links\n\tvar links = [],\n\t\tcheckParseTree = function(parseTree) {\n\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t}\n\t\t\t\t} else if (parseTreeNode.type === \"macrocall\" && parseTreeNode.name === \"uni-link\" && parseTreeNode.params && parseTreeNode.params[0].value) {\n\t\t\t\t\tvar value = parseTreeNode.params[0].value;\n\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t}\n\t\t\t\t} // else if type===\"macrocall\"\n\n\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcheckParseTree(parseTreeRoot);\n\treturn links;\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinksXXX = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\t// Count up the links\n\t\tvar links = [],\n\t\t\tcheckParseTree = function(parseTree) {\n\t\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (parseTreeNode.type === \"macrocall\" && parseTreeNode.name === \"uni-link\" && parseTreeNode.params && parseTreeNode.params[0].value) {\n\t\t\t\t\t\tvar value = parseTreeNode.params[0].value;\n\t\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t} // else if type===\"macrocall\"\n\n\t\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\tif(parser) {\n\t\t\tcheckParseTree(parser.tree);\n\t\t}\n\t\treturn links;\n\t});\n};\n\n/*\nAlias backlink handling\n*/\nfunction aliasInit(title) {\n\t// Parse the tiddler\n\tvar parser = this.parseTiddler(title);\n\t// Count up the links\n\tvar links = [],\n\t\tcheckParseTree = function(parseTree) {\n\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\tif(parseTreeNode.type === \"macrocall\" && parseTreeNode.name === \"aka\") {\n\t\t\t\t\tvar value = parseTreeNode.params[0].value;\n\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tif(parser) {\n\t\tcheckParseTree(parser.tree);\n\t}\n\t/*\n\tFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\n\tsortField: field to sort by\n\texcludeTag: tag to exclude\n\tincludeSystem: whether to include system tiddlers (defaults to false)\n\t*/\n\tvar backlinks = []\n\tthis.forEachTiddler({includeSystem:true}, function(ttl,tiddler) {\n\t\tif (tiddler.fields[\"aliases\"]) {\n\t\t\t// var fields = tiddler.fields[\"aliases\"];\n\t\t\tvar fields = $tw.utils.parseStringArray(tiddler.fields[\"aliases\"]);\n\t\t\tfields = fields.map(function (el){\n\t\t\t\treturn el.toLowerCase();\n\t\t\t});\n\t\t\tlinks.map( function (el) {\n\t\t\t\tif (fields.indexOf(el.toLowerCase()) != -1) backlinks.push(ttl);\n\t\t\t})\n\t\t} // if tiddler aliases\n\t});\n\n\tif ((backlinks.length === 0) && (links.length > 0)) {\n\t\tbacklinks[0] = \"?\";\n\t}\n\n\treturn backlinks;\n}\n\nexports.getAllAliases = function() {\n\tvar self = this,\n\t\taliases = \"\";\n\t/*\n\tFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\n\tsortField: field to sort by\n\texcludeTag: tag to exclude\n\tincludeSystem: whether to include system tiddlers (defaults to false)\n\t*/\n\tself.forEachTiddler({includeSystem:true}, function(title,tiddler) {\n\t\tif (tiddler.fields[\"aliases\"]) {\n//\t\t\t$tw.utils.pushTop(aliases, this.getCacheForTiddler(title,\"alias\",aliasInit.bind(this, title)));\n\t\t\taliases = aliases + ` ${tiddler.fields.aliases}`;\n\t\t} // if tiddler aliases\n\t});\n\taliases = aliases.toLowerCase();\n\treturn $tw.utils.parseStringArray(aliases);\n};\n\n\n/*\nReturn an array of tiddler titles that are alias linked from the specified tiddler\n*/\nexports.getTiddlerAliasLinks = function(title) {\n\tvar self = this;\n\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"alias\",aliasInit.bind(this, title));\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerAliasBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbacklinks = [];\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerAliasLinks(title);\n\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\tbacklinks.push(title);\n\t\t}\n\t});\n\treturn backlinks;\n};\n\n})();\n\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/core/images/aliasify": {
"title": "$:/core/images/aliasify",
"created": "20180909082646243",
"modified": "20180909091537847",
"tags": "$:/tags/Image",
"type": "text/vnd.tiddlywiki",
"text": "<svg class=\"tc-linkify-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n<path d=\"m17.031 31.919h-7.983v64.931h7.983v6.92h-17.031v-78.77h17.031zm24.66 0h-7.983v64.931h7.983v6.92h-17.031v-78.77h17.03v6.919zm44.619 64.931h7.982v-64.93h-7.982v-6.92h17.031v78.77h-17.031zm24.659 0h7.983v-64.93h-7.983v-6.92h17.031v78.77h-17.031z\" fill-rule=\"evenodd\"/>\n <path d=\"m45.188 34.74v62.668h7.3507c-0.02998-28.03 0.06401-32 0.04791-62.668zm28.464 2.6834c-2.6133 0-5.1484 0.36297-7.6094 1.0734-2.4357 0.7104-4.8412 1.7835-7.2261 3.2297v7.159c2.461-1.6999 4.8147-2.9934 7.0728-3.8814 2.2834-0.88801 4.4263-1.3321 6.4306-1.3321 2.7401 0 4.9348 0.69381 6.584 2.0892 1.6745 1.3954 2.5205 3.2238 2.5205 5.4819 0 1.2432-0.33704 2.4589-0.9967 3.6514-0.63429 1.1925-1.6685 2.46-3.1147 3.8047l-3.431 3.3926c-2.2834 2.182-3.7748 4.0915-4.4852 5.7406-0.71039 1.6491-1.0638 3.7627-1.0638 6.3252v5.8556h7.2644v-4.6768c0-1.3193 0.03891-2.3631 0.115-3.1243 0.07613-0.76115 0.19278-1.4031 0.34501-1.9359 0.20297-0.63429 0.5434-1.2858 1.0255-1.9455 0.50744-0.68504 1.3568-1.6251 2.5493-2.8176l3.3447-3.268c2.2834-2.182 3.888-4.1399 4.8014-5.8652 0.91338-1.7506 1.3705-3.592 1.3705-5.5202 0-4.0341-1.4231-7.276-4.2647-9.737-2.8162-2.461-6.5637-3.6993-11.232-3.6993zm-5.5489 48.187v9.6604h7.7244v-9.6604z\" fill-rule=\"evenodd\" stroke-width=\"1.1245\"/>\n</svg>\n"
},
"$:/core/ui/EditorToolbar/aliasify": {
"title": "$:/core/ui/EditorToolbar/aliasify",
"caption": "{{$:/language/Buttons/Aliasify/Caption}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"created": "20180909082308073",
"description": "{{$:/language/Buttons/Aliasify/Hint}}",
"icon": "$:/core/images/aliasify",
"list-before": "$:/core/ui/EditorToolbar/mono-block",
"modified": "20180909091537847",
"shortcuts": "((aliasify))",
"tags": "$:/tags/EditorToolbar",
"type": "text/vnd.tiddlywiki",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"[[\"\n\tsuffix=\"|?]]\"\n/>\n"
},
"$:/core/ui/TiddlerInfo/References": {
"title": "$:/core/ui/TiddlerInfo/References",
"caption": "{{$:/language/TiddlerInfo/References/Caption}}",
"tags": "$:/tags/TiddlerInfo",
"type": "text/vnd.tiddlywiki",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\"></$list>\n<hr>\n\n''Alias backlinks from tiddlers:''\n\n<$list filter=\"[all[current]aliasbacklinks[]sort[title]]\" emptyMessage=\"No alias links to this one\" template=\"$:/core/ui/ListItemTemplate\"></$list>\n"
},
"$:/plugins/wikilabs/uni-link/ui/ControlPanel/settings": {
"title": "$:/plugins/wikilabs/uni-link/ui/ControlPanel/settings",
"caption": "uni-link",
"created": "20171205224905238",
"modified": "20171205230149750",
"tags": "$:/tags/ControlPanel",
"type": "text/vnd.tiddlywiki",
"text": "!! [[Enable Aliases Footer|$:/plugins/wikilabs/uni-link/aka-footer]]\n\n<<<\n<$checkbox tiddler=\"$:/plugins/wikilabs/uni-link/aka-footer\" tag=\"$:/tags/ViewTemplate\"> Enable Aliases Footer</$checkbox>\n<<<\n\n!! [[Uni-link - Default field|$:/config/wikilabs/uni-link/field]]\n\nUse the following field as link text, if available: \n\n<<<\n<$tiddler tiddler=\"$:/config/wikilabs/uni-link/field\">\n<$radio value=\"caption\"> caption</$radio><br>\n<$radio value=\"subtitle\"> subtitle</$radio><br>\n<$radio value=\"\"> title</$radio><br>\n</$tiddler>\n<<<\n\n!! Additional Info\n\nSee: [[$:/plugins/wikilabs/uni-link/readme]]\n"
},
"$:/plugins/wikilabs/uni-link/ui/EditorToolbar/alias-dropdown": {
"title": "$:/plugins/wikilabs/uni-link/ui/EditorToolbar/alias-dropdown",
"created": "20190210145516221",
"modified": "20190210194738308",
"type": "text/vnd.tiddlywiki",
"text": "\\define lingo-base() $:/language/Buttons/Link/\n\n\\define add-link-actions()\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"make-alias-link\" text={{$(linkTiddler)$}} />\n<$action-deletetiddler $tiddler=<<dropdown-state>> />\n<$action-deletetiddler $tiddler=<<searchTiddler>> />\n<$action-deletetiddler $tiddler=<<linkTiddler>> />\n\\end\n\n\\define external-link()\n<$button class=\"tc-btn-invisible\" style=\"width:auto; display:inline-block; background:none; padding:0;\" actions=<<add-link-actions>>>\n{{$:/core/images/chevron-right}}\n</$button>\n\\end\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<$vars searchTiddler=\"\"\"$config-title$/search\"\"\" linkTiddler=\"\"\"$config-title$/link\"\"\" linktext=\"\" >\n\n<$vars linkTiddler=<<searchTiddler>>>\n<$keyboard key=\"ENTER\" actions=<<add-link-actions>>>\n<$edit-text tiddler=<<searchTiddler>> type=\"search\" tag=\"input\" focus=\"true\" placeholder={{$:/language/Search/Search}} default=\"\"/>\n<$reveal tag=\"span\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n<<external-link>>\n<$button class=\"tc-btn-invisible\" style=\"width:auto; display:inline-block; background:none; padding:0;\">\n<$action-setfield $tiddler=<<searchTiddler>> text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$keyboard>\n</$vars>\n\n<$reveal tag=\"div\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n\n<$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>>\n\n{{$:/plugins/wikilabs/uni-link/ui/EditorToolbar/SearchResults}}\n\n</$linkcatcher>\n\n</$reveal>\n\n</$vars>\n\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Link/\">>/>"
},
"$:/plugins/wikilabs/uni-link/ui/EditorToolbar/alias": {
"title": "$:/plugins/wikilabs/uni-link/ui/EditorToolbar/alias",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"caption": "{{$:/language/Buttons/Make/Alias/Caption}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"created": "20190210145538580",
"description": "{{$:/language/Buttons/Make/Alias/Hint}}",
"dropdown": "$:/plugins/wikilabs/uni-link/ui/EditorToolbar/alias-dropdown",
"icon": "$:/core/images/link",
"modified": "20190210194833231",
"shortcuts": "((alias-link))",
"tags": "$:/tags/EditorToolbar",
"type": "text/vnd.tiddlywiki",
"text": ""
},
"$:/plugins/wikilabs/uni-link/ui/EditorToolbar/SearchResults": {
"title": "$:/plugins/wikilabs/uni-link/ui/EditorToolbar/SearchResults",
"created": "20190210164849276",
"modified": "20190210194648558",
"type": "text/vnd.tiddlywiki",
"text": "\\whitespace trim\n<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AliasResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AliasResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/AliasResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n\n</$list>\n</div>"
},
"$:/plugins/wikilabs/uni-link/ui/EditorToolbar/SearchTemplate": {
"title": "$:/plugins/wikilabs/uni-link/ui/EditorToolbar/SearchTemplate",
"caption": "Aliases",
"created": "20190210153457679",
"modified": "20190210194716605",
"tags": "$:/tags/AliasResults",
"type": "text/vnd.tiddlywiki",
"text": "\\define getRealName()\nTiddler -> <<aka-no-links target:\"\"\"$(alias)$\"\"\">>\n\\end\n\\define searchResultList()\n\\whitespace trim\n<$list filter=\"[all[aliases]search:{$(searchTiddler)$}sort[title]]\" variable=alias>\n <div class=\"tc-menu-list-item\">\n <$link to=<<alias>> tooltip=<<getRealName>> ><<alias>></$link>\n </div>\n</$list>\n\\end\n<<searchResultList>>"
},
"$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases": {
"title": "$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases",
"caption": "Aliases",
"created": "20171214213808142",
"list-before": "$:/core/ui/MoreSideBar/Recent",
"modified": "20171214215245931",
"tags": "$:/tags/MoreSideBar",
"type": "text/vnd.tiddlywiki",
"text": "<div class=\"uni-link-sidebar tc-sidebar-lists\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases]!has[draft.of]]\" \"$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases/byAlias\" \"$:/state/tab/Aliases\" >>\n</div>"
},
"$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases/byAlias": {
"title": "$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases/byAlias",
"caption": "Alias",
"created": "20171214203739053",
"list-before": "$:/core/ui/MoreSideBar/Recent",
"modified": "20171214213743140",
"tags": "$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases",
"type": "text/vnd.tiddlywiki",
"text": "\\whitespace trim\n<$list filter=\"[all[aliases]sort[title]]\" variable=alias>\n <div class=\"tc-menu-list-item\">\n <$macrocall $name=\"aka\" target=<<alias>> />\n <div class=\"tc-menu-list-subitem\">\n <$macrocall $name=\"aka-no-links\" target=<<alias>> />\n </div>\n </div>\n</$list>\n"
},
"$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases/byTitle": {
"title": "$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases/byTitle",
"caption": "Title",
"created": "20171214201333460",
"list-before": "$:/core/ui/MoreSideBar/Recent",
"modified": "20171214213745643",
"tags": "$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases",
"type": "text/vnd.tiddlywiki",
"text": "\\whitespace trim\n<$list filter=\"[has[aliases]sort[title]]\">\n <div class=\"tc-menu-list-item\">\n <$link to=<<currentTiddler>> ><<currentTiddler>></$link>\n <$list filter=\"[list[!!aliases]]\">\n <div class=\"tc-menu-list-subitem\">\n <$view field=title/>\n </div>\n </$list>\n </div>\n</$list>\n"
},
"$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases/undefined": {
"title": "$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases/undefined",
"caption": "Undefined",
"created": "20180202150804918",
"list-before": "$:/core/ui/MoreSideBar/Recent",
"modified": "20180202151517364",
"tags": "$:/plugins/wikilabs/uni-link/ui/MoreSideBar/Aliases",
"type": "text/vnd.tiddlywiki",
"text": "<$list filter=\"[[?]aliasbacklinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\" emptyMessage=\"No undefined Aliases\"/>\n\n---\n\nYou'll need to reload the page, to update this list!\n"
},
"$:/plugins/wikilabs/uni-link/uni-link-macro": {
"title": "$:/plugins/wikilabs/uni-link/uni-link-macro",
"tags": "$:/tags/Macro",
"text": "\\define getClass()\n<$uni-fields template=\"uni-$name$\" include=$(field-name)$ sort=\"no\"/> uni-link\n\\end\n\n\\define linkText()\n\\whitespace trim\n<$set name=\"tv-wikilinks\" value=\"no\">\n<span class=<<class>> >\n <$transclude field=$(field-name)$ ><$transclude field=title/></$transclude>\n</span>\n</$set>\n\\end\n\n\\define uni-link(tid)\n\\whitespace trim\n<$tiddler tiddler=\"\"\"$tid$\"\"\">\n <$vars field-name={{{[[$:/config/wikilabs/uni-link/field]get[text]]~[[title]]}}} >\n <$wikify name=class text=<<getClass>> >\n <$link to=\"\"\"$tid$\"\"\" tooltip=\"\"\"uni-link -> $tid$\"\"\"><<linkText>></$link>\n </$wikify>\n </$vars>\n</$tiddler>\n\\end\n\n<pre><$view field=\"text\"/></pre>"
},
"$:/plugins/wikilabs/uni-link/styles": {
"title": "$:/plugins/wikilabs/uni-link/styles",
"tags": "$:/tags/Stylesheet",
"text": ".uni-link {\n color: navy;\n}\n\n.uni-caption {\n color: #2a699f;\n}\n\n.uni-subtitle {\n color: #0e8446;\n}\n\n.uni-alias {\n color: #7557d8;\n}\n\n.uni-alias-missing {\n color: red;\n}\n\n.uni-link-sidebar .tc-tab-buttons {\n padding-top: 0;\n}\n"
}
}
}
<h3 style="margin-bottom: -5px; margin-top: 5px">𝕮𝖗𝖊𝖘𝖈𝖊𝖓𝖙𝖊 𝖘𝖈𝖎𝖊𝖓𝖙𝖎𝖆, 𝖔𝖓𝖊 𝖙𝖎𝖉𝖉𝖑𝖊𝖗 𝖆𝖙 𝖆 𝖙𝖎𝖒𝖊</h3>
<$link to="OnePlaybook">{{Lab_logo_descriptive.svg}}</$link>
$:/core/ui/EditTemplate/body/preview/output
$:/core/ui/ImportPreviews/Text
$:/plugins/Abe/maarfapad/navbar-simple-settings
$:/plugins/Abe/maarfapad/controls
{
"toggleSaver": "false"
}
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/vis
$:/core/ui/TiddlerInfo/Tools
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/vis
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/namespace
$:/core/ui/TiddlerInfo/Tools
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/core/ui/TiddlerInfo/Tools
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/core/ui/TiddlerInfo/Fields
$:/core/ui/TiddlerInfo/References
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/editNode/default
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/layout
$:/core/ui/TiddlerInfo/Tagging
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/editNode/default
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/vis
$:/core/ui/TiddlerInfo/Tagging
$:/core/ui/AdvancedSearch/Standard
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/layout
$:/plugins/felixhayashi/tiddlymap/dialog/editNode/local
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/interaction
$:/core/ui/TiddlerInfo/Tagging
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/vis
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/vis
$:/core/ui/TiddlerInfo/Tagging
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/vis
$:/plugins/felixhayashi/tiddlymap/dialog/editNode/default
$:/plugins/felixhayashi/tiddlymap/dialog/editNode/local
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/Tools
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/core/ui/ControlPanel/Toolbars
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/Tools
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/vis
$:/core/ui/TiddlerInfo/Tagging
$:/core/ui/TiddlerInfo/Tagging
$:/core/ui/ControlPanel/Basics
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/layout
$:/core/ui/TiddlerInfo/Tools
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/core/ui/TiddlerInfo/Tagging
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/interaction
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/interaction
$:/core/ui/TiddlerInfo/Tagging
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/default
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/interaction
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/editNode/local
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/Tagging
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/References
$:/core/ui/TiddlerInfo/Tagging
$:/core/ui/TiddlerInfo/Fields
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/Tagging
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/default
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/Tools
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/vis
$:/core/ui/TiddlerInfo/Tagging
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/Tagging
$:/plugins/felixhayashi/tiddlymap/dialog/editNode/default
$:/core/ui/ControlPanel/Plugins/Installed/Plugins
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/core/ui/TiddlerInfo/Tools
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/vis
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/interaction
$:/plugins/felixhayashi/tiddlymap/dialog/editNode/local
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/layout
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/Tools
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/core/ui/TiddlerInfo/Tagging
$:/plugins/jd/mob/config/misc
$:/core/ui/TiddlerInfo/Tagging
$:/core/ui/TiddlerInfo/Tools
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/interaction
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/Tagging
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/interaction
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/editNode/local
$:/core/ui/TiddlerInfo/References
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/fields
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/Tagging
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/interaction
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/core/ui/ControlPanel/KeyboardShortcuts
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/References
$:/core/ui/TiddlerInfo/Tagging
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/core/ui/TiddlerInfo/References
$:/core/ui/TiddlerInfo/Fields
$:/plugins/Abe/maarfapad/manage-wikis
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/fullscreenTiddlerEditor/draft
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/default
$:/core/ui/TiddlerInfo/Tagging
$:/core/ui/TiddlerInfo/Tagging
$:/core/ui/TiddlerInfo/References
$:/core/ui/TiddlerInfo/Tagging
$:/core/ui/TiddlerInfo/Tagging
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/vis
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/editNode/default
$:/core/ui/TiddlerInfo/Tagging
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/layout
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/References
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/vis
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/layout
$:/plugins/felixhayashi/tiddlymap/dialog/editNode/default
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/plugins/felixhayashi/tiddlymap/dialog/globalConfig/default
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/vis
$:/plugins/felixhayashi/tiddlymap/dialog/editNode/default
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/References
$:/plugins/felixhayashi/tiddlymap/dialog/configureView/editFilters
$:/core/ui/MoreSideBar/Missing
$:/core/ui/MoreSideBar/Plugins
$:/core/ui/ControlPanel/Toolbars/PageControls
$:/plugins/felixhayashi/tiddlymap/dialog/MapElementTypeManager/styling
{
"tiddlers": {
"$:/info/browser": {
"title": "$:/info/browser",
"text": "yes"
},
"$:/info/node": {
"title": "$:/info/node",
"text": "no"
},
"$:/info/url/full": {
"title": "$:/info/url/full",
"text": "https://maarfapad.cloudno.de/wiki/home"
},
"$:/info/url/host": {
"title": "$:/info/url/host",
"text": "maarfapad.cloudno.de"
},
"$:/info/url/hostname": {
"title": "$:/info/url/hostname",
"text": "maarfapad.cloudno.de"
},
"$:/info/url/protocol": {
"title": "$:/info/url/protocol",
"text": "https:"
},
"$:/info/url/port": {
"title": "$:/info/url/port",
"text": ""
},
"$:/info/url/pathname": {
"title": "$:/info/url/pathname",
"text": "/wiki/home"
},
"$:/info/url/search": {
"title": "$:/info/url/search",
"text": ""
},
"$:/info/url/origin": {
"title": "$:/info/url/origin",
"text": "https://maarfapad.cloudno.de"
},
"$:/info/browser/screen/width": {
"title": "$:/info/browser/screen/width",
"text": "1366"
},
"$:/info/browser/screen/height": {
"title": "$:/info/browser/screen/height",
"text": "768"
},
"$:/info/browser/language": {
"title": "$:/info/browser/language",
"text": "en-GB"
}
}
}
Deficiencies of Roam: opportunities
Image batch processing/batch processing in general
.cm-s-monokai-sublime {
font-size: 1em;
line-height: 1.5em;
font-family: inconsolata, monospace;
letter-spacing: 0.3px;
word-spacing: 1px;
background: #272822;
color: #F8F8F2;
}
.cm-s-monokai-sublime .CodeMirror-lines {
padding: 8px 0;
}
.cm-s-monokai-sublime .CodeMirror-gutters {
box-shadow: 1px 0 2px 0 rgba(0, 0, 0, 0.5);
-webkit-box-shadow: 1px 0 2px 0 rgba(0, 0, 0, 0.5);
background-color: #272822;
padding-right: 10px;
z-index: 3;
border: none;
}
.cm-s-monokai-sublime div.CodeMirror-cursor {
border-left: 3px solid #F8F8F2;
}
.cm-s-monokai-sublime .CodeMirror-activeline-background {
background: #3E3D32;
}
.cm-s-monokai-sublime .CodeMirror-selected {
background: #49483E;
}
.cm-s-monokai-sublime .cm-comment {
color: #75715E;
}
.cm-s-monokai-sublime .cm-string {
color: #E6DB74;
}
.cm-s-monokai-sublime .cm-number {
color: #66D9EF;
}
.cm-s-monokai-sublime .cm-atom {
color: #66D9EF;
}
.cm-s-monokai-sublime .cm-keyword {
color: #F92672;
}
.cm-s-monokai-sublime .cm-variable {
color: #A6E22E;
}
.cm-s-monokai-sublime .cm-def {
font-style: italic;
color: #FD971F;
}
.cm-s-monokai-sublime .cm-variable-2 {
color: #F92672;
}
.cm-s-monokai-sublime .cm-property {
color: #66D9EF;
}
.cm-s-monokai-sublime .cm-operator {
color: #F92672;
}
.cm-s-monokai-sublime .CodeMirror-linenumber {
color: #75715E;
}
{
"tiddlers": {
"$:/themes/jd/Whitespace/template/sidebar": {
"created": "20171201152819844",
"creator": "JD",
"text": "\\define wsconfig(name) $:/config/Whitespace/$name$\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\\define config-title-sidebar()\n$:/config/SideBar/Visibility/$(currentTiddler)$\n\\end\n\\define drop-actions()\n<$action-listops $tiddler=\"$:/tags/SideBar\" $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n<$fieldmangler tiddler=<<actionTiddler>>>\n<$action-sendmessage $message=\"tm-add-tag\" $param=\"$:/tags/SideBar\"/>\n</$fieldmangler>\n\\end\n\\define drop-actions-PageControls-buttons()\n<$action-listops $tiddler=\"$:/tags/PageControls\" $subfilter=\"+[insertbefore:listItem<actionTiddler>]\"/>\n\\end\n\\define sidebar-title()\n<$list filter=\"[all[shadows+tiddlers]!has[draft.of]is[current]has[caption]]\">{{!!caption}}</$list>\n<$list filter=\"[all[shadows+tiddlers]!has[draft.of]is[current]!has[caption]]\">{{!!title}}</$list>\n\\end\n\\define control-panel-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$action-setfield $tiddler=<<wsconfig search>> text=\"no\"/>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search}}/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\\define NewTidActions()\n<$action-setfield $tiddler=<<wsconfig search>> text=\"no\"/>\n<$action-createtiddler $basetitle={{$:/temp/search}} $savetitle=\"$:/temp/NewTidTitle\"/>\n<$action-sendmessage $message=\"tm-edit-tiddler\" $param={{$:/temp/NewTidTitle}}/>\n<$action-deletetiddler $tiddler=\"$:/temp/NewTidTitle\"/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n\\end\n\\define ws-page-controls()\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$droppable actions=<<drop-actions-PageControls-buttons>>>\n<div class=\"tc-droppable-placeholder\">\n \n</div>\n<$list filter=\"[<config-title>!text[hide]]\" variable=\"checker\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$draggable tiddler=<<listItem>> tag=\"span\"><$transclude tiddler=<<listItem>>/></$draggable>\n</$set>\n</$list>\n</$droppable>\n</$list>\n\\end\n\n<div class=\"vertical-controls\">\n<<ws-page-controls>>\n</div>\n\n<div class=\"jd-sidebar\">\n<div class=\"jd-header\">\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"no\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip=\"Unfix sidebar\" class=\"tc-btn-invisible\">{{$:/core/images/menu-button}}</$button>\n</$reveal>\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"no\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip=\"Fix sidebar\" class=\"tc-btn-invisible\">{{$:/core/images/menu-button}}</$button>\n</$reveal>\n<span class=\"header-buttons\">\n<<ws-page-controls>>\n</span>\n</div>\n<$list filter=\"[[$:/config/Whitespace/show-sitetitle]!text[no]]\" variable=\"checker\">\n<div class=\"jd-sitetitle-wrapper\">\n<$list filter=\"[[$:/SiteTitle]!text[]]\" variable=\"checker\">\n<div class=\"jd-sitetitle\"><$transclude tiddler=\"$:/SiteTitle\"/></div>\n</$list>\n<$list filter=\"[[$:/SiteSubtitle]!text[]]\" variable=\"checker\">\n<div class=\"jd-sitesubtitle\"><$transclude tiddler=\"$:/SiteSubtitle\"/></div>\n</$list>\n</div>\n</$list>\n<div class=\"jd-sidebar-column\">\n<div class=\"jd-search-wrapper\">\n<div class=\"jd-search-header\">\n<$keyboard class=\"jd-searchbar-wrapper\" tag=\"div\" key=\"ctrl+space\" actions=<<NewTidActions>>>\n<$edit-text tiddler=\"$:/temp/search\" type=\"search\" tag=\"input\" placeholder=\"Search / create\" class=\"jd-searchbar\"/>\n</$keyboard>\n<div class=\"jd-searchbar-buttons\">\n<$list filter=\"[[$:/temp/search]!text[]]\">\n<$button tooltip=\"Create new tiddler with this title\" class=\"tc-btn-invisible\" actions=<<NewTidActions>>>\n{{$:/core/images/new-button}}\n</$button>\n<$button tooltip=\"Clear searchbar\" class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=<<wsconfig search>> text=\"no\"/>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text=\"\"/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$list>\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n</div>\n</div>\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n<div class=\"jd-search-results\">\n<$scrollable fallthrough=\"no\" class=\"results\">\n<$set name=\"searchTiddler\" value=\"$:/temp/search\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n</$set>\n</$scrollable>\n</div>\n</$reveal>\n</div>\n</div>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" variable=\"currentTiddler\">\n<$droppable actions=<<drop-actions>>>\n<div class=\"tc-droppable-placeholder\">\n \n</div>\n<div class=\"jd-sidebar-column\">\n<div class=\"jd-sidebar-column-header\">\n<$list variable=\"checker\" filter=\"[<config-title-sidebar>!text[hide]]\" emptyMessage=\"\"\"\n<$button set=<<config-title-sidebar>> setTo=\"show\" dragTiddler=<<currentTiddler>> class=\"tc-btn-invisible\" tag=\"text\">\n<<sidebar-title>>\n</$button>\n\"\"\">\n<$button set=<<config-title-sidebar>> setTo=\"hide\" dragTiddler=<<currentTiddler>> class=\"tc-btn-invisible\" tag=\"text\">\n<<sidebar-title>>\n</$button>\n</$list>\n<div class=\"jd-sidebar-column-header-buttons\">\n<$button tooltip=\"Open in story river\" to=<<currentTiddler>> dragTiddler=<<currentTiddler>> class=\"tc-btn-invisible\">{{$:/core/images/open-window}}</$button>\n<$button tooltip=\"Edit this tiddler\" dragTiddler=<<currentTiddler>> class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-edit-tiddler\"/>{{$:/core/images/edit-button}}</$button>\n<$button tooltip=\"Remove from sidebar\" dragTiddler=<<currentTiddler>> class=\"tc-btn-invisible\">\n<$fieldmangler tiddler=<<currentTiddler>>>\n<$action-sendmessage $message=\"tm-remove-tag\" $param=\"$:/tags/SideBar\"/>\n</$fieldmangler>{{$:/core/images/close-button}}</$button>\n</div>\n</div>\n<$list variable=\"checker\" filter=\"[<config-title-sidebar>!text[hide]]\">\n<div class=\"jd-sidebar-column-header-border\"></div>\n<div class=\"jd-sidebar-column-body\">\n\n<$transclude/>\n\n</div>\n</$list>\n</div>\n</$droppable>\n</$list>\n<div style=\"height:32px;\">\n</div>\n</div>",
"title": "$:/themes/jd/Whitespace/template/sidebar",
"tags": "$:/tags/PageTemplate",
"modifier": "jd",
"modified": "20180826115839800"
},
"$:/themes/jd/Whitespace/Stylesheet": {
"created": "20171127170053658",
"creator": "JD",
"text": "\\define wsconfig(name) $:/config/Whitespace/$name$\n\\define ws-sidebar-op() <$list filter=\"[[$:/themes/jd/Whitespace/config]text[right]]\" emptyMessage=\"right\">left</$list>\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { \n\n<$reveal state=<<wsconfig ThemeEditFrame>> type=\"match\" text=\"yes\" default=\"yes\">\n\n\n/** NO BOX SHADOW ON INPUTS **/\n\n.tc-tiddler-edit-frame .tc-edit-field-add input.tc-edit-texteditor, \n.tc-tiddler-edit-frame text, \n.tc-tiddler-edit-frame textarea, \n.tc-tiddler-edit-frame .tc-edit-tags, \n.tc-tiddler-edit-frame textarea.tc-edit-texteditor {\n -moz-box-shadow: none !important;\n -ms-box-shadow: none !important;\n -o-box-shadow: none !important;\n -webkit-box-shadow: none !important;\n box-shadow: none !important;\n}\n\n.tc-tiddler-edit-frame input.tc-titlebar.tc-edit-texteditor,\n.tc-tiddler-edit-frame .tc-edit-tags, \n.tc-tiddler-edit-frame text, \n.tc-tiddler-edit-frame textarea, \n.tc-tiddler-edit-frame textarea.tc-edit-texteditor { border: none !important; }\n\n\n/** EDIT TIDDLER **/\n\n.tc-tiddler-edit-frame input.tc-titlebar.tc-edit-texteditor {\n -moz-box-shadow: none !important;\n -ms-box-shadow: none !important;\n -o-box-shadow: none !important;\n -webkit-box-shadow: none !important;\n box-shadow: none !important;\n padding: .25em .5em !important;\n font-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}}; \n font-weight: normal;\n}\n\n.tc-tiddler-edit-frame .tc-edit-tags, \n.tc-tiddler-edit-frame .tc-editor-toolbar,\n.tc-tiddler-edit-frame .tc-type-selector,\n.tc-tiddler-edit-frame .tc-edit-field-add {\n background-color: <<colour tiddler-editor-background>>;\n padding: 8px 4px;\n}\n\n.tc-tiddler-edit-frame input.tc-edit-texteditor,\n.tc-tiddler-edit-frame .tc-edit-tags, \n.tc-tiddler-edit-frame .tc-editor-toolbar,\n.tc-tiddler-edit-frame .tc-type-selector,\n.tc-tiddler-edit-frame .tc-edit-field-add {\n margin: 0 0 4px 0 !important;\n}\n\n.tc-tiddler-edit-frame iframe.tc-edit-texteditor,\n.tc-tiddler-edit-frame table.tc-edit-fields { margin: 0 !important; }\n\n.tc-tiddler-edit-frame .tc-editor-toolbar { background: <<colour tiddler-editor-border>>; margin-bottom: 0 !important; }\n\n.tc-tiddler-edit-frame .tc-editor-toolbar .tc-btn-invisible { background: transparent; }\n\n.tc-tiddler-edit-frame .tc-editor-toolbar .tc-btn-invisible:hover {\n background: transparent;\n fill: <<colour primary>>;\n}\n\n</$reveal>\n\n\n.borderless { border: none !important; }\n\ntextarea.large-textarea { \n min-height: 100px;\n width: 100%;\n max-width: 100%;\n border: 1px solid <<colour table-border>> !important;\n}\n\ninput.scene-textarea { \n border: 1px solid <<colour table-border>> !important;\n}\n\n.tc-tiddler-frame {\n width: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}} !important;\n border-radius: {{!!box-radius}};\n margin-left: auto;\n margin-right: auto;\n <<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.09)\">>\n}\n\n.tc-storyview-zoomin-tiddler {\n position: relative !important;\n width: calc({{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}} - 84px) !important;\n}\n\n\n/** CARD BUTTONS **/\n\n.jd-sidebar-column-header > .tc-btn-invisible {\n color: <<colour foreground>>;\n margin-top: -3px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n<$reveal state=<<wsconfig Spacious>> type=\"match\" text=\"yes\" default=\"yes\">\n.tc-tiddler-view-frame .tc-tiddler-controls svg {\n opacity: 0; \n <<transition \"opacity 150ms ease-in-out\">>\n}\n\n.tc-tiddler-view-frame .tc-tiddler-controls:hover svg { opacity: 1; }\n</$reveal>\n\n/** FONT SIZES **/\n\n.jd-buttons .tc-btn-invisible { font-size: 18px; }\n.jd-sidebar:hover .jd-header .tc-btn-invisible, \n.jd-sidebar .header-buttons .tc-btn-invisible { font-size: 16px; }\n.jd-header .tc-btn-invisible,\n.jd-sidebar .jd-header .tc-btn-invisible,\n.vertical-controls .tc-btn-invisible { font-size: 20px; }\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">\n.jd-sidebar .jd-header .tc-btn-invisible { font-size: 16px; }\n</$reveal>\n\n\n<$reveal state=<<wsconfig Spacious>> type=\"match\" text=\"yes\" default=\"yes\">\n\n/** AUTOHIDE VERTICAL BUTTONS **/\n\n.vertical-controls {\n opacity: 0;\n <<transition \"opacity 150ms ease-in-out\">>\n}\n\n.vertical-controls:hover {\n opacity: 1;\n}\n\n</$reveal>\n\n\n/** STORY RIVER **/\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">\n.tc-story-river { padding: 42px 2em !important; }\n</$reveal>\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"no\" default=\"yes\">\n.tc-story-river { padding: 42px 10% !important; }\n</$reveal>\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">\n.tc-story-river {\n {{$:/themes/jd/Whitespace/config!!sidebar-position}}: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}} !important;\n width: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}}) !important;\n}\n.jd-sidebar { opacity: 1; }\n</$reveal>\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"no\" default=\"yes\">\n\n.tc-story-river { width: 100% !important; }\n\n</$reveal>\n\n.tc-tiddler-body {\n margin-top: 10px;\n padding-right: 10px;\n padding-bottom: 20px;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n\n/** VERTICAL CONTROLS **/\n\n.jd-header {\n width: 50px;\n height: 50px;\n position: fixed;\n top: 0;\n overflow: hidden;\n {{$:/themes/jd/Whitespace/config!!sidebar-position}}: 0;\n padding: 15px;\n z-index: 700;\n}\n\n<$reveal state=<<wsconfig Spacious>> type=\"match\" text=\"yes\" default=\"yes\">\n\n.jd-header .header-buttons {\n opacity: 0;\n -webkit-transition: opacity {{$:/config/AnimationDuration}}ms;\n transition: opacity {{$:/config/AnimationDuration}}ms;\n}\n\n.jd-header:hover .header-buttons { opacity: 1; }\n\n</$reveal>\n\n.jd-header .header-buttons .tc-image-button {\n width: 0;\n height: 0;\n}\n\n.jd-sidebar:hover .header-buttons .tc-image-button {\n width: 1em;\n height: 1em;\n margin: 0 0 0 10px;\n}\n\n.jd-header .tc-btn-invisible {\n fill: <<colour sidebar-controls-foreground>>;\n -webkit-transition: fill {{$:/config/AnimationDuration}}ms, font-size {{$:/config/AnimationDuration}}ms;\n transition: fill {{$:/config/AnimationDuration}}ms, font-size {{$:/config/AnimationDuration}}ms;\n}\n\n.jd-sidebar:hover .jd-header {\n width: calc({{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}} - 1.5em);\n height: 39px;\n background: <<colour page-background>>;\n padding: 10px 20px;\n -webkit-transition: width {{$:/config/AnimationDuration}}ms;\n transition: width {{$:/config/AnimationDuration}}ms;\n}\n\n<$reveal state=\"$:/themes/jd/Whitespace/config!!sidebar-position\" type=\"match\" text=\"left\" default=\"right\">\n.jd-sidebar:hover .jd-header {\n box-shadow: -5px 0 5px 0 <<colour page-background>>;\n}\n</$reveal>\n\n<$reveal state=\"$:/themes/jd/Whitespace/config!!sidebar-position\" type=\"match\" text=\"right\" default=\"right\">\n.jd-sidebar:hover .jd-header {\n box-shadow: 5px 0 5px 0 <<colour page-background>>;\n margin-right: calc(1.5em - 1px);\n}\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">\n.jd-header {\n margin-right: calc(1.5em - 1px);\n}\n</$reveal>\n</$reveal>\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">\n.jd-sidebar .jd-header {\n width: calc({{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}} - 1.5em);\n height: 39px;\n background: <<colour page-background>>;\n padding: 10px 20px;\n}\n.jd-sidebar .header-buttons .tc-image-button {\n width: 1em;\n height: 1em;\n margin: 0 0 0 10px;\n}\n</$reveal>\n\n.vertical-controls {\n background: <<colour page-background>>;\n position: fixed;\n top: 50px;\n {{$:/themes/jd/Whitespace/config!!sidebar-position}}: 0;\n width: 50px;\n height: calc(100% - 50px);\n padding: 5px 15px;\n z-index: 600;\n}\n\n.vertical-controls button {\n margin-bottom: 15px;\n outline: none;\n}\n\n.vertical-controls .tc-btn-invisible {\n fill: <<colour sidebar-controls-foreground>>;\n <<transition \"fill 150ms ease-in-out\">>\n}\n\n.jd-header .tc-droppable.tc-dragover > .tc-droppable-placeholder { display: inline; }\n\n\n/** STYLED SIDEBAR **/\n\n.jd-sitetitle-wrapper { text-align: center; }\n\n.jd-sitetitle { font-size: 2em; padding: 0.2em 0; }\n\n.jd-sitesubtitle { padding-bottom: 2em; }\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"no\">\n\n.jd-sitetitle-wrapper { opacity: 0; }\n\n.jd-sidebar:hover .jd-sitetitle-wrapper { opacity: 1; }\n\n</$reveal>\n\n<$reveal state=\"$:/SiteSubtitle\" type=\"match\" text=\"\">\n\n.jd-sitetitle { padding-bottom: 1em; }\n\n</$reveal>\n\n.jd-sidebar p {\n margin: 5px 0;\n}\n\n.jd-sidebar {\n background: <<colour page-background>>;\n height: 50px;\n display: inline-block;\n position: fixed;\n top: 0;\n {{$:/themes/jd/Whitespace/config!!sidebar-position}}: 0;\n justify-content: center;\n z-index: 800;\n -webkit-transition: width {{$:/config/AnimationDuration}}ms, height {{$:/config/AnimationDuration}}ms;\n transition: width {{$:/config/AnimationDuration}}ms, height {{$:/config/AnimationDuration}}ms;\n}\n\n.jd-sidebar:hover {\n width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n border-<<ws-sidebar-op>>: 1px solid<<colour page-background>>;\n padding: 42px 20px 0 20px;\n height: 100%;\n overflow-y: auto;\n}\n<$reveal state=\"$:/themes/jd/Whitespace/config!!sidebar-position\" type=\"match\" text=\"left\" default=\"right\">\n.jd-sidebar:hover {\n <<box-shadow \"6px 0 20px 0 rgba(0, 0, 0, 0.1)\">>\n}\n</$reveal>\n<$reveal state=\"$:/themes/jd/Whitespace/config!!sidebar-position\" type=\"match\" text=\"right\" default=\"right\">\n.jd-sidebar:hover {\n <<box-shadow \"-6px 0 20px 0 rgba(0, 0, 0, 0.1)\">>\n}\n</$reveal>\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">\n.jd-sidebar {\n width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n padding: 42px 20px 0 20px;\n border-<<ws-sidebar-op>>: 1px solid<<colour page-background>>;\n height: 100%;\n overflow-y: auto;\n}\n.jd-sidebar-column { opacity: 1; }\n<$reveal state=\"$:/themes/jd/Whitespace/config!!sidebar-position\" type=\"match\" text=\"left\">\n.jd-sidebar {\n <<box-shadow \"6px 0 20px 0 rgba(0, 0, 0, 0.1)\">>\n}\n</$reveal>\n<$reveal state=\"$:/themes/jd/Whitespace/config!!sidebar-position\" type=\"match\" text=\"right\" default=\"right\">\n.jd-sidebar {\n <<box-shadow \"-6px 0 20px 0 rgba(0, 0, 0, 0.1)\">>\n}\n</$reveal>\n</$reveal>\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"no\" default=\"yes\">\n.jd-sidebar {\n width: 50px;\n overflow: hidden;\n}\n.jd-sidebar-column {\n opacity: 0;\n}\n</$reveal>\n\n.jd-sidebar-column {\n display: block;\n background: <<colour background>>;\n padding: 10px;\n margin-bottom: 10px;\n border: 1px solid <<colour tiddler-border>>;\n border-radius: {{!!box-radius}};\n <<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.09)\">>\n overflow: hidden;\n -webkit-transition: opacity {{$:/config/AnimationDuration}}ms;\n transition: opacity {{$:/config/AnimationDuration}}ms;\n}\n\n.jd-sidebar-column-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 2px 0;\n overflow: hidden;\n}\n\n.jd-sidebar-column-header-border {\n height: 10px;\n width: 100%;\n border-top: 1px solid <<colour table-border>>;\n margin-top: 8px;\n}\n\n.jd-sidebar-column-header .jd-sidebar-column-header-buttons {\n display: flex;\n align-items: flex-end;\n}\n\n.jd-sidebar-column-header .jd-sidebar-column-header-buttons button {\n margin-left: 6px;\n}\n\n<$reveal state=<<wsconfig Spacious>> type=\"match\" text=\"yes\" default=\"yes\">\n.jd-sidebar-column-header .jd-sidebar-column-header-buttons {\n opacity: 0;\n <<transition \"opacity 150ms ease-in-out\">>\n}\n.jd-sidebar-column-header:hover .jd-sidebar-column-header-buttons { opacity: 1; }\n</$reveal>\n\n<$reveal type=\"match\" state=<<wsconfig SidebarHeight>> text=\"limit\" default=\"limit\">\n.jd-sidebar-column-body {\n max-height: <$list filter=\"[[$:/config/Whitespace/SidebarHeight]!height[]]\" emptyMessage=\"300px\">{{$:/config/Whitespace/SidebarHeight!!height}}</$list>;\n overflow-y: auto;\n overflow-x: hidden;\n}\n</$reveal>\n\n.jd-sidebar:hover .jd-sidebar-column {\n opacity: 1;\n}\n\n.tc-droppable {\n padding: 0;\n margin: 0;\n}\n\n.tc-sidebar-scrollable,\n.jd-config,\n.tc-topbar,\n.tc-bottombar { \n width: 0; \n height: 0; \n margin: 0; \n padding: 0; \n display: none; \n}\n\n\n/** POPUPS AND DROPDOWNS **/\n\n.jd-sidebar .tc-drop-down,\n.tc-tiddler-frame .tc-drop-down,\n.tc-tiddler-frame .tc-block-dropdown {\n overflow: auto;\n <<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.09)\">>\n}\n\n.jd-sidebar .tc-drop-down {\n position: fixed;\n {{$:/themes/jd/Whitespace/config!!sidebar-position}}: 20px;\n top: 50px;\n min-width: calc({{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}} - 40px) !important;\n max-width: calc({{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}} - 40px) !important;\n max-height: 360px !important;\n}\n\n.tc-tiddler-frame .tc-drop-down,\n.tc-tiddler-frame .tc-block-dropdown {\n min-width: 230px !important;\n max-height: 230px !important;\n}\n\n.tc-menu-list-item {\n -webkit-word-break: break-all !important;\n -moz-word-break: break-all !important;\n -ms-word-break: break-all !important;\n -o-word-break: break-all !important;\n word-break: break-all !important;\n}\n\n.tc-edit-type-dropdown { overflow: auto; }\n\n\n/** BUTTONS **/\n\n.jd-sidebar-column .tc-btn-invisible,\n.jd-edit-title-controls .tc-btn-invisible {\n fill: <<colour sidebar-controls-foreground>>;\n <<transition \"fill 150ms ease-in-out\">>\n}\n\n.vertical-controls .tc-btn-invisible:hover,\n.jd-edit-title-controls .tc-btn-invisible:hover,\n.jd-sidebar .tc-btn-invisible:hover,\n.jd-sidebar-column .tc-btn-invisible:hover {\n fill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n\n/** NOTIFICATION **/\n\n<$reveal type=\"nomatch\" state=\"$:/themes/jd/Whitespace/config!!sidebar-position\" text=\"left\">\n.tc-notification { left: 14px; width: initial; }\n</$reveal>\n\n\n/** SCROLLBARS **/\n\n<$reveal state=<<wsconfig scrollbar-style>> type=\"match\" text=\"visible\" default=\"visible\">\n.tc-tiddler-frame .tc-drop-down::-webkit-scrollbar,\n.tc-tiddler-frame .tc-block-dropdown::-webkit-scrollbar,\ndiv::-webkit-scrollbar {\n background: transparent;\n width: 6px;\n}\n\n.tc-tiddler-frame .tc-drop-down::-webkit-scrollbar-thumb,\n.tc-tiddler-frame .tc-block-dropdown::-webkit-scrollbar-thumb,\ndiv::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.3); \n -webkit-border-radius: {{!!box-radius}};\n border-radius: {{!!box-radius}};\n}\n\n.jd-sidebar::-webkit-scrollbar-thumb {\n background: <<colour primary>>; \n}\n</$reveal>\n<$reveal state=<<wsconfig scrollbar-style>> type=\"match\" text=\"invisible\" default=\"visible\">\n.tc-tiddler-frame .tc-drop-down::-webkit-scrollbar,\n.tc-tiddler-frame .tc-block-dropdown::-webkit-scrollbar,\n.jd-sidebar::-webkit-scrollbar,\ndiv::-webkit-scrollbar {\n background: transparent;\n width: 0;\n}\n</$reveal>\n\n\n/** SIDEBAR SEARCH **/\n\n.jd-search-wrapper {\n width: 100%;\n display: inline-block;\n}\n\n.jd-search-header {\n background: <<colour background>>;\n display: flex;\n justify-content: space-between;\n}\n\n.jd-searchbar-wrapper { width: 100%; }\n\n.jd-searchbar-buttons {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n width: 120px;\n}\n\n.jd-searchbar {\n width: 100%;\n outline: none !important;\n border: none !important;\n background: transparent !important;\n}\n\n.jd-search-results {\n margin-top: 10px;\n padding-right: 15px;\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n<$reveal type=\"match\" state=<<wsconfig SidebarHeight>> text=\"limit\" default=\"limit\">\n.jd-search-results { max-height: <$list filter=\"[<$:/config/Whitespace/SidebarHeight>!height[]]\" emptyMessage=\"300px\">{{$:/config/Whitespace/SidebarHeight!!height}}</$list>; }\n</$reveal>\n\n.jd-searchbar-buttons button {\n outline: none;\n margin-left: 10px;\n}\n\n.jd-searchbar-buttons .tc-btn-invisible {\n fill: <<colour sidebar-controls-foreground>>;\n <<transition \"fill 150ms ease-in-out\">>\n}\n\n.jd-searchbar-buttons .tc-btn-invisible:hover {\n fill: <<colour sidebar-controls-foreground-hover>>;\n color: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.jd-search-results .tc-menu-list-item {\n white-space: normal;\n word-wrap: break-word;\n padding-left: 5px;\n text-indent: -5px;\n}\n\n\n/** SIDEBAR CONTROLS**/\n\n.jd-buttons { \n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-start;\n}\n\n.jd-buttons > .tc-reveal {\n min-width: 0 !important;\n width: 20% !important;\n text-align: center;\n}\n\n.jd-buttons > .tc-btn-invisible {\n margin: 5px 0;\n outline: none;\n fill: <<colour sidebar-controls-foreground>>;\n <<transition \"fill 150ms ease-in-out\">>\n}\n\n.jd-buttons > .tc-btn-invisible:hover {\n fill: <<colour sidebar-controls-foreground-hover>>;\n}\n\nbutton, button:hover { outline: none; }\n\ninput, input:focus { outline: none !important; }\n\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { \n\n.jd-sidebar, .vertical-controls { display: none; }\n.tc-titlebar text, input.tc-titlebar.tc-edit-texteditor { font-size: 18px; }\n\n}",
"title": "$:/themes/jd/Whitespace/Stylesheet",
"tags": "$:/tags/Stylesheet",
"modifier": "jd",
"modified": "20180826124908994",
"box-radius": "1px"
},
"$:/themes/jd/Whitespace/readme": {
"text": "This theme uses an overhauled sidebar, which can be accessed via a hamburger button at the topright or topleft of the screen. I turned this into a theme just to make it easier for me to move it around my TW5's. \n\n''The hamburger button:''\n\n* When the sidebar is minimized, hovering on the hamburger button will expand the sidebar. The sidebar will minimize when it loses mouse focus. Clicking on the hamburger button will make the sidebar \"sticky\" until it is clicked again.\n\n* Below the hamburger button (when sidebar is minimized) are the usual Page Control buttons. \n\n''Changes to the sidebar:''\n\n# Minimize-able via the hamburger button\n# Movable to the left or the right of the screen\n# Sidebar tabs are turned into draggable, removable, and minimize-able \"card\"-things\n\n''Changes to the sidebar tabs:''\n\n# Draggable = click on the card title + drag above or below other \"cards\" in the sidebar\n# Removable = hover on card title + click the right-most button that appears\n# Minimize-able = click on the card title (expand by clicking again)\n* The card title is the \"caption\" of the tiddler. Otherwise, it's the tiddler title\n\n''~PageControls:''\n\n* ~PageControls appear beside the hamburger button on hover (when sidebar is expanded), or below it when sidebar is \"minimized\"\n\n//Note:// \n\nThis theme is best used with [[Very Simple Mobile Layout (plugin)|http://j.d.tiddlyspot.com/#Very%20Simple%20Mobile%20Layout%20(plugin)]].\n\n<a target=\"blank\" href=\"http://j.d.whitespace.tiddlyspot.com\">Project Homepage on Tiddlyspot</a>",
"title": "$:/themes/jd/Whitespace/readme",
"modifier": "jd",
"modified": "20180826055758382",
"creator": "JD",
"created": "20180203113849420"
},
"$:/themes/jd/Whitespace/config": {
"created": "20171203134043686",
"creator": "JD",
"title": "$:/themes/jd/Whitespace/config",
"text": "\\define wsconfig(name) $:/config/Whitespace/$name$\n\\define config-base() $:/config/SideBar/Visibility/\n\\define config-title-sidebar()\n$(config-base)$$(currentTiddler)$\n\\end\n\\define drop-actions()\n<$action-listops $tiddler=\"$:/tags/SideBar\" $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n<style>\n.tc-control-panel table input[type=\"radio\"] { width: auto; }\n.ws-select-button {\n display: inline-flex;\n width: 1em;\n height: 1em;\n border-radius: 50%;\n border: 1px solid <<colour primary>>;\n}\n.ws-disabled-btn {\n background: <<colour muted-background>>;\n}\n.ws-enabled-btn {\n background: <<colour primary>>;\n}\n</style>\n\n<table width=\"99%\">\n<tr>\n<td>\nSidebar width:\n</td>\n<td>\n<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\" tag=\"input\"/>\n</td>\n</tr>\n<tr>\n<td>\nTiddler width:\n</td>\n<td>\n<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" tag=\"input\"/>\n</td>\n</tr>\n<tr>\n<td>\nLimit sidebar card height:\n</td>\n<td>\n<$checkbox tiddler=<<wsconfig SidebarHeight>> field=\"text\" checked=\"limit\" unchecked=\"full\" default=\"limit\"/>\n<$list filter=\"[[$:/config/Whitespace/SidebarHeight]text[limit]]\"><$edit-text tiddler=<<wsconfig SidebarHeight>> field=\"height\" tag=\"input\" placeholder=\"300px\"/></$list>\n</td>\n</tr>\n<tr>\n<td>\nVisible scrollbars:\n</td>\n<td>\n<$checkbox tiddler=<<wsconfig scrollbar-style>> field=\"text\" checked=\"visible\" unchecked=\"invisible\" default=\"visible\"/>\n</td>\n</tr>\n<tr>\n<td>\nShow Sitetitle and Subtitle:\n</td>\n<td>\n<$checkbox tiddler=<<wsconfig show-sitetitle>> field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"/>\n</td>\n</tr>\n<tr>\n<td>\nShow buttons on hover:\n</td>\n<td>\n<$checkbox tiddler=<<wsconfig Spacious>> field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"/>\n</td>\n</tr>\n<tr>\n<td>\nTheme the tiddler edit mode:\n</td>\n<td>\n<$checkbox tiddler=<<wsconfig ThemeEditFrame>> field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"/>\n</td>\n</tr>\n<tr>\n<td>\nSidebar position:\n</td>\n<td>\n<$radio tiddler=\"$:/themes/jd/Whitespace/config\" field=\"sidebar-position\" value=\"left\"> left</$radio><br>\n<$radio tiddler=\"$:/themes/jd/Whitespace/config\" field=\"sidebar-position\" value=\"right\"> right</$radio>\n</td>\n</tr>\n</table>",
"tags": "$:/tags/ControlPanel/Appearance",
"sidebar-position": "left",
"modifier": "jd",
"modified": "20180826103034713",
"caption": "Whitespace tweaks"
}
}
}
\define wsconfig(name) $:/config/Whitespace/$name$
\define config-base() $:/config/SideBar/Visibility/
\define config-title-sidebar()
$(config-base)$$(currentTiddler)$
\end
\define drop-actions()
<$action-listops $tiddler="$:/tags/SideBar" $subfilter="+[insertbefore:currentTiddler<actionTiddler>]"/>
\end
<style>
.tc-control-panel table input[type="radio"] { width: auto; }
.ws-select-button {
display: inline-flex;
width: 1em;
height: 1em;
border-radius: 50%;
border: 1px solid <<colour primary>>;
}
.ws-disabled-btn {
background: <<colour muted-background>>;
}
.ws-enabled-btn {
background: <<colour primary>>;
}
</style>
<table width="99%">
<tr>
<td>
Sidebar width:
</td>
<td>
<$edit-text tiddler="$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth" tag="input"/>
</td>
</tr>
<tr>
<td>
Tiddler width:
</td>
<td>
<$edit-text tiddler="$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth" tag="input"/>
</td>
</tr>
<tr>
<td>
Limit sidebar card height:
</td>
<td>
<$checkbox tiddler=<<wsconfig SidebarHeight>> field="text" checked="limit" unchecked="full" default="limit"/>
<$list filter="[[$:/config/Whitespace/SidebarHeight]text[limit]]"><$edit-text tiddler=<<wsconfig SidebarHeight>> field="height" tag="input" placeholder="300px"/></$list>
</td>
</tr>
<tr>
<td>
Visible scrollbars:
</td>
<td>
<$checkbox tiddler=<<wsconfig scrollbar-style>> field="text" checked="visible" unchecked="invisible" default="visible"/>
</td>
</tr>
<tr>
<td>
Show Sitetitle and Subtitle:
</td>
<td>
<$checkbox tiddler=<<wsconfig show-sitetitle>> field="text" checked="yes" unchecked="no" default="yes"/>
</td>
</tr>
<tr>
<td>
Show buttons on hover:
</td>
<td>
<$checkbox tiddler=<<wsconfig Spacious>> field="text" checked="yes" unchecked="no" default="yes"/>
</td>
</tr>
<tr>
<td>
Theme the tiddler edit mode:
</td>
<td>
<$checkbox tiddler=<<wsconfig ThemeEditFrame>> field="text" checked="yes" unchecked="no" default="yes"/>
</td>
</tr>
<tr>
<td>
Sidebar position:
</td>
<td>
<$radio tiddler="$:/themes/jd/Whitespace/config" field="sidebar-position" value="left"> left</$radio><br>
<$radio tiddler="$:/themes/jd/Whitespace/config" field="sidebar-position" value="right"> right</$radio>
</td>
</tr>
</table>
{
"tiddlers": {
"$:/themes/tiddlywiki/snowwhite/base": {
"title": "$:/themes/tiddlywiki/snowwhite/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-sidebar-header {\n\ttext-shadow: 0 1px 0 <<colour sidebar-foreground-shadow>>;\n}\n\n.tc-tiddler-info {\n\t<<box-shadow \"inset 1px 2px 3px rgba(0,0,0,0.1)\">>\n}\n\n@media screen {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n\t}\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow none>>\n\t}\n}\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected,\n.tc-page-controls button.tc-selected {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-edit-tags {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\n\t<<box-shadow \"none\">>\n\tborder: none;\n\toutline: none;\n}\n\ntextarea.tc-edit-texteditor {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\ncanvas.tc-edit-bitmapeditor {\n\t<<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\n\tborder-top: none;\n\theight: 1px;\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%\">>\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n.tc-plugin-info {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n"
}
}
}
{
"tiddlers": {
"$:/themes/tiddlywiki/vanilla/themetweaks": {
"title": "$:/themes/tiddlywiki/vanilla/themetweaks",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ThemeTweaks/ThemeTweaks}}",
"text": "\\define lingo-base() $:/language/ThemeTweaks/\n\n\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n\\define backgroundimage-dropdown()\n<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"\n\t$value=<<imageTitle>>\n/>\n\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n\\end\n\n\\define backgroundimageattachment-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\" default=\"scroll\">\n<option value=\"scroll\"><<lingo Settings/BackgroundImageAttachment/Scroll>></option>\n<option value=\"fixed\"><<lingo Settings/BackgroundImageAttachment/Fixed>></option>\n</$select>\n\\end\n\n\\define backgroundimagesize-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\" default=\"scroll\">\n<option value=\"auto\"><<lingo Settings/BackgroundImageSize/Auto>></option>\n<option value=\"cover\"><<lingo Settings/BackgroundImageSize/Cover>></option>\n<option value=\"contain\"><<lingo Settings/BackgroundImageSize/Contain>></option>\n</$select>\n\\end\n\n<<lingo ThemeTweaks/Hint>>\n\n! <<lingo Options>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><<lingo Options/SidebarLayout>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><option value=\"fixed-fluid\"><<lingo Options/SidebarLayout/Fixed-Fluid>></option><option value=\"fluid-fixed\"><<lingo Options/SidebarLayout/Fluid-Fixed>></option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><<lingo Options/StickyTitles>></$link><br>//<<lingo Options/StickyTitles/Hint>>// |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><option value=\"no\">{{$:/language/No}}</option><option value=\"yes\">{{$:/language/Yes}}</option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><<lingo Options/CodeWrapping>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><option value=\"pre\">{{$:/language/No}}</option><option value=\"pre-wrap\">{{$:/language/Yes}}</option></$select> |\n\n! <<lingo Settings>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"><<lingo Settings/FontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\"><<lingo Settings/CodeFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"><<lingo Settings/BackgroundImage>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" default=\"\" tag=\"input\"/> |<<backgroundimage-dropdown>> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\"><<lingo Settings/BackgroundImageAttachment>></$link> |<<backgroundimageattachment-dropdown>> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\"><<lingo Settings/BackgroundImageSize>></$link> |<<backgroundimagesize-dropdown>> | |\n\n! <<lingo Metrics>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\"><<lingo Metrics/FontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\"><<lingo Metrics/LineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\"><<lingo Metrics/BodyFontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\"><<lingo Metrics/BodyLineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\"><<lingo Metrics/StoryLeft>></$link><br>//<<lingo Metrics/StoryLeft/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\"><<lingo Metrics/StoryTop>></$link><br>//<<lingo Metrics/StoryTop/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\"><<lingo Metrics/StoryRight>></$link><br>//<<lingo Metrics/StoryRight/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\"><<lingo Metrics/StoryWidth>></$link><br>//<<lingo Metrics/StoryWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"><<lingo Metrics/TiddlerWidth>></$link><br>//<<lingo Metrics/TiddlerWidth/Hint>>//<br> |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\"><<lingo Metrics/SidebarBreakpoint>></$link><br>//<<lingo Metrics/SidebarBreakpoint/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\"><<lingo Metrics/SidebarWidth>></$link><br>//<<lingo Metrics/SidebarWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\" default=\"\" tag=\"input\"/> |\n"
},
"$:/themes/tiddlywiki/vanilla/base": {
"title": "$:/themes/tiddlywiki/vanilla/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\define custom-background-datauri()\n<$set name=\"background\" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>\n<$list filter=\"[<background>is[image]]\">\n`background: url(`\n<$list filter=\"[<background>!has[_canonical_uri]]\">\n`\"`<$macrocall $name=\"datauri\" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>`\"`\n</$list>\n<$list filter=\"[<background>has[_canonical_uri]]\">\n`\"`<$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field=\"_canonical_uri\"/>`\"`\n</$list>\n`) center center;`\n`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;\n-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\nbackground-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`\n</$list>\n</$set>\n\\end\n\n\\define if-fluid-fixed(text,hiddenSidebarText)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$hiddenSidebarText$\n</$reveal>\n</$reveal>\n\\end\n\n\\define if-editor-height-fixed(then,else)\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n$then$\n</$reveal>\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n$else$\n</$reveal>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\n*, input[type=\"search\"] {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n}\n\nhtml button {\n\tline-height: 1.2;\n\tcolor: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\tword-wrap: break-word;\n\t<<custom-background-datauri>>\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tfill: <<colour foreground>>;\n}\n\n<<if-background-attachment \"\"\"\n\nbody.tc-body {\n background-color: transparent;\n}\n\n\"\"\">>\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tpadding: 14px;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\ncode {\n\tcolor: <<colour code-foreground>>;\n\tbackground-color: <<colour code-background>>;\n\tborder: 1px solid <<colour code-border>>;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\nblockquote {\n\tborder-left: 5px solid <<colour blockquote-bar>>;\n\tmargin-left: 25px;\n\tpadding-left: 10px;\n\tquotes: \"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";\n}\n\nblockquote > div {\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\nblockquote.tc-big-quote {\n\tfont-family: Georgia, serif;\n\tposition: relative;\n\tbackground: <<colour pre-background>>;\n\tborder-left: none;\n\tmargin-left: 50px;\n\tmargin-right: 50px;\n\tpadding: 10px;\n border-radius: 8px;\n}\n\nblockquote.tc-big-quote cite:before {\n\tcontent: \"\\2014 \\2009\";\n}\n\nblockquote.tc-big-quote:before {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: open-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n left: -50px;\n top: 42px;\n}\n\nblockquote.tc-big-quote:after {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: close-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n right: -80px;\n bottom: -20px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\nbutton, textarea, input, select {\n\toutline-color: <<colour primary>>;\n}\n\ntextarea,\ninput[type=text],\ninput[type=search],\ninput[type=\"\"],\ninput:not([type]) {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour background>>;\n}\n\ninput[type=\"checkbox\"] {\n vertical-align: middle;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\nsvg.tc-image-button {\n\tpadding: 0px 1px 1px 0px;\n}\n\n.tc-icon-wrapper > svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\nkbd {\n\tdisplay: inline-block;\n\tpadding: 3px 5px;\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tcolor: <<colour foreground>>;\n\tvertical-align: middle;\n\tbackground-color: <<colour background>>;\n\tborder: solid 1px <<colour muted-foreground>>;\n\tborder-bottom-color: <<colour muted-foreground>>;\n\tborder-radius: 3px;\n\tbox-shadow: inset 0 -1px 0 <<colour muted-foreground>>;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tpadding: 0;\n\tborder: none;\n\tbackground-color: inherit;\n\tcolor: inherit;\n}\n\ntable {\n\tborder: 1px solid <<colour table-border>>;\n\twidth: auto;\n\tmax-width: 100%;\n\tcaption-side: bottom;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\t/* next 2 elements needed, since normalize 8.0.1 */\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n}\n\ntable th, table td {\n\tpadding: 0 7px 0 7px;\n\tborder-top: 1px solid <<colour table-border>>;\n\tborder-left: 1px solid <<colour table-border>>;\n}\n\ntable thead tr td, table th {\n\tbackground-color: <<colour table-header-background>>;\n\tfont-weight: bold;\n}\n\ntable tfoot tr td {\n\tbackground-color: <<colour table-footer-background>>;\n}\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-tiddler-frame img,\n.tc-tiddler-frame svg,\n.tc-tiddler-frame canvas,\n.tc-tiddler-frame embed,\n.tc-tiddler-frame iframe {\n\tmax-width: 100%;\n}\n\n.tc-tiddler-body > embed,\n.tc-tiddler-body > iframe {\n\twidth: 100%;\n\theight: 600px;\n}\n\n/*\n** Links\n*/\n\nbutton.tc-tiddlylink,\na.tc-tiddlylink {\n\ttext-decoration: none;\n\tfont-weight: 500;\n\tcolor: <<colour tiddler-link-foreground>>;\n\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\n}\n\n.tc-sidebar-lists a.tc-tiddlylink {\n\tcolor: <<colour sidebar-tiddler-link-foreground>>;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink:hover {\n\tcolor: <<colour sidebar-tiddler-link-foreground-hover>>;\n}\n\nbutton.tc-tiddlylink:hover,\na.tc-tiddlylink:hover {\n\ttext-decoration: underline;\n}\n\na.tc-tiddlylink-resolves {\n}\n\na.tc-tiddlylink-shadow {\n\tfont-weight: bold;\n}\n\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\na.tc-tiddlylink-missing {\n\tfont-style: italic;\n}\n\na.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour external-link-foreground>>;\n\tbackground-color: <<colour external-link-background>>;\n}\n\na.tc-tiddlylink-external:visited {\n\tcolor: <<colour external-link-foreground-visited>>;\n\tbackground-color: <<colour external-link-background-visited>>;\n}\n\na.tc-tiddlylink-external:hover {\n\tcolor: <<colour external-link-foreground-hover>>;\n\tbackground-color: <<colour external-link-background-hover>>;\n}\n\n/*\n** Drag and drop styles\n*/\n\n.tc-tiddler-dragger {\n\tposition: relative;\n\tz-index: -10000;\n}\n\n.tc-tiddler-dragger-inner {\n\tposition: absolute;\n\ttop: -1000px;\n\tleft: -1000px;\n\tdisplay: inline-block;\n\tpadding: 8px 20px;\n\tfont-size: 16.9px;\n\tfont-weight: bold;\n\tline-height: 20px;\n\tcolor: <<colour dragger-foreground>>;\n\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour dragger-background>>;\n\tborder-radius: 20px;\n}\n\n.tc-tiddler-dragger-cover {\n\tposition: absolute;\n\tbackground-color: <<colour page-background>>;\n}\n\n.tc-dropzone {\n\tposition: relative;\n}\n\n.tc-dropzone.tc-dragover:before {\n\tz-index: 10000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour dropzone-background>>;\n\ttext-align: center;\n\tcontent: \"<<lingo DropMessage>>\";\n}\n\n.tc-droppable > .tc-droppable-placeholder {\n\tdisplay: none;\n}\n\n.tc-droppable.tc-dragover > .tc-droppable-placeholder {\n\tdisplay: block;\n\tborder: 2px dashed <<colour dropzone-background>>;\n}\n\n.tc-draggable {\n\tcursor: move;\n}\n\n.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder,\n.tc-links-draggable-list .tc-droppable-placeholder {\n\tline-height: 2em;\n\theight: 2em;\n}\n\n.tc-sidebar-tab-open-item {\n\tposition: relative;\n}\n\n.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg {\n\tfont-size: 0.7em;\n\tfill: <<colour muted-foreground>>;\n}\n\n/*\n** Plugin reload warning\n*/\n\n.tc-plugin-reload-warning {\n\tz-index: 1000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour alert-background>>;\n\ttext-align: center;\n}\n\n/*\n** Buttons\n*/\n\nbutton svg, button img, label svg, label img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n \tcursor: pointer;\n\tcolor: <<colour foreground>>;\n}\n\n.tc-btn-boxed {\n\tfont-size: 0.6em;\n\tpadding: 0.2em;\n\tmargin: 1px;\n\tbackground: none;\n\tborder: 1px solid <<colour tiddler-controls-foreground>>;\n\tborder-radius: 0.25em;\n}\n\nhtml body.tc-body .tc-btn-boxed svg {\n\tfont-size: 1.6666em;\n}\n\n.tc-btn-boxed:hover {\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n}\n\nhtml body.tc-body .tc-btn-boxed:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded {\n\tfont-size: 0.5em;\n\tline-height: 2;\n\tpadding: 0em 0.3em 0.2em 0.4em;\n\tmargin: 1px;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n\tborder-radius: 2em;\n}\n\nhtml body.tc-body .tc-btn-rounded svg {\n\tfont-size: 1.6666em;\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded:hover {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tcolor: <<colour muted-foreground>>;\n}\n\nhtml body.tc-body .tc-btn-rounded:hover svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-icon svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-text {\n\tpadding: 0;\n\tmargin: 0;\n}\n\n/* used for documentation \"fake\" buttons */\n.tc-btn-standard {\n\tline-height: 1.8;\n\tcolor: #667;\n\tbackground-color: #e0e0e0;\n\tborder: 1px solid #888;\n\tpadding: 2px 1px 2px 1px;\n\tmargin: 1px 4px 1px 4px;\n}\n\n.tc-btn-big-green {\n\tdisplay: inline-block;\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: <<colour download-background>>;\n\tcolor: <<colour download-foreground>>;\n\tfill: <<colour download-foreground>>;\n\tborder: none;\n\tborder-radius: 2px;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n\ttext-decoration: none;\n}\n\n.tc-btn-big-green svg,\n.tc-btn-big-green img {\n\theight: 2em;\n\twidth: 2em;\n\tvertical-align: middle;\n\tfill: <<colour download-foreground>>;\n}\n\n.tc-primary-btn {\n \tbackground: <<colour primary>>;\n}\n\n.tc-sidebar-lists input {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-sidebar-lists button {\n\tcolor: <<colour sidebar-button-foreground>>;\n\tfill: <<colour sidebar-button-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini {\n\tcolor: <<colour sidebar-muted-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini:hover {\n\tcolor: <<colour sidebar-muted-foreground-hover>>;\n}\n\nbutton svg.tc-image-button, button .tc-image-button img {\n\theight: 1em;\n\twidth: 1em;\n}\n\n.tc-unfold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 100%;\n\twidth: calc(100% + 2px);\n\tmargin-left: -43px;\n\ttext-align: center;\n\tborder-top: 2px solid <<colour tiddler-info-background>>;\n\tmargin-top: 4px;\n}\n\n.tc-unfold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n\tborder-top: 2px solid <<colour tiddler-info-border>>;\n}\n\n.tc-unfold-banner svg, .tc-fold-banner svg {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n.tc-fold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 23px;\n\ttext-align: center;\n\tmargin-left: -35px;\n\ttop: 6px;\n\tbottom: 6px;\n}\n\n.tc-fold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-unfold-banner {\n\t\tposition: static;\n\t\twidth: calc(100% + 59px);\n\t}\n\n\t.tc-fold-banner {\n\t\twidth: 16px;\n\t\tmargin-left: -16px;\n\t\tfont-size: 0.75em;\n\t}\n\n}\n\n/*\n** Tags and missing tiddlers\n*/\n\n.tc-tag-list-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: 400;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour tag-background>>;\n\tborder-radius: 1em;\n}\n\n.tc-sidebar-scrollable .tc-tag-label {\n\ttext-shadow: none;\n}\n\n.tc-untagged-separator {\n\twidth: 10em;\n\tleft: 0;\n\tmargin-left: 0;\n\tborder: 0;\n\theight: 1px;\n\tbackground: <<colour tab-divider>>;\n}\n\nbutton.tc-untagged-label {\n\tbackground-color: <<colour untagged-background>>;\n}\n\n.tc-tag-label svg, .tc-tag-label img {\n\theight: 1em;\n\twidth: 1em;\n\tmargin-right: 3px; \n\tmargin-bottom: 1px;\n\tvertical-align: text-bottom;\n}\n\n.tc-edit-tags button.tc-remove-tag-button svg {\n\tfont-size: 0.7em;\n\tvertical-align: middle;\n}\n\n.tc-tag-manager-table .tc-tag-label {\n\twhite-space: normal;\n}\n\n.tc-tag-manager-tag {\n\twidth: 100%;\n}\n\nbutton.tc-btn-invisible.tc-remove-tag-button {\n\toutline: none;\n}\n\n/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: 300;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls .tc-drop-down {\n font-size: 1rem;\n}\n\n.tc-page-controls button {\n\tmargin-right: 0.5em;\n}\n\n.tc-page-controls a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-page-controls img {\n\twidth: 1em;\n}\n\n.tc-page-controls svg {\n\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg {\n\tfill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.tc-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\thtml[dir=\"rtl\"] .tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tright: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\n\t\tpadding: 42px 42px 42px 42px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-story-river {\n\t\twidth: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});\n\t}\n\n\">>\n\n}\n\n@media print {\n\n\tbody.tc-body {\n\t\tbackground-color: transparent;\n\t}\n\n\t.tc-sidebar-header, .tc-topbar {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.tc-story-river .tc-tiddler-frame {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tpadding: 0;\n\t}\n}\n\n/*\n** Tiddler styles\n*/\n\n.tc-tiddler-frame {\n\tposition: relative;\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n{{$:/themes/tiddlywiki/vanilla/sticky}}\n\n.tc-tiddler-info {\n\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: 200;\n}\n\n.tc-view-field-value {\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: 300;\n\tfont-size: 2.35em;\n\tline-height: 1.2em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-site-title {\n\tcolor: <<colour site-title-foreground>>;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n\tmargin-right: .1em;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-titlebar h2 {\n\tfont-size: 1em;\n\tdisplay: inline;\n}\n\n.tc-titlebar img {\n\theight: 1em;\n}\n\n.tc-subtitle {\n\tfont-size: 0.9em;\n\tcolor: <<colour tiddler-subtitle-foreground>>;\n\tfont-weight: 300;\n}\n\n.tc-subtitle .tc-tiddlylink {\n\tmargin-right: .3em;\n}\n\n.tc-tiddler-missing .tc-title {\n font-style: italic;\n font-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n}\n\n.tc-tiddler-controls .tc-drop-down {\n\tfont-size: 0.6em;\n}\n\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\n\tfont-size: 1em;\n}\n\n.tc-tiddler-controls > span > button,\n.tc-tiddler-controls > span > span > button,\n.tc-tiddler-controls > span > span > span > button {\n\tvertical-align: baseline;\n\tmargin-left:5px;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img,\n.tc-search button svg, .tc-search a svg {\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n}\n\n.tc-search button svg, .tc-search a svg {\n height: 1.2em;\n width: 1.2em;\n margin: 0 0.25em;\n}\n\n.tc-tiddler-controls button.tc-selected svg,\n.tc-page-controls button.tc-selected svg {\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n}\n\n.tc-tiddler-controls button.tc-btn-invisible:hover svg,\n.tc-search button:hover svg, .tc-search a:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n@media print {\n\t.tc-tiddler-controls {\n\t\tdisplay: none;\n\t}\n}\n\n.tc-tiddler-help { /* Help prompts within tiddler template */\n\tcolor: <<colour muted-foreground>>;\n\tmargin-top: 14px;\n}\n\n.tc-tiddler-help a.tc-tiddlylink {\n\tcolor: <<colour very-muted-foreground>>;\n}\n\n.tc-tiddler-frame .tc-edit-texteditor {\n\twidth: 100%;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor,\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tbackground-color: <<colour tiddler-editor-background>>;\n\tline-height: 1.3em;\n\t-webkit-appearance: none;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\n.tc-tiddler-frame .tc-binary-warning {\n\twidth: 100%;\n\theight: 5em;\n\ttext-align: center;\n\tpadding: 3em 3em 6em 3em;\n\tbackground: <<colour alert-background>>;\n\tborder: 1px solid <<colour alert-border>>;\n}\n\ncanvas.tc-edit-bitmapeditor {\n\tborder: 6px solid <<colour tiddler-editor-border-image>>;\n\tcursor: crosshair;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n}\n\n.tc-edit-bitmapeditor-width {\n\tdisplay: block;\n}\n\n.tc-edit-bitmapeditor-height {\n\tdisplay: block;\n}\n\n.tc-tiddler-body {\n\tclear: both;\n}\n\n.tc-tiddler-frame .tc-tiddler-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\n}\n\n.tc-titlebar, .tc-tiddler-edit-title {\n\toverflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */\n}\n\nhtml body.tc-body.tc-single-tiddler-window {\n\tmargin: 1em;\n\tbackground: <<colour tiddler-background>>;\n}\n\n.tc-single-tiddler-window img,\n.tc-single-tiddler-window svg,\n.tc-single-tiddler-window canvas,\n.tc-single-tiddler-window embed,\n.tc-single-tiddler-window iframe {\n\tmax-width: 100%;\n}\n\n/*\n** Editor\n*/\n\n.tc-editor-toolbar {\n\tmargin-top: 8px;\n}\n\n.tc-editor-toolbar button {\n\tvertical-align: middle;\n\tbackground-color: <<colour tiddler-controls-foreground>>;\n\tcolor: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n\tborder-radius: 4px;\n\tpadding: 3px;\n\tmargin: 2px 0 2px 4px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {\n\tmargin-left: 1px;\n\twidth: 1em;\n\tborder-radius: 8px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {\n\tmargin-left: 11px;\n}\n\n.tc-editor-toolbar button.tc-selected {\n\tbackground-color: <<colour primary>>;\n}\n\n.tc-editor-toolbar button svg {\n\twidth: 1.6em;\n\theight: 1.2em;\n}\n\n.tc-editor-toolbar button:hover {\n\tbackground-color: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour background>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more {\n\twhite-space: normal;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more button {\n\tdisplay: inline-block;\n\tpadding: 3px;\n\twidth: auto;\n}\n\n.tc-editor-toolbar .tc-search-results {\n\tpadding: 0;\n}\n\n/*\n** Adjustments for fluid-fixed mode\n*/\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n<<if-fluid-fixed text:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 0;\n\t\tposition: relative;\n\t\twidth: auto;\n\t\tleft: 0;\n\t\tmargin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 42px);\n\t}\n\n\"\"\" hiddenSidebarText:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 3em;\n\t\tmargin-right: 0;\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 84px);\n\t}\n\n\"\"\">>\n\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n fill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n fill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n fill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n fill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n fill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n fill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n fill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n fill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n fill: <<colour toolbar-done-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-type-selector .tc-edit-typeeditor {\n\twidth: 20%;\n}\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-add-tag .tc-keyboard {\n\tdisplay:inline;\n}\n\n.tc-edit-tags .tc-tag-label {\n\tdisplay: inline-block;\n}\n\n.tc-edit-tags-list {\n\tmargin: 14px 0 14px 0;\n}\n\n.tc-remove-tag-button {\n\tpadding-left: 4px;\n}\n\n.tc-tiddler-preview {\n\toverflow: auto;\n}\n\n.tc-tiddler-preview-preview {\n\tfloat: right;\n\twidth: 49%;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 0 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n<<if-editor-height-fixed then:\"\"\"\n\n.tc-tiddler-preview-preview {\n\toverflow-y: scroll;\n\theight: {{$:/config/TextEditor/EditorHeight/Height}};\n}\n\n\"\"\">>\n\n.tc-tiddler-frame .tc-tiddler-preview .tc-edit-texteditor {\n\twidth: 49%;\n}\n\n.tc-tiddler-frame .tc-tiddler-preview canvas.tc-edit-bitmapeditor {\n\tmax-width: 49%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name {\n\tdisplay: inline-block;\n\twidth: 15%;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n\twidth: 40%;\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-viewswitcher .tc-image-button {\n\tmargin-right: .3em;\n}\n\n.tc-storyview-zoomin-tiddler {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-storyview-zoomin-tiddler {\n\t\twidth: calc(100% - 84px);\n\t}\n\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down .tc-drop-down-info {\n\tpadding-left: 14px;\n}\n\n.tc-drop-down p {\n\tpadding: 0 14px 0 14px;\n}\n\n.tc-drop-down svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-drop-down img {\n\twidth: 1em;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n\tdisplay: block;\n\tpadding: 0 14px 0 14px;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: <<colour foreground>>;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-tab-set .tc-tab-buttons button {\n\tdisplay: inline-block;\n width: auto;\n margin-bottom: 0px;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.tc-drop-down .tc-prompt {\n\tpadding: 0 14px;\n}\n\n.tc-drop-down .tc-chooser {\n\tborder: none;\n}\n\n.tc-drop-down .tc-chooser .tc-swatches-horiz {\n\tfont-size: 0.4em;\n\tpadding-left: 1.2em;\n}\n\n.tc-drop-down .tc-file-input-wrapper {\n\twidth: 100%;\n}\n\n.tc-drop-down .tc-file-input-wrapper button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-tab-buttons button {\n\tbackground-color: <<colour dropdown-tab-background>>;\n}\n\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour dropdown-tab-background-selected>>;\n\tborder-bottom: 1px solid <<colour dropdown-tab-background-selected>>;\n}\n\n.tc-drop-down-bullet {\n\tdisplay: inline-block;\n\twidth: 0.5em;\n}\n\n.tc-drop-down .tc-tab-contents a {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-block-dropdown-wrapper {\n\tposition: relative;\n}\n\n.tc-block-dropdown {\n\tposition: absolute;\n\tmin-width: 220px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\tz-index: 1000;\n\ttext-shadow: none;\n}\n\n.tc-block-dropdown.tc-search-drop-down {\n\tmargin-left: -12px;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-block-dropdown.tc-search-drop-down a {\n\tdisplay: block;\n\tpadding: 0px 10px 0px 10px;\n}\n\n.tc-drop-down .tc-dropdown-item-plain,\n.tc-block-dropdown .tc-dropdown-item-plain {\n\tpadding: 4px 14px 4px 7px;\n}\n\n.tc-drop-down .tc-dropdown-item,\n.tc-block-dropdown .tc-dropdown-item {\n\tpadding: 4px 14px 4px 7px;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-block-dropdown a:hover {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-search-results {\n\tpadding: 0 7px 0 7px;\n}\n\n.tc-image-chooser, .tc-colour-chooser {\n\twhite-space: normal;\n}\n\n.tc-image-chooser a,\n.tc-colour-chooser a {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\ttext-align: center;\n\tposition: relative;\n}\n\n.tc-image-chooser a {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 2px;\n\tmargin: 2px;\n\twidth: 4em;\n\theight: 4em;\n}\n\n.tc-colour-chooser a {\n\tpadding: 3px;\n\twidth: 2em;\n\theight: 2em;\n\tvertical-align: middle;\n}\n\n.tc-image-chooser a:hover,\n.tc-colour-chooser a:hover {\n\tbackground: <<colour primary>>;\n\tpadding: 0px;\n\tborder: 3px solid <<colour primary>>;\n}\n\n.tc-image-chooser a svg,\n.tc-image-chooser a img {\n\tdisplay: inline-block;\n\twidth: auto;\n\theight: auto;\n\tmax-width: 3.5em;\n\tmax-height: 3.5em;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tmargin: auto;\n}\n\n/*\n** Modals\n*/\n\n.tc-modal-wrapper {\n\tposition: fixed;\n\toverflow: auto;\n\toverflow-y: scroll;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 900;\n}\n\n.tc-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 1000;\n\tbackground-color: <<colour modal-backdrop>>;\n}\n\n.tc-modal {\n\tz-index: 1100;\n\tbackground-color: <<colour modal-background>>;\n\tborder: 1px solid <<colour modal-border>>;\n}\n\n@media (max-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 1em;\n\t\tleft: 1em;\n\t\tright: 1em;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 2em;\n\t\tleft: 25%;\n\t\twidth: 50%;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n.tc-modal-header {\n\tpadding: 9px 15px;\n\tborder-bottom: 1px solid <<colour modal-header-border>>;\n}\n\n.tc-modal-header h3 {\n\tmargin: 0;\n\tline-height: 30px;\n}\n\n.tc-modal-header img, .tc-modal-header svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-modal-body {\n\tpadding: 15px;\n}\n\n.tc-modal-footer {\n\tpadding: 14px 15px 15px;\n\tmargin-bottom: 0;\n\ttext-align: right;\n\tbackground-color: <<colour modal-footer-background>>;\n\tborder-top: 1px solid <<colour modal-footer-border>>;\n}\n\n/*\n** Notifications\n*/\n\n.tc-notification {\n\tposition: fixed;\n\ttop: 14px;\n\tright: 42px;\n\tz-index: 1300;\n\tmax-width: 280px;\n\tpadding: 0 14px 0 14px;\n\tbackground-color: <<colour notification-background>>;\n\tborder: 1px solid <<colour notification-border>>;\n}\n\n/*\n** Tabs\n*/\n\n.tc-tab-set.tc-vertical {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tab-buttons {\n\tfont-size: 0.85em;\n\tpadding-top: 1em;\n\tmargin-bottom: -2px;\n}\n\n.tc-tab-buttons.tc-vertical {\n\tz-index: 100;\n\tdisplay: block;\n\tpadding-top: 14px;\n\tvertical-align: top;\n\ttext-align: right;\n\tmargin-bottom: inherit;\n\tmargin-right: -1px;\n\tmax-width: 33%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n}\n\n.tc-tab-buttons button.tc-tab-selected {\n\tcolor: <<colour tab-foreground-selected>>;\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-left: 1px solid <<colour tab-border-selected>>;\n\tborder-top: 1px solid <<colour tab-border-selected>>;\n\tborder-right: 1px solid <<colour tab-border-selected>>;\n}\n\n.tc-tab-buttons button {\n\tcolor: <<colour tab-foreground>>;\n\tpadding: 3px 5px 3px 5px;\n\tmargin-right: 0.3em;\n\tfont-weight: 300;\n\tborder: none;\n\tbackground: inherit;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-right: 1px solid <<colour tab-border>>;\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin-top: 3px;\n\tmargin-right: 0;\n\ttext-align: right;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tborder-right: none;\n\tborder-top-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-right: 1px solid <<colour tab-background-selected>>;\n}\n\n.tc-tab-divider {\n\tborder-top: 1px solid <<colour tab-divider>>;\n}\n\n.tc-tab-divider.tc-vertical {\n\tdisplay: none;\n}\n\n.tc-tab-content {\n\tmargin-top: 14px;\n}\n\n.tc-tab-content.tc-vertical {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-top: 0;\n\tpadding-left: 14px;\n\tborder-left: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 70%;\n\tflex: 1 0 70%;\n\toverflow: auto;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\tdisplay: block;\n\twidth: 100%;\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tborder-top: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tborder-right: 1px solid #ccc;\n\tmargin-bottom: inherit;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Manager\n*/\n\n.tc-manager-wrapper {\n\t\n}\n\n.tc-manager-controls {\n\t\n}\n\n.tc-manager-control {\n\tmargin: 0.5em 0;\n}\n\n.tc-manager-list {\n\twidth: 100%;\n\tborder-top: 1px solid <<colour muted-foreground>>;\n\tborder-left: 1px solid <<colour muted-foreground>>;\n\tborder-right: 1px solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item {\n\n}\n\n.tc-manager-list-item-heading {\n display: block;\n width: 100%;\n text-align: left;\t\n\tborder-bottom: 1px solid <<colour muted-foreground>>;\n\tpadding: 3px;\n}\n\n.tc-manager-list-item-heading-selected {\n\tfont-weight: bold;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n\tbackground-color: <<colour foreground>>;\n}\n\n.tc-manager-list-item-heading:hover {\n\tbackground: <<colour primary>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-manager-list-item-content {\n\tdisplay: flex;\n}\n\n.tc-manager-list-item-content-sidebar {\n flex: 1 0;\n background: <<colour tiddler-editor-background>>;\n border-right: 0.5em solid <<colour muted-foreground>>;\n border-bottom: 0.5em solid <<colour muted-foreground>>;\n white-space: nowrap;\n}\n\n.tc-manager-list-item-content-item-heading {\n\tdisplay: block;\n\twidth: 100%;\n\ttext-align: left;\n background: <<colour muted-foreground>>;\n\ttext-transform: uppercase;\n\tfont-size: 0.6em;\n\tfont-weight: bold;\n padding: 0.5em 0 0.5em 0;\n}\n\n.tc-manager-list-item-content-item-body {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-manager-list-item-content-item-body > pre {\n\tmargin: 0.5em 0 0.5em 0;\n\tborder: none;\n\tbackground: inherit;\n}\n\n.tc-manager-list-item-content-tiddler {\n flex: 3 1;\n border-left: 0.5em solid <<colour muted-foreground>>;\n border-right: 0.5em solid <<colour muted-foreground>>;\n border-bottom: 0.5em solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item-content-item-body > table {\n\tborder: none;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-manager-list-item-content-item-body > table td {\n\tborder: none;\n}\n\n.tc-manager-icon-editor > button {\n\twidth: 100%;\n}\n\n.tc-manager-icon-editor > button > svg,\n.tc-manager-icon-editor > button > button {\n\twidth: 100%;\n\theight: auto;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 28px;\n\tleft: 0;\n\tright: 0;\n\tmax-width: 50%;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 14px;\n\tpadding: 7px;\n\tborder: 1px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 7px;\n\tright: 7px;\n line-height: 0;\n}\n\n.tc-alert-toolbar svg {\n\tfill: <<colour alert-muted-foreground>>;\n}\n\n.tc-alert-subtitle {\n\tcolor: <<colour alert-muted-foreground>>;\n\tfont-weight: bold;\n font-size: 0.8em;\n margin-bottom: 0.5em;\n}\n\n.tc-alert-body > p {\n\tmargin: 0;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-static-alert {\n\t\tposition: relative;\n\t}\n\n\t.tc-static-alert-inner {\n\t\tposition: absolute;\n\t\tz-index: 100;\n\t}\n\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n}\n\n/*\n** Floating drafts list\n*/\n\n.tc-drafts-list {\n\tz-index: 2000;\n\tposition: fixed;\n\tfont-size: 0.8em;\n\tleft: 0;\n\tbottom: 0;\n}\n\n.tc-drafts-list a {\n\tmargin: 0 0.5em;\n\tpadding: 4px 4px;\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n\tborder: 1px solid <<colour background>>;\n\tborder-bottom-none;\n\tbackground: <<colour dirty-indicator>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a:hover {\n\ttext-decoration: none;\n\tbackground: <<colour foreground>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a svg {\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: text-bottom;\n}\n\n/*\n** Control panel\n*/\n\n.tc-control-panel td {\n\tpadding: 4px;\n}\n\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\n\twidth: 100%;\n}\n\n.tc-plugin-info {\n\tdisplay: flex;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tfill: <<colour muted-foreground>>;\n\tbackground-color: <<colour background>>;\n\tmargin: 0.5em 0 0.5em 0;\n\tpadding: 4px;\n align-items: center;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info {\n margin: 0.5em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugin-indicator {\n\tmargin: -16px 1em 0 2em;\n}\n\n.tc-plugin-info-sub-plugin-indicator button {\n\tcolor: <<colour background>>;\n\tbackground: <<colour foreground>>;\n\tborder-radius: 8px;\n padding: 2px 7px;\n font-size: 0.75em;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info-dropdown {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-plugin-info-disabled {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n}\n\n.tc-plugin-info-disabled:hover {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n}\n\na.tc-tiddlylink.tc-plugin-info:hover {\n\ttext-decoration: none;\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour foreground>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-plugin-info-chunk {\n margin: 2px;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description {\n\tflex-grow: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-buttons {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tflex-grow: 0;\n\tflex-shrink: 0;\n text-align: right;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h1 {\n\tfont-size: 1em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h2 {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description div {\n\tfont-size: 0.7em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg {\n\twidth: 2em;\n\theight: 2em;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tmargin-top: -8px;\n}\n\n.tc-plugin-info-dropdown-message {\n\tbackground: <<colour message-background>>;\n\tpadding: 0.5em 1em 0.5em 1em;\n\tfont-weight: bold;\n\tfont-size: 0.8em;\n}\n\n.tc-plugin-info-dropdown-body {\n\tpadding: 1em 1em 0 1em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugins {\n\tpadding: 0.5em;\n margin: 0 1em 1em 1em;\n\tbackground: <<colour notification-background>>;\n}\n\n.tc-install-plugin {\n\tfont-weight: bold;\n\tbackground: green;\n\tcolor: white;\n\tfill: white;\n\tborder-radius: 4px;\n\tpadding: 3px;\n}\n\n.tc-install-plugin.tc-reinstall-downgrade {\n\tbackground: red;\n}\n\n.tc-install-plugin.tc-reinstall {\n\tbackground: blue;\n}\n\n.tc-install-plugin.tc-reinstall-upgrade {\n\tbackground: orange;\n}\n\n.tc-check-list {\n\tline-height: 2em;\n}\n\n.tc-check-list .tc-image-button {\n\theight: 1.5em;\n}\n\n/*\n** Message boxes\n*/\n\n.tc-message-box {\n\tborder: 1px solid <<colour message-border>>;\n\tbackground: <<colour message-background>>;\n\tpadding: 0px 21px 0px 21px;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: <<colour message-foreground>>;\n}\n\n.tc-message-box svg {\n\twidth: 1em;\n\theight: 1em;\n vertical-align: text-bottom;\n}\n\n/*\n** Pictures\n*/\n\n.tc-bordered-image {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 5px;\n\tmargin: 5px;\n}\n\n/*\n** Floats\n*/\n\n.tc-float-right {\n\tfloat: right;\n}\n\n/*\n** Chooser\n*/\n\n.tc-chooser {\n\tborder-right: 1px solid <<colour table-header-background>>;\n\tborder-left: 1px solid <<colour table-header-background>>;\n}\n\n\n.tc-chooser-item {\n\tborder-bottom: 1px solid <<colour table-header-background>>;\n\tborder-top: 1px solid <<colour table-header-background>>;\n\tpadding: 2px 4px 2px 14px;\n}\n\n.tc-drop-down .tc-chooser-item {\n\tpadding: 2px;\n}\n\n.tc-chosen,\n.tc-chooser-item:hover {\n\tbackground-color: <<colour table-header-background>>;\n\tborder-color: <<colour table-footer-background>>;\n}\n\n.tc-chosen .tc-tiddlylink {\n\tcursor:default;\n}\n\n.tc-chooser-item .tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tbackground-color: transparent;\n}\n\n.tc-chooser-item:hover .tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-chosen .tc-tiddlylink,\n.tc-drop-down .tc-chooser-item .tc-tiddlylink:hover {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-chosen > .tc-tiddlylink:before {\n\tmargin-left: -10px;\n\tposition: relative;\n\tcontent: \"» \";\n}\n\n.tc-chooser-item svg,\n.tc-chooser-item img{\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: middle;\n}\n\n.tc-language-chooser .tc-image-button img {\n\twidth: 2em;\n\tvertical-align: -0.15em;\n}\n\n/*\n** Palette swatches\n*/\n\n.tc-swatches-horiz {\n}\n\n.tc-swatches-horiz .tc-swatch {\n\tdisplay: inline-block;\n}\n\n.tc-swatch {\n\twidth: 2em;\n\theight: 2em;\n\tmargin: 0.4em;\n\tborder: 1px solid #888;\n}\n\ninput.tc-palette-manager-colour-input {\n\twidth: 100%;\n\tpadding: 0;\n}\n\n/*\n** Table of contents\n*/\n\n.tc-sidebar-lists .tc-table-of-contents {\n\twhite-space: nowrap;\n}\n\n.tc-table-of-contents button {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents svg {\n\twidth: 0.7em;\n\theight: 0.7em;\n\tvertical-align: middle;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n}\n\n.tc-table-of-contents ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-table-of-contents li {\n\tfont-size: 1.0em;\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.4;\n}\n\n.tc-table-of-contents li li a {\n\tfont-weight: normal;\n}\n\n.tc-table-of-contents li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n}\n\n.tc-tabbed-table-of-contents {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents {\n\tz-index: 100;\n\tdisplay: inline-block;\n\tpadding-left: 1em;\n\tmax-width: 50%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n\tbackground: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tdisplay: block;\n\tpadding: 0.12em 1em 0.12em 0.25em;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\n\tborder-top: 1px solid <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-background>>;\n\tborder-bottom: 1px solid <<colour tab-background>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\n\ttext-decoration: none;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour background>>;\n\tmargin-right: -1px;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\n\ttext-decoration: none;\n}\n\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-left: 1.5em;\n\tpadding-right: 1.5em;\n\tborder: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 50%;\n\tflex: 1 0 50%;\n}\n\n/*\n** Dirty indicator\n*/\n\nbody.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {\n\tfill: <<colour dirty-indicator>>;\n\tcolor: <<colour dirty-indicator>>;\n}\n\n/*\n** File inputs\n*/\n\n.tc-file-input-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-file-input-wrapper input[type=file] {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tfont-size: 999px;\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\toutline: none;\n\tbackground: white;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n/*\n** Thumbnail macros\n*/\n\n.tc-thumbnail-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin: 6px;\n\tvertical-align: top;\n}\n\n.tc-thumbnail-right-wrapper {\n\tfloat:right;\n\tmargin: 0.5em 0 0.5em 0.5em;\n}\n\n.tc-thumbnail-image {\n\ttext-align: center;\n\toverflow: hidden;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-image svg,\n.tc-thumbnail-image img {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n\tmin-width: 100%;\n\tmin-height: 100%;\n\tmax-width: 100%;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {\n\tfilter: alpha(opacity=0.8);\n\topacity: 0.8;\n}\n\n.tc-thumbnail-background {\n\tposition: absolute;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-icon svg,\n.tc-thumbnail-icon img {\n\twidth: 3em;\n\theight: 3em;\n\t<<filter \"drop-shadow(2px 2px 4px rgba(0,0,0,0.3))\">>\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {\n\tfill: #fff;\n\t<<filter \"drop-shadow(3px 3px 4px rgba(0,0,0,0.6))\">>\n}\n\n.tc-thumbnail-icon {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: -webkit-flex;\n\t-webkit-align-items: center;\n\t-webkit-justify-content: center;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.tc-thumbnail-caption {\n\tposition: absolute;\n\tbackground-color: #777;\n\tcolor: #fff;\n\ttext-align: center;\n\tbottom: 0;\n\twidth: 100%;\n\tfilter: alpha(opacity=0.9);\n\topacity: 0.9;\n\tline-height: 1.4;\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n}\n\n/*\n** Diffs\n*/\n\n.tc-diff-equal {\n\tbackground-color: <<colour diff-equal-background>>;\n\tcolor: <<colour diff-equal-foreground>>;\n}\n\n.tc-diff-insert {\n\tbackground-color: <<colour diff-insert-background>>;\n\tcolor: <<colour diff-insert-foreground>>;\n}\n\n.tc-diff-delete {\n\tbackground-color: <<colour diff-delete-background>>;\n\tcolor: <<colour diff-delete-foreground>>;\n}\n\n.tc-diff-invisible {\n\tbackground-color: <<colour diff-invisible-background>>;\n\tcolor: <<colour diff-invisible-foreground>>;\n}\n\n.tc-diff-tiddlers th {\n\ttext-align: right;\n\tbackground: <<colour background>>;\n\tfont-weight: normal;\n\tfont-style: italic;\n}\n\n.tc-diff-tiddlers pre {\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n\n/*\n** Tree macro\n*/\n\n.tc-tree div {\n \tpadding-left: 14px;\n}\n\n.tc-tree ol {\n \tlist-style-type: none;\n \tpadding-left: 0;\n \tmargin-top: 0;\n}\n\n.tc-tree ol ol {\n \tpadding-left: 1em; \n}\n\n.tc-tree button { \n \tcolor: #acacac;\n}\n\n.tc-tree svg {\n \tfill: #acacac;\n}\n\n.tc-tree span svg {\n \twidth: 1em;\n \theight: 1em;\n \tvertical-align: baseline;\n}\n\n.tc-tree li span {\n \tcolor: lightgray;\n}\n\nselect {\n color: <<colour select-tag-foreground>>;\n background: <<colour select-tag-background>>;\n}\n\n/*\n** Utility classes for SVG icons\n*/\n\n.tc-fill-background {\n\tfill: <<colour background>>;\n}"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize",
"text": "15px"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight",
"text": "22px"
},
"$:/themes/tiddlywiki/vanilla/metrics/fontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/fontsize",
"text": "14px"
},
"$:/themes/tiddlywiki/vanilla/metrics/lineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/lineheight",
"text": "20px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyleft": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyleft",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storytop": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storytop",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyright": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyright",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storywidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storywidth",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth",
"text": "686px"
},
"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint",
"text": "960px"
},
"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth",
"text": "350px"
},
"$:/themes/tiddlywiki/vanilla/options/stickytitles": {
"title": "$:/themes/tiddlywiki/vanilla/options/stickytitles",
"text": "no"
},
"$:/themes/tiddlywiki/vanilla/options/sidebarlayout": {
"title": "$:/themes/tiddlywiki/vanilla/options/sidebarlayout",
"text": "fixed-fluid"
},
"$:/themes/tiddlywiki/vanilla/options/codewrapping": {
"title": "$:/themes/tiddlywiki/vanilla/options/codewrapping",
"text": "pre-wrap"
},
"$:/themes/tiddlywiki/vanilla/reset": {
"title": "$:/themes/tiddlywiki/vanilla/reset",
"type": "text/plain",
"text": "/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n"
},
"$:/themes/tiddlywiki/vanilla/settings/fontfamily": {
"title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily",
"text": "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\""
},
"$:/themes/tiddlywiki/vanilla/settings/codefontfamily": {
"title": "$:/themes/tiddlywiki/vanilla/settings/codefontfamily",
"text": "\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace"
},
"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment": {
"title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment",
"text": "fixed"
},
"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize": {
"title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize",
"text": "auto"
},
"$:/themes/tiddlywiki/vanilla/sticky": {
"title": "$:/themes/tiddlywiki/vanilla/sticky",
"text": "<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\" type=\"match\" text=\"yes\">\n``\n.tc-tiddler-title {\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n\ttop: 0px;\n\tbackground: ``<<colour tiddler-background>>``;\n\tz-index: 500;\n}\n\n``\n<$list filter=\"[range[100]]\">\n`.tc-story-river .tc-tiddler-frame:nth-child(100n+`<$text text=<<currentTiddler>>/>`) {\nz-index: `<$text text={{{ [[200]subtract<currentTiddler>] }}}/>`;\n}\n`\n</$list>\n</$reveal>\n"
}
}
}
{
"20200610145535790": "none",
"20200716153614641": "none",
"20201002070319349": "none",
"20210515175949710": "none",
"20220219214508284": "none",
"20220220144802731": "none"
}
{
"itemtext": "",
"editview": "view",
"option": "no",
"markall": "no",
"timestamp": "hide"
}
{
"20200610145535790": "undone",
"20200716153614641": "undone",
"20201002070319349": "undone",
"20210515175949710": "undone",
"20220219214508284": "undone",
"20220220144802731": "undone"
}
{
"20200610145535790": "Take a free [[Google course on technical writing|https://developers.google.com/tech-writing]]",
"20200716153614641": "[[Android dev basic course|https://developer.android.com/courses/android-basics-kotlin/course]]",
"20201002070319349": "[[Access React course|https://egghead.io/token/278a0636-3cdd-4ce7-b673-f392d22d7fda?client_id=4118545974333dd5a03999d7b141ec809b9e83725630934e907e7205a9ac83cf]]",
"20210515175949710": "Summarize [[Types of polymorphism in Javascript]]",
"20220219214508284": "[[Google career certification|https://grow.google/certificates/#?modal_active=none]]",
"20220220144802731": "[[Coursera online degrees|https://www.coursera.org/degrees]]"
}
{
"itemtext": "",
"editview": "view"
}
{
"20200515233419018": "none"
}
{
"itemtext": "",
"editview": "view"
}
{
"20200515233419018": "undone"
}
{
"20200515233419018": "Hello"
}
{
"itemtext": "",
"option": "no",
"editview": "view",
"timestamp": "hide"
}
{
"itemtext": "",
"editview": "view",
"option": "no",
"markall": "no",
"timestamp": "hide"
}
{
"20200921063253861": "[[Seo|https://www.gatsbyjs.com/docs/add-seo-component/]] & [[Look into adding head meta data|https://www.gatsbyjs.com/docs/add-page-metadata/#using-react-helmet-and-gatsby-plugin-react-helmet]]",
"20201003001217551": "[[Create a cookie banner for Clicky]]"
}
{
"20200921063253861": "none",
"20201003001217551": "none"
}
{
"itemtext": "",
"editview": "view",
"option": "no",
"markall": "no"
}
{
"itemtext": "",
"editview": "view"
}
{
"20211202000333094": "Hide cloud services already in use"
}
{
"20211130001745814": "none",
"20211202000333094": "orange",
"20220113004326085": "none",
"20220212011429554": "none"
}
{
"itemtext": "",
"editview": "view",
"option": "no",
"markall": "no"
}
{
"20211130001745814": "undone",
"20220113004326085": "undone",
"20220212011429554": "undone"
}
{
"20211130001745814": "[[Persist tiddlers]]",
"20220113004326085": "[[Multiple accounts]]?",
"20220212011429554": "[[Continuous content improvement for SEO|Linked pages for SEO]]"
}
{
"20210820123000432": "none"
}
{
"itemtext": "",
"editview": "view",
"option": "no",
"markall": "no",
"timestamp": "hide"
}
{
"20210820123000432": "undone"
}
{
"20210820123000432": "Add a proper note to file on temperature excursion and send manual to sites"
}
Notes to self: concerning the registration component `<AppContainer />`, it will act as the controller component for `<StepperContainer />` and `<FormContainer />`.
The `<AppContainer />` will feed receive and supply the steps array to it's children. Then it will set the index/key for these components to display.
The `<FormContainer />` will toggle whether to display a form section or not depending on the index/key requested by `<AppContainer />`. Then, the the index equals the length of the steps, the data will be sent. Or something along those lines. I don't know. I'm tired! But I think we're on to something.
* dta:
** for the nutrimam study.
* psbi pre-screening and screening:
** we need to do pre-screening; no mistakes have been made.
** no need to involve the mother
** we will need to get data from retrospect
** we will add an irb stamp
** night screening for rct-2 only!
** recommended screening time 7am to 5pm
** rct-2 who come at night are admitted anyway. if they come at 1am for example with moderate signs; when you come at 8am, the patient has already been admitted for 7hrs.
** we will have to introduce a screening form for the hospital staff. there are 2 registrars in temeke: maria and imani; at amana, we have dr arafa, dr mbaga, and 2 others
** these registrars will have to be trained on the protocol and ethical principals. we will have to bring in imani and maria for training
** we could add on 1000 for screening and 2000 if the screening is enrolled
* qa/qc issues:
** dr tina tangerine isn't helping us a lot. the forms aren't being recorded as expected. we've only been able to see a-1 data. the other ones did not have ids for a long time.
** out workaround was mudy giving us a data dump
** review of b2 forms: shows some using overdosing of ampicillin
** we reference pg 243 and pg 117
*** less than 7 days old: 50mg/kg bd
*** greater than 7 days old 50mg/kg tds
** prof: we must ensure that the sop is up-to-date, ''confirm with the hospital records'', and we should inform the hospital about this. we must also document retraining of the staff and hospital staff. then we will document the deviations.
** these ranges are recommendations based on imci.
** we can categorize as an sop deviation; so it will be classified as a
** in the sop, say dose should be given indicated below, the appendix or as per national guidelines pg 117 and 243 or imci booklet pg 39
* nutrimam issues
** mechanistic of gut study function which will require us to do eed and body composition studies
** tfnc may be able to performs body composition studies with deuterium isotope solution
** we have budgeted for 6 staff members, including 2 physicians, 2 nurses and 2 lab people
# Podcast: we could call Mendes about it this tomorrow morning. What's out backup plan? We can delay our episode until we get someone worthy for an interview.
# Innovation Peer: we will have to meet up to see what we can do to repackage the offer into a remote format in order to see if we can reduce friction during conversion. ~~Friday 1530hrs~~ Saturday 1200hrs, we can meet to discuss.
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/Tiddlywiki?src=hash&ref_src=twsrc%5Etfw">#Tiddlywiki</a> bring what it is makes it very simple to achieve such ends. The Wiki itself cannot be an end itself. Just as hoarding knowledge for yourself isn't of much use. <a href="https://twitter.com/hashtag/thoughts?src=hash&ref_src=twsrc%5Etfw">#thoughts</a> <a href="https://twitter.com/hashtag/javascript?src=hash&ref_src=twsrc%5Etfw">#javascript</a> <a href="https://twitter.com/hashtag/knowledge?src=hash&ref_src=twsrc%5Etfw">#knowledge</a> <a href="https://twitter.com/hashtag/HTML?src=hash&ref_src=twsrc%5Etfw">#HTML</a> <a href="https://twitter.com/hashtag/css?src=hash&ref_src=twsrc%5Etfw">#css</a></p>— Abraham Samma (@ABSamma) <a href="https://twitter.com/ABSamma/status/964852172545544193?ref_src=twsrc%5Etfw">February 17, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
!This is an encrypted Tiddler
```javascript
class Tree {
constructor(size = '10', leaves = {
spring: 'green',
summer: 'green',
fall: 'orange',
winter: null
}) {
this.size = size;
this.leaves = leaves;
this.leafColor = null;
}
changeSeason(season) {
this.leafColor = this.leaves[season];
if (season === 'spring') {
this.size += 1;
}
}
}
class Maple extends Tree {
constructor(syrupQty = 15, size, leaves) {
super(size, leaves);
this.syrupQty = syrupQty;
}
changeSeason(season) {
super.changeSeason(season);
if (season === 'spring') {
this.syrupQty += 1;
}
}
gatherSyrup() {
this.syrupQty -= 3;
}
}
const myMaple = new Maple(15, 5);
myMaple.changeSeason('fall');
myMaple.gatherSyrup();
myMaple.changeSeason('spring');
```
```javascript
function Tree(size, leaves) {
this.size = (typeof size === "undefined") ? 10 : size;
const defaultLeaves = {
spring: 'green',
summer: 'green',
fall: 'orange',
winter: null
};
this.leaves = (typeof leaves === "undefined") ? defaultLeaves : leaves;
this.leafColor;
}
Tree.prototype.changeSeason = function(season) {
this.leafColor = this.leaves[season];
if (season === 'spring') {
this.size += 1;
}
}
function Maple(syrupQty, size, leaves) {
Tree.call(this, size, leaves);
this.syrupQty = (typeof syrupQty === "undefined") ? 15 : syrupQty;
}
Maple.prototype = Object.create(Tree.prototype);
Maple.prototype.constructor = Maple;
Maple.prototype.changeSeason = function(season) {
Tree.prototype.changeSeason.call(this, season);
if (season === 'spring') {
this.syrupQty += 1;
}
}
Maple.prototype.gatherSyrup = function() {
this.syrupQty -= 3;
}
const myMaple = new Maple(15, 5);
myMaple.changeSeason('fall');
myMaple.gatherSyrup();
myMaple.changeSeason('spring');
```
The Iterable Protocol
The iterable protocol is used for defining and customizing the iteration behavior of objects. What that really means is you now have the flexibility in ES6 to specify a way for iterating through values in an object. For some objects, they already come built-in with this behavior. For example, strings and arrays are examples of built-in iterables.
In order for an object to be iterable, it must implement the iterable interface. If you come from a language like Java or C, then you’re probably familiar with interfaces, but for those of you who aren’t, that basically means that in order for an object to be iterable it must contain a default iterator method. This method will define how the object should be iterated.
The iterator method, which is available via the constant `[Symbol.iterator]`, is a zero arguments function that returns an iterator object. An iterator object is an object that conforms to the iterator protocol.
The Iterator Protocol
The iterator protocol is used to define a standard way that an object produces a sequence of values. What that really means is you now have a process for defining how an object will iterate. This is done through implementing the .next() method.
How it Works
An object becomes an iterator when it implements the .next() method. The .next() method is a zero arguments function that returns an object with two properties:
* value : the data representing the next value in the sequence of values within the object
* done : a boolean representing if the iterator is done going through the sequence of values
** If done is true, then the iterator has reached the end of its sequence of values.
** If done is false, then the iterator is able to produce another value in its sequence of values.
Here’s the example from earlier, but instead we are using the array’s default iterator to step through the each value in the array.
```javascript
const digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
const arrayIterator = digits[Symbol.iterator]();
console.log(arrayIterator.next());
console.log(arrayIterator.next());
console.log(arrayIterator.next());
Object {value: 0, done: false}
Object {value: 1, done: false}
Object {value: 2, done: false}
```
A symbol is a unique and immutable data type that is often used to identify object properties.
To create a symbol, you write Symbol() with an optional string as its description.
```javascript
const sym1 = Symbol('apple');
console.log(sym1);
Symbol(apple)
```
In Javascript, memory is allocated when new values are created and is "automatically" freed up when those values are no longer needed. This process of freeing up memory after it is no longer needed is what is known as garbage collection.
~WeakMaps & ~WeakSets take advantage of this by exclusively working with objects as keys. If you set an object to null, then you’re essentially deleting the object. And when Javascript’s garbage collector runs, the memory that object previously occupied will be freed up to be used later in your program.
~TiddlyWiki 5 incorporates a custom implementation of the ~CommonJS ~JavaScript module standard (http://wiki.commonjs.org/wiki/Modules/1.1) that is based on tiddlers instead of files, and works in the browser and under Node.js. In the browser it uses `eval()`, but under Node.js it uses `vm.runInThisContext()` which has (slightly) better sandboxing.
The top level structure of TW5 is that there is a boot kernel of (~2,000 lines) that sets up the ~CommonJS module environment and then invokes the main core plugin (~$:/core) that contains JS modules and wikitext tiddlers that make up the core of ~TiddlyWiki itself.
Jackline Richards will send us the email of her dept. director after he 'buys in' to our offer. Then we can send the proposal
# Ben
# Landry
# Albert
Open ended discussion for price tier designs
__Minutes__
# Ben opens by reiterating how we met and that we need to work together to make [[InnovationPeer]] work.
# Pricing strategies we could employ
## Competition-Based Pricing
## Cost-Plus Pricing
## Dynamic Pricing
## Freemium Pricing
## High-Low Pricing
## Hourly Pricing
## Skimming Pricing
## Penetration Pricing
## Premium Pricing
## Project-Based Pricing
## Value-Based Pricing
# Value based pricing seems to be good but requires a lot in terms of knowing what the customer wants
# We could take a hybrid approach, where we allow a calculated breakdown based on value of the individual components, and then allow negotiations to proceed based on these components
# We can go default project based pricing with value based pricing if negotiations are desired for a corporate client. Base price is 5000 usd for a design sprint. Three thousand usd for growth hacking three hour sessions.
# For startups, we can make a two pronged approach: via direct or via incubator. However, the price differences need to be matched with a downgrade of the offering. For example, we could use a tier based approach for escalating features and corresponding prices with a ten percent discount for incubators.
CoreBOS resources
* https://gitter.im/corebos/discuss [ask questions here]
* https://corebos.com/documentation/doku.php?id=en:devel:corebosws:methodreference
* https://github.com/tsolucio/coreBOSwsDevelopment
* https://github.com/tsolucio/coreBOSwsLibrary
* https://github.com/coreBOS/tiddlywiki
#### Build your own `3D Renderer`
* [**C++**: _Introduction to Ray Tracing: a Simple Method for Creating 3D Images_](https://www.scratchapixel.com/lessons/3d-basic-rendering/introduction-to-ray-tracing/how-does-it-work)
* [**C++**: _How OpenGL works: software rendering in 500 lines of code_](https://github.com/ssloy/tinyrenderer/wiki)
* [**C++**: _Raycasting engine of Wolfenstein 3D_](http://lodev.org/cgtutor/raycasting.html)
* [**C# / TypeScript / JavaScript**: _Learning how to write a 3D soft engine from scratch in C#, TypeScript or JavaScript_](https://www.davrous.com/2013/06/13/tutorial-series-learning-how-to-write-a-3d-soft-engine-from-scratch-in-c-typescript-or-javascript/)
* [**Java / JavaScript**: _Build your own 3D renderer_](https://avik-das.github.io/build-your-own-raytracer/)
* [**Java**: _How to create your own simple 3D render engine in pure Java_](http://blog.rogach.org/2015/08/how-to-create-your-own-simple-3d-render.html)
* [**JavaScript / Pseudocode**: _Computer Graphics from scratch_](http://www.gabrielgambetta.com/computer-graphics-from-scratch/introduction.html)
* [**Python**: _A 3D Modeller_](http://aosabook.org/en/500L/a-3d-modeller.html)
__Agenda__
* Drawing up portfolio for case study paper
__Minutes__
What's in our portfolio
* Jamii insurance
* Ingenious city
* Mipango
* Food Sasa
* Sema Tz
For the sake of targeting CRDB's future customer development space, we need to focus on a case study that talks about incubators.
We've selected Sycamore Ventures and Ingenious city as references because of the latter's relatively young age. Documenting their progress would allow us to use them as a reference on how we can ideate on their project.
Here's the layout from Board of Innovation for Ingenious city:
# Title: Building a Productive Incubator in Central Africa
# Challenge: strengthening of the Congolese entrepreneurial ecosystem and making it shine at the pan-African and global level by building the first platform incubator in the DRC
# Process & Solution:
# Impact: Finally opened for service in 2018, with over 1200m^^2^^ of available office and meeting space for 55+ startups, with access to high speed internet, 150 mentors and 10 strategic partners and sponsors
Here's the layout from Board of Innovation for Sema Tz:
# Title: Creating a National Helpline for Abused Children
# Challenge: How do you provide immediate support to children facing abuse
# Process & Solution: Creating a national hotline number 116 to report such abuse cases
# Impact: Data collected used to inform government on what intervention strategies work, as well as lessons and challenges on both access and provision of children services. (will need numerical data on level of impact)
Here's the layout from Board of Innovation for Mipango app:
# Title: Increasing access to Personal Financial Management services in East Africa
# Challenge: Taking the Personal Financial Management platform Mipango app from ideation to working product
# Process & Solution:
## Business model innovation
## Customer development
## Product ideation and design
# Impact: access to affordable financial management delivered to more than 2000 active users in just 3 months
Here's the layout from Board of Innovation for Food Sasa:
# Title: Creating an E-commerce platform for Food Delivery Services in Dar es Salaam
# Challenge: Taking Food Sasa from ideation to working product
# Process & Solution:
# Impact: 2000 daily active users within 2 months of launch
Here's the layout from Board of Innovation for DSE:
# Title: Increasing Accessibility to the Tanzanian Stock market
# Challenge: Reducing barriers of entry to investing in domestic stock market via a mobile app
# Process & Solution:
# Impact: Launched app on November 20, 2020 with more than 1000 daily active users as December 5th, 2020
Here's the layout from Board of Innovation for Jamii Insurance:
# Title: Validating the Problem of Access to Health Insurance in Low-income families in Tanzania
# Challenge: To create an affordable health insurance product that low-income families can pay for using mobile money
# Process & Solution:
# Impact: 6000 early signups to 20,000 daily active users with to 400 hospitals accepting Jamii Insurance
__Some references__
* [[Ingenious city Phys Org article|https://phys.org/news/2018-05-dr-congo-home-grown-digital-entrepreneurs.html]]
* [[Ingenious city]] profile
Next, discussed the format for our framework on creating incubators. We'll use Board of Innovation as a template.
Next, we need a compelling argument for our meeting with Airtel money; we could frame the question as such: why is the market share for Airtel money at 20% and not say 50% in Tanzania? And then secondly, how do we get there quickly? How can Aritel Money do better?
<p>[[From Emily|https://mail.google.com/mail/u/0/#inbox/FMfcgzGljvJjhfJxRJKmzfvHNmRFXxfl]]</p>
<p>I hope you are having a nice week. Thank you for your patience as we worked on the qualitative manuscript for the LIFE 0-6 month cohort over the past few months. I'm happy to share a first draft of the results and welcome any and all feedback to strengthen what we have. Below are guiding questions that I would appreciate input on:</p>
<ol>
<li>A detailed review of the Intro, Methods, and Results
<ul>
<li>Does the framing in the intro make sense? </li>
<li>Are the methods clear?</li>
<li>Any questions about the results? What might be missing/need more detail or context? What is surprising?</li></ul></li>
<li>A detailed review of the Discussion outline
<ul>
<li>Are there additional areas of discussion or focus?</li>
<li>Any input on context?</li>
<li>Is there literature that we should reference?</li>
<li>Thoughts on the implications and next steps based on qual findings?</li></ul></li>
<li>Is BMJ Global Health an appropriate journal? Other suggestions?</li></ol>
<p>You can access a live version of the draft <a href="https://docs.google.com/document/d/126KJ9pt0FSICocttao-Q3C8GhhWd3JjuZ9-bzknFKMw/edit" target="_blank">here</a> or, if you prefer, use the attached Word doc. <u><strong>Please provide input via the 'comment' function by 1 October.</strong> </u></p>
<p> </p>
<p>Please note that authorship is being determined and I will provide a proposed update once I have one.</p>
<p> </p>
<p>I will be out of the office until then, but please reach out to Linda (<a href="mailto:lvesel@ariadnelabs.org" target="_blank">lvesel@ariadnelabs.org</a>) if you have questions or concerns. </p>
<p><a href="https://threadreaderapp.com/thread/1254790988955938817.html">threadreaderapp.com</a></p>
<h1>Thread by @awilkinson: 1/ I spent the weekend deep diving on @~RoamResearch, which aside from Clubhouse is probably the buzziest thing in Silicon Valley these days.…</h1>
<p>4-5 minutes</p>
<hr />
<p>1/ I spent the weekend deep diving on <a href="https://twitter.com/RoamResearch">@RoamResearch</a>, which aside from Clubhouse is probably the buzziest thing in Silicon Valley these days.</p>
<p>I'm almost through <a href="https://twitter.com/nateliason">@nateliason</a>'s power user course and gave it the old college try.</p>
<p>Here are my high level thoughts so far...</p>
<p>2/ First of all: it's clearly early. It feels like a very solid beta, but lacks a mobile app (!!!) and the design leaves a lot to be desired.</p>
<p>It feels like a web app from 2012, complete with blurry loading screen, which as a designer makes my eye twitch a bit...</p>
<p>3/ But, despite being rough around the edges, Roam is conceptually very interesting.</p>
<p>My TLDR version is: it's the slightly awkward love child of a daily journal app and Wikipedia.</p>
<p>Essentially, every day, you dump your brain into it, and as you type, link your ideas together....</p>
<p>4/ Unlike most note taking apps, which require you to create a hierarchical structure yourself, Roam just kind of magically connects all your key topics/ideas/tags/etc with little blue links.</p>
<p>It reminds me a lot of Wikipedia—you can get lost clicking through deeplinks forever.</p>
<p>5/ For example, as I do a morning brain dump I could say "Worried the drywallers will be delayed on our [[House Build]]".</p>
<p>By using those ~[[ ]], I am linking the thought to a page about my new house construction project...</p>
<p>6/ Once I do this, I can click "House Build" (now a blue link) and see every single note I've ever taken related to house build. I can mix, match, and filter this by date, by tag, by todos, etc.</p>
<p>That's pretty cool, because it allows you to resurface old thoughts. But...</p>
<p>7/ That said, it requires an *extreme* level of nerdy dedication:</p>
<p>- Despite "auto-linking", you still have to remember to link things manually.</p>
<p>8/ - You have to remember all the metadata you use for each item.</p>
<p>Example: If I create a page about a person I meet, I have to manually remember all the details I write about each person (phone number, job, kids names, etc).</p>
<p>9/ - Nothing feels automated or extensible. I can't assign templates or use snippets. I can't pull data in from other places.</p>
<p>Roam leaves me feeling excited about the idea, but the execution has a long way to go. Before I can become a daily user, I'd want to see:</p>
<p>10/ 📱A proper mobile app - This is just table stakes these days.</p>
<p>📒Templates - I want to be able to define the metadata of a type of content (people, places, quotes, etc) and be prompted to enter it. Same goes for The Daily Note—I want to be able to structure it a certain way.</p>
<p>11/ 🤖Automation and APIs - Part of where Roam shines is the idea that you can just dump everything into it. Need to write an email? Write it in your daily note then send it later. Just keep writing and linking stuff together.</p>
<p>12/ It would be incredible if you could tag specific pieces of content to be sent out by APIs. For example, if I tag something <a href="https://threadreaderapp.com/hashtag/tweet">#tweet</a> and specify a time, Roam could send it to the Twitter API to post at the specific time. Same goes for email, writing, etc...</p>
<p>13/ 🎨A better design - Hate all you want engineers, but this app is pretty freaking ugly. It's utilitarian. It works. But it feels very inaccessible and nerdy and the product design leaves a lot to be desired. This can come later (see: Asana).</p>
<p>To summarize...</p>
<p>14/ The fact that I am taking the time to write a 14 tweet tweetstorm on this reveals that Roam is interesting. I am intrigued by the idea of a personal wiki that graphs/links my thoughts together.</p>
<p>It's worth playing with. Some interesting ideas and a lot of potential.</p>
<$tmap editor="advanced" height="500px" ></$tmap>
A point of sale system with order tracking for a small business written in TiddlyWiki
https://mydigitalmark.com/small-business-pos-system
!Core Data Structures
To understand widgets we need some understanding of four core data structures: i) the Parse Tree ii) the Widget Tree; iii) the Dom Node Tree; and iv) the Dom itself. The choreography of the work needed on these four data structures may not intuitive, so I'll give my understanding at the level needed to get started:
!!The Parse Tree
:The Parse Tree is generated by ~TiddlyWiki5 core parsers as an overall interpretation of all the tiddlers which need to be presented in the browser. One of the first things which happens when a tiddler is to be presented is that it is parsed by the specific parser for the indicated tiddler "type". Parsing a tiddler results in a parse tree for that tiddler which is injected into the overall Parse Tree. When an instance of our widget is initialized, the Parse Tree location of "this" instance of our widget is passed to our widget via "parseTreeNode". Our widget needs to maintain that location via `this.parseTreeNode` so that we can reference it later, and repeatedly, to do things like reading widget attributes when we render our widget.
!!The Widget Tree
:The Widget Tree is generated during rendering and is instantiated by a combination of our `initialize()` and `render()` functions; it establishes hierarchic relationships between the widgets rendered in the wiki. In a sense, the Widget Tree overlays the Parse Tree, providing a widget-only view with links back to the Parse Tree. We need to know about it because the Widget Tree does at least two very important things for us:
#It manages the refresh process, so that changes to tiddlers or attributes ripple through the branches of the tree efficiently. In the case of our `<$select...>` widget example we use this mechanism to refresh the widget itself if any of the widget attributes are changed, otherwise we pass the refresh request down through the hierarchy.
#It allows us to create "widget variables" which are visible anywhere in the branches from the widget which "sets" such variables. In the case of the `<$select....>` widget example we use this mechanism to "pass" the selection result to child widgets and macros, so that the selection can inform the wiktext contained by the `<$select....>` widget.
:Two properties of the widget function codify the Widget Tree: `this.parentWidget` and `this.children`. Generally the core Widget function manages these for us.
!!The Dom Node Tree
:The Dom Node Tree is generated by our widget ( `domNodes` in `Widget()` ); it establishes hierarchic relationships between the Widget Tree and the any Dom nodes which we want the widget mechanism to manage. Typically a widget needs to add a single, root Dom node which we create in our `render` function, but in principle a widget can include several Dom nodes without a common root. We care because the Dom tree is used to manage deletion of the Dom nodes which we create within a widget. To make that mechanism work, the root Dom node created by our widget needs to be bolted into the Dom node tree. We also need to make certain that the default `Widget.prototype.removeChildDomNodes` deletes the Dom nodes which our widget creates, or, if it doesn't then write a replacement function which does.
!!The Dom
:The Dom is the Dom. We need to know about it, understand it, "program" it, because it is the mechanism by which we do the job of rendering. Widgets "do" their rendering via a `render` function, which is where we perform standard Dom manipulations to render the html which we desire from our widget.
The next part of the guide gives a high level breakdown of the widget code.
[[A Simple Widget - Part 2 - Code Breakdown|A Simple Widget - Part 2]]
!Code Breakdown
The javascript for the `<$select....>` widget is available, here:
:[[$:/editions/codingForTiddlyWiki5/widgets/selectWidget]].
If you look through the code you will see that it is largely a copy-paste of almost any one of the standard widgets. There are seven functions in all; the first five functions represent a pattern common to most widgets; the last two functions are helper functions specific to our widget:
Core Widget Functions:
```
SelectWidget.prototype.render
SelectWidget.prototype.execute
SelectWidget.prototype.refresh
SelectWidget.prototype.removeChildDomNodes
SelectWidget.prototype.create
```
Helper Functions:
```
SelectWidget.prototype.getOptionList
SelectWidget.prototype.handleChangeEvent
```
!!Render
Given that the purpose of a widget is to render, the heart of a widget is the `render` function. Typically, we don't need to do any customization of the render function, but we need to understand what it does. The reason that we don't typically need to do much in `render` is that most of the work is typically done by two major functions invoked by `render`, namely `execute` and `create`, and we do most of our customization in those functions.
The main steps of "render" are as follows:
#Maintain a link to the parent DOM node, i.e. the DOM element immediately above any DOM elements which we create with this widget.
#Fetch any attributes which were included in the "call" to this widget.
#Perform calculations needed ahead of construction of the DOM elements for this widget, including making any "child" widgets required by this widget.
#Create the actual DOM elements for this widget.
#Insert the DOM elements for this widget into the parent DOM node structure.
#Use renderChildren to `render` each of the child widgets. These child widgets are rendered as DOM child elements of the DOM node we created earlier with `create`. These child widgets were either created by the earlier `execute` function or could be widgets wrapped by this widget in the wikiText.
```
SelectWidget.prototype.render = function(parent,nextSibling) {
this.parentDomNode = parent;
this.computeAttributes();
this.execute();
var domNode = this.create(parent,nextSibling);
this.domNodes.push(domNode);
parent.insertBefore(domNode,nextSibling);
this.renderChildren(domNode,null);
};
```
!!Execute
The `execute` function is invoked by the `render` function, and it typically does two things for us:
#Fetches attributes which were included in the widget's invocation, whether wikiText or otherwise.
#Makes child widgets
Child widgets can come from the originating wikitext, or be created programmatically as part of the the `execute` function.
```
SelectWidget.prototype.execute = function() {
// get attributes
this.filter = this.getAttribute("filter");
this.list = this.getAttribute("list");
this.tiddler =
this.getAttribute("tiddler",this.getVariable("currentTiddler"));
this.selectClass = this.getAttribute("class");
this.setName = this.getAttribute("name","currentTiddler");
// make child widgets
this.makeChildWidgets();
};
```
In this case we don't create any child widgets as part of this widget, but we do need to make sure that we make any child widgets which originate in the wikitext. For a good example of creating child widgets programmatically I recommend taking a look at the 'execute' function of the `<$edit....>` widget, here:
:[[$:/core/modules/widgets/edit.js]]
!!Create
''NOTE: Don't use this until you understand it. Just create a DOM node using `$tw.utils.domMaker` or `document.createElement()`''
The `create` function is invoked by the `render` function. It's job is to create the actual DOM nodes forming the rendering of the widget. It is really that simple.
There are a couple of ~TiddlyWiki5 core functions used in the example which are worth noting for future use:
!!!$tw.utils.domMaker
This utility function is provided in the core to help to create DOM nodes with a "class" attached. You have a choice of doing this in one line with `domMaker`:
```
var domNode = $tw.utils.domMaker("div",{class:this.selectClass});
```
Or you can do the same with two lines using plain old DOM manipulation, which would look like this:
```
var domNode = this.document.createElement("div");
domNode.className = this.selectClass;
```
!!!$tw.utils.addEventListeners
This utility function registers event handler functions to DOM objects. In the `<$select....>` widget we add an event handler to the Dom `<select>` entity for "change" events occurring on the widget. Of course we need to provide the event handler function too, and in this case we provide `Select.prototype.handleChangeEvent(event)`.
```
$tw.utils.addEventListeners(select,[
{name: "change", handlerObject: this, handlerMethod: "handleChangeEvent"}
]);
```
!!!Widget.prototype.setVariable and Widget.prototype.getVariable
`this.setVariable` and `this.getVariable` are the function invocations used to set and get widget variables accessible downstream by child widgets and macros. By "setting" a variable with `setVariable`, any child widget can access that variable directly via getVariable. The widget mechanism does the work of searching back up the widget tree for the nearest, corresponding, `setVariable`.
!!Refresh
The `refresh` function is invoked either externally, typically by the widget's parent widget by invoking `refreshChildren`. For the `<$select....>` widget we do a refresh if and only if the driving attributes have changed. In that case we invoke the standard widget `refreshSelf` function, which removes child DOM nodes of this widget and then re-renders the widget, this time according to the new attributes.
If none of the attributes has changed then all we do here is invoke `refreshChildren` in case any of the child widgets need or want to do a refresh based on changed tiddlers or changed attributes etc.
!!~RemoveChildDomNodes
The `removeChildDomNodes` function is invoked by `refreshSelf` to remove the DOM nodes which we added to the `domNodes` array which we built during `render`. Typically all of the DOM nodes created by a widget are children of a single root DOM node, so that `removeChildDomNodes` is a boiler-plate copy of the corresponding, default `Widget` function.
Go here --> https://tinkaplugin.github.io/
I am a doctor
I love science, tech and programming
I believe we're destined to walk among the stars. But to do that, we need to transcend our present way of thinking. We need to get out of our "end of history" delusion.
My mottos of life:
{{Favorite latin sayings}}
<h2 id="esnextclassfields">ESnext Class Fields</h2>
<p>The class fields proposal allows properties to be initialized at the top of a class:</p>
<pre class=" language-javascript"><code class="javascript language-javascript"><span class="token keyword">class</span> <span class="token class-name">MyClass</span> <span class="token punctuation">{</span>
a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
b <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
c <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>This is equivalent to:</p>
<pre class=" language-javascript"><code class="javascript language-javascript"><span class="token keyword">class</span> <span class="token class-name">MyClass</span> <span class="token punctuation">{</span>
<span class="token function">constructor</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>b <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>c <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p>Initializers are executed before any constructor runs (<em>presuming a constructor is still necessary</em>).</p>
<h3 id="staticclassfields">Static Class Fields</h3>
<p>Class fields permit static properties to be declared within the <code class=" language-javascript"><span class="token keyword">class</span></code>. For example:</p>
<pre class=" language-javascript"><code class="javascript language-javascript"><span class="token keyword">class</span> <span class="token class-name">MyClass</span> <span class="token punctuation">{</span>
x <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
y <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token keyword">static</span> z <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> MyClass<span class="token punctuation">.</span>z <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 3</span>
</code></pre>
<p>The inelegant ES6 equivalent:</p>
<pre class=" language-javascript"><code class="javascript language-javascript"><span class="token keyword">class</span> <span class="token class-name">MyClass</span> <span class="token punctuation">{</span>
<span class="token function">constructor</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>y <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
MyClass<span class="token punctuation">.</span>z <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> MyClass<span class="token punctuation">.</span>z <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 3</span>
</code></pre>
<h3 id="privateclassfields">Private Class Fields</h3>
<p>All properties in ES6 classes are public by default and can be examined or modified outside the class. In the <code class=" language-javascript">Animal</code> example above, there’s nothing to prevent the <code class=" language-javascript">food</code> property being changed without calling the <code class=" language-javascript">eats</code> setter:</p>
<pre class=" language-javascript"><code class="javascript language-javascript"><span class="token keyword">class</span> <span class="token class-name">Animal</span> <span class="token punctuation">{</span>
<span class="token function">constructor</span><span class="token punctuation">(</span>name <span class="token operator">=</span> <span class="token string">'anonymous'</span><span class="token punctuation">,</span> legs <span class="token operator">=</span> <span class="token number">4</span><span class="token punctuation">,</span> noise <span class="token operator">=</span> <span class="token string">'nothing'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>type <span class="token operator">=</span> <span class="token string">'animal'</span><span class="token punctuation">;</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>legs <span class="token operator">=</span> legs<span class="token punctuation">;</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>noise <span class="token operator">=</span> noise<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">set</span> <span class="token function">eats</span><span class="token punctuation">(</span>food<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>food <span class="token operator">=</span> food<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">get</span> <span class="token function">dinner</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token template-string"><span class="token string">`</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span><span class="token keyword">this</span><span class="token punctuation">.</span>name<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> eats </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span><span class="token keyword">this</span><span class="token punctuation">.</span>food <span class="token operator">||</span> <span class="token string">'nothing'</span><span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> for dinner.`</span></span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">const</span> rex <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Animal</span><span class="token punctuation">(</span><span class="token string">'Rex'</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token string">'woof'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
rex<span class="token punctuation">.</span>eats <span class="token operator">=</span> <span class="token string">'anything'</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// standard setter</span>
rex<span class="token punctuation">.</span>food <span class="token operator">=</span> <span class="token string">'tofu'</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// bypass the eats setter altogether</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> rex<span class="token punctuation">.</span>dinner <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// Rex eats tofu for dinner.</span>
</code></pre>
<p>Other languages permit <code class=" language-javascript"><span class="token keyword">private</span></code> properties to be declared. That’s not possible in ES6, although developers can work around it using an underscore convention (<code class=" language-javascript">_propertyName</code>), <a href="https://curiosity-driven.org/private-properties-in-javascript">closures, symbols, or WeakMaps</a>.</p>
<p>In ESnext, private class fields are defined using a hash <code class=" language-javascript">#</code> prefix:</p>
<pre class=" language-javascript"><code class="javascript language-javascript"><span class="token keyword">class</span> <span class="token class-name">MyClass</span> <span class="token punctuation">{</span>
a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// .a is public</span>
#b <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// .#b is private</span>
<span class="token keyword">static</span> #c <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// .#c is private and static</span>
<span class="token function">incB</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>#b<span class="token operator">++</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">const</span> m <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MyClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
m<span class="token punctuation">.</span><span class="token function">incB</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// runs OK</span>
m<span class="token punctuation">.</span>#b <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// error - private property cannot be modified outside class</span>
</code></pre>
<p>Note that there’s no way to define private methods, getters and setters, although a <a href="https://github.com/tc39/proposal-private-methods">TC39 stage 2: draft proposal</a> suggests using a hash <code class=" language-javascript">#</code> prefix on names. For example:</p>
<pre class=" language-javascript"><code class="javascript language-javascript"><span class="token keyword">class</span> <span class="token class-name">MyClass</span> <span class="token punctuation">{</span>
<span class="token comment" spellcheck="true">// private property</span>
#x <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">// private method (can only be called within the class)</span>
#<span class="token function">incX</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>#x<span class="token operator">++</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment" spellcheck="true">// private setter (can only be called within the class)</span>
<span class="token keyword">set</span> #<span class="token function">setX</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>#x <span class="token operator">=</span> x<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment" spellcheck="true">// private getter (can only be called within the class)</span>
<span class="token keyword">get</span> #<span class="token function">getX</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$x<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<h2 id="immediatebenefitcleanerreactcode">Immediate Benefit: Cleaner React Code!</h2>
<p>React components often have methods tied to DOM events. To ensure <code class=" language-javascript"><span class="token keyword">this</span></code> resolves to the component, it’s necessary to <code class=" language-javascript">bind</code> every method accordingly. For example:</p>
<pre class=" language-javascript"><code class="javascript language-javascript"><span class="token keyword">class</span> <span class="token class-name">App</span> <span class="token keyword">extends</span> <span class="token class-name">Component</span> <span class="token punctuation">{</span>
<span class="token function">constructor</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">super</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
state <span class="token operator">=</span> <span class="token punctuation">{</span> count<span class="token punctuation">:</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token comment" spellcheck="true">// bind all methods</span>
<span class="token keyword">this</span><span class="token punctuation">.</span>incCount <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>incCount<span class="token punctuation">.</span><span class="token function">bind</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">incCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">setState</span><span class="token punctuation">(</span>ps <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">(</span><span class="token punctuation">{</span> count<span class="token punctuation">:</span> ps<span class="token punctuation">.</span>count <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span>
<span class="token operator"><</span>div<span class="token operator">></span>
<span class="token operator"><</span>p<span class="token operator">></span><span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>state<span class="token punctuation">.</span>count <span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>p<span class="token operator">></span>
<span class="token operator"><</span>button onClick<span class="token operator">=</span><span class="token punctuation">{</span><span class="token keyword">this</span><span class="token punctuation">.</span>incCount<span class="token punctuation">}</span><span class="token operator">></span>add one<span class="token operator"><</span><span class="token operator">/</span>button<span class="token operator">></span>
<span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p>If <code class=" language-javascript">incCount</code> is defined as a class field, it can be set to a function using an ES6 <code class=" language-javascript"><span class="token operator">=</span><span class="token operator">></span></code> fat arrow, which automatically binds it to the defining object. The <code class=" language-javascript">state</code> can also be declared as a class field so no constructor is required:</p>
<pre class=" language-javascript"><code class="javascript language-javascript"><span class="token keyword">class</span> <span class="token class-name">App</span> <span class="token keyword">extends</span> <span class="token class-name">Component</span> <span class="token punctuation">{</span>
state <span class="token operator">=</span> <span class="token punctuation">{</span> count<span class="token punctuation">:</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
incCount <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">setState</span><span class="token punctuation">(</span>ps <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">(</span><span class="token punctuation">{</span> count<span class="token punctuation">:</span> ps<span class="token punctuation">.</span>count <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token punctuation">(</span>
<span class="token operator"><</span>div<span class="token operator">></span>
<span class="token operator"><</span>p<span class="token operator">></span><span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>state<span class="token punctuation">.</span>count <span class="token punctuation">}</span><span class="token operator"><</span><span class="token operator">/</span>p<span class="token operator">></span>
<span class="token operator"><</span>button onClick<span class="token operator">=</span><span class="token punctuation">{</span><span class="token keyword">this</span><span class="token punctuation">.</span>incCount<span class="token punctuation">}</span><span class="token operator">></span>add one<span class="token operator"><</span><span class="token operator">/</span>button<span class="token operator">></span>
<span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
Innovation Peer is an innovation strategy consultancy firm that envisions a thriving and productive startup ecosystem in the Tanzanian and wider African environment. Our primary goal is to provide startups and corporates with the tools and skills needed to innovate better and generate more value for themselves, their client and the wider community
Met with Mr. Beda Biswalo. Marketing director. He'd prefer to see a synopsis of our services before he decides which demo he'd like to start with.
He's interested in marketing, customer service and digital service delivery.
People and institutions need smart and accessible archiving services that can be called upon at a moment's notice.
But, we can also include action: action creates information and information should create action. A diary summarizes the actions to be taken. What if it could literally help initiate those actions, such that we spare the writer/typist any need for focusing out to other apps? This would help keep all possible distractions to a minimum.
E.g. reminders that actually remind, transactions that actually ask to be executed, actions that report and document themselves in a neat and organized way and give rise to more actions. The sum orchestration and documentation of all these things constitutes and knowledge artifact
...'Actionable Knowledge' ... is knowledge relevant to practice, designed and presented in a manner which makes it easy to use in decisions in the real life practice setting. ... Examples of actionable knowledge products include: clinical calculators and handbooks.
Active record: this pattern for ORM allow for the creation of in-memory objects tied directly to a persistent data layer, using a base object/class that provides methods that directly map an object to a database e.g. CRUD methods. These are useful for cases where business processes are not known ahead of time or they basic methods map neatly to simple CRUD operations of persistent data storage.
Agile software development recommends:
# Release frequently
# Gather metrics for learning
# Integrate what you’ve learned
The Manifesto for Agile Software Development is based on twelve principles:
# Customer satisfaction by early and continuous delivery of valuable software.
# Welcome changing requirements, even in late development.
# Deliver working software frequently (weeks rather than months)
# Close, daily cooperation between business people and developers
# Projects are built around motivated individuals, who should be trusted
# Face-to-face conversation is the best form of communication (co-location)
# Working software is the primary measure of progress
# Sustainable development, able to maintain a constant pace
# Continuous attention to technical excellence and good design
# [[Simplicity—the art of maximizing the amount of work not done—is essential|Foundation of pattern languages]]
# Best architectures, requirements, and designs emerge from self-organizing teams
# Regularly, the team reflects on how to become more effective, and adjusts accordingly
[[Features common to pattern languages and wikis]] give rise to many of the ideas underpinning the [[principles of Agile development|Agile development]], namely:
# Rapidity
# Generative, i.e. simplicity via generativity, not specifications
# Embracing evolution and change at any point in time, and anticipating it via design
# Falsify and refine, don't ossify
# Good design emerge from self-organizing teams
# Exploration from bottom up
# Learn and adapt accordingly
And we also see from the exploration of [[Wiki as a Pattern Language]] that Agile really does NOT advocate:
# Against planning. Planning for constant change (as per the nature of wikis, which constantly change) is the best type of planning you could do
# Against documentation (duh!)
# Not having procedures and doing whatever you want
# Scrum or any methodology for that matter
# Work fitting into Sprints
# Turning agile itself into a methodology
# Not having deadlines (instead, you should learn from data to predict the deadline better and refine accordingly)
# Only using agile in small companies
# Being a one way ticket to success. It is a means of failing quickly and cheaply versus failing slowly and expensively
# Having no leadership; you need leaders to set high level objectives, not micromanaging people on procedures
# Speed over Quality; if you're not focusing on quality you might as well not work. Quality emerges and is refined via continuous improvement
# Not thinking things through. You still need to think.
# that it only belongs to the IT department. These are twelve domain agnostic principles that can be applied anywhere
I have listed more //[[via negativa]]// description than //via positiva//. That makes for a more robust exploration of this topic!
It is interesting to note how working with wikis and agile somewhat resemble [[Bricoleur style of work]].
<<<
“A year spent in artificial intelligence is enough to make one believe in God.”
—Alan Perlis
<<<
Shy and timid girl. Timidness is due to her mother's ill treatment of her.
Father loves her most out of all her siblings. Some of the siblings don't like her because of that.
# [[Theme]]
# [[Story Skeleton]]
# [[Characters]]
# [[Organizations]]
# MindMap
# [[Story chapters and notes]]
# Peter, the eldest. Strong, intelligent and proud. He is his mother's favorite and she often pits him against his third born sister. He is 16 in the story.
# Helga, the second born. Helga only looks capable on the surface but she is anything but. She as the only girl in the family besides [[Aika]], she prefers to hang out more with her sister. She sympathizes with her mother often, though Deborah rarely reciprocates if ever. She is 13 in the story.
# [[Aika]], the third born and the youngest girl (10 years) in the family.
# Kevin, a 7 year old, loves football but has no one to share the experience with in the family. Peter introduced the sport to him, but he lost interest soon after because of the demands of school. [[Aika ]]often watches with him, but only because she doesn't want Kevin to feel forgotten in the family.
# Finally, the youngest of the lot, 5 year old George Jr. Named after his father because of his uncanny resemblance, George Jr. or 'Georgie' (because of the way he mispronounces his own name) is young and impulsive. He often likes to hang around with others wherever he finds them and ask that they play video games with him. He's good with games, but that's about it. [[Aika ]]and her father sometimes think he needs to have less screen time but his doting mother always shuts them down the moment they mention it.
Sharing stuff between Apple devices is made seamless with this thing called Airdrop. But there seems to be no standard alternative for other devices.
Could be an unmet need or a simple case of good to have if you're into Apple.
The available alternatives for non-Apple devices include:
* Nearby share
To do this, we'd have to set up a wireless peer to peer connection. I'm already thinking of possible ways to automate [[this process|https://mobile.smallbusinesscomputing.com/testdrive/article.php/3359421/Setting-Up-a-Wireless-PeertoPeer-Network.htm]].
Want to be an Android developer? Here you go: How to start building your Android app: creating Mockups, UI, and XML layouts https://t.co/chBYCcxiRG
CEO of NeonoeticTechnologies. She is an accomplished woman with degrees in the sciences of computers and bioinformatics. She had recently dabbled in the life sciences in anticipation for her next project for her already successful company. She had originally wanted to study medicine but became distracted by a pet project for what she would only describe to her closest colleagues as "the cure to end all cures". Like [[Okami]], she has been reported as "missing" by her company after she left to see company facilities in Africa. She has been missing for over a year now.
[[Resource for Public APIs]]
<$macrocall
$name="toc-tabbed-internal-nav"
tag="App Design Studies"
sort=sort[created]
selectedTiddler="$:/temp/toc/app-design-studies"
unselectedText="<p>Select a topic in the table of contents. Click the arrow to expand a topic.</p>"
missingText="<p>Missing tiddler.</p>"
/>
Lean Startup by Bê Sabino from the Noun Project, modified.
<svg width="20pt" height="20pt" viewBox="0 0 120 95" xmlns="http://www.w3.org/2000/svg">
<g>
<title>background</title>
<rect fill="none" id="canvas_background" height="100" width="108" y="-1" x="-1"/>
</g>
<g>
<title>Layer 1</title>
<g id="svg_1" display="none">
<rect id="svg_2" height="168.4" width="1789.9" fill="#000000" y="-32.1" x="-1529.400001"/>
</g>
<g id="svg_3">
<path id="svg_4" d="m52.099999,8.1c6.1,0 11,4.9 11,11s-4.9,11 -11,11s-11,-4.9 -11,-11s4.9,-11 11,-11m0,-4c-8.3,0 -15,6.7 -15,15s6.7,15 15,15c8.3,0 15,-6.7 15,-15s-6.7,-15 -15,-15l0,0z"/>
<path id="svg_5" d="m83.899999,59.9c6.1,0 11,4.9 11,11s-4.9,11 -11,11s-11,-4.9 -11,-11s4.9,-11 11,-11m0,-4c-8.3,0 -15,6.7 -15,15s6.7,15 15,15s15,-6.7 15,-15s-6.7,-15 -15,-15l0,0z"/>
<path id="svg_6" d="m20.199999,59.9c6.1,0 11,4.9 11,11s-4.9,11 -11,11s-11,-4.9 -11,-11s4.9,-11 11,-11m0,-4c-8.3,0 -15,6.7 -15,15s6.7,15 15,15c8.3,0 15,-6.7 15,-15s-6.8,-15 -15,-15l0,0z"/>
<g id="svg_7">
<path id="svg_8" d="m-1476.600001,8.5c13.3,0 24.1,10.8 24.1,24.1s-10.8,24.1 -24.1,24.1s-24.1,-10.8 -24.1,-24.1s10.8,-24.1 24.1,-24.1m0,-4c-15.5,0 -28.1,12.6 -28.1,28.1s12.6,28.1 28.1,28.1s28.1,-12.6 28.1,-28.1s-12.5,-28.1 -28.1,-28.1l0,0z"/>
<path id="svg_9" d="m-1436.800001,8.5c13.3,0 24.1,10.8 24.1,24.1s-10.8,24.1 -24.1,24.1c-13.3,0 -24.1,-10.8 -24.1,-24.1s10.8,-24.1 24.1,-24.1m0,-4c-15.5,0 -28.1,12.6 -28.1,28.1s12.6,28.1 28.1,28.1c15.5,0 28.1,-12.6 28.1,-28.1s-12.6,-28.1 -28.1,-28.1l0,0z"/>
<path id="svg_10" d="m-1457.700001,43.3c13.3,0 24.1,10.8 24.1,24.1c0,13.3 -10.8,24.1 -24.1,24.1c-13.3,0 -24.1,-10.8 -24.1,-24.1c0,-13.3 10.8,-24.1 24.1,-24.1m0,-4c-15.5,0 -28.1,12.6 -28.1,28.1s12.6,28.1 28.1,28.1c15.5,0 28.1,-12.6 28.1,-28.1s-12.6,-28.1 -28.1,-28.1l0,0z"/>
</g>
<path id="svg_11" d="m-1248.000001,33.2c6.3,-17.3 22.9,-29.7 42.4,-29.7c24.9,0 45.1,20.2 45.1,45.1s-20.2,45.1 -45.1,45.1c-20.2,0 -37.4,-13.3 -43.1,-31.7" stroke-miterlimit="10" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_12" d="m-1243.400001,56.6c-1.2,3.4 -3.2,5.5 -5.3,5.5c-3.8,0 -6.8,-6.5 -6.8,-14.5s3,-14.5 6.8,-14.5c2.2,0 4.1,2.2 5.3,5.5" stroke-miterlimit="10" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<circle id="svg_13" r="4.5" cy="39" cx="-1176.600001"/>
<path id="svg_14" d="m-1167.800001,72.7c-14.9,0 -27.1,-7.5 -27.8,-16.9" stroke-miterlimit="10" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_15" d="m-1316.500001,55.5l1.6,0c16.2,0 29.4,11.2 29.4,27.4l0,1c0,6.6 -7.4,14 -14,14l-61.9,0c-6.6,0 -14,-7.4 -14,-14l0,-1c0,-16.2 13.2,-27.4 29.4,-27.4" stroke-miterlimit="10" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_16" d="m-1346.100001,55.5l1.9,0" stroke-miterlimit="10" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_17" d="m-1330.500001,5.8c14.2,0 25.8,11.6 25.8,25.8s-11.6,25.8 -25.8,25.8s-25.8,-11.6 -25.8,-25.8s11.6,-25.8 25.8,-25.8m0,-4c-16.5,0 -29.8,13.4 -29.8,29.8s13.4,29.8 29.8,29.8s29.8,-13.4 29.8,-29.8s-13.3,-29.8 -29.8,-29.8l0,0z"/>
<g id="svg_18">
<path id="svg_19" d="m-1120.200001,10.1c1.7,0 3.1,1.4 3.1,3.1s-1.4,3.1 -3.1,3.1s-3.1,-1.4 -3.1,-3.1s1.4,-3.1 3.1,-3.1m0,-4c-3.9,0 -7.1,3.2 -7.1,7.1s3.2,7.1 7.1,7.1s7.1,-3.2 7.1,-7.1s-3.2,-7.1 -7.1,-7.1l0,0z"/>
<path id="svg_20" d="m-1046.400001,10.1c1.7,0 3.1,1.4 3.1,3.1s-1.4,3.1 -3.1,3.1s-3.1,-1.4 -3.1,-3.1s1.4,-3.1 3.1,-3.1m0,-4c-3.9,0 -7.1,3.2 -7.1,7.1s3.2,7.1 7.1,7.1s7.1,-3.2 7.1,-7.1s-3.2,-7.1 -7.1,-7.1l0,0z"/>
<path id="svg_21" d="m-1120.200001,83c1.7,0 3.1,1.4 3.1,3.1s-1.4,3.1 -3.1,3.1s-3.1,-1.4 -3.1,-3.1s1.4,-3.1 3.1,-3.1m0,-4c-3.9,0 -7.1,3.2 -7.1,7.1c0,3.9 3.2,7.1 7.1,7.1s7.1,-3.2 7.1,-7.1c0,-3.9 -3.2,-7.1 -7.1,-7.1l0,0z"/>
<path id="svg_22" d="m-1046.400001,83c1.7,0 3.1,1.4 3.1,3.1s-1.4,3.1 -3.1,3.1s-3.1,-1.4 -3.1,-3.1s1.4,-3.1 3.1,-3.1m0,-4c-3.9,0 -7.1,3.2 -7.1,7.1c0,3.9 3.2,7.1 7.1,7.1s7.1,-3.2 7.1,-7.1c0,-3.9 -3.2,-7.1 -7.1,-7.1l0,0z"/>
<g id="svg_23">
<line id="svg_24" y2="13" x2="-1108.500001" y1="13" x1="-1113.500001" stroke-miterlimit="10" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<line id="svg_25" y2="13" x2="-1061.500001" y1="13" x1="-1098.500001" stroke-dasharray="12,9" stroke-miterlimit="10" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<line id="svg_26" y2="13" x2="-1052.500001" y1="13" x1="-1057.500001" stroke-miterlimit="10" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
</g>
<g id="svg_27">
<line id="svg_28" y2="78.2" x2="-1112.200001" y1="81.8" x1="-1115.700001" stroke-miterlimit="10" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<line id="svg_29" y2="25.9" x2="-1059.900001" y1="72.7" x1="-1106.700001" stroke-dasharray="9.7363,7.7891" stroke-miterlimit="10" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<line id="svg_30" y2="19.6" x2="-1053.600001" y1="23.2" x1="-1057.100001" stroke-miterlimit="10" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
</g>
<g id="svg_31">
<line id="svg_32" y2="86" x2="-1108.500001" y1="86" x1="-1113.500001" stroke-miterlimit="10" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<line id="svg_33" y2="86" x2="-1061.500001" y1="86" x1="-1098.500001" stroke-dasharray="12,9" stroke-miterlimit="10" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<line id="svg_34" y2="86" x2="-1052.500001" y1="86" x1="-1057.500001" stroke-miterlimit="10" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
</g>
</g>
<g id="svg_35">
<path id="svg_36" d="m-918.100001,26.7l0,13.1l-87,0l0,-13.1l87,0m0,-4l-87,0c-2.2,0 -4,1.8 -4,4l0,13.1c0,2.2 1.8,4 4,4l87,0c2.2,0 4,-1.8 4,-4l0,-13.1c0,-2.2 -1.8,-4 -4,-4l0,0z"/>
<path id="svg_37" d="m-923.900001,43.9l0,49.4l-75.4,0l0,-49.4l75.4,0m4,-4l-83.4,0l0,53.4c0,2.2 1.8,4 4,4l75.4,0c2.2,0 4,-1.8 4,-4l0,-53.4l0,0z"/>
<line id="svg_38" y2="25" x2="-962.500001" y1="95" x1="-962.500001" stroke-miterlimit="10" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<g id="svg_39">
<path id="svg_40" d="m-942.500001,4.3c5.6,0 10.2,4.6 10.2,10.2s-4.6,10.2 -10.2,10.2" stroke-miterlimit="10" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_41" d="m-962.000001,22.6c0,0 7.3,-18.3 19.6,-18.3" stroke-miterlimit="10" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
</g>
<g id="svg_42">
<path id="svg_43" d="m-981.500001,4.3c-5.6,0 -10.2,4.6 -10.2,10.2s4.6,10.2 10.2,10.2" stroke-miterlimit="10" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_44" d="m-962.000001,22.6c0,0 -7.3,-18.3 -19.6,-18.3" stroke-miterlimit="10" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
</g>
</g>
<path id="svg_45" d="m-803.500001,9c3.3,0 6,2.7 6,6l0,70c0,3.3 -2.7,6 -6,6l-70,0c-3.3,0 -6,-2.7 -6,-6l0,-70c0,-3.3 2.7,-6 6,-6l70,0m0,-4l-70,0c-5.5,0 -10,4.5 -10,10l0,70c0,5.5 4.5,10 10,10l70,0c5.5,0 10,-4.5 10,-10l0,-70c0,-5.5 -4.5,-10 -10,-10l0,0z"/>
<line id="svg_46" y2="93" x2="-839.500001" y1="6" x1="-839.500001" stroke-miterlimit="10" stroke-linejoin="round" stroke-width="4" stroke="#000000" fill="none"/>
<line id="svg_47" y2="50" x2="-838.500001" y1="50" x1="-794.500001" stroke-miterlimit="10" stroke-linejoin="round" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_48" d="m-713.000001,30.9l25.8,19.1l-25.8,19.1l-25.8,-19.1l25.8,-19.1m0,-4c-0.8,0 -1.7,0.3 -2.4,0.8l-25.8,19.1c-1,0.8 -1.6,1.9 -1.6,3.2s0.6,2.5 1.6,3.2l25.8,19.1c0.7,0.5 1.5,0.8 2.4,0.8s1.7,-0.3 2.4,-0.8l25.8,-19.1c1,-0.8 1.6,-1.9 1.6,-3.2s-0.6,-2.5 -1.6,-3.2l-25.8,-19.1c-0.7,-0.5 -1.5,-0.8 -2.4,-0.8l0,0z"/>
<path id="svg_49" d="m-713.000001,7c1.9,0 3.5,1.6 3.5,3.5s-1.6,3.5 -3.5,3.5c-1.9,0 -3.5,-1.6 -3.5,-3.5s1.6,-3.5 3.5,-3.5m0,-4c-4.2,0 -7.5,3.4 -7.5,7.5s3.4,7.5 7.5,7.5c4.2,0 7.5,-3.4 7.5,-7.5s-3.3,-7.5 -7.5,-7.5l0,0z"/>
<path id="svg_50" d="m-752.000001,86c1.9,0 3.5,1.6 3.5,3.5c0,1.9 -1.6,3.5 -3.5,3.5c-1.9,0 -3.5,-1.6 -3.5,-3.5c0,-2 1.6,-3.5 3.5,-3.5m0,-4c-4.2,0 -7.5,3.4 -7.5,7.5c0,4.2 3.4,7.5 7.5,7.5c4.2,0 7.5,-3.4 7.5,-7.5c0,-4.2 -3.3,-7.5 -7.5,-7.5l0,0z"/>
<path id="svg_51" d="m-673.000001,86c1.9,0 3.5,1.6 3.5,3.5c0,1.9 -1.6,3.5 -3.5,3.5c-1.9,0 -3.5,-1.6 -3.5,-3.5c0,-2 1.5,-3.5 3.5,-3.5m0,-4c-4.2,0 -7.5,3.4 -7.5,7.5c0,4.2 3.4,7.5 7.5,7.5c4.2,0 7.5,-3.4 7.5,-7.5c0,-4.2 -3.4,-7.5 -7.5,-7.5l0,0z"/>
<line id="svg_52" y2="29" x2="-713.500001" y1="17" x1="-713.500001" stroke-miterlimit="10" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<g id="svg_53">
<line id="svg_54" y2="79" x2="-752.500001" y1="83" x1="-752.500001" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<line id="svg_55" y2="58" x2="-752.500001" y1="71" x1="-752.500001" stroke-dasharray="8,8" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<polyline id="svg_56" points="-752.5000009536743,54 -752.5000009536743,50 -748.5000009536743,50 " stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<line id="svg_57" y2="49.9" x2="-739.900001" y1="49.9" x1="-743.900001" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
</g>
<g id="svg_58">
<line id="svg_59" y2="79" x2="-673.500001" y1="83" x1="-673.500001" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<line id="svg_60" y2="58" x2="-673.500001" y1="71" x1="-673.500001" stroke-dasharray="8,8" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<polyline id="svg_61" points="-673.5000009536743,54 -673.5000009536743,50 -677.5000009536743,50 " stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<line id="svg_62" y2="49.9" x2="-685.700001" y1="49.9" x1="-681.700001" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
</g>
<g id="svg_63">
<path id="svg_64" d="m-560.800001,9.1c3.3,0 6,2.7 6,6l0,50.7c0,3.3 -2.7,6 -6,6l-69.3,0c-3.3,0 -6,-2.7 -6,-6l0,-50.7c0,-3.3 2.7,-6 6,-6l69.3,0m0,-4l-69.3,0c-5.5,0 -10,4.5 -10,10l0,50.7c0,5.5 4.5,10 10,10l69.3,0c5.5,0 10,-4.5 10,-10l0,-50.7c0,-5.5 -4.5,-10 -10,-10l0,0z"/>
<line id="svg_65" y2="85" x2="-638.500001" y1="85" x1="-551.500001" stroke-miterlimit="10" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<line id="svg_66" y2="95" x2="-638.500001" y1="95" x1="-551.500001" stroke-miterlimit="10" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<line id="svg_67" y2="71.2" x2="-554.200001" y1="9.1" x1="-636.500001" stroke-miterlimit="10" stroke-width="4" stroke="#000000" fill="none"/>
<line id="svg_68" y2="71.3" x2="-636.500001" y1="10" x1="-555.100001" stroke-miterlimit="10" stroke-width="4" stroke="#000000" fill="none"/>
</g>
<path id="svg_69" d="m-450.900001,7c2.2,0 4,1.8 4,4l0,78c0,2.2 -1.8,4 -4,4l-33.1,0c-2.2,0 -4,-1.8 -4,-4l0,-78c0,-2.2 1.8,-4 4,-4l33.1,0m0,-4l-33.1,0c-4.4,0 -8,3.6 -8,8l0,78c0,4.4 3.6,8 8,8l33.1,0c4.4,0 8,-3.6 8,-8l0,-78c0,-4.4 -3.6,-8 -8,-8l0,0z"/>
<path id="svg_70" d="m-450.900001,7.3c2.2,0 4,1.8 4,4l0,66l-41.1,0l0,-66c0,-2.2 1.8,-4 4,-4l33.1,0m0,-4l-33.1,0c-4.4,0 -8,3.6 -8,8l0,70l49.1,0l0,-70c0,-4.4 -3.6,-8 -8,-8l0,0z"/>
<circle id="svg_71" r="4.1" cy="87" cx="-467.600001"/>
<polyline id="svg_72" points="-323.5000009536743,80 -325.20001316070557,80 -299.5000009536743,80 " stroke-miterlimit="10" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_73" d="m-349.300001,20.8c-16.2,0 -28.5,13.1 -28.5,29.2c0,10.1 5,19 12.7,24.2c0.3,0.2 0.6,0.4 0.9,0.6" stroke-miterlimit="10" stroke-linejoin="round" stroke-width="4" stroke="#000000" fill="none"/>
<polyline id="svg_74" points="-302.8999948501587,72.9000015258789 -296.5000009536743,79.19999694824219 -302.8999948501587,85.5999984741211 " stroke-miterlimit="10" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<polyline id="svg_75" points="-337.79998874664307,27.100000381469727 -344.20001316070557,20.799999237060547 -337.79998874664307,14.399999618530273 " stroke-miterlimit="10" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_76" d="m-343.200001,21.2c16.2,0 29.4,13.2 29.4,29.4s-13,29.4 -29.2,29.4l-49.5,0" stroke-miterlimit="10" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_77" d="m-217.100001,14.7c21.5,0 39,17.5 39,39s-17.5,39 -39,39s-39,-17.5 -39,-39s17.5,-39 39,-39m0,-4c-23.7,0 -43,19.3 -43,43s19.3,43 43,43c23.7,0 43,-19.3 43,-43s-19.3,-43 -43,-43l0,0z"/>
<path id="svg_78" d="m-217.100001,27.7c14.3,0 26,11.7 26,26s-11.7,26 -26,26s-26,-11.7 -26,-26s11.7,-26 26,-26m0,-4c-16.6,0 -30,13.4 -30,30s13.4,30 30,30c16.6,0 30,-13.4 30,-30s-13.4,-30 -30,-30l0,0z"/>
<path id="svg_79" d="m-217.100001,41.7c6.6,0 12,5.4 12,12s-5.4,12 -12,12s-12,-5.4 -12,-12s5.4,-12 12,-12m0,-4c-8.8,0 -16,7.2 -16,16s7.2,16 16,16s16,-7.2 16,-16s-7.2,-16 -16,-16l0,0z"/>
<line id="svg_80" y2="19.7" x2="-183.300001" y1="53.5" x1="-217.100001" stroke-miterlimit="10" stroke-linejoin="round" stroke-linecap="round" stroke-width="4" stroke="#000000" fill="none"/>
<polygon id="svg_81" points="-173.80000400543213,19.399999618530273 -183.00000095367432,19.399999618530273 -183.00000095367432,10.199999809265137 -176.10000705718994,3.299999952316284 -176.10000705718994,12.5 -166.8999948501587,12.5 " stroke-miterlimit="10" stroke-linejoin="round" stroke-width="4" stroke="#000000" fill="none"/>
<circle id="svg_82" r="4" cy="53.7" cx="-217.200001"/>
<path id="svg_83" d="m-104.700001,23.2l7.9,13.1l-8.2,13.1l-16.1,0l-8,-13l8,-13l16.6,0m-0.6,-2.9l-16.1,0c-1,0 -2,0.2 -2.6,1.1l-8,13c-0.6,1 -0.6,2.1 0,3l8,13.3c0.5,0.9 1.5,1.5 2.6,1.5l16.1,0c1,0 2,-0.7 2.6,-1.6l8,-13.2c0.6,-1 0.6,-2.2 0,-3.1l-8,-12.9c-0.6,-0.8 -1.5,-1.1 -2.6,-1.1l0,0z" stroke-miterlimit="10" stroke="#000000"/>
<path id="svg_84" d="m-78.200001,8.2l7.9,13.1l-8.1,13.1l-16.1,0l-8,-13l8,-13l16,0m0.1,-2.9l-16.1,0c-1,0 -2,0.3 -2.6,1.2l-8,13.1c-0.6,1 -0.6,2.1 0,3.1l8,13.2c0.5,0.9 1.5,1.5 2.6,1.5l16.1,0c1,0 2,-0.6 2.6,-1.5l8,-13.2c0.6,-1 0.6,-2.2 0,-3.1l-8,-12.9c-0.6,-1.1 -1.5,-1.4 -2.6,-1.4l0,0z" stroke-miterlimit="10" stroke="#000000"/>
<path id="svg_85" d="m-77.900001,37.2l8,13.1l-8,13.1l-16.1,0l-8,-13l8,-13l16.5,0m-0.4,-2.9l-16.1,0c-1,0 -2,0.2 -2.6,1.1l-8,13c-0.6,1 -0.6,2.1 0,3l8,13.3c0.5,0.9 1.5,1.6 2.6,1.6l16.1,0c1,0 2,-0.7 2.6,-1.6l8,-13.3c0.6,-1 0.6,-2.2 0,-3.2l-8,-12.9c-0.6,-0.8 -1.6,-1 -2.6,-1l0,0z" stroke-miterlimit="10" stroke="#000000"/>
<path id="svg_86" d="m-51.500001,22.5l8,13.1l-8,12.9l-16.1,0l-8,-13l8,-13l16.1,0m0,-3l-16.1,0c-1,0 -2,0.5 -2.6,1.4l-8,13.2c-0.6,1 -0.6,2.1 0,3.1l8,13c0.5,0.9 1.5,1.3 2.6,1.3l16.1,0c1,0 2,-0.4 2.6,-1.3l8,-13.1c0.6,-1 0.6,-2.1 0,-3.1l-8,-13.1c-0.6,-0.9 -1.6,-1.4 -2.6,-1.4l0,0z" stroke-miterlimit="10" stroke="#000000"/>
<path id="svg_87" d="m-50.600001,51.2l8,13.1l-8.1,13.1l-16.1,0l-8,-13l8,-13l16.3,0m-0.3,-2.9l-16.1,0c-1,0 -2,0.2 -2.6,1.1l-8,13c-0.6,1 -0.6,2.1 0,3l8,13.3c0.5,0.9 1.5,1.6 2.6,1.6l16.1,0c1,0 2,-0.7 2.6,-1.6l8,-13.3c0.6,-1 0.6,-2.2 0,-3.2l-8,-12.8c-0.6,-0.9 -1.5,-1.1 -2.6,-1.1l0,0z" stroke-miterlimit="10" stroke="#000000"/>
<path id="svg_88" d="m-77.100001,66.2l7.9,13.1l-8.1,13.1l-16.1,0l-8,-13l8,-13l16.9,0m-0.8,-2.9l-16.1,0c-1,0 -2,0.1 -2.6,1l-8,13c-0.6,1 -0.6,2.1 0,3l8,13.4c0.5,0.9 1.5,1.6 2.6,1.6l16.1,0c1,0 2,-0.8 2.6,-1.7l8,-13.3c0.6,-1 0.6,-2.2 0,-3.2l-8,-12.8c-0.6,-0.9 -1.5,-1 -2.6,-1l0,0z" stroke-miterlimit="10" stroke="#000000"/>
<path id="svg_89" d="m-104.400001,52.2l8,13.1l-8,13.1l-16.1,0l-8,-13l8,-13l16,0m0.1,-2.9l-16.1,0c-1,0 -2,0.2 -2.6,1.1l-8,13c-0.6,1 -0.6,2.1 0,3l8,13.3c0.5,0.9 1.5,1.6 2.6,1.6l16.1,0c1,0 2,-0.7 2.6,-1.6l8,-13.3c0.6,-1 0.6,-2.2 0,-3.2l-8,-12.8c-0.6,-0.9 -1.6,-1.1 -2.6,-1.1l0,0z" stroke-miterlimit="10" stroke="#000000"/>
<path id="svg_90" d="m16.599999,58.5c-0.2,-1.5 -0.3,-3.1 -0.3,-4.7c0,-15.3 9.5,-28.3 23,-33.5" stroke-miterlimit="10" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_91" d="m16.599999,58.5" stroke-miterlimit="10" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_92" d="m75.699999,80.7c-6.3,5.5 -14.6,8.9 -23.6,8.9c-9,0 -17.3,-3.4 -23.6,-8.9" stroke-miterlimit="10" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_93" d="m75.699999,80.7" stroke-miterlimit="10" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_94" d="m64.899999,20.3c13.4,5.2 23,18.2 23,33.5c0,1.6 -0.1,3.1 -0.3,4.6" stroke-miterlimit="10" stroke-width="4" stroke="#000000" fill="none"/>
<g id="svg_95">
<path id="svg_96" d="m219.499999,14.8c3.3,0 6,2.7 6,6l0,58.4c0,3.3 -2.7,6 -6,6l-78,0c-3.3,0 -6,-2.7 -6,-6l0,-58.4c0,-3.3 2.7,-6 6,-6l78,0m0,-4l-78,0c-5.5,0 -10,4.5 -10,10l0,58.4c0,5.5 4.5,10 10,10l78,0c5.5,0 10,-4.5 10,-10l0,-58.4c0,-5.5 -4.5,-10 -10,-10l0,0z"/>
<line id="svg_97" y2="50" x2="164.499999" y1="50" x1="196.499999" stroke-miterlimit="10" stroke-linejoin="round" stroke-width="4" stroke="#000000" fill="none"/>
<path id="svg_98" d="m219.499999,14.8c3.3,0 6,2.7 6,6l0,58.4c0,3.3 -2.7,6 -6,6l-20.8,0l0,-70.4l20.8,0m0,-4l-24.8,0l0,78.4l24.8,0c5.5,0 10,-4.5 10,-10l0,-58.4c0,-5.5 -4.5,-10 -10,-10l0,0z"/>
<path id="svg_99" d="m162.299999,14.8l0,70.4l-20.8,0c-3.3,0 -6,-2.7 -6,-6l0,-58.4c0,-3.3 2.7,-6 6,-6l20.8,0m4,-4l-24.8,0c-5.5,0 -10,4.5 -10,10l0,58.4c0,5.5 4.5,10 10,10l24.8,0l0,-78.4l0,0z"/>
</g>
</g>
<text id="svg_100" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif" font-weight="bold" font-size="5px" fill="#000000" y="115" x="0">Created by Bê Sabino</text>
<text id="svg_101" font-family="'Helvetica Neue', Helvetica, Arial-Unicode, Arial, Sans-serif" font-weight="bold" font-size="5px" fill="#000000" y="120" x="0">from the Noun Project</text>
<g stroke="null" id="svg_106">
<path stroke="null" id="svg_105" d="m51.749995,37.461853c-8.997883,0 -16.288139,7.849731 -16.288139,17.538138s7.290256,17.538138 16.288139,17.538138s16.288139,-7.849731 16.288139,-17.538138s-7.290256,-17.538138 -16.288139,-17.538138zm9.457629,19.51825c0,0.466741 -0.354661,0.84862 -0.788136,0.84862l-6.042374,0l0,6.506083c0,0.466741 -0.354661,0.84862 -0.788136,0.84862l-3.677967,0c-0.433475,0 -0.788136,-0.381879 -0.788136,-0.84862l0,-6.506083l-6.042374,0c-0.433475,0 -0.788136,-0.381879 -0.788136,-0.84862l0,-3.960225c0,-0.466741 0.354661,-0.84862 0.788136,-0.84862l6.042374,0l0,-6.506083c0,-0.466741 0.354661,-0.84862 0.788136,-0.84862l3.677967,0c0.433475,0 0.788136,0.381879 0.788136,0.84862l0,6.506083l6.042374,0c0.433475,0 0.788136,0.381879 0.788136,0.84862l0,3.960225z" fill="currentColor"/>
</g>
</g>
</svg>
Appian seems more oriented towards building apps for enterprises. They focus on BPM and its collaboration features are what win many over. One of the biggest disadvantages about this app is the fact that it feels outdated, and it feels clunky when dealing with complex apps. However, it still remains popular with an average score of 4.1
<<list-links "[tag[Apps of Note]sort[title]]">>
* https://dev.to/nyxtom/realtime-collaborative-drawing-with-canvas-and-webrtc-2d01
* https://dzone.com/articles/multi-user-applications-with-pouchdb-and-ibm-cloud
An ''Array Literal'' in Formulas is expressed as a pair of curly braces containing a series of [[expressions|Expression]] separated by commas.
```
{1, 2, 3, "fork"}
```
The syntax is similar to the one used in popular spreadsheet software. 2D arrays with `;` are not currently supported, however.
<$button>
<$action-sendmessage $message="tm-new-tiddler" tags="Article" title="New Article" />
Create a new article
</$button>
! Unread articles
//Drag the articles to re-order them//
<<list-tagged-draggable tag:"Article" subFilter:"!has[draft.of]!tag[done]!sort[created]" itemTemplate:"TaskManagementExampleDraggableTemplate" emptyMessage:"You don't have any unread articles">>
! Read articles
//(Listed in reverse order of completion)//
<$list filter="[!has[draft.of]tag[Article]tag[done]!sort[created]]">
<div>
<$checkbox tag="done"> ~~<$link to={{!!title}}><$view field="title"/></$link>~~</$checkbox>
<$button message="tm-delete-tiddler" style="border:none;">❎</$button>
</div>
</$list>
Piotr Gaczkowski (@DoomHammerNG) Tweeted:
@ABSamma @MicahIverson @asana The ability to quickly and easily add tasks, share them with others, see the calendar view, and monitor the progress. https://twitter.com/DoomHammerNG/status/1310858372556763141?s=20
Piotr Gaczkowski (@DoomHammerNG) Tweeted:
@ABSamma @MicahIverson @asana It's also great for regular reviews. https://twitter.com/DoomHammerNG/status/1310858451971641344?s=20
Problem: "Hey, could you please send that document about X?"
Send me this, send me that!
Solution: a digital agent that says "Hey Abraham, I've found these documents that might be associated with this request. Should I send them?"
Perfect email assistant. No more poking around the file directories.
#### Build your own `Augmented Reality`
* [**C#**: _How To: Augmented Reality App Tutorial for Beginners with Vuforia and Unity 3D_](https://www.youtube.com/watch?v=uXNjNcqW4kY) [video]
* [**C#**: _Windows Mixed Reality Academy_](https://docs.microsoft.com/en-us/windows/mixed-reality/academy) [video]
* [**C#**: _How To Unity ARCore_](https://www.youtube.com/playlist?list=PLKIKuXdn4ZMjuUAtdQfK1vwTZPQn_rgSv) [video]
* [**C#**: _AR Portal Tutorial with Unity_](https://www.youtube.com/playlist?list=PLPCqNOwwN794Gz5fzUSi1p4OqLU0HTmvn) [video]
* [**C#**: _How to create a Dragon in Augmented Reality in Unity ARCore_](https://fr-film.net/v-how-to-create-a-dragon-in-augmented-reality-in-unity-arcore-tutorial-qTSDPkPyPqs.html) [video]
* [**C#**: _How to Augmented Reality AR Tutorial: ARKit Portal to the Upside Down_](https://www.youtube.com/watch?v=Z5AmqMuNi08) [video]
This is a remake for TW5 of the plugin autotag of tiddlywiki classic created by Eric Shulman.
To be honest, it can not be called a remake since it only includes the only feature that was useful
for me: automatic tagging of tiddlers based on their content.
The tags are added ''when the tiddler is saved''.
The plugin only add tags that exists already on the wiki. For example, if you have a tag called `tiddler`, or a tag called `test`, when you save a
tiddler with the sentence "This tiddler is just a test" it will be tagged with the tags `tiddler` and `test`.
https://danielorodriguez.com/TW5-AutoTag/
Trading is hard and learning how to trade is even harder. But, what if we could transfer the knowledge to shareable strategic machines? Algorithms that can all that precisely and at high capacity?
It would allow newbies and those without access to finally have access to reliable personal trading and improved ROI with little effort.
<<list-links "[tag<currentTiddler>sort[title]]">>
<p><a href="https://babeljs.io/docs/en/usage">babeljs.io</a></p>
<h1>Usage Guide · Babel</h1>
<p>8 - 10 minutes</p>
<hr />
<p> </p>
<p>There are quite a few tools in the Babel toolchain that try to make it easy for you to use Babel whether you're an "end-user" or building an integration of Babel itself. This will be a quick introduction to those tools and you can read more about them in the "Usage" section of the docs.</p>
<blockquote>
<p>If you're using a framework, the work of configuring Babel might be different or actually already handled for you. Check out our <a href="https://babeljs.io/setup.html">interactive setup guide</a> instead.</p></blockquote>
<h2> </h2>
<h2>Overview</h2>
<p>This guide will show you how to compile your JavaScript application code that uses ES2015+ syntax into code that works in current browsers. That will involve both transforming new syntax and polyfilling missing features.</p>
<p>The entire process to set this up involves:</p>
<ol>
<li>
<p>Running these commands to install the packages:</p>
<pre><code>npm install --save-dev @babel/core @babel/cli @babel/preset-env
npm install --save @babel/polyfill
</code></pre></li>
<li>
<p>Creating a config file named <code>babel.config.json</code> (requires <code>v7.8.0</code> and above) in the root of your project with this content:</p>
<pre><code>{
"presets": [
[
"@babel/env",
{
"targets": {
"edge": "17",
"firefox": "60",
"chrome": "67",
"safari": "11.1",
},
"useBuiltIns": "usage",
"corejs": "3.6.5",
}
]
]
}
</code></pre>
<blockquote>
<p>The browsers list above is just an arbitrary example. You will have to adapt it for the browsers you want to support.</p></blockquote></li></ol>
<p>Or <code>babel.config.js</code> if you are using an older Babel version</p>
<pre><code>const presets = [
[
"@babel/env",
{
targets: {
edge: "17",
firefox: "60",
chrome: "67",
safari: "11.1",
},
useBuiltIns: "usage",
"corejs": "3.6.4",
},
],
];
module.exports = { presets };
</code></pre>
<ol>
<li>
<p>And running this command to compile all your code from the <code>src</code> directory to <code>lib</code>:</p>
<pre><code>./node_modules/.bin/babel src --out-dir lib
</code></pre>
<blockquote>
<p>You can use the npm package runner that comes with npm@5.2.0 to shorten that command by replacing <code>./node_modules/.bin/babel</code> with <code>npx babel</code></p></blockquote></li></ol>
<p>Read on for a step-by-step explanation of how this works and an introduction to each of the tools used.</p>
<h2> </h2>
<h2>Basic usage with CLI</h2>
<p>All the Babel modules you'll need are published as separate npm packages scoped under <code>@babel</code> (since version 7). This modular design allows for various tools each designed for a specific use case. Here we'll look at <code>@babel/core</code> and <code>@babel/cli</code>.</p>
<h3> </h3>
<h3>Core Library</h3>
<p>The core functionality of Babel resides at the <a href="https://babeljs.io/docs/en/babel-core">@babel/core</a> module. After installing it:</p>
<pre><code>npm install --save-dev @babel/core
</code></pre>
<p>you can <code>require</code> it directly in your JavaScript program and use it like this:</p>
<pre><code>const babel = require("@babel/core");
babel.transform("code", optionsObject);
</code></pre>
<p>As an end-user though, you'll probably want to install other tools that serve as an interface to <code>@babel/core</code> and integrate well with your development process. Even so, you might still want to check its documentation page to learn about the options, most of which can be set from the other tools as well.</p>
<h3> </h3>
<h3>CLI tool</h3>
<p><a href="https://babeljs.io/docs/en/babel-cli">@babel/cli</a> is a tool that allows you to use babel from the terminal. Here's the installation command and a basic usage example:</p>
<pre><code>npm install --save-dev @babel/core @babel/cli
./node_modules/.bin/babel src --out-dir lib
</code></pre>
<p>This will parse all the JavaScript files in the <code>src</code> directory, apply any transformations we have told it to, and output each file to the <code>lib</code> directory. Since we haven't told it to apply any transformations yet, the output code will be identical to the input (exact code styling is not preserved). We can specify what transformations we want by passing them as options.</p>
<p>We used the <code>--out-dir</code> option above. You can view the rest of the options accepted by the cli tool by running it with <code>--help</code>. But the most important to us right now are <code>--plugins</code> and <code>--presets</code>.</p>
<h2> </h2>
<h2>Plugins & Presets</h2>
<p>Transformations come in the form of plugins, which are small JavaScript programs that instruct Babel on how to carry out transformations to the code. You can even write your own plugins to apply any transformations you want to your code. To transform ES2015+ syntax into ES5 we can rely on official plugins like <code>@babel/plugin-transform-arrow-functions</code>:</p>
<pre><code>npm install --save-dev @babel/plugin-transform-arrow-functions
./node_modules/.bin/babel src --out-dir lib --plugins=@babel/plugin-transform-arrow-functions
</code></pre>
<p>Now any arrow functions in our code will be transformed into ES5 compatible function expressions:</p>
<pre><code>const fn = () => 1;
var fn = function fn() {
return 1;
};
</code></pre>
<p>That's a good start! But we also have other ES2015+ features in our code that we want transformed. Instead of adding all the plugins we want one by one, we can use a "preset" which is just a pre-determined set of plugins.</p>
<p>Just like with plugins, you can create your own presets too to share any combination of plugins you need. For our use case here, there's an excellent preset named <code>env</code>.</p>
<pre><code>npm install --save-dev @babel/preset-env
./node_modules/.bin/babel src --out-dir lib --presets=@babel/env
</code></pre>
<p>Without any configuration, this preset will include all plugins to support modern JavaScript (ES2015, ES2016, etc.). But presets can take options too. Rather than passing both cli and preset options from the terminal, let's look at another way of passing options: configuration files.</p>
<h2> </h2>
<h2>Configuration</h2>
<blockquote>
<p>There are a few different ways to use configuration files depending on your needs. Be sure to read our in-depth guide on how to <a href="https://babeljs.io/docs/en/configuration">configure Babel</a> for more information.</p></blockquote>
<p>For now, let's create a file called <code>babel.config.json</code> (requires <code>v7.8.0</code> and above) with the following content:</p>
<pre><code>{
"presets": [
[
"@babel/env",
{
"targets": {
"edge": "17",
"firefox": "60",
"chrome": "67",
"safari": "11.1"
}
}
]
]
}
</code></pre>
<p>Now the <code>env</code> preset will only load transformation plugins for features that are not available in our target browsers. We're all set for syntax. Let's look at polyfills next.</p>
<h2> </h2>
<h2>Polyfill</h2>
<blockquote>
<p>🚨 As of Babel 7.4.0, this package has been deprecated in favor of directly including <code>core-js/stable</code> (to polyfill ECMAScript features) and <code>regenerator-runtime/runtime</code> (needed to use transpiled generator functions):</p>
<pre><code>import "core-js/stable";
import "regenerator-runtime/runtime";
</code></pre></blockquote>
<p>The <a href="https://babeljs.io/docs/en/babel-polyfill">@babel/polyfill</a> module includes <a href="https://github.com/zloirock/core-js">core-js</a> and a custom <a href="https://github.com/facebook/regenerator/blob/master/packages/regenerator-runtime/runtime.js">regenerator runtime</a> to emulate a full ES2015+ environment.</p>
<p>This means you can use new built-ins like <code>Promise</code> or <code>WeakMap</code>, static methods like <code>Array.from</code> or <code>Object.assign</code>, instance methods like <code>Array.prototype.includes</code>, and generator functions (when used alongside the regenerator plugin). The polyfill adds to the global scope as well as native prototypes like <code>String</code> in order to do this.</p>
<p>For library/tool authors this may be too much. If you don't need the instance methods like <code>Array.prototype.includes</code> you can do without polluting the global scope altogether by using the <a href="https://babeljs.io/docs/en/babel-plugin-transform-runtime">transform runtime</a> plugin instead of <code>@babel/polyfill</code>.</p>
<p>To go one step further, if you know exactly what features you need polyfills for, you can require them directly from <a href="https://github.com/zloirock/core-js#commonjs">core-js</a>.</p>
<p>Since we're building an application we can just install <code>@babel/polyfill</code>:</p>
<pre><code>npm install --save @babel/polyfill
</code></pre>
<blockquote>
<p>Note the <code>--save</code> option instead of <code>--save-dev</code> as this is a polyfill that needs to run before your source code.</p></blockquote>
<p>Now luckily for us, we're using the <code>env</code> preset which has a <code>"useBuiltIns"</code> option that when set to <code>"usage"</code> will practically apply the last optimization mentioned above where you only include the polyfills you need. With this new option the configuration changes like this:</p>
<pre><code>{
"presets": [
[
"@babel/env",
{
"targets": {
"edge": "17",
"firefox": "60",
"chrome": "67",
"safari": "11.1",
},
"useBuiltIns": "usage",
}
]
]
}
</code></pre>
<p>Babel will now inspect all your code for features that are missing in your target environments and include only the required polyfills. For example this code:</p>
<pre><code>Promise.resolve().finally();
</code></pre>
<p>would turn into this (because Edge 17 doesn't have <code>Promise.prototype.finally</code>):</p>
<pre><code>require("core-js/modules/es.promise.finally");
Promise.resolve().finally();
</code></pre>
<p>If we weren't using the <code>env</code> preset with the <code>"useBuiltIns"</code> option set to <code>"usage"</code> we would've had to require the full polyfill <em>only once</em> in our entry point before any other code.</p>
<h2> </h2>
<h2>Summary</h2>
<p>We used <code>@babel/cli</code> to run Babel from the terminal, <code>@babel/polyfill</code> to polyfill all the new JavaScript features, and the <code>env</code> preset to only include the transformations and polyfills for the features that we use and that are missing in our target browsers.</p>
<p>For more information on setting up Babel with your build system, IDE, and more, check out our <a href="https://babeljs.io/setup.html">interactive setup guide</a>.</p>
<p> </p>
As much as possible, we're going to adhere to this file structure to make it compatible to [[TW for Nodejs|https://tiddlywiki.com/#TiddlyWikiFolders:TiddlyWikiFolders%20%5B%5Btiddlywiki.info%20Files%5D%5D%20%5B%5BCustomising%20Tiddler%20File%20Naming%5D%5D]]:
```
├── files/
├── plugins/
├── languages/
├── themes/
├── tiddlers/
└── tiddlywiki.info
```
For reference sake, here are the properties for the `tiddlywiki.info` file:
* plugins - an array of plugin names to be included in the wiki
* themes - an array of theme names to be included in the wiki
* languages - an array of language names to be included in the wiki
* includeWikis - an array of references to external wiki folders to be included in the wiki
* build - a hashmap of named build targets, each defined by an array of command tokens (see BuildCommand)
* config - an optional hashmap of configuration options (see below)
And here's an example of the contents of a typical `tiddlywiki.info` file:
```
{
"plugins": [
"tiddlywiki/tiddlyweb",
"tiddlywiki/filesystem"
],
"includeWikis": [
{"path": "../tw5.com", "read-only": true}
],
"build": {
"index": [
"--rendertiddler","$:/core/save/all","index.html","text/plain"],
"favicon": [
"--savetiddler","$:/favicon.ico","favicon.ico",
"--savetiddler","$:/green_favicon.ico","static/favicon.ico"]
},
"config": {
"retain-original-tiddler-path": true
}
}
```
Here's a logic we can employ to create `.tid` files:
```javascript
var tiddler = JSON.parse($tw.wiki.getTiddlerAsJson("Introduction"));
var tidFile = ``;
// sorting is the big gotcha here; we a robust sorter, or we could avoid it entirely!
function sortFunction (prev, next) {
if (prev > next) return -1;
if (next > prev) return 1;
return 0;
};
Object.entries(tiddler).sort(sortFunction).forEach(([key, value], i, arr) => {
if (key !== 'modified') {
if (key === 'title') {
tidFile += `${key}: ${value} \n\n`;
} else if (key === 'text') tidFile += `${value} \n`;
else tidFile += `${key}: ${value} \n`;
if (i+1 === arr.length) console.log(tidFile);
}
});
```
an even better way which avoids the need to sort:
```javascript
var tiddler = JSON.parse($tw.wiki.getTiddlerAsJson("Introduction"));
var tidFile = ``;
for (var field in tiddler) {
if (field !== 'modified') {
if (field === 'created' || field === 'tags' || field === 'title' || field === 'text') tidFile = `created: ${tiddler.created}\ntags: ${tiddler.tags}\ntitle: ${tiddler.title}\n\n${tiddler.text}`;
else tidFile = `${field}: ${tiddler[field]}\n${tidFile}`;
}
}
console.log(tidFile);
```
another simpler way:
```javascript
function generateTidFile (title) {
var tiddler = JSON.parse($tw.wiki.getTiddlerAsJson(title)),
tidFile = '',
created = tiddler.created,
tags = tiddler.tags,
title = tiddler.title,
text = tiddler.text,
extra = Object.keys(tiddler).filter(function (el) { el !== 'modified' && el !== 'created' && el !== 'tags' && el !== 'title' && el !== 'text' });
if (extra.length > 0) {
extra.forEach(function (field) { tidFile += field + ': ' + tiddler[field]});
tidFile = tidFile + '\n' + 'created' + ': ' + created + '\n' + 'tags' + ': ' + tags + '\n' + 'title' + ': ' + title + '\n\n' + text;
} else {
tidFile = 'created' + ': ' + created + '\n' + 'tags' + ': ' + tags + '\n' + 'title' + ': ' + title + '\n\n' + text;
}
return tidFile;
};
```
Some issues: Need to consider how to parse and serialize system tiddlers without adding unintended `undefined` strings in the text field in particular.
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
The nation wants to more and more banks to become inclusive. The mandate is to bring banking to more Tanzanians. How can they do that?
Basecamp is a project management software created by Basecamp, an American web software company based in Chicago, Illinois. The firm was co‑founded in 1999 by Jason Fried (ceo), Carlos Segura, and Ernest Kim as a web design company. Since mid‑2004, the company's focus has shifted from web design to web application development.
David Heinemeier Hansson, creator of Ruby on Rails is a partner at the company and CTO.
[[Basecamp offers a flat monthly fee of $99|https://drive.google.com/file/d/12Pqp1STedV-Tl59_b5TZH0lQ-KyCeStd/view?usp=drivesdk]] for having an app that does the equivalent of more than $200 dollars worth of apps. We have to try doing better by offering the equivalent for less.
To create a basic javascript macro take a look at the example below, most importantly setting its `type` field to `application/javascript`.
`<<examplemacro "foo bar">>` renders as: <<examplemacro "foo bar">>
```
/*\
title: $:/.tb/demo/example.js
type: application/javascript
module-type: macro
<<examplemacro>>
<<examplemacro "foo bar">>
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
/*
An example js macro rendering an internal link.
*/
exports.name = "examplemacro";
exports.params = [
{ name: "tid" }
];
/*
Run the macro
*/
exports.run = function(tid) {
var tid = tid || "GettingStarted",
output ="[[" + tid + "]]";
return output;
};
})();
```
__Why Deno__
* Only ship a single executable (deno).
* Provide Secure Defaults
* Unless specifically allowed, scripts can't access files, the environment, or the network.
* Browser compatible: The subset of Deno programs which are written completely in JavaScript and do not use the global Deno namespace (or feature test for it), ought to also be able to be run in a modern web browser without change.
* Provide built-in tooling like unit testing, code formatting, and linting to improve developer experience.
* Does not leak V8 concepts into user land.
* Be able to serve HTTP efficiently
__Comparison to Nodejs__
* Deno does not use npm
** It uses modules referenced as URLs or file paths
* Deno does not use package.json in its module resolution algorithm.
* All async actions in Deno return a promise. Thus Deno provides different APIs than Node.
* Deno requires explicit permissions for file, network, and environment access.
* Deno always dies on uncaught errors.
* Uses "ES Modules" and does not support require(). Third party modules are imported via URLs:
```javascript
import * as log from "https://deno.land/std/log/mod.ts";
```
Other key behaviours:
* Remote code is fetched and cached on first execution, and never updated until the code is run with the --reload flag. (So, this will still work on an airplane.)
* Modules/files loaded from remote URLs are intended to be immutable and cacheable.
First of all, we must remember that [[OnePlaybook]] is all about helping people manage anything. But when we talk about managing anything, we need to start with basics, and then build from that foundation.
So, that's the model of the offer. Start with basics, and then suggest progressively sophisticated means of managing the achievement of a goal.
So what are the basics?
# Goal setting
# Time management
# Task management
# Learning management
I believe the above can apply to both the individual level, as well as a company-wide, project level. Obviously, one must first master oneself before mastering something as complicated as a project.
From Ness lab, there is this [[framework|https://nesslabs.com/smart-goals-pact]] that could be the basis of the model we need for Oneplaybook: SMART goals vs PACT goals.
* Specific. Your goal should be well defined, clear, and unambiguous.
* Measurable. You can easily measure your progress towards the accomplishment of the goal.
* Achievable. The goal should seem attainable and not impossible to achieve.
* Relevant. The goal should be aligned with your current priorities.
* Timely. Your goal should have a clearly defined timeline, including a starting date and a target end date.
VS
* Purposeful. Your goal should be meaningful to your long-term purpose in life, not just relevant to you right now. It will be much harder to stick to your goal if you don’t actually care. When a goal is aligned with your passions and your objectives in life, you are feeling much more motivated. (many tasks don’t feel purposeful but need to be done in order to achieve a meaningful long-term goal, and that’s fine—they are tasks, not goals)
* Actionable. A good goal is based on outputs you can control. Your goal should be actionable and controllable. It’s all about shifting your mindset from distant outcomes in the future to present outputs you can control and that are within your reach, taking action today rather than overplanning for tomorrow.
* Continuous. It’s important that the actions you take towards your goal are simple and repeatable. So many goals are not achieved because of what’s called choice paralysis. That’s when there are so many options that you end up spending more time doing research than actually doing stuff that will make you progress towards your goal. The good thing about continuous goals is their flexibility. What you need to do is get started, and as you learn more, you can adapt your approach. It’s about continuous improvement rather than reaching a supposed end goal.
* Trackable. Not measurable. Stats can be overrated and don’t apply to lots of different types of goals. I’m a big fan of the “yes” or “no” approach to goal tracking, similar to the GitHub tracker. Have you done the thing or not? Have you coded today? Have you called three potential customers? Have you published your weekly blog post? Yes or no? This makes your progress very easy to track.
Examples of SMART vs PACT goals:
* SMART version of a goal: “Get 5,000 subscribers in 25 weeks.”
* PACT version of a goal: “Publish 25 newsletters over the next 25 weeks.”
<<todolist-ui caption:"!! Local device release todos" base:"Simple" width:60%>>
Basic, bare bone feature to enable key functions.
In both mobile and desktop views, there will be an app bar that will be used to access key user functions, including (<<high "''red''">> means high priority):
* Global search
* <<high "''Fork option''">>
* <<high "''Create wiki''">>
* <<high "''User profile''">>
** <<high "''Connect/disconnect function''">>
** <<high "''Settings under user profile''">>
*** Full screen mode
*** Dark mode
* <<high "''Menu to browse personal library of wikis''">>
* Explore wikis
* [[Backend details]]
The primary screen should show the Library view:
| Logo | Connect profile |
| Create wiki ~FaB |<|
|! Library | Explore |
For the desktop view, the primary screen tabs ''Library'' and ''Explore'' will be located in the left drawer:-
|! Create wiki ~FaB | Logo | Connect profile |
|! Library | [[Contents]] |<|
|! Explore | |<|
Selecting a personal wiki menu item here should lead to:-
| ← | Title | More btn/Delete/Hide topbar |
| TiddlyWiki |<|<|
The ''Explore'' view should show the following:-
| Logo | Connect profile |
| Items to explore |<|
| Library |! Explore |
Selecting an explore item should lead to a view similar to a personal wiki view, except there is a primary actions for forking wiki or installing a plugin or theme it:-
| ← | Title | More btn/Hide topbar |
| TiddlyWiki |<|<|
| Fork/Install/Save ~FaB |<|<|
<div>
<div><a class="cv cw bf bg bh bi bj bk bl bm cx cy bp cz da" href="https://tobiasbru.medium.com/?source=post_sidebar--------------------------post_sidebar-----------" rel="noopener">Tobias Bru</a></div></div>
<div>
<p>A part-time nerd who is passionate about reading 📚, Knowledge Management, and studying 🧠. In my free evenings I write articles. 💻🌐 Discovered via <a href="https://tobiasbru.medium.com/the-history-of-roam-research-and-the-roamcult-4c1e1897633d" target="_blank">this article about Roam Research's history</a></p>
<p><strong>Nat Eliason</strong> launched his first Roam course, <strong>Shu Omi</strong> started his career as a Youtuber and Knowledge Management Expert — many others like <strong>Robert Haisfield</strong> or <strong>Ramses Oudt</strong> followed.</p></div>
<ul>
<li>Binary trees are data structures made up of nodes branching off to more than two nodes.</li>
<li>A parent node can have left and right child nodes</li>
<li>By convention, left child nodes have values less than parent</li>
<li>Right child nodes contain greater values</li>
<li>All trees begin with a single root</li>
<li>To <strong>insert</strong> a value:
<ul>
<li>Create a new node</li>
<li>Comparing its value to the root and its descendant values</li>
<li>Search further leftward or rightward</li>
<li>Insert at an available position</li></ul></li>
<li>To <strong>find </strong>a value is similar to <strong>insert</strong></li>
<li>To make a <strong>breadth-first search </strong>of values requires:
<ul>
<li>Storing the root value</li>
<li>Proceed with the left child</li>
<li>Then the right child</li>
<li>Repeat downwards</li>
<li>in this <a href="https://cdn-media-1.freecodecamp.org/images/MgGzdIJ78U3kLa-qh-AezTkzNYDsCOo4MB6j">example</a>, Breadth First Search returns [3, 1, 5, 0, 2, 4, 6]</li></ul></li>
<li>To make a <strong>depth-first </strong><strong>search (pre-order) </strong>of values:
<ul>
<li>Store root value</li>
<li>Proceed with ALL leftward descendants</li>
<li>Then right descendants</li>
<li>in this <a href="https://cdn-media-1.freecodecamp.org/images/VhYpkEBTORBiFDgRHEJAHOpSO5dVTH6h0IBe">example</a>, Depth First Search Pre-Order returns [3, 1, 0, 2, 5, 4, 6]</li></ul></li>
<li>Notice the similarity between <strong>inserting </strong>and <strong>finding</strong>. So it is no surprise that their complexity is the same: <strong>O(log n)</strong>.</li>
<li>As mentioned [[here|Trees and Heaps]], trees can also be referred to as heaps.</li>
<li>A binary heap is a pyramidal structure whose nodes can stack upward with rows of decreasing values toward a minimum (minimum binary heap) or a with rows of increasing values toward a maximum (maximum binary heap)</li></ul>
<p><a href="https://cdn-media-1.freecodecamp.org/images/HE8SQ3qiyd19h6kZOCpp8griQB2cOIXcV4L6">A max binary heap</a></p>
<ul>
<li>For the max binary, inserting a value at the base of the pyramid requires comparing it to parent nodes, and <strong>bubbling</strong> up the larger value</li>
<li>To <strong>extract a max value</strong> requires moving the apex value and sinking down a value from the pyramid's base.</li>
<li>This involves finding the higher of the two children nodes</li>
<li>For a <strong>max binary heap, insertion </strong>of a node and <strong>extraction </strong>of a node with max value both have a complexity of O(log n)</li>
<li>For 3 node max binary heap, insertion of a node with value 6 requires two steps.</li></ul>
<p><a href="https://cdn-media-1.freecodecamp.org/images/v7W4gtqZZ4vknoz9-Qj28CuXtviStsYYXAS8">Bubbling up new node with value 6</a></p>
<ul>
<li>Upon attaching node of value 6 to a new row (below 4), is <strong>6</strong> greater than or less than 4? Swap.</li>
<li>Is <strong>6 </strong>greater than or less than 5? Swap.</li>
<li>Similarly, for removal of a node with a max value and replacing it with anode of value 1, two steps remain</li></ul>
<p><a href="https://cdn-media-1.freecodecamp.org/images/C-UotKFPhKz02WrcwHlP-qf6zyjI9OlPpe64">Sinking down new node with value of 1</a></p>
<ul>
<li>Is <strong>1</strong> greater than or less than 5? Swap.</li>
<li>Is <strong>1</strong> greater than or less than 4? Swap.</li></ul>
<p>Let's continue with [[Properties of Binary Trees]]</p>
<p><a href="https://www.freecodecamp.org/news/the-best-way-to-bind-event-handlers-in-react-282db2cf1530/">freecodecamp.org</a></p>
<h1>The best way to bind event handlers in React</h1>
<p>7-9 minutes</p>
<hr />
<p>by Charlee Li</p>
<p>Binding event handlers in React can be tricky (you have JavaScript to thank for that). For those who know the history of Perl and Python, TMTOWTDI (There’s More Than One Way To Do It) and TOOWTDI (There’s Only One Way To Do It) should be familiar words. Unfortunately, at least for event binding, JavaScript is a TMTOWTDI language, which always makes developers confused.</p>
<p>In this post, we will explore the common ways of creating event bindings in React, and I’ll show you their pros and cons. And most importantly, I will help you find the “Only One Way” — or at least, my favorite.</p>
<p>This post assumes that you understand the necessity of binding, such as why we need to do <code>this.handler.bind(this)</code>, or the difference between <code>function() { console.log(this); }</code> and <code>() => { console.log(this)</code>; }. If you get confused about these question<a href="https://medium.freecodecamp.org/this-is-why-we-need-to-bind-event-handlers-in-class-components-in-react-f7ea1a6f93eb" rel="noopener">s, Saurabh Misra had an amazing p</a>ost explaining them.</p>
<h3>Dynamic binding in render()</h3>
<p>The first case commonly used is calling <code>.bind(this)</code> in the <code>render()</code> function. For example:</p>
<pre><code>class HelloWorld extends Component { handleClick(event) {} render() { return ( <p>Hello, {this.state.name}!</p> <button onClick={this.handleClick.bind(this)}>Click</button> ); }}</code></pre>
<p>Of course this will work. But think about one thing: What happens if <code>this.state.name</code>changes?</p>
<p>You might say that changing <code>this.state.name</code> will cause the component to re-<code>render()</code> . Good. The component will render to update the name part. But will the button be rendered?</p>
<p>Consider the fact that React uses the Virtual DOM. When render occurs, it will compare the updated Virtual DOM with the previous Virtual DOM, and then only update the changed elements to the actual DOM tree.</p>
<p>In our case, when <code>render()</code> is called, <code>this.handleClick.bind(this)</code> will be called as well to bind the handler. This call will generate a<strong> brand-new handler</strong>, which is completely different than the handler used when <code>render()</code> was called the first time!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/u0GzKJdrXoomFQqomNjOV3UecQV8tHrTj9UM" /></p>
<p>Virtual DOM for dynamic binding. Elements in Blue will be re-rendered.</p>
<p>As in the above diagram, when <code>render()</code> was called previously, <code>this.handleClick.bind(this)</code> returned <code>funcA</code> so that React knew <code>onChange</code> was <code>funcA</code>.</p>
<p>Later, when <code>render()</code> is called again, <code>this.handleClick.bind(this)</code> returned <code>funcB</code> (note it returns a new function every time being called). This way, React knows that <code>onChange</code> is no longer <code>funcA</code>, which means that <code>button</code> needs to be re-rendered.</p>
<p>One button may not be a problem. But what if you have 100 buttons rendered within a list?</p>
<pre><code>render() { return ( {this.state.buttons.map(btn => ( <button key={btn.id} onChange={this.handleClick.bind(this)}> {btn.label} </button> ))} );}</code></pre>
<p>In the above example, any button label change will cause all the buttons to be re-rendered, since all buttons will generate a new <code>onChange</code> handler.</p>
<h3>Bind in constructor()</h3>
<p>An old school way is to do the binding in the constructor. Nothing fancy:</p>
<pre><code>class HelloWorld extends Component { constructor() { this.handleClick = this.handleClickFunc.bind(this); } render() { return (<button onClick={this.handleClick}/>); }}</code></pre>
<p>This way is much better than previous one. Calling <code>render()</code> will not generate a new handler for <code>onClick</code>, so the <code><butt</code>on> will not be re-rendered as long as the button does not change.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/iTs98nwnYdvxE2fFoO5N1Rzcg-u-cD7LL9g1" /></p>
<p>Virtual DOM for binding in constructor. Elements in Blue will be re-rendered.</p>
<h3>Bind with the Arrow Function</h3>
<p>With ES7 class properties (currently supported with <a href="https://babeljs.io/docs/plugins/transform-class-properties/" rel="noopener">Babel</a>), we can do bindings at the method definition:</p>
<pre><code>class HelloWorld extends Component { handleClick = (event) => { console.log(this.state.name); } render() { return (<button onClick={this.handleClick}/>) }}</code></pre>
<p>In the above code, <code>handleClick</code> is an assignment which is equivalent to:</p>
<pre><code>constructor() { this.handleClick = (event) => { ... };}</code></pre>
<p>So once the component is initialized, <code>this.handleClick</code> will never change again. This way, it ensures that <code><butt</code>on> won’t get re-rendered. This approach is probably the best way of doing bindings. It’s simple, easy to read, and most importantly, it works.</p>
<h3>Dynamic binding with the Arrow Function for multiple elements</h3>
<p>Using the same arrow function trick, we can use the same handler for multiple inputs:</p>
<pre><code>class HelloWorld extends Component { handleChange = name => event => { this.setState({ [name]: event.target.value }); } render() { return ( <input onChange={this.handleChange('name')}/> <input onChange={this.handleChange('description')}/> ) }}</code></pre>
<p>At first glance, this looks pretty amazing due to its simplicity. However, if you consider carefully, you’ll find that it has the same problem as the first approach: every time <code>render()</code> is called both<code><inp</code>ut> will be re-rendered.</p>
<p>Indeed I do think this approach is smart, and I don’t want to write multiple <code>handleXXXChange</code> for each field either. Luckily, this type of “multi-use handler” is less likely to appear inside a list. This means that there will be only a couple of <code><inp</code>ut> components that get re-rendered, and there probably won’t be a performance issue.</p>
<p>Anyway, the benefits it brings to us are much greater than the performance loss. Therefore, I would suggest that you use this approach directly.</p>
<p>In case those performance issues becoming significant, I would suggest caching the handlers when doing the bindings (but this will make the code less readable):</p>
<pre><code>class HelloWorld extends Component { handleChange = name => { if (!this.handlers[name]) { this.handlers[name] = event => { this.setState({ [name]: event.target.value }); }; } return this.handlers[name]; } render() { return ( <input onChange={this.handleChange('name')}/> <input onChange={this.handleChange('description')}/> ) }}</code></pre>
<h3>Conclusion</h3>
<p>When doing event bindings in React, we must check very carefully whether the handlers are generated dynamically. Usually this is not a problem when the affected components appear only once or twice. But when event handlers appear in a list, this can results in severe performance issues.</p>
<h4>Solutions</h4>
<ul>
<li>Use Arrow Function binding whenever possible</li>
<li>If you must generate bindings dynamically, consider caching the handlers if the bindings become a performance issue</li></ul>
<p>Thanks for reading! I hope this post was helpful. If you find this post useful, please share it with more people by recommending it.</p>
<p><em>Update:</em></p>
<p><a href="https://www.freecodecamp.org/news/the-best-way-to-bind-event-handlers-in-react-282db2cf1530/undefined" rel="noopener">Omri Luzon</a> and <a href="https://www.freecodecamp.org/news/the-best-way-to-bind-event-handlers-in-react-282db2cf1530/undefined" rel="noopener">Shesh</a> mentioned <code>lodash-decorators</code> and <code>react-autobind</code> packages for more convenient bindings. Personally I am not a big fan of automatically doing anything (I am always trying to keep things such bindings minimal) but auto bind is absolutely a great way of writing clean code and saving more efforts. The code would be like:</p>
<pre><code>import autoBind from 'react-autobind';class HelloWorld() { constructor() { autoBind(this); }</code></pre>
<pre><code> handleClick() { ... } render() { return (<button onClick={this.handleClick}/>); }}</code></pre>
<p>Since <code>autoBind</code> will handle the bindings automatically, it is not necessary to use arrow function trick ( <code>handleClick = () =></code> {} ) to do the binding, and in t<code>he rende</code>r() functio<code>n, this.handleCl</code>ick can be used directly.</p>
<p>Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. <a href="https://www.freecodecamp.org/learn">Get started</a></p>
[[Bit|https://bit.dev/]] is a distributed code component manager.
Bit is a component-based approach to modern application development.
Bit makes the development and composition of modern applications from independent components repeatable and fun.
#### Build your own `Blockchain / Cryptocurrency`
* [**ATS**: _Functional Blockchain_](https://beta.observablehq.com/@galletti94/functional-blockchain)
* [**C#**: _Programming The Blockchain in C#_](https://programmingblockchain.gitbooks.io/programmingblockchain/)
* [**Ethereum**: _From “What is Blockchain?” to building a blockchain in less than an hour_](https://medium.freecodecamp.org/from-what-is-blockchain-to-building-a-blockchain-within-an-hour-4e738efc819d)
* [**Go**: _Building Blockchain in Go_](https://jeiwan.cc/posts/building-blockchain-in-go-part-1/)
* [**Go**: _Code your own blockchain in less than 200 lines of Go_](https://medium.com/@mycoralhealth/code-your-own-blockchain-in-less-than-200-lines-of-go-e296282bcffc)
* [**Haskell**: _A simple cryptocurrency implementation, written to illustrate the basic components of a Proof-of-Work based public distributed ledger_](https://github.com/adjoint-io/nanocoin)
* [**Java**: _Creating Your First Blockchain with Java_](https://medium.com/programmers-blockchain/create-simple-blockchain-java-tutorial-from-scratch-6eeed3cb03fa)
* [**JavaScript**: _A cryptocurrency implementation in less than 1500 lines of code_](https://github.com/conradoqg/naivecoin)
* [**JavaScript**: _Build your own Blockchain in JavaScript_](https://github.com/nambrot/blockchain-in-js)
* [**JavaScript**: _Learn & Build a JavaScript Blockchain_](https://medium.com/digital-alchemy-holdings/learn-build-a-javascript-blockchain-part-1-ca61c285821e)
* [**JavaScript**: _Creating a blockchain with JavaScript_](https://github.com/SavjeeTutorials/SavjeeCoin) [video]
* [**JavaScript**: _How To Launch Your Own Production-Ready Cryptocurrency_](https://hackernoon.com/how-to-launch-your-own-production-ready-cryptocurrency-ab97cb773371)
* [**Python**: _Learn Blockchains by Building One_](https://hackernoon.com/learn-blockchains-by-building-one-117428612f46)
* [**Python**: _Build your own blockchain: a Python tutorial_](http://ecomunsing.com/build-your-own-blockchain)
* [**Python**: _Building an automated Cryptocurrency trading bot with Python on Binance_](https://www.youtube.com/playlist?list=PLIFBTFgFpoJ-2Qq6GFW-knNyAR9PcOwPw) [video]
* [**Python**: _A Practical Introduction to Blockchain with Python_](http://adilmoujahid.com/posts/2018/03/intro-blockchain-bitcoin-python/)
* [**Ruby**: _Programming Blockchains Step-by-Step (Manuscripts Book Edition)_](https://github.com/yukimotopress/programming-blockchains-step-by-step)
* [**TypeScript**: _Naivecoin: a tutorial for building a cryptocurrency_](https://lhartikk.github.io/)
Possible names:
The Consilience Playbook: because we're all about achieving consilience with our playbook
<<list-links "[tag<currentTiddler>sort[title]]">>
<$button>
<$action-sendmessage $message="tm-new-tiddler" tags="[[pain point]]" title="New pain point to solve" />
Make a new entry
</$button>
You have identified <$count filter="[tag[pain point]]"/> pain points so far.
{{Resource for Public APIs}}
<$macrocall
$name="toc-tabbed-internal-nav"
tag="pain point"
sort=!sort[created]
selectedTiddler="$:/temp/toc/book-of-pain-points"
unselectedText="<p>Select a topic in the table of contents. Click the arrow to expand a topic.</p>"
missingText="<p>Missing tiddler.</p>"
/>
What I Learned About Startups by Collecting 30,000 Data Points. The results are surprising in many ways.
https://alitamaseb.medium.com/what-i-learned-about-startups-by-collecting-30-000-data-points-f10657724b2a
This is a cool example of the use of `border-image` CSS property to get a gradient border:
```html
<div style="display: flex; justify-content: center; width: 100px; border-image: linear-gradient(to left, orange, red) 10; border-style: solid; border-width: 5px; border-radius: 30px;">
<strong>Sweet!</strong>
</div>
```
<div style="display: flex; justify-content: center; width: 100px; border-image: linear-gradient(to left, orange, red) 10; border-style: solid; border-width: 5px; border-radius: 30px;">
<strong>Sweet!</strong>
</div>
Notice that the `border-radius` property isn't having an effect. I am not sure why. To get around this, we instead introduce a background padding-box set to white and a border-box set to the gradient color we desire. Then we set `border-color` as transparent:
```html
<div style="display: flex; justify-content: center; width: 150px; background: linear-gradient( white, white) padding-box, linear-gradient(to left, orange, red) border-box; border-style: solid; border-width: 5px; border-radius: 30px; border-color: transparent;">
<strong>Even sweeter!</strong>
</div>
```
<div style="display: flex; justify-content: center; width: 150px; background: linear-gradient(white, white) padding-box, linear-gradient(to left, orange, red) border-box; border-style: solid; border-width: 5px; border-radius: 30px; border-color: transparent;">
<strong>Even sweeter!</strong>
</div>
This allows us to clip the background (remember, `background` has a constituent property `background-clip`) using the transparent border and modify the appearance of the background by modding the transparent border.
If you're wondering why the you must use `linear-gradient(white, white)` and not just `white`, it's because `background-clip` won't work without an image in this setup (I think).
__Alternative methods?__
There are probably other ways to achieve a similar effect. I'll add them here as I find them...
#### Build your own `Bot`
* [**Haskell**: _Roll your own IRC bot_](https://wiki.haskell.org/Roll_your_own_IRC_bot)
* [**Java**: _How To Make a Scary Russian Twitter Bot With Java_](https://medium.com/@SeloSlav/how-to-make-a-scary-russian-twitter-bot-with-java-b7b62768a3ac)
* [**Node.js**: _Creating a Simple Facebook Messenger AI Bot with API.ai in Node.js_](https://tutorials.botsfloor.com/creating-a-simple-facebook-messenger-ai-bot-with-api-ai-in-node-js-50ae2fa5c80d)
* [**Node.js**: _Why you should have your own Twitter bot, and how to build one in less than 30 minutes_](https://medium.freecodecamp.org/easily-set-up-your-own-twitter-bot-4aeed5e61f7f)
* [**Node.js**: _How to make a responsive telegram bot_](https://www.sohamkamani.com/blog/2016/09/21/making-a-telegram-bot/)
* [**Node.js**: _Create a Discord bot_](https://discordjs.guide/)
* [**PHP**: _Let’s write a cryptocurrency bot_](https://medium.com/@joeldg/an-advanced-tutorial-a-new-crypto-currency-trading-bot-boilerplate-framework-e777733607ae)
* [**Python**: _Chatbot Fundamentals: An interactive guide to writing bots in Python_](https://apps.worldwritable.com/tutorials/chatbot/)
* [**Python**: _Step-by-Step Instructions for Building a Basic Facebook Chat Bot_](https://blog.hartleybrody.com/fb-messenger-bot/)
* [**Python**: _How to Build Your First Slack Bot with Python_](https://www.fullstackpython.com/blog/build-first-slack-bot-python.html)
* [**Python**: _Build a Reddit Bot_](http://pythonforengineers.com/build-a-reddit-bot-part-1/)
* [**Python**: _How To Make A Reddit Bot_](https://www.youtube.com/watch?v=krTUf7BpTc0) [video]
* [**Python**: _How To Create a Telegram Bot Using Python_](https://khashtamov.com/en/how-to-create-a-telegram-bot-using-python/)
* [**Python**: _Create a Twitter Bot in Python Using Tweepy_](https://medium.freecodecamp.org/creating-a-twitter-bot-in-python-with-tweepy-ac524157a607)
* [**Python**: _Creating Reddit Bot with Python & PRAW_](https://www.youtube.com/playlist?list=PLIFBTFgFpoJ9vmYYlfxRFV6U_XhG-4fpP) [video]
* [**R**: _Build A Cryptocurrency Trading Bot with R_](https://towardsdatascience.com/build-a-cryptocurrency-trading-bot-with-r-1445c429e1b1)
* Attendees:
** Brayson John Laiza (Android dev from Mipango),
** Frank Enoch Anderson (data scientist),
** Bernard Daniel Madole
** Landry Kampangala Kapela
** Abraham Bashir Samma
* Agenda
** Knowledge management pitch for CRDB meeting this week. Do they have a knowledge management infrastructure? Ben says they don't.
** Innovation peer offers in innovation strategy, strategy development and data science services
** Registration of the company:
*** We need the certificate of incorporation, business license, TIN numbers and NIDA numbers
*** Fee structure from Brela
**** Company whose nominal share capital is: More than Tshs. 20,000/= but not more than Tshs. 1,000,000/=: 95,000/-
**** Filling fee for the application, meaning shs. 22,000/= for each document i.e Memorandum and Articles of Association, Forms no. 14a and 14b: 66,000/-
**** Each Stamp duty for each copy of the Memorandum and Articles of Association is charged: 5000/-
**** Stamp duty for Form no. 14b is charged: 1,200/-
**** Quarterly tax (out of 30% of forecast profit of 1M): 75,000/-
**** Tax cost for building: 250,000/-
**** EFD machine: 590,000/-
**** Bank account minimum amount: 100,000/-
**** Total: (=95000+66000+5000+1200+75000+250000+590000+100000=).
**** with a round figure of 600,000/-: (=600000+590000+100000=)
**** contribution of 5 individuals: (=1290000/5=)/-
**** Ben will confirm the participation of each individual. And he will confirm the meeting with CRDB this week.
** Landry has a friend who will be our legal counsel for compliance
a French loanword that means the process of improvisation in a human endeavor.
Bricolage is {{Bricolage}} Systems that rely on this philosophy tend to utilize the principle of [[generativity|Foundation of pattern languages]], which is also inherent to [[wikis & agile principles|Wikis, Design Patterns & Agile: What unites these concepts?]] to allow users to evolve their systems based on their needs rather than having prescriptive implementations from top-down:
<<<
In information systems, bricolage is used by Claudio Ciborra to describe the way in which strategic information systems (SIS) can be built in order to maintain successful competitive advantage over a longer period of time than standard SIS. By valuing tinkering and allowing SIS to evolve from the bottom-up, rather than implementing it from the top-down, the firm will end up with something that is deeply rooted in the organisational culture that is specific to that firm and is much less easily imitated.
[[Wikipedia|https://en.wikipedia.org/wiki/Bricolage#Information_technology]]
<<<
<p>In her book <em><a href="https://en.wikipedia.org/wiki/Life_on_the_Screen" title="Life on the Screen">Life on the Screen</a></em> (1995), <a href="https://en.wikipedia.org/wiki/Sherry_Turkle" title="Sherry Turkle">Sherry Turkle</a> discusses the concept of bricolage as it applies to problem solving in code projects and workspace productivity. She advocates the "bricoleur style" of programming as a valid and underexamined alternative to what she describes as the conventional structured "planner" approach. In this style of coding, the programmer works without an exhaustive preliminary specification, opting instead for a step-by-step growth and re-evaluation process. In her essay "Epistemological Pluralism", Turkle writes: "The bricoleur resembles the painter who stands back between brushstrokes, looks at the canvas, and only after this contemplation, decides what to do next."</p>
Insightful notes about the issue from Geoffrey:
https://www.geoffreylitt.com/2021/03/05/bring-your-own-client.html
<p>From this awesome article titled <a href="https://uxdesign.cc/building-a-second-brain-for-product-management-8a05cc4c5e4e">"<strong>Building a Second Brain for Productivity</strong>"</a></p>
<p>... there is no single “right” solution for note-taking. It’s likely the first system you build will need to gradually replaced once you get a feel for what’s useful. The following is how I run my note-taking system, and it starts with some principles:</p>
<ol>
<li>Individual notes need to be a single expression of an idea, thought or representation of a single piece of media (blog post, video, podcast, book, email)</li>
<li>Notes need to standardised into a single format which is easily transferable (I put everything into markdown)</li>
<li>Notes must be easily searchable and discoverable</li>
<li>Notes must be easy to create and enhance</li></ol>
<p>I’m an avid reader, and I wanted a solution that would fit into my current workflows. Here is the tech-stack I’m using, so to speak:</p>
<ul>
<li><strong>Ulysses</strong> — This is a markdown editor that works on both Mac and iOS devices. It’s perfect for writing notes in a standardised format, creating folders for categorisation and using iCloud to sync across devices. Where ever I am, I have my searchable notes with me.</li>
<li><strong>PARA Method</strong> — Projects (things I’m working on), Areas of Responsibility (things I’m responsible for), Resources (things I’m interested in)and Archives (things I’m afraid to throw away). The PARA method is a system that promises you a framework for organising digital information. I find myself modifying it over time with most notes ending up in Resources, but it feels like a good starting point.</li>
<li><strong>Pocket</strong> — I paid for the premium version and never looked back. Any blog post or article I consume goes straight into Pocket where it is subsequently highlighted and tagged. I have a small python script which then pulls this information from their API, converts it to markdown and puts it straight into the database. You can also use a paid solution like Readwise to achieve a similar flow.</li>
<li><strong>Kindle</strong> — In a similar way to Pocket, I tend to annotate and write notes as I’m reading books. Afterwards, I run a python script to pull this out of a notes.txt file from my Kindle and convert them into individual notes. Readwise, again, provides a paid solution if that’s too technical.</li>
<li><strong>Highlights (app)</strong> — It’s hard to find a good PDF reader that works across devices and allows you to export annotations easily. Highlights for Mac and iOS is the best of the lot — highlights and comments are easily exportable into a plain text format.</li>
<li><strong>Obsidian</strong> — Part of a new breed of knowledge management system apps (Roam Research being the most popular currently). Obsidian is an open source app which focuses on making it easy to add atoms of thought and gradually compose them together into larger pieces. The way I have started using Obsidian is to visualise the connections between concepts and ideas based on a system of inter-note referencing. It’s surprisingly insightful and is beginning to change the way I think about my work process fundamentally.</li></ul>
<$tmap view="Bank MVP" editor="advanced" height="500px" ></$tmap>
Some links to this topic:
* [[Slack wiki alternatives|https://getpocket.com/read/3108584400]]
* [[How to build a wiki or knowledge base in Slack|https://getpocket.com/read/3299010596]]
* [[Extending Slack with Knowledge Manangement|https://getpocket.com/read/3076412817]]
According to the [[Sign up analysis]], many business owners are interested in using OnePlaybook and TiddlyWiki for [[Knowledge management]] in their businesses. However, there are cases in the community of things like [[a point of sales app]] built with TiddlyWiki. We should explore this use case in the very near future with people.
Problem: how can we give more useful deliverables for decision makers in business modeling and strategy?
Solution: ~BUsIness modeL Developer or BUILD book
<$macrocall
$name="toc-tabbed-internal-nav"
tag=<<currentTiddler>>
sort=sort[created]
selectedTiddler="$:/temp/toc/selectedTiddler"
unselectedText="<p>Select a topic in the table of contents. Click the arrow to expand a topic.</p>"
missingText="<p>Missing tiddler.</p>"
/>
<p>Buyer-based means that GitLab offers <a href="https://about.gitlab.com/pricing/">four different tiers of the software</a>, which offer different functionality based on what each buyer persona needs.</p>
<h3>How do you generate revenue with buyer-based open core?</h3>
<p>Each tier focuses on what the buyer wants – and nothing more. It is also priced accordingly. Those at a higher level in the organization often have more budget authority – so they can spend budget on what provides value for them.</p>
<h3>How can COSSes avoid commoditization?</h3>
<ol>
<li>Insert proprietary functionality in a majority of your use cases.</li>
<li>Offer many proprietary features.</li>
<li>Offer interaction through a user interface, rather than through APIs.</li>
<li>Cater to price-insensitive buyers.</li>
<li>Attract users that rarely contribute to open source.</li></ol>
<p>Learn more about these best practices and how GitLab has implemented them by <a href="https://youtu.be/G6ZupYzr_Zg">watching Sid’s presentation</a>, or viewing his slides below:</p>
* Personal
* Small business: {{By Team function!!subdirectory}}
* Enterprise
Means "Bring Your Own Client"
__[[Notes on BYOC]]__
{{Notes on BYOC}}
__Essential Reading__
* https://www.inkandswitch.com/cambria.html
* [[Bring Your Own Client]]
Value in social networks is calculated, depending on whom you ask, algorithmically (Metcalfe’s law) or logarithmically (Zipf’s law). Either way, in social networks, 1+1 is much more than 2.
\define filter()
[prefix[$(currentTiddler)$]] [prefix[$(currentTiddler)$]tagging[]]
\end
\define state-tiddler() $:/state/$(currentTiddler)$
\define big-red-delete-button()
<$button class="danger-delete-btn" to={{!!project}}>
<$action-sendmessage $message="tm-notify" $param="deletion-notification" />
<$action-deletetiddler $filter=<<filter>>/>
Yes, Delete Canvas
</$button>
\end
<$button tooltip="Go to Lean Projects Overview" to="Overview">
{{$:/plugins/absamma/lean-canvas-creator/icon}}
Lean Projects Overview
</$button>
<$button tooltip="Go back to Main Project Page" to={{!!project}}>
{{$:/core/images/left-arrow}}
Back to Project Page
</$button>
<$button tooltip="Delete this canvas" popup=<<state-tiddler>> setTo="open">
{{$:/core/images/delete-button}}
Delete Canvas
</$button>
<$reveal type="popup" state=<<state-tiddler>>>
<div class="tc-drop-down">
<p>''Are you sure you want to delete this canvas?''</p>
<p>''This operation is irreversible!''</p>
<<big-red-delete-button>>
</div>
</$reveal>
<div class="template-container-style">
|template-table-style|k
|^{{||Problem}}|^<$transclude tiddler="Solution" mode="block"/>|^<$transclude tiddler="Unique Value Proposition" mode="block"/>|^<$transclude tiddler="Unfair Advantage" mode="block"/>|^<$transclude tiddler="Customer Segments" mode="block"/>|
|~|^<$transclude tiddler="Key Metrics" mode="block"/>|~|^<$transclude tiddler="Channels" mode="block"/> |~|
|>|>|^<$transclude tiddler="Cost Structure" mode="block"/>|^<$transclude tiddler="Revenue Streams" mode="block"/>|<|
</div>
Uber's tech stack, though impressive, is not what makes it work. What makes it work is its business model. It serves two customer segments:
# Drivers: gives them a flexible means of obtaining income from their cars
# Riders: gives them an on-demand service that undercuts the market price and automatic payment
This model is called a peer-to-peer marketplace and the technology merely helps to facilitate this. But, there is also the internal value that Uber creates with this approach: they don't have to worry about various administrative issues that would come with owning a fleet of taxis. The car owners do that instead. This means massive savings in fixed and variable costs, increasing their margins from their 30% commission.
A ''Cell Reference'' consists of one or two capital letters followed by one or more digits. These are interpreted as index references for the current (data) tiddler. So writing `B3` in a formula is equivalent to the [[Transclusion]] `{{##B3}}`.
```
(= A1+A2+A3+A4 * B1 =)
```
This is an advanced feature meant to help other developers implement spreadsheets using the Formulas plugin. Currently, the `<$tiddler>` widget is necessary to make this feature work.
{{Problems of centralized collaboration}}
# CRDB wants established partners with a secretary, office, etc
# {{CRDB pain point}}
\import [[database-macro]]
''Channels''
<$set name="project" value={{!!project}}>
<$edit-text tiddler=<<database-macro>> index="channels" default="" placeholder="How are you going to get customers?
What are the ways you plan to interact with them?
Are you going to use direct sales, channels, freemium or something else?
What will be the cost of acquisition?" class="text-input" />
</$set>
<p>"Circe is smart."</p>
<p>Aika's father, George, glanced curiously at his 9 year old daughter. Her head was bobbing slightly up and down as the pickup he was driving went into some shallow potholes. Her eyebrows were furrowed in concentration as she hung her head slightly over the old book she was reading. It's cover was missing, leaving the yellowing paper exposed. She cradled it in her hands, as if it would fall apart.</p>
<p>"Oh," remarked George as he turned his attention back to the inclined road that led up to their home. "Who is smart again?"</p>
<p>"Circe, the sorceress", she said. "Odysseus is lucky to have her guiding him."</p>
<p>"Ah, you're reading The Odyssey. That's one of my favorites," said George. Then he looked at Aika quizzically. "Where did you get it?"</p>
<p>Aika looked at her father and said proudly, "I rescued it. My school library was getting rid of old books. I found it in a pile, alone and forgotten.</p>
<p>"So, I decided to adopt," she said with a grin.</p>
<p>"Adopted? Is that what you kids call stealing these days?"</p>
<p>Aika giggled a little in reply. Her father gave her a dry look and her giggling stopped; She continued to smile, but the message had been received. She looked back down at the book and continued reading.</p>
<p>George continued talking while negotiating a turn towards the nearby Mount Kilimanjaro's slopes, leaving the City of Moshi's main highway.</p>
<p>"So, why is Circe so smart?"</p>
<p>"It's because she's told Odysseus how to get past Scylla and Chary-", she squinted a little, "Charybidis."</p>
<p>"I think you mean Charybdis <em>telu</em>", he said.</p>
<p>"Yeah. She tells him to go past Scylla instead of the other. That way he will only lose a few men.</p>
<p>"Much better than losing an entire ship," she said with a hint of admiration. She stared momentarily at the scenery around them as the pickup's engine noise ramped up as the road became steeper. Her father engaged gear one and the vehicle lurched forward and continued to heave itself up the mountain. Tall alpine trees covered thickly with stringy creeper vines lined the road, hiding other houses and private estates that line the lower slopes of Kilimanjaro.</p>
<p>Aika could hear a nearby stream gurgling with water from the mountain's melting glaciers. Tiny winged insects circled clumps of flowers scattered in the undergrowth, and grasshoppers leapt out of the grass as their car passed by, making clicking sounds as they did. The late morning sun shone brilliantly with only a few clouds overhead. But despite that, it didn't feel too hot. It was a fine Saturday morning.</p>
<p>As George drove off the main road and entered the side road on the left leading to their house, Aika caught a momentary glimpse of her father's workplace further up the road, peeking over the tree line: shaped like a giant prism lying on its side, the building was made of sand colored stone and glass with intricately patterned etchings that gleamed bright in the sun. She had once remarked that the building looked more like a hotel from outside than a private research lab during a family day event for the facilities employees. The place was surrounded by a huge, beautiful garden full of colorful flower groves, sweet smelling trees and meandering water ways that connected to huge fountains. Even with all those families, they barely filled half of that garden. She could not wait for the next family day event when she could go there again. That is, if her father is allowed to go back to work again. He hasn't been there for almost two months now.</p>
<p>"Papa?"</p>
<p>"Yes <em>telu</em>?". His eyes remained trained on the road and his voice calm, but cheery as he maneuvered the pickup carefully around a steep bend.</p>
<p>"When will you go back to work?"</p>
<p>Her father did not reply immediately. The air in the pickup suddenly felt heavier. George cleared his throat a bit. Then he spoke.</p>
<p>"The head office needs to first decide sort some stuff out before I can come back."</p>
<p>Aika looked down at her book. Now she felt a little sad. She didn't like to make her father feel uncomfortable. He still hears her talk to Auntie Deborah and the others who work there on the phone, but he always looked sad after those talks. Then he would get angry and won't talk much to anyone at home for a while until dinner. He never was like that before. He was always cheerful. Always calm. Now he's becoming and more like...</p>
<p>Her vision suddenly became blurry; Her eyes felt wet with threatening tears. Her throat tightened up, as she finally uttered her fear timidly, her head still looking down. "Papa, please don't become Mama."</p>
<p>The vehicle braked suddenly with a jerk. The seat belt held her back, but her old book tumbled away from her hands to bottom of the seat. Surprised, and scared, Aika looked up at her father. His was looking straight ahead, his hands gripping the steering wheel so tightly, the leather strained. The vehicle purred on neutral, the engine noise mixed with the sound of the breeze gently caressing the tree branches overhead, causing the trees themselves to creak, heave and sigh all around them in their silence. George finally turned towards his daughter. Despite her being the third born and youngest daughter of the family, he treated her like she was his first born son.</p>
<p>In their tribe, the <em>Chaggas</em>, males, first borns especially, were always given preference in terms of land, titles and inheritance over the females, who were usually left with almost nothing. George always found that distasteful, even as a boy. He had an older sister who passed away at the tender age of only twelve. He still remembers the callousness with which his entire family regarded her during the funeral. He recalls vividly his uncles saying, 'it's a good thing the boy is still alive to keep your family name alive' As if her life was not worth even the atoms that made up her body, or the space she took up. It was a disgusting belief. And even those closest to him were not immune to it. 'Ophelia, dear sweet Ophelia,' he thought. 'How I wish you were still here with me, to lend me your strength. How I wish you could see my Aika! You deserved at least that.'</p>
<p>George took his daughter's light brown face gently in his hands and caressed her dark, curly hair. Her bird-like brown eyes looked back at his, glistening with tears.</p>
<p>"My daughter, as long as I am your father, you will know only my love, and not my wrath. I will always be by your side when you feel least loved. Remember that. And if I ever betray these words, tell them back at me.</p>
<p>He paused for a moment, reconsidering. "No. <em>Shout</em> these words back at me," he said, "just like you did now. And I will keep my promise."</p>
<p>Aika felt the tightening feeling around her throat release her. And she embraced her father. And George embraced her back; The forest heaved and sighed in the gentle breeze over father and daughter sharing a moment of joyful silence.</p>
<p> </p>
<hr />
<p> </p>
<p> </p>
<$button>
<$action-sendmessage $message="tm-new-tiddler" tags="aika character" title="Character" />
Create Character
</$button>
__Characters__
<<list-links "[tag[character]sort[title]]">>
This problem needs no introduction. Child safety online can be tenuous at best, non-existent at worst. Here's an article about a [[report|https://www.platformer.news/p/the-child-safety-problem-on-platforms]] from the NGO Thorn about the state of affairs online. TLDR: it's worse than we thought. Despite a huge amount of effort expended by parents, communities, companies, organizations and governments, this is still a problem.
[[Check out Thorn's best practices guidebook for platforms.|https://drive.google.com/file/d/1L4oRDqZNJejhPfcZO1aQ4xEV0COVy8Yd/view?usp=sharing]]
# Researching and managing citations is a pain
# Citation managers could not get any more complicated
# Creating a paper is a whole other story. Folks can have their entire body of material lost or stolen, destroying their career in an instant. How can we improve and enhance the workflow?
In some programming languages, a variable declared inside a function exists only until the function is called. Not so for JavaScript; here the variable continues to be available afterwards, creating a scoped lexical environment in which other functions inside the first function can reference them.
This combination of functions inside a scoped lexical environment is what's called a closure. It's created by every function declaration in JavaScript.
If you combine this property with immediately invoked functions, you can use this via the [[module pattern]] to create private methods and state; in other words, encapsulation.
Collaboration refers to the ability of workers to work together simultaneously on a particular task. Document collaboration can be completed face to face. However, collaboration has become more complex, with the need to work with people all over the world in real time on a variety of different types of documents, using different devices.
A 2003 report mapped out five reasons why workers are reluctant to collaborate more.[4] These are:
* People resist sharing their knowledge.
* safety issues
* Users are most comfortable using e-mail as their primary electronic collaboration tool.
* People do not have incentive to change their behaviour.
* Teams that want to or are selected to use the software do not have strong team leaders who push for more collaboration.
* Senior management is not actively involved in or does not support the team collaboration initiative.
As a result, many providers created cloud collaboration tools. These include the integration of email alerts into collaboration software and the ability to see who is viewing the document at any time. All the tools a team could need are put into one piece of software so workers no longer have to rely on email.
By building on systems that are already of value to users, we create additional value by augmenting their function as well as internal value by relieving ourselves of common burdens like hosting and maintenance costs. We can instead focus on creating and testing a variety of useful tools for different domains, and contribute to the wider tiddlywiki community.
# Dropbox
# Github
# Gitlab
# Bitbucket
# Amazon storage/ Amazon drive
# Google Drive [[API docs|https://developers.google.com/drive/api/v3/about-sdk]]
# iCloud
# ~OneDrive
# Box
# Baidu Wangpan
# ?Alibaba cloud
# ~NextCloud
# ownCloud
# pCloud
# Yandex disk
# Seafile
# Pydio
__Resources__
* [[Documentation|https://developer.apple.com/documentation/cloudkitjs]]
__From website__
We're built for software teams. Our mission is to ensure software development teams can do their best work. So we created Clubhouse to provide the most intuitive and enjoyable project management platform teams actually want to use — from project planning to product creation.
__Core features__
* Tracking issues using 'stories'
* Organize stories into larger themes called 'epics'
* Arrange epics into organization wide 'milestone' initiatives
* Report on team progress and achievements
* Iterations: plan and manage work in time-boxed periods
* Collaborate on workspaces
* App integrations
* Mobile friendly
* Projects and story workflows
Problems associated with linters (static analyzers):
* Limited to one language
* Variable Functionality For A Narrow View Of Code Quality i.e. overlapping function or too narrow a function that fails to provide a holistic coverage of the codebase, including security, syntax, code coverage, or code style
* Difficulty Handling Complex Rules
* False positives
* Limited transfer of good practice learnings
* Maintenance costs for each and every linter used
* Reporting On Only Basic Metrics: While linting tools are good for basic metrics, they may not be the best choice to report on more complex indicators of software quality. This includes cyclomatic complexity which gauges the complexity of a program.
Companies like codacy are making code quality management suites that allow devs to use many [[code linters|Open source code linters]] without dealing with the above shortcomings.
{{Codebase knowledge management}}
A good codebase requires good documentation. This is just as important as writing unit and integration tests.
I recently read an article on dev.com talking about how confluence does not support documentation because it lies outside the workflow of software development. Usually documentation is considered only after software has been merged. so it is quite common for documentation to become outdated, because someone has to haul their ass back to confluence to use its what-you-see-is-what-you-get editor and write down the documentation after the code has been merged. That's a big burden, and it leads to unreliable documentation which is usually out-of-date and is usually unreliable and nobody has any incentive to make it all work. It becomes a destructive feedback loop.
It is also important to consider the tenants of agile programming, where code constantly changes, leaving static documentations behind. Documentation should should not be applied as an afterthought; it shouldn't be applied to code that has already been written and finalized as already specified above. It should be an ongoing process as you code, so that all decisions and thought processes that lead to a given line of code are documented as well.
The above is emphasized in another article:
...feel that the only way to make the process of writing documentation sustainable is'' to make it a blocker for software development''. Make it lightweight but mandatory. It should become part of the process instead of being yet another thing to do. Some things that have worked for this in my experience.
* Write before you code. Unless the change is trivial, every engineer writes a note about what they are going to do and runs it by the rest of the team. At the end of the discussion, the actual coding should become trivial.
* Write simply. Don’t complicate the writing, at least until it becomes second nature. Diagrams, fancy sections etc can wait. Write very simply about what you thought, what you are doing, and why. Even if the document can serve as a basic pointer to the rest of the team now and in the future, it is superbly valuable.
* Document the decision with their alternatives – Rather than documenting the actual implementation (which may change over time) in detail, focus on documenting the choices and why they were made. This is what the code cannot ever explain and hence writing it down adds the most valuable. Details can be documented based on the time you are willing to invest.
* Make it searchable – No amount of documentation will be of any use if people cannot find it. Use tools that support text searching out of the box. This is one of the reasons I like Google Docs for documentation. It is great for writing but just horrible for collaboration and discovery.
* Track changes. Some organizations use version control to track changes to the system’s design over time. That’s great. But if you are not there yet, keep one document per feature and keep putting dated updates on it so that evolution can be tracked in one place with minimal hassle.
Bottom line is that documentation is hard because writing is hard. Maybe we can use TiddlyWiki to come up with a solution that will make this process easier and perhaps even fun. Here are some resources we can explore:
* [[Original article|http://begley.me/2020/08/20/confluence-is-where-documentation-goes-to-die.html]]
* [[Architectural decision records|https://github.blog/2020-08-13-why-write-adrs/]] Architecture decision records, also known as ADRs, are a great way to document how and why a decision was reached within a codebase
* [[About so called self documenting code. Hint: it requires effort and it only tells you the how and not the important why|https://kislayverma.com/programming/how-to-write-self-documenting-code/]]
* Some links to famous doc generators:
** https://docusaurus.io
** https://storybook.js.org/
** https://wiki.js.org/
** https://github.com/jsdoc/jsdoc
** https://github.com/slatedocs/slate
* ''For API documentation'', we should consider targeting https://insomnia.rest. Details on creating a plugin for their platform are [[here|https://support.insomnia.rest/article/173-plugins#context.response]]. We could consider Postman only if there is interest.
<p><a href="https://blog.palantir.com/the-code-base-knowledge-singularity-3a5e2afe280d">Source</a></p>
<p>A <em>singularity</em> is a point in time or configuration space in which a system becomes unpredictable or misbehaved in some way. For example, in mathematics, the function <em>f(x) = 1/x</em> is singular at <em>x=0</em> because it “explodes”; in general relativity, Stephen Hawking showed that the Big Bang has infinite density (i.e., space is point-like) and Nobel Prize winner Roger Penrose argued that black holes necessarily have a singularity; maybe most famously, the <em>technological singularity</em> is a <em>“</em>hypothetical point in time at which technological growth becomes uncontrollable and irreversible, resulting in unforeseeable changes to human civilization<em>”</em> (<a href="http://en.wikipedia.org/wiki/Technological_singularity" rel="noopener">Wikipedia</a>).</p>
<p>In this blog post I argue that software code bases are subject to what I call the <em>code base knowledge singularity</em>. In a nutshell, this is the point in time when organizational knowledge about the code has been lost, when nobody remembers the original design trade-offs or the nuances of the implementation. Given my experience of working with hundreds of teams across thousands of code repositories at Palantir, I will describe the circumstances that lead to singularities and present the techniques and tools that we employ to avoid them.</p>
<p><img alt="" src="https://miro.medium.com/max/1488/1*aF4L0WQV77WPd1MW3r530Q.png" /></p>
<p>O.P.C. (Copied from <a href="https://abstrusegoose.com/432" rel="noopener">Abstruse Goose</a> under CC BY-NC 3.0 US) — Other people’s code must not be terrible, it can be a pleasure to read if it was authored with consideration and empathy for the reader.</p>
<h2><strong>What the heck is this?</strong></h2>
<p>I think every programmer has been confronted with the code base knowledge singularity at some point. It is the moment when you look at a code base, wondering, <em>what the heck is this function doing? </em>I have observed two common response patterns in such situations:<br />
- The pessimist: <em>I won’t ever touch that code, this is way too scary to change</em><br />
- The optimist: <em>That code looks way too convoluted, I’m sure I can refactor and simplify this</em></p>
<p>If I were part of an engineering organization or team that you are in charge of, would you prefer I were generally exhibiting the pessimistic or optimistic behavior? Correct, <em>neither. </em>The pessimistic variant is bad because it indicates that the code in question will never change, it is definitionally <a href="https://en.wikipedia.org/wiki/Legacy_code" rel="noopener">legacy</a>, it is a dead code base. The optimistic approach is bad in more subtle ways: it’s quite likely that there were good reasons for the code being complicated and it’s even more likely that I don’t understand these reasons and will mess things up and introduce bugs rather than simplifying. This scenario is known as <em>Chesterton’s fence;</em><a href="https://fs.blog/2020/03/chestertons-fence/" rel="noopener"> quoting from a Farnam Street article:</a></p>
<blockquote>
<p><em>“When we seek to intervene in any system created by someone, it’s not enough to view their decisions and choices simply as the consequences of first-order thinking because we can inadvertently create serious problems. Before changing anything, we should wonder whether they were using second-order thinking. Their reasons for making certain choices might be more complex than they seem at first. It’s best to assume they knew things we don’t or had experience we can’t fathom, so we don’t go for quick fixes and end up making things worse.”</em></p></blockquote>
<h2><strong>The code base knowledge singularity</strong></h2>
<p>Before changing such code, I should ask a knowledgable colleague or contributor to explain its nuances. Unfortunately, more often than not, such a person does not exist, either because they have left the project or company or because they themselves forgot the details after a few years. This is the point when the organization hits the <em>code base knowledge singularity, </em>it has lost the institutional memory of why a particular piece of software is written the way it is. In order to find out, the only hope is <a href="https://revelry.co/resources/development/inherited-codebase/" rel="noopener">source code archeology</a>: I would dig through Git commit logs, GitHub pull request comments, emails, Quip documents, Slack channels, etc. pp., desperate to learn the why and the how behind the mysterious <em>what the heck is this function doing</em> piece of code<em>.</em></p>
<p>Of course the implications are not as dire as those of the technological singularity (<em>“</em>hypothetical point in time at which technological growth becomes uncontrollable and irreversible, resulting in unforeseeable changes to human civilization<em>”</em>). However, when approaching the code base knowledge singularity, developers become much more likely to introduce performance or behavior regressions, to waste time exploring futile previously-trodden paths, or to violate implicit or hidden cross-component assumptions.</p>
<p>So how did we get to this situation in the first place, why and how did we end up with two poor choices, the pessimist treating code as legacy or the optimist refactoring and potentially introducing bugs? Of course, many different factors determine how quickly code bases approach the singularity, but I want to call out two particularly important ones. First, communication style. <span style="background-color:Yellow">In organizations with predominantly synchronous communication (tell tales: <em>“let’s schedule a VTC to figure this out”, “can we discuss this in person next week when I’m in London anyway?”</em>), decisions are primarily made in verbal, face-to-face communication. <strong>Unless such organizations have developed a strong culture of note taking and dissemination, decisions and — more importantly — the rationale behind the decisions are ephemeral and quickly lost</strong>.</span></p>
<p>In contrast, organizations with asynchronous communication styles (check out <a href="https://basecamp.com/guides/how-we-communicate" rel="noopener">Basecamp</a> or <a href="https://about.gitlab.com/company/culture/all-remote/asynchronous/#async-30-at-gitlab" rel="noopener">Gitlab</a>, for instance) typically use collaborative, text-based communication tools (e.g., Quip or Wikis) that automatically produce written artifacts of discussion and decision-making. <span style="background-color:Yellow">But watch out, don’t get tricked into relying on <a href="https://medium.com/@ursula2000/slack-the-good-the-bad-and-the-ugly-40bb2174e40e" rel="noopener">synchronous communication tools like Slack to capture decisions for asynchronous consumption</a>! <strong>Even with collaborative documentation tools like Quip or Google Documents, knowledge organization (e.g., structuring, tagging, search, archival, access control, etc.) remains a major challenge.</strong></span></p>
<p><span style="background-color:Yellow">Second, the software architecture (as a mirror of the organizational structure, per <a href="https://en.wikipedia.org/wiki/Conway's_law" rel="noopener">Conway’s law</a>) directly impacts the half-life time of architectural decisions.</span> For example, micro-service code and organization architectures often exhibit strong intra-service social bonds, but also strong per-service information siloing. <span style="background-color:Yellow">Even if technical decisions <em>within</em> a given service are documented, organizations may lack an obvious forum for discussing and capturing cross-service, system-wide architectural decisions.</span> Organization leaders who strive to promote organization-wide knowledge sharing will find themselves in a constant uphill battle against entropy and laziness.</p>
<h2><strong>Programming vs software engineering</strong></h2>
<p>The Farnam Street quote from above discusses Chesterton’s fence in terms of “first-order thinking” and “second-order thinking”. In mathematics or physics, a <em>first-order</em> approximation is usually a linear approximation, e.g., an order-1 <a href="https://en.wikipedia.org/wiki/Taylor's_theorem#:~:text=For%20a%20smooth%20function,%20the,to%20as%20the%20quadratic%20approximation." rel="noopener">Taylor expansion</a> of a function. Linear approximations have poor forecasting ability. For instance, they cannot express the difference between <em>my account balance grows</em> (first order) and <em>the rate at which my account balance grows grows</em> (second order). Analogously, first-order thinking concerns the direct consequences of an action, while second-order thinking considers the consequences of the consequences of an action or a decision. Second-order thinkers continually wonder, <a href="https://fs.blog/2016/04/second-order-thinking/" rel="noopener">And then what</a>? Second-order thinkers have better forecasting ability, they produce more future-proof solutions.</p>
<p>Programming (or, “coding”) is first-order thinking and software engineering is second-order thinking. To understand the distinction, consider <a href="https://www.oreilly.com/library/view/software-engineering-at/9781492082781/" rel="noopener">Google’s insight</a> that <em>”</em>software engineering is programming over time<em>“:</em> programming is to solve the problem at hand, software engineering is to solve the problem in such a way that the solution will stand the test of time, that it can get adapted and reused by other people and systems in the future. The person who wrote our <em>what the heck is this function doing? </em>piece of code was potentially a brilliant programmer, but quite likely not a stellar software engineer.</p>
<p>In contrast to programming, software engineering requires much more than writing down the correct algorithm: choosing a future-proof programming language, writing tests to document edge case behavior and prevent regressions, writing API documentation, giving variables and methods intuitive and consistent names, documenting nuances of the design or implementation, or even sharing knowledge and insights with others through documentation, tech talks, and education programs. These behaviors can help avoid <em>what the heck is this function doing? </em>moments, they can help postpone or even avoid the knowledge singularity.</p>
<h2><strong>Coding tools for second-order thinkers</strong></h2>
<p>The code base knowledge singularity is too real a danger to be fended off with appeals only (“just code more carefully!”, “try harder!”). Much more important are concrete tools and routines that help anchor second-order thinking. Here are a few simple examples from my work at Palantir:</p>
<ul>
<li>Every code or configuration change at Palantir requires <a href="https://medium.com/palantir/code-review-best-practices-19e02780015f" rel="noopener">code review</a>. A first-order consequence is to catch bugs, an (arguably more important?) second-order consequence is to share knowledge about the code base.</li>
<li>We use Quip for <em>Request for Comments</em> (RFC) documents in which engineers propose technical problems and solutions. Their peers can join the discussion, comment, critique, ask questions, etc. Wherever possible given legal and compliance constraints, team Quip folders have open-by-default access policies.</li>
<li>Many teams produce <a href="https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions" rel="noopener">Architecture Decision Records</a> (ADR) to document important, long-term architectural choices: which database technology or storage layout does this service use, why are WebSockets preferred in this service over REST-style RPC, how is access control designed for user-facing resources, etc. It’s practical to store ADRs alongside the code in the source code management system, this helps with both discoverability and archeology. Side note: A big challenge for many teams is the transition from the <em>discussion</em> phase (RFC) to the <em>documentation</em> phase (ADR). Too often, after a fruitful discussion on the RFC document, teams struggle to consolidate the discussion, update the written artifacts, and and persist the insights from the RFC as an ADR.</li>
<li>We have regular internal Tech Talks in which engineers give whiteboard-based presentations of the technical underbelly of their software components. Tech Talks are recorded and serve as a great source of information for new hires or new team members.</li>
<li>Our teams hold <a href="https://medium.com/palantir/how-we-do-agile-1-35fa76e48cad" rel="noopener">post-mortem retrospectives akin to five-whys</a> in order to understand high-impact bugs or system outages and document the learnings for the future.</li></ul>
<h2><strong>Conclusion</strong></h2>
<p>Despite all these good ideas and tools, also I experience <em>what the heck is this function doing?</em> moments on a regular basis, of course even with my own code… The <em>code base knowledge singularity</em> is real, and it is a major threat to the ability of software organizations to deliver new features safely and swiftly, or to evolve existing software according to emergent infrastructure requirements in a time and cost-effective manner. In contrast to singularities in mathematics, however, this is a singularity we can stand up against. Engineering leaders must recognize this threat and fight it <em>hard</em>, by championing engineering quality initiatives and incentivizing second-order thinking in software engineering.</p>
Some problems we could solve for codebases with PKM tools:-
* [[Code linting management]]
* Best practices management and education
* Code security and code review assistance
* Documentation
* Project management
I found this recommendation on stack overflow to use [[TogetherJS|https://togetherjs.com]] for collaboration in OnePlaybook.
It's built by Mozilla, but the project hasn't been updated since earlier this year, but there some folks from jsfiddle are trying to keep the project going. I didn't realize Mozilla Labs had been shut down. That's sad. However, there just seems to be too much inactivity in this repo to justify using this. That's a shame. Maybe I might fork it to explore it on my own. But I think I should look for some other alternative. But, I don't know if I might find something else quite like Togetherjs.
As a side note, here's a technical write of the underlying tech: https://togetherjs.com/docs/#technology-overview
Another option is [[SimplePeer|https://github.com/feross/simple-peer]] which uses rtc to establish video, audio and data channels between peers.
Another option is Socket.IO with Simple-Peer for [[webrtc|https://webrtcforthecurious.com/docs/01-what-why-and-how/]], or SSE which provides some advantages.
There is a lot of back and forth. Receiving feedback and giving feedback can be slow and frustrating and reduces productivity.
<div class="item paragraph" data-id="f345b9a30bc7ab75" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>The web became more collaborative with wiki's introduction of the<span> </span><a class="internal" href="http://ward.asia.wiki.org/internal-link.html" data-page-name="internal-link" title="view => ward.bay.wiki.org" style="text-decoration: none;">Internal Link</a>. Link names were drawn from a shared space backed up at the time by shared storage. Federated wiki's internal links preserves the shared space but not the shared storage making it the ideal link for the distributed collaborative web.</p></div><div class="item paragraph" data-id="b6634a67558b53d9" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>The creative commons' attribution agreement combined with html5's cross-origin resource sharing provide the missing mechanisms that make the distributed collaborative link work.</p></div><div class="item paragraph" data-id="01e372e1e64bfc5e" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>In short, we know where a page came from and we know how to find more.</p></div><div class="item paragraph" data-id="fbb0aec0e6208071" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>When we mashup a page that has been well circulated we can still expect its links to work even if the cited pages have not been similarly copied. A click on a collaborative link works backwards through current and previous authors until the desired page is found.</p></div><div class="item paragraph" data-id="bfae5278a2342ec6" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>When communities meet and share a page or two they have opened a portal between each web that future readers will follow within the one site they have become.</p></div><div class="item markdown" data-id="16c1a0ad66380097" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><h3>Mechanism</h3></div><div class="item paragraph" data-id="7b923457f07b3321" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>We now describe collaborative links in the abstract and as implemented in federated wiki.</p></div><div class="item paragraph" data-id="a3d0fff41b4af9bd" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>As pages are copied (forked) they accumulate attributions sufficient to locate originals in their original linking context.</p></div><div class="item paragraph" data-id="cd51d34cdcd1c820" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>Federated wiki uses individually owned domain names as attribution expecting author identification and related pages to be served according to well established conventions.</p></div><div class="item paragraph" data-id="c87e736afd324edc" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>Link click handling consults the accumulated attributions in a most-recent first priority search for the desired page.</p></div><div class="item paragraph" data-id="b828efcce47366d9" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>Federated wiki javascript polls sites in order handling 404s until it finds the desired page. If not found, it offers to create the page locally while also consulting sitemaps for any other sites in recent browsing history.</p></div><div class="item paragraph" data-id="d94c9bbdd8740469" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>Community awareness is provided by acknowledging older and newer versions of pages as their availability becomes known.</p></div><div class="item paragraph" data-id="50cdd506575f3fbb" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>Federated wiki fetches automatically maintained sitemaps for each attribution it encounters. This informs available versions as well as 404, search and recent changes.</p></div><div class="item paragraph" data-id="a8890908c86a2cb3" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>The reader controls the collection of sites dynamically merged into one based on their own needs and interests of the moment.</p></div><div class="item paragraph" data-id="a168d91b5659f8a9" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>Federated wiki maintains a distinct neighborhood for each browser tab. Features like drag and drop between tabs and collected rosters of likely participants provide quick and controlled neighborhood expansion while browsing.</p></div><div class="item markdown" data-id="29110eeff6ceb0ee" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><h3>Experience</h3></div><div class="item paragraph" data-id="47da15a0d748060e" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>Federated wiki creates new sites on first reference. We've found this to be liberating in that each site provides a unique vocabulary for the writing that takes place there.</p></div><div class="item paragraph" data-id="3c57029e8528ec65" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>We fork pages that have utility in multiple contexts. This frees each site to be as independent and connected as convenient. We've adopted an abrupt, to the point, easily refactored writing style that regains context by surrounding pages.</p></div><div class="item paragraph" data-id="953f1c5eb2ef33cb" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>Emergent site structures tend to be topical, chronological or reflective. Pages are written quickly and then updated occasionally. A page copied to a new environment will be adjusted to fit.</p></div><div class="item paragraph" data-id="8a30cd60345c15a1" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>We designed for desktop authoring while viewing three to five wiki pages at once, tablet reading while viewing two or three page and smartphone reference retrieval showing only one or two. We have not yet shown this to be the prefered use of touch devices.</p></div><div class="item paragraph" data-id="8ca7564f01cda870" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>Our design favor non-conversational collaborations suitable for more thoughtful writing. Authors are not guaranteed to know what has become of their words.</p></div><div class="item paragraph" data-id="03b2fde3b8fef190" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>Random identifiers are created for each paragraph. These survive through editing and copying. Pages sharing a paragraph of common origin remain implicitly and bi-directionally linking by id. Search engines then become the external link-store that makes bi-directional links possible.</p></div><div class="item paragraph" data-id="c0e47847f868e693" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p>We have been crawling the visible federation since October of last year. We found 776 sites then which has grown to 1067 now. We see 300,000 uniquely identified paragraphs, a number which is growing by 3000 a month. We settle for slow but steady growth by insisting that participants launch their own servers.</p></div><div class="item markdown" data-id="bf7c15571e759ae6" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><h3>Related</h3></div><div class="item paragraph" data-id="e6d2e49ee6324960" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p><a class="internal" href="http://ward.asia.wiki.org/tedx-portland.html" data-page-name="tedx-portland" title="view => ward.bay.wiki.org" style="text-decoration: none;">TEDx Portland</a><span> </span>2012. Describes improved link.</p></div><div class="item paragraph" data-id="917d4fd5b483a351" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p><a class="internal" href="http://ward.asia.wiki.org/writing-with-strangers.html" data-page-name="writing-with-strangers" title="view => ward.bay.wiki.org" style="text-decoration: none;">Writing with Strangers</a><span> </span>2015. Emotional reflection.</p></div><div class="item paragraph" data-id="970cf013d0de58fd" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p><a class="internal" href="http://ward.asia.wiki.org/natural-genetic-infrastructure.html" data-page-name="natural-genetic-infrastructure" title="view => ward.bay.wiki.org" style="text-decoration: none;">Natural Genetic Infrastructure</a><span> </span>1996. Call to action.</p></div><div class="item paragraph" data-id="3a29cf65664eedd7" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p><a class="internal" href="http://ward.asia.wiki.org/decentralized-web-summit.html" data-page-name="decentralized-web-summit" title="view => ward.bay.wiki.org" style="text-decoration: none;">Decentralized Web Summit</a><span> </span>2016. Inspired this page.</p></div><div class="item paragraph" data-id="949fcf7009023982" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Verdana, helvetica, Arial, Sans; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><p><a class="internal" href="http://ward.asia.wiki.org/link-to-neighbors.html" data-page-name="link-to-neighbors" title="view => ward.bay.wiki.org" style="text-decoration: none;">Link to Neighbors</a><span> </span>but not without notice.</p></div>
Still a problem according Katherine Semrau. Google Docs gives the best support currently. Git has been extremely good for the software development community. What if we bring this to collaborative writing?
There is a pain point to solve here: git doesn't work well with binary objects like word docs and ppt files unless you convert them to a format that git understands like plaintext. As mentioned in this [[article|https://blog.martinfenner.org/2014/08/25/using-microsoft-word-with-git/]]:
<<<
One of the major challenges of writing a journal article is to keep track of versions - both the different versions you create as the document progresses, and to merge in the changes made by your collaborators. For most academics Microsoft Word is the default writing tool, and it is both very good and very bad in this. Very good because the track changes feature makes it easy to see what has changed since the last version and who made the changes. Very bad because this feature is built around keeping everything in a single Word document, so that only one person can work on on a manuscript at a time. This usually means sending manuscripts around by email, and being very careful about not confusing different versions of the document, which requires [[creativity|http://www.phdcomics.com/comics/archive.php?comicid=1531]]
Approaches to overcome these challenges are to a) integrate the Word documents into collaboration tools such as Sharepoint and Office 365, or document sharing services such as Dropbox and Google Docs (if you use it just for that), or b) use a different authoring tool altogether. If neither of these approaches works for you, you have a third option: use the version control system git.
<<<
The git workflow allows for distributed collaborative writing and is much more efficient than the word workflow. However, we can keep brainstorming this problem as we continue working towards OnePlaybook.
We could call it {{Name idea for a Wiki for Version Control}}
Information is merely collected and processed. It is not "thought" upon.
<<<
Hence a two-step creative process: collect raw material, then think about it. From this process comes pattern recognition and eventually the insights that form the basis of novel ideas.
<<<
Inkandswitch.com, 2019
{{Action and Information}}
Our platform is used to organize scientific knowledge in the form of reusable workflow templates with plug&play components, automation actions, unified meta descriptions and common APIs from reproduced research papers. The goal is to automate AI, ML and System research, accelerate innovation and simplify its adoption in the real world. For example, our prototype successfully automated the complex co-design process of Pareto-efficient AI/ML/SW/HW stacks and their deployment in production from the cloud to the edge.
{{cKnowledge platform}}
Lightweight webrtc app development environment for any user that needs to create custom, decentralized communication channels/audio spaces, radio or otherwise, for local groups. ~~I would like to experiment with a hands free, audio only interface like in Star Trek.~~
Might be useful for setting up ad hoc communication apps.
Addendum: Would it make sense to add support for asynchronous communication?
A knowledge graph querying framework for JavaScript
link: https://github.com/comunica/comunica
There are so many ways to talk to customers and friends. What if we could condense all these ways into one api?
Codename: Ongeajs
Target: Enterprise developers who have to develop customer service software.
Folks who cannot access different friends on different platforms for whatever reason. A person on Whatsapp should be able to talk to someone on telegram.
Server hub to coordinate profiles and sending.
Converting tacit knowledge from ChatOps/email or whatever communication platform the team uses into explicit knowledge in wikis isn't easy. You need a bunch of custom extensions working in tandem with your wiki software for it to succeed. (If your wiki can act as a cross-functional platform and replace a variety of other stuff like Trello, task managers, etc, therefore saving money)
Starting engaging mission oriented community spaces is difficult but fantastic for those who crack it. Maybe we could help make this easier OnePlaybook. This could also help us take advantage of the [[flywheel effect|The Flywheel effect]] by adding the potential for [[virality|Virality]]. Moreover, it will align perfectly with our [[mission|OnePlaybook's mission]].
[[This canvas focuses on this pain point.|OnePlaybook project: SocialWiki canvas]]
[img[https://mdn.mozillademos.org/files/17124/The_Javascript_Runtime_Environment_Example.svg]]
Above is a model of the JS engine. The event loop handles processing messages in the message queue, dropped in there by the Web API function calls (like `setTimeout`) that enable JS's non-blocking single thread concurrency.
The event loop make sure that the stack is empty of frames (function calls) before processing messages. It is called that because of its implementation using a `while` loop:
```js
while (queue.waitForMessage()) {
queue.processNextMessage();
}
```
The heap is an unsorted memory allocation for objects.
Iframes, web workers have their own runtimes with their own heaps, stacks and queues. They are allowed to only communicate with each other using messages via `postMessage`.
So, this explains why web API callbacks usually are the last to complete their tasks before everything else. Note that messages are run to completion by the event loop before the next queued callback can be processed.
{{$:/plugins/ebalster/condition/readme}}
!Get the Plugin
<<<
Drag-and-drop this to your wiki:
{{$:/plugins/ebalster/condition||$:/core/ui/Components/plugin-info}}
<<<
* [[Wikijournals and academic journals|https://wikimania.wikimedia.org/wiki/2021:Unconference/Wikipedia_and_academic_journals]]
** Have a plagiarism tool, but not able to tell direction of plagiarim
** Can turn journal articles into Wikipedia pages. But not for all
** Have not had a retraction. How to handle them is a long-term project
** Key speakers: Thomas Shafee and [[Andrew Leung|https://twitter.com/OhanaUnited]]
* Turkey Wikipedia suffered a ban for 2.5yrs with no recourse. Had to ask the WMF for help with legal proceedings to get the ban removed. Lessons for Wikipedia in Africa. Note that certain VPN ip addresses could be blocked by WMF. So you need to be aware of ip-address-white-list functionality.
* [[Wikifunctions|https://en.wikipedia.org/wiki/Wikifunctions]]: is a new Wikimedia project that allows anyone to create and maintain code. This is useful in many different ways. It provides a catalog of all kinds of functions that anyone can call, write, maintain, and use. It also provides code that translates the language-independent article from [[Abstract Wikipedia|https://meta.wikimedia.org/wiki/Abstract_Wikipedia]] (the term “Abstract Wikipedia” itself refers to the long-term goal – that this [[library of functions|https://meta.wikimedia.org/wiki/Abstract_Wikipedia/Function_model]] will someday enable the creation of language-independent articles) into the language of a Wikipedia.
<p><a href="https://babeljs.io/docs/en/configuration">babeljs.io</a></p>
<h1>Configure Babel · Babel</h1>
<p>5 - 7 minutes</p>
<hr />
<p> </p>
<p>Babel can be configured! Many other tools have similar configs: ESLint (<code>.eslintrc</code>), Prettier (<code>.prettierrc</code>).</p>
<p>All Babel API <a href="https://babeljs.io/docs/en/options">options</a> are allowed. However, if the option requires JavaScript, you may want to use a JavaScript <a href="https://babeljs.io/docs/en/config-files">configuration file</a>.</p>
<h2> </h2>
<h2>What's your use case?</h2>
<ul>
<li>You are using a monorepo?</li>
<li>You want to compile <code>node_modules</code>?</li></ul>
<blockquote>
<p><a href="moz-extension://11ff491e-461f-448b-b51f-1bfd6a01c508/readerview.html?url=https%3A%2F%2Fbabeljs.io%2Fdocs%2Fen%2Fconfiguration&id=137438953501#babelconfigjson"><code>babel.config.json</code></a> is for you!</p></blockquote>
<ul>
<li>You have a configuration that only applies to a single part of your project?</li></ul>
<blockquote>
<p><a href="moz-extension://11ff491e-461f-448b-b51f-1bfd6a01c508/readerview.html?url=https%3A%2F%2Fbabeljs.io%2Fdocs%2Fen%2Fconfiguration&id=137438953501#babelrcjson"><code>.babelrc.json</code></a> is for you!</p></blockquote>
<ul>
<li>Guy Fieri is your hero?</li></ul>
<blockquote>
<p>We recommend using the <a href="https://babeljs.io/docs/en/config-files#project-wide-configuration"><code>babel.config.json</code></a> format. <a href="https://github.com/babel/babel/blob/master/babel.config.js">Babel itself is using it</a>.</p></blockquote>
<h3> </h3>
<h3><code>babel.config.json</code></h3>
<p>Create a file called <code>babel.config.json</code> with the following content at the root of your project (where the <code>package.json</code> is).</p>
<pre><code>{
"presets": [...],
"plugins": [...]
}
</code></pre>
<pre><code>module.exports = function (api) {
api.cache(true);
const presets = [ ... ];
const plugins = [ ... ];
return {
presets,
plugins
};
}
</code></pre>
<p>Check out the <a href="https://babeljs.io/docs/en/config-files#project-wide-configuration"><code>babel.config.json</code> documentation</a> to see more configuration options.</p>
<h3> </h3>
<h3><code>.babelrc.json</code></h3>
<p>Create a file called <code>.babelrc.json</code> with the following content in your project.</p>
<pre><code>{
"presets": [...],
"plugins": [...]
}
</code></pre>
<p>Check out the <a href="https://babeljs.io/docs/en/config-files#file-relative-configuration">.babelrc documentation</a> to see more configuration options.</p>
<h3> </h3>
<h3><code>package.json</code></h3>
<p>Alternatively, you can choose to specify your <a href="moz-extension://11ff491e-461f-448b-b51f-1bfd6a01c508/readerview.html?url=https%3A%2F%2Fbabeljs.io%2Fdocs%2Fen%2Fconfiguration&id=137438953501#babelrcjson"><code>.babelrc.json</code></a> config from within <code>package.json</code> using the <code>babel</code> key like so:</p>
<pre><code>{
"name": "my-package",
"version": "1.0.0",
"babel": {
"presets": [ ... ],
"plugins": [ ... ],
}
}
</code></pre>
<h3> </h3>
<h3>JavaScript configuration files</h3>
<p>You can also write <code>babel.config.json</code> and <code>.babelrc.json</code> files using JavaScript:</p>
<pre><code>const presets = [ ... ];
const plugins = [ ... ];
module.exports = { presets, plugins };
</code></pre>
<p>You are allowed to access any Node.js APIs, for example a dynamic configuration based on the process environment:</p>
<pre><code>const presets = [ ... ];
const plugins = [ ... ];
if (process.env["ENV"] === "prod") {
plugins.push(...);
}
module.exports = { presets, plugins };
</code></pre>
<p>You can read more about JavaScript configuration files in the <a href="https://babeljs.io/docs/en/config-files">dedicated documentation</a></p>
<h2> </h2>
<h2>Using the CLI (<code>@babel/cli</code>)</h2>
<pre><code>babel --plugins @babel/plugin-transform-arrow-functions script.js
</code></pre>
<p>Check out the <a href="https://babeljs.io/docs/en/babel-cli">babel-cli documentation</a> to see more configuration options.</p>
<h2> </h2>
<h2>Using the API (<code>@babel/core</code>)</h2>
<pre><code>require("@babel/core").transform("code", {
plugins: ["@babel/plugin-transform-arrow-functions"]
});
</code></pre>
<p>Check out the <a href="https://babeljs.io/docs/en/babel-core">babel-core documentation</a> to see more configuration options.</p>
<h2> </h2>
<h2>Print effective configs</h2>
<p>You can tell Babel to print effective configs on a given input path</p>
<pre><code>
BABEL_SHOW_CONFIG_FOR=./src/myComponent.jsx npm start
</code></pre>
<pre><code>$env:BABEL_SHOW_CONFIG_FOR = ".\src\myComponent.jsx"; npm start
</code></pre>
<p><code>BABEL_SHOW_CONFIG_FOR</code>accepts both absolute and relative <em>file</em> paths. If it is a relative path, it will be resolved from <a href="https://babeljs.io/docs/en/options#cwd"><code>cwd</code></a>.</p>
<p>Once Babel processes the input file specified by <code>BABEL_SHOW_CONFIG_FOR</code>, Babel will print effective configs to the console. Here is an example output:</p>
<pre><code>Babel configs on "/path/to/cwd/src/index.js" (ascending priority):
config /path/to/cwd/babel.config.json
{
"sourceType": "script",
"plugins": [
"@foo/babel-plugin-1"
],
"extends": "./my-extended.js"
}
config /path/to/cwd/babel.config.json .env["test"]
{
"plugins": [
[
"@foo/babel-plugin-3",
{
"noDocumentAll": true
},
]
]
}
config /path/to/cwd/babel.config.json .overrides[0]
{
"test": "src/index.js",
"sourceMaps": true
}
config /path/to/cwd/.babelrc
{}
programmatic options from @babel/cli
{
"sourceFileName": "./src/index.js",
"presets": [
"@babel/preset-env"
],
"configFile": "./my-config.js",
"caller": {
"name": "@babel/cli"
},
"filename": "./src/index.js"
}
</code></pre>
<p>Babel will print effective config sources ordered by ascending priority. Using the example above, the priority is:</p>
<pre><code>babel.config.json < .babelrc < programmatic options from @babel/cli
</code></pre>
<p>In other words, <code>babel.config.json</code> is overwritten by <code>.babelrc</code>, and <code>.babelrc</code> is overwritten by programmatic options.</p>
<p>For each config source, Babel prints applicable config items (e.g. <a href="https://babeljs.io/docs/en/options#overrides"><code>overrides</code></a> and <a href="https://babeljs.io/docs/en/options#env"><code>.env</code></a>) in the order of ascending priority. Generally each config sources has at least one config item -- the root content of configs. If you have configured <code>overrides</code> or <code>env</code>, Babel will not print them in the root, but will instead output a separate config item titled as <code>.overrides[index]</code>, where <code>index</code> is the position of the item. This helps determine whether the item is effective on the input and which configs it will override.</p>
<p>If your input is ignored by <code>ignore</code> or <code>only</code>, Babel will print that this file is ignored.</p>
<h3> </h3>
<h3>How Babel merges config items</h3>
<p>For each config items mentioned above, Babel applies <code>Object.assign</code> on options except for <code>plugins</code> and <code>presets</code>, which is concatenated by <code>Array#concat</code>. For example</p>
<pre><code>const config = {
plugins: [["plugin-1a", { loose: true }], "plugin-1b"],
presets: ["preset-1a"],
sourceType: "script"
}
const newConfigItem = {
plugins: [["plugin-1a", { loose: false }], "plugin-2b"],
presets: ["preset-1a", "preset-2a"],
sourceType: "module"
}
BabelConfigMerge(config, newConfigItem);
({
plugins: [
["plugin-1a", { loose: false }],
"plugin-1b",
["plugin-1a", { loose: false }],
"plugin-2b"
],
presets: [
"preset-1a",
"preset-1a",
"preset-2b"
],
sourceType: "module"
})
</code></pre>
<p> </p>
An emerging class of productivity apps that condense and consolidate other tools via APIs, allowing a birds eye view and access of a 'work domain' while removing the problems associated with context switching. Discovered this in a recent article by Francesco D'Angelo of Keep Productive blog.
<<<
Constellation is a Web based design framework for developing distributed applications which allows single user or group of users to concurrently access and manipulate different aspects of a distributed application from a simple Mosaic like front-end tool. Users can edit and build programs and documents, manage source code, debug and instrument running distributed programs, read manual pages and other documents, browse through source code and much, much more from a simple yet powerful front-end tool. Constellation is designed to work in heterogeneous networked environment. It works with different host types, different OS environments, supports different communication protocols. It is designed to work with hybrid client/server applications that consist of new as well as legacy code. Constellation is easily extensible to support new protocols, hosts, servers, services and back-end tools
<<<
In today's [[Fission Demo day 20/5/2021]], I saw what is possible; constellations of wikis connected to federated web services, all secured with encryption.
Found this [[interesting paper from 1994|https://www.w3.org/Conferences/WWW4/Papers/343/]] on creating a framework called Constellation:
{{Constellation Framework: what is it?}}
This can be done with today's modern browsers yes, but it requires some specialized services, and it is not based on a universal framework or protocol. This framework talks about creating a decentralized, universal Web 2.0 for creating documents and building programs. This is more akin Fission codes.
A universal, decentralized navigator client with these kinds of capabilities does not exist. Only specialized web services can pull this off. Moreover, different services provide different tools that each have their own learning curve in order to master. Consider how we'd make decentralized applications using today's tools:
{{Constellation: the problem}}
Thus the paper outlines the need (that is arguably still relevant today) below:
{{Constellation: the need}}
<<<
By employing a particular protocol, the World Wide Web has met the challenge of allowing users, through a single front end tool, to browse documents that reside on a large number of different platforms. The World Wide Web, however, which has been in existence for a number of years, does not provide for any other types of functions apart from browsing and the previously described problems presented by distributed programs remain.
<mark>So, there is a need for a system that provides the capability to develop distributed programs that operate on different computers, operating systems and communication protocols, while requiring only one set of tools.</mark> Further, there is a need for a system that allows such integration for programs that have already been partially developed or completely developed under a variety of tool environments and that require modification. <mark>More broadly, there is a need for a system that allows a single front end tool to perform operations on a plurality of files that reside on different platforms without requiring a user to separately access each separate platform specific piece on that platform.</mark>
<<<
<<<
...distributed programs present substantial difficulties to programmers since they must learn to operate the tool set that was used to develop each distributed program segment. These tool sets are usually quite detailed and require days, weeks and even months to master. Further, to edit, view or debug the distributed program currently requires performing these functions under one tool set for a particular program segment, exiting the tool set, locating the tool set for a different program segment, which may be on a different computer, and entering that tool set. This type of operation is extremely time consuming, especially where a program has a large number of segments, each developed with a different tool set.
<<<
<div class="tc-table-of-contents">
<<toc-selective-expandable "Content" >>
</div>
Problem: it is hard to attract attention online. But content-marketing is the recommended way of attracting new viewers and customers. How can we solve this problem?
Insights: people seem to better navigate and enjoy micro-content. I've noticed that the default behavior these days is for people to notice something on twitter, facebook or instagram and navigate later to the content. But producing enough content and tracking it all is no small feat, especially if the team is small and underhanded.
Solution: we could create a "trailblazer" app that could take inspiration from the [[Memex|Details of the Memex]], and create simple but informative "memes", visual information that can hint to a user to navigate to more content. These "trail heads" can then be distributed easily to the top platforms for people to view, consume, share and use to explore further content that you may offer.
The content in the Library view will be in the form of screen-wide or container wide cards:
[View menu: Select/deselect all, Sort by, Archive all, Delete all]
|Grip|Select option|Image/Emoji|Title|Archive option|Deletion option|
Options can only be seen when hovered on. These options (except Grip to drag and rearrange items) must be hidden in a more button menu on mobile.
Whereas content in the Explore view will contain tiles/cards (?) that focus on projects aggregated and shared by others. Each card should have 2 options: fork, star and open.
Teams and corporate partnerships are now "agile" and "distributed". What are the challenges they face everyday? And how can knowledge tools allow them to create better value for money.
__Challenges__
# Poor communication: 33% of respondents cite communication as their greatest challenge.
# Access to expertise: 14% report a difficulty in accessing the knowledge they need to succeed.
# Technical management: 14% say technical management is their biggest hurdle.
# Planning overhead: 12% have a difficult time planning.
# Lack of training: 10% claim their team is not adequately trained.
# Cultural differences: 9% say overcoming cultural diversity is their team’s biggest challenge.
# Team morale: 4% have trouble keeping their spirits high.
# Lack of support: 4% don’t feel encouraged in their work.
!!!!!! [[Source|https://www.wrike.com/blog/8-biggest-challenges-for-leading-virtual-teams-infographic/]]
[img[https://d3tvpxjako9ywy.cloudfront.net/blog/content/uploads/legacy/infographDistAgileTeams.jpeg?av=b2ff6ffcfedb61b379a96697a875e8db]]
Need to add the following to MPL v2.0 license notice:
```
Copyright 2020, Abraham Bashir Hussein Samma
```
Followed by the following in all files:
```
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
```
# Authorize access
# Inquire:
## if the user would like to create a new folder to store tiddlers, or use an existing folder
## if the user would like to add other folders for adding/embedding files from
# Retrieve list of tiddlers (will we need pagination if the list is very long?)
# Encrypt/decrypt tiddlers on request (can work on this later)
# CRUD ops
# Embed files
__Social logic__
# Add a public/private read or read & edit or read, edit & write privileges
# Add a share to a list of collaborators with read or read & edit or read, edit & write privileges
# Add a follow/subscribe button, with list of followers. We could either implement this as:-
## following via backend-backend subscription (useful for things like live updates & notifications)
## following via backend-frontend subscription (useful if a user just wants to receive updates asynchronously)
How do you maintain secure authentication and authorization across corporate networks and assets. This may be a solved problem in many cases, but there are cracks that are still open to attack, including:
* Human tendency to fail at making secure passwords
* Human tendency to reuse insecure passwords
* Not having enough manpower or technological resources to secure data and networks
Medium-sized corporations, small teams and small businesses may be more vulnerable than large, international corporations like banks who can afford to properly secure their networks and assets.
\import [[database-macro]]
''Cost Structure''
<$edit-text tiddler=<<database-macro>> index="cost-structure" default="" placeholder="What will it cost to launch and run your business? Break it down" class="text-input" />
<div class="tc-table-of-contents">
<<toc-selective-expandable 'CRDB'>>
</div>
<p><a href="https://allafrica.com/stories/202004210459.html">allafrica.com</a></p>
<h1>Tanzania: CRDB Digital Transformation Boosts Profit Level</h1>
<p>3-4 minutes</p>
<hr />
<p>CRDB Bank digital banking transformation has started to pay off after controlling 80 per cent of all transactions, cutting costs and pushes up profitability level.</p>
<p>The bank, largest lender in the land, emphasised for digital services some three years ago, and today sees the usage going up while increase efficiency at a cost effective manner.</p>
<p>The digital transactions shot up to 80 per cent recently compared to 50 per cent before the transformation journey started over three years ago.</p>
<p>CRDB Group CEO and Managing Director, Abdulmajid Nsekela said last year performance was attributed to reforms targeted at revitalizing the business by creating new efficiencies and synergies to power growth.</p>
<p>"This is because we are taking our propositions seriously and we are working to elevate our customer experience by providing services efficiently and reliably," said Mr Nsekela.</p>
<p>The Group said in a statement that their subsidiaries CRDB Burundi, and CRDB Insurance Broker contributed to growth, delivering impressive results riding on the transformation initiatives being implemented.</p>
<p>Some of the digital service includes a last year launched Jiwezeshe, a credit facility for micro-entrepreneurs 'machinga', aimed at providing affordable loans to empower them to boost their businesses.</p>
<p>"We believe that 'Machingas' play a significant role in facilitating trade and so by giving them access to loans, we would not only accelerate their growth, but also enhance their contributions to the country's economy," Mr Nsekela explained.</p>
<p><img src="https://cdn07.allafrica.com/static/images/structure/aa-logo-rgba-no-text-128x128.png" /></p>
<h4>Sign up for free AllAfrica Newsletters</h4>
<p>Get the latest in African news delivered straight to your inbox</p>
<p>The bank said the digital transformation pushed up last year profitability by 87 per cent to 120.1bn/-.</p>
<p>Also, the Group introduced a digital lending solution named Boom Advance to support qualifying university and college students, especially for the period before their loans are disbursed by the Higher Education Students Loans Board.</p>
<p>To walk the talk, CRDB redefined Simbanking to allow more digital features including serving group accounts like Saccos, where groups of over 30 members to see transaction digitally via mobile phones.</p>
<p>"We have launched several innovative financing solutions for different sectors and customer segments aiming at addressing financial challenges that impede growth," the Group CEO stated.</p>
<p>Group customer deposits grew by 11per cent to 5.2tri/-, mainly fuelled by strong growth from the retail segment supported by a wide distribution network and augmented by CRDB Wakala agents.</p>
<p>During the year, the Group recruited more than 9,000 CRDB Wakala agents--previously FahariHuduma--to bring the total number of agents to 14,761; in addition to 553 ATMs spread across the country.</p>
Banks are extremely conservative so we should be able to work with their key decision, which can bog down the innovation process. Currently the dept. of Innovation and digital transformation is trying to create a framework that separates them from the bank so they can move faster. This impediment really hurts the dept. when showcasing things that are new to the key decision makers. e.g. Songesha was originally pitched to CRDB, but eventually had to move to Vodacom because of the bogged down process.
<$button tooltip="Create New Lean Project" class="app-btn" to="Overview">
<!--<$action-sendmessage $message="tm-new-tiddler" tags="[[Lean Project]]" title="New Lean Project" text="{{||new-project-template}}" />-->
<$action-createtiddler $basetitle="New Lean Project" tags="[[Lean Project]]" text="{{||new-project-template}}" />
<$action-sendmessage $message="tm-notify" $param="create-project-notify" />
<$list filter="[<tv-config-toolbar-icons>match[yes]]">
{{$:/plugins/absamma/lean-canvas-creator/icon}}
</$list>
</$button>
<$button>
<$action-sendmessage $message="tm-new-tiddler" tags="YourTagHere" title="New Title Here" />
Click Me
</$button>
/create
Index illustrates general act of creation of wiki spaces. Sub directories will delve into further topics organized by templates, team size, use case and team function with the same CTA in every page. Example:
/create/kanban vs /templates/kanban
<svg width="12pt" height="12pt" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 70 65 ">
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
<g>
<title>background</title>
<rect x="-1" y="-1" width="77" height="68" id="canvas_background" fill="none"/>
<g id="canvasGrid" display="none">
<rect id="svg_1" width="53" height="49" x="3" y="3" stroke-width="0" fill="url(#gridpattern)"/>
</g>
</g>
<g>
<title>Layer 1</title>
<g stroke="null" id="svg_10">
<path stroke="null" fill="currentColor" d="m56.000192,34.848251c-7.633599,0 -13.81849,6.334084 -13.81849,14.151828s6.184892,14.151822 13.81849,14.151822s13.81849,-6.334084 13.81849,-14.151822s-6.184886,-14.151828 -13.81849,-14.151828zm8.023639,15.749617c0,0.376619 -0.300882,0.684764 -0.668632,0.684764l-5.126219,0l0,5.249868c0,0.376625 -0.300882,0.68477 -0.668632,0.68477l-3.120305,0c-0.367751,0 -0.668638,-0.308145 -0.668638,-0.68477l0,-5.249868l-5.126213,0c-0.367751,0 -0.668638,-0.308145 -0.668638,-0.684764l0,-3.195577c0,-0.376619 0.300887,-0.684764 0.668638,-0.684764l5.126213,0l0,-5.249874c0,-0.376619 0.300887,-0.684764 0.668638,-0.684764l3.120305,0c0.367751,0 0.668632,0.308145 0.668632,0.684764l0,5.249874l5.126219,0c0.367751,0 0.668632,0.308145 0.668632,0.684764l0,3.195577z" id="svg_9"/>
</g>
<g stroke="null" id="svg_15">
<path stroke="null" fill="currentColor" d="m46.279333,0.476l-38.503313,0c-2.453663,0 -4.44269,2.22488 -4.44269,4.969477l0,36.442797c0,2.744604 1.989028,4.969477 4.44269,4.969477l38.503313,0c2.453663,0 4.44269,-2.224873 4.44269,-4.969477l0,-36.442797c0,-2.744597 -1.989028,-4.969477 -4.44269,-4.969477zm-22.213451,39.755781l-14.808963,0l0,-9.93894l14.808963,0l0,9.93894zm0,-16.564909l-14.808963,0l0,-9.93894l14.808963,0l0,9.93894zm20.732552,16.564909l-14.808963,0l0,-9.93894l14.808963,0l0,9.93894zm0,-16.564909l-14.808963,0l0,-9.93894l14.808963,0l0,9.93894z" id="svg_14"/>
</g>
</g>
</svg>
By default, TiddlyWiki displays a blank screen while it is loading. You can add a special "splash screen" that is displayed while the wiki loads.
Larger TiddlyWiki files and those loaded over a slow network connection may take a little time to load. Once fully loaded, performance improves, because everything is now running entirely within the browser. Using a splash screen ensures people know the loading process is taking place, reducing the chance they will leave the page.
In order for the splash screen to be displayed before TiddlyWiki is initialised it is embedded as static HTML/CSS within the TiddlyWiki HTML file. This is done with the [[SystemTag: $:/tags/RawMarkupWikified/TopBody]].
In order to remove the splash screen when the wiki has finished loading, the HTML should be wrapped in a container with the special class `tc-remove-when-wiki-loaded`. Any DOM elements with this class are automatically deleted by the core once the wiki has loaded.
Here's an example of a simple splash screen that just displays the text //Loading//. To use it, copy the text into a new tiddler, give it the type "text/plain" and the tag "$:/tags/RawMarkupWikified/TopBody":
```
<div class="tc-remove-when-wiki-loaded">
Loading...
</div>
```
If the tiddler is given the WikiText type `text/vnd.tiddlywiki` then the contents are wikified as the file is saved, allowing transclusion etc. For example, here's an example that quotes the site title in the loading message. To use it, copy the text into a new tiddler, give it the type "text/vnd.tiddlywiki" and the tag "$:/tags/RawMarkupWikified/TopBody":
```
\rules only filteredtranscludeinline transcludeinline
<div class="tc-remove-when-wiki-loaded">
Please wait while {{$:/SiteTitle}} is loading
</div>
```
The `\rules` directive is used to limit the wikitext syntax that is recognised to the two forms of inline transclusion. This avoids accidental wikification of tiddler content.
There is a more complex example splash screen using CSS animations and images configured in this wiki: see $:/SplashScreen
https://talk.tiddlywiki.org/t/create-pdf-book-from-collection-of-tiddlers/150?u=abesamma
Test your card payment system with the Card generator.
https://cardgenerator.org/
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
The Croquet Collaboration Library and Frameworks are the easiest & most powerful way for developers to create instantaneous shared experiences.
https://croquet.io/
Are you sure everything is rendering correctly on every browser on every device? Because of it isn't, and no user tells you so, well....
<p>Culture isn’t a mission statement or a set of values: <em>culture is the way a group of people make decisions in support of the company’s values</em>. Founders can’t be present for every decision, but the best ones build cultures that allow their employees to make decisions from the same core values that they would.</p>
<p>The best post I’ve ever read on this topic is by Brian Chesky, CEO of Airbnb, called <a href="https://medium.com/@bchesky/dont-fuck-up-the-culture-597cde9ee9d4">Don’t Fuck Up the Culture</a>. The whole post is beyond phenomenal, but the payload is here:</p>
<blockquote>The stronger the culture, the less corporate process a company needs. When the culture is strong, you can trust everyone to do the right thing. People can be independent and autonomous. They can be entrepreneurial.</blockquote>
<p>People can be independent and autonomous because <em>they all share the same knowledge about how to make decisions</em>.</p>
The curse of knowledge is a cognitive bias that occurs when an individual, communicating with other individuals, unknowingly assumes that the others have the background to understand. This bias is also called by some authors the curse of expertise.
* Noted people are truly looking for data sovereignty coupled with a comprehensive user experience. No lock-ins of any sort. Be like Joplin
* When it comes to extensions like [[WorldBrain Memex]], browser extensions aren't favored much because they're perceived as restrictive due to lack of mobile support, though this isn't a universal thing
* Data portability is MANDATORY
* Moving between apps, devices and browsers is going to be a big user preference: you should make yourself available everywhere
* DO NOT FORGET NEXTCLOUD USERS. They exist and they're already at our door step
* Seems to be a demand for managing bookmarks beyond what browsers can offer. And they're doing it using MicrPub, Joplin and TiddlyWiki.
{{Review Card}}
{
"what_you_do": "I am creative designer.",
"how_plan_strategies": "Time management. three phases, meeting with client, kickstarting the project, revision and delivery.",
"biggest_time_waster": "Revisions.",
"advice_projects": "Friends in real life and other creatives. The response from online is not always fast. How tos and community forums used.",
"successful_project_strategy": "Tujenge. Social entrepreneurship. ",
"replicate_successful_strategies": "They're not ready to be launched but I am sure they'll be successful.",
"need_docu_strategies": "Yes, I am not good at documenting but I should do it.",
"how_measure_progress": "I measure relative to the size of the project, budget and impact.",
"bottomline": "Understanding the problem before solving it.",
"best_tool": "Usability and the flexibility. If the customer can use it, better.",
"discourages_tool": "Open to listening but there should be no duplication of features.",
"coordinate_tools": "Drive mostly and slack for feedback and tracking the project. It is hard to coordinate them. I have to move between.",
"yes_automate_tools": "It hastens the creative process.",
"dream_automate_tools": "Tool that will organize your projects. Sometimes I work on three projects and I find it hard to track them all. Having a single dashboard for all projects would be nice.",
"wicked_problems": "The feedback phase is the problem. The feedback is slow and it finds me in another project and it is difficult to switch between different projects."
}
{
"what_you_do": "I am lawyer.",
"how_plan_strategies": "First come first served.",
"biggest_time_waster": "Clerk. A paralegal clerk. We don't have that at work. So we end up doing it ourselves.",
"advice_projects": "References and then people. But it depends on the project.",
"successful_project_strategy": "Still employed.",
"need_docu_strategies": "Yes. There's lack of material on Tanzanian material. Our laws aren't harmonized and documentations therein.",
"how_measure_progress": "KPIs, financial. There is a system that we feed in information for you. But it doesn't track. It doesn't matter how you achieve these things.",
"bottomline": "Financial",
"best_tool": "Two",
"discourages_tool": "It has to be approved. Global office approval.",
"coordinate_tools": "It's not hard and it is pretty easy.",
"tool_automation": "Yes, legal material research. Google scholar is the primary tool.",
"wicked_problems": "No.",
"replicate_successful_strategies": "N/A",
"yes_automate_tools": "N/A",
"dream_automate_tools": "Already answered."
}
{
"what_you_do": "Entrepreneur",
"how_plan_strategies": "Depends on project. Id problem. Then look at worth, capacity and resources. See if I need a team. ",
"biggest_time_waster": "Not planning in advance. Changing plans. You spend more time planning if you don't plan ahead.",
"advice_projects": "Learn from customers and competitors. Other countries. Also from my boss, who's my mentor.",
"successful_project_strategy": "The current one that I am working on. You know what a farmer wants by being a farmer.",
"replicate_successful_strategies": "",
"need_docu_strategies": "There is. It is difficult to know what to do in the beginning. So this can help them and is useful. There is also a need to share opportunities more. We're late adopters in Tz.",
"how_measure_progress": "KPIs. Weekly meetings every Monday. Monthly reviews. These meetings are a burden in the beginning. We use minutes. ",
"bottomline": "The right team.",
"best_tool": "Google Drive, see everything.",
"discourages_tool": "1. Convenience. Access it anywhere\n2. Any new features. If there is nothing new, why should I",
"tool_automation": "ERP, quickbooks, xero. Xero has more features in terms of inventory movement.",
"yes_automate_tools": "Yes",
"dream_automate_tools": "Customer ordering. Right now we use whatsapp and email. Place order online. and link it to inventory. For hotels and eateries.",
"wicked_problems": "Making decisions, you don't know if you're making the right move or the wrong move."
}
<$button>
<$action-createtiddler $basetitle="Customer Interview" tags="[[customer interview]]" text="{{||customer-interview-template}}" />
Create New Customer Interview
</$button>
__Customer interviews__
<<list-links "[tag[customer interview]sort[title]]" "" "" "" "Such empty!">>
__Assets__
* [[customer-interview-template]]
<<<
After decades of watching great companies fail, we’ve come to the conclusion that the focus on correlation—and on knowing more and more about customers—is taking firms in the wrong direction. What they really need to home in on is the progress that the customer is trying to make in a given circumstance—what the customer hopes to accomplish. This is what we’ve come to call the job to be done.
The focus on knowing more about customers has taken firms in the wrong direction.
<<<
Managers, executives and whole companies are focusing too much on correlation instead of understanding causation. What causes buyers to buy and others to not buy?
You must strive to understand the circumstances of the buyers, and the emotional and social reasons for their decisions. That way you can accommodate these factors and make it easier for folks to do their job with your product.
You also must remove all obstacles that may impede their decision to switch to your product. Fears of transition are real. And you must understand and mitigate those fears.
And above all, solve problems that formerly had only inadequate solutions—or no solution. Give third, thoughtful, empathetic and impactful 'third options'.
Summarized and sourced from [[Know Your Customers’ “Jobs to Be Done”|https://hbr.org/2016/09/know-your-customers-jobs-to-be-done]] by Clayton M. Christensen //et al//.
From our limited survey, we see two main camps. Small, non-corporate entities and independent entrepreneurs and service industry workers vs corporate, established players. The incorporated players already have established contracts and solutions that they will not budge from so we will have to leave them out for now.
We have to target small, non-established folks who start a gig, but:
# Have difficulty managing feedback from clients (e.g. "The feedback phase is the problem. The feedback is slow and it finds me in another project and it is difficult to switch between different projects.")
# Find it tiresome switching between different tools (e,g, "Drive mostly and slack for feedback and tracking the project. It is hard to coordinate them. I have to move between.")
# Online collaboration and help is perceived as important but slow
# Have difficulties in business decision-making (e.g. "Making decisions, you don't know if you're making the right move or the wrong move.")
We could offer a simple, programmable work space on top of their pre-existing tools, e.g. dropbox and google drive, that would allow them to collate all data required for decision making, planning, tracking and quite possibly, creating with others, without needing to spend on more apps and services. It can all work right inside their cloud storage services.
\define customer-segments-tag()
[[$(currentTiddler)$ Customer Segments]] [[$(currentTiddler)$]]
\end
\define customer-segments-filtertagparam()
$(currentTiddler)$ Customer Segments
\end
\define adopters-tag()
[[$(currentTiddler)$]] [[$(currentTiddler)$ Early Adopters]]
\end
\define adopters-filtertagparam()
$(currentTiddler)$ Early Adopters
\end
''Customer Segments''
<$button style="border: none; font-size: 10px">
➕
<$action-sendmessage $message="tm-new-tiddler" tags=<<customer-segments-tag>> title="Customer Segment" />
Add item
</$button>
<ol>
<$list filter="[!has[draft.of]tag<customer-segments-filtertagparam>sort[created]]">
<li style="font-size: 12px">
<$link to={{!!title}}><$view field="title"/></$link>
<$button message="tm-delete-tiddler" param={{!!title}} style="border:none;">❎</$button>
</li>
</$list>
</ol>
Early Adopters
<$button style="border: none; font-size: 10px">
➕
<$action-sendmessage $message="tm-new-tiddler" tags=<<adopters-tag>> title="Early Adopters" />
Add item
</$button>
<ol>
<$list filter="[!has[draft.of]tag<adopters-filtertagparam>sort[created]]">
<li style="font-size: 12px">
<$link to={{!!title}}><$view field="title"/></$link>
<$button message="tm-delete-tiddler" param={{!!title}} style="border:none;">❎</$button>
</li>
</$list>
</ol>
\define datatiddler() $(currentTiddler)$ data tiddler
\define input(index)
<$edit-text tiddler=<<datatiddler>> index=<<__index__>> default="" placeholder="Type answer" class="text-input" />
\end
# Can you tell me what you do in one sentence?<div>
<<input "what_you_do">>
</div>
# How do you usually plan your strategies for a project?<div>
<<input "how_plan_strategies">>
</div>
# What do you think is the biggest time waster when starting or running a project?<div>
<<input "biggest_time_waster">>
</div>
# Do you usually look for advice online and/or from other people about how you tackle certain projects? What are those?<div>
<<input "advice_projects">>
</div>
# Can you think of a project of yours that turned out highly successful because of a certain digital strategy?<div>
<<input "successful_project_strategy">>
</div>
# Have you been able to replicate this success story elsewhere?<div>
<<input "replicate_successful_strategies">>
</div>
# Do you see any need in documenting and sharing such successful strategies?<div>
<<input "need_docu_strategies">>
</div>
# Do you measure your progress?
## If yes, how do you measure progress?<div>
<<input "how_measure_progress">>
</div>
## If no, why not?<div>
<<input "not_measure_progress">>
</div>
# Bottomline, what do you think is the number one success criterion in any project?<div>
<<input "bottomline">>
</div>
# There are many digital tools these days. How do you decide which one is the best for you?<div>
<<input "best_tool">>
</div>
# What discourages you from using a new digital tool?<div>
<<input "discourages_tool">>
</div>
# How do you coordinate all these tools right now?<div>
<<input "coordinate_tools">>
</div>
# Do you see any benefit in automating your workflow?<div>
<<input "tool_automation">>
</div>
# Do you try to automate anything in your life and at work?
## If yes, how?<div>
<<input "yes_automate_tools">>
</div>
## If no, why not?<div>
<<input "not_automate_tools">>
</div>
# What dream automation do you not have right now, but would like to have?<div>
<<input "dream_automate_tools">>
</div>
# Do you experience any wicked or stressful, recurring problems when trying to manage anything? What are those?<div>
<<input "wicked_problems">>
</div>
* bus passengers to discover where their preferred buses are, what routes they take, where they congregate, whether they're full or empty, and so on
* bus drivers to know exactly where passengers are and thus prevent them from relying on sitting at one place for a long time for passengers, delaying everyone
* bus conductors to effortlessly collect fees (for example via an automatic mobile interface) without worrying about missing payments
* a support system that could provide additional income to bus owners via advertisement or add-on services like free Wi-Fi
The major challenge here are passenger who still use dumb phones. How do we accommodate them?
Oh boy is this difficult. The queries man. The queries!
Data mapper: this pattern for ORM maps in-memory data representational objects in a 'domain layer' to a separate 'data persistence layer'. By keeping these layers independent of each other, one can enforce strict business processes on the data in the domain layer that do not map neatly to the persistent data store.
#### Build your own `Database`
* [**C**: _Let's Build a Simple Database_](https://cstack.github.io/db_tutorial/)
* [**C++**: _Implementing a Key-Value Store_](http://codecapsule.com/2012/11/07/ikvs-implementing-a-key-value-store-table-of-contents/)
* [**C#**: _Build Your Own Database_](https://www.codeproject.com/Articles/1029838/Build-Your-Own-Database)
* [**Clojure**: _An Archaeology-Inspired Database_](http://aosabook.org/en/500L/an-archaeology-inspired-database.html)
* [**Crystal**: _Why you should build your own NoSQL Database_](https://medium.com/@marceloboeira/why-you-should-build-your-own-nosql-database-9bbba42039f5)
* [**JavaScript**: _Dagoba: an in-memory graph database_](http://aosabook.org/en/500L/dagoba-an-in-memory-graph-database.html)
* [**Python**: _DBDB: Dog Bed Database_](http://aosabook.org/en/500L/dbdb-dog-bed-database.html)
* [**Python**: _Write your own miniature Redis with Python_](http://charlesleifer.com/blog/building-a-simple-redis-server-with-python/)
\define database-macro()
$(project)$-$(currentTiddler)$-database
\end
The application of continuous delivery and DevOps to data analytics has been termed DataOps. DataOps seeks to integrate data engineering, data integration, data quality, data security, and data privacy with operations. It applies principles from DevOps, Agile Development and the statistical process control, used in lean manufacturing, to improve the cycle time of extracting value from data analytics.
<<list-links "[tag<currentTiddler>!<currentTiddler>sort[title]]">>
A ''Date Literal'' specifies a date and optionally a 24-hour time. The time may include seconds and milliseconds.
```
2017-12-15
2017-12-15 13:07
2017-12-15 13:07
```
Date literals can be used in a [[Datum]] but not in a [[Formula]]. Use the DATE function to create dates in formulas.
A ''Datum'' is some text that may be included into a formula by a [[Transclusion]], [[Filter]] or [[Variable]]. It can be:
* A [[Formula]] starting with an equals sign `=` (spreadsheet style).
* A [[Formula]] in mushroom brackets `(= =)` ([[wikitext style|Formulas in WikiText]])
* A [[Transclusion]] in curly braces `{{ }}` (yielding another ''Datum'').
* A [[Variable]] in pointy braces `<< >>` (yielding another ''Datum'').
* Some other value, which is treated as a constant.
** A [[Number Literal]] such as `1.23`
** A [[Date Literal]] such as `2017-12-15`
** A TiddlyWiki date as used in the created and modified fields.
** Any other text
|!<div style="width:30px;">{{$:/core/images/warning}}</div>|A 14- or 17-digit number may be interpreted as a TiddlyWiki date, but only if the month, day, hour, minute and second are within acceptable ranges. The chance of this happening randomly is about <$formula formula=100*.12*.31*.24*.60*.60 toPrecision=3/>%.|
A ''Datum'' is analog to a cell in spreadsheet software.
* Recap of day 2 activities, including assessment of:
** Not feeding well
** Hypothermia
** Movement only on stimulation
** Convulsions: appreciated rhythmic movements which were repetitive and involuntary. A high index of suspicion is important and it if the mother reports in the history, it is important to ask the mother to describe the convulsions to you. [[Here's a paper with some illustrative videos|http://dx.doi.org/10.1136/bcr-2014-206577]]
__Day 3 activities__
* ''Low body (< 35.5C)/High body (> 38C) temperature'': temperature checks should should always be confirmed with another check at 30 minutes after the first check. While you wait for the 30 minute mark to recheck the temperature, either remove the baby's clothes in case of fever, or cover the baby with warm clothes if hypothermia is seen. If the beeping hasn't happened in one minute, don't be in a hurry to remove the thermometer. Wait for 3-5 minutes so it gets a chance to equalize and bleep. Calibration of these thermometers is done by measuring our own body temperature.
** Some discussion about reducing the waiting time between readings because of concerns about the leaving the child with fever for so long without acting. We can collect some temperature time pairs to see if that is indeed the case
* ''Fast breathing'': straightforward. When counting breaths during breastfeeding, you should wait for some time before you begin counting to give the baby time to finish breastfeeding and then settle down
* ''Severe chest wall in-drawing'': mild chest wall indrawing due to compliant chest wall of YI is normal. We need to look for deep and persistent lower chest wall indrawing on inspiration (or paradoxical breathing).
* Video training showing severe chest wall indrawing (SCWI), mild chest wall indrawing (CWI) and no SCWI
* We must make sure we expose the child's chest well so that we can make an accurate assessment. This applies to assessing for fast breathing as well
* we have a discrepancy rate of 1 in 9 in our SCWI assessments compared to WHO's assessment
* We will have a one on one discussion with WHO concerning these discrepancies
* View polling feedback from [[yesterday's exercise|Day 4 training]]:
** Quite a number of discrepancies.
* We will have another exercise in the future. When we have this exercise, it'll be better if we everyone participates in the poll individually. Exercise 2 will be held in two weeks
* Take notice of the lower costal margin and chest wall
* This study is based on soft outcomes that are based on clinical assessment. So we shouldn't take anything for granted.
* Significant differences between sites: marked expressed BF in Malawi compared to elsewhere, more fortification/supplements in India than in Africa. Site by site comparison analysis would be preferable to aggregation.
* No marked differences wrt exclusive BF over time. Chart review seems to suggest a different story, suggesting influence of documentation problems. There's a paper comparing documentation, observation and recall in the Lancet
* Observational data seems to be the most superior, However, we should keep in mind that the chart review data goes only up to 2 weeks
* Term/preterm: more exclusive BF in terms vs preterm
* SGA/AGA: more exclusive BF in SGA vs AGA. Why??
* Water and other feeds really marked increase from 18 weeks onwards. Why? Does this mean Exclusive BF is not enough?
* Prelacteal feeds bit higher in Tz compared to other sites. Probably due to longer separation.
* Feeding support: not 100% overall. Support is less than optimal for those with BF problems. Opportunities to intervene via clinicians who seem to be the key supporters in all 4 sites. Suggestion from Dr. Kisenge to change "clinician" label to healthcare providers to make it more indicative of inclusion of nurses.
* Feeding quality. Oh boy 🙄, what are these tools? LATCH, PIBBS & NEOEATS. How do they relate to each other? What do these scores mean? I am staring at a sea of numbers and I can't even think! Why are Tanzania's numbers skewed consistently below the SD?
* Data analysis and sharing
** Data sharing agreements are needed before data can be shared
** Country specific datasets will be made available to all co-PIs for sub-analyses and any additional analyses not included on the list of publications by the end of the LIFE study
** Harvard Data-verse will be hosting the data
** White paper has been submitted to the
** After data is made public as per Gates requirement, researchers may approach the PIs and co-PIs for concept paper submission to publication committee to assess the appropriateness of the research question
* Principles for authorship
** Involvement in study design, collection of data, analysis and/or interpretation
*** ''Acquisition of funding or data collection alone is insufficient for authorship''
* Publications planning committee consists of PIs from sites, including Katherine Semrau, Prof Karim and Chris Sudfeld
* Primary papers
** I am involved in Process and Qualitative paper
** DHM secondary paper will also be included. How do we collaborate without watering down both this paper and Qualitative paper which has some overlap
[[Outline|https://docs.google.com/document/d/1LOfN3Zv1EqwgRODyeaoKmYDT8Zxl1VUy-UNMzigTgGE/edit]]
* Interesting to note that although SGA infants are at greatest risk for growth faltering, the ''term SGA'' infants are worse off in our sites compared to even preterm SGA. What does that mean? Does this mean that perhaps small children who are born term have needs that aren't beng met? (See [[slide 30|https://docs.google.com/presentation/d/1OwfIhDths3g0almoexKil1LgdxCwKkfCe7zp5EgXTHM/edit#slide=id.gb09151b06a_1_177]])
* The implications might mean that simple anthropometrics may not accurately predict the entire future risk for the children. Maybe there are other factors, including body composition, adiposity, etc.
* No working definition for [[failure to thrive|https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5714432/]]
Problem: it's hard to manage your time and your calendar. And many don't have time to keep a diary.
Solution: what if the diary keeps you?
__Daybook: the smart diary__
# What have you done and what will you do prompter
# 4DX sieve
# To-do list with calendar pull/push functionality
# Share and collaborate
But, what about daily rituals and sealing calendar space ahead of time for these to encourage habits.
[[Aika]]'s mother. She's a megabitch. Probably the most irrational human being on Earth. She hates [[Aika]]. She adores her eldest son, but [[Aika]] thinks she's only pretending.
She spends most of her time trying to poison the other children against her siblings and anyone else who are unfortunate enough to become the object of her hatred.
She works as a quality assurance officer at a nearby food cannery.
<iframe src='https://embed.simplecast.com/857f7522' width='100%' frameborder='0' height='200px' scrolling='no' seamless></iframe>
<p>Originally, [[Roam sold the idea|https://every.to/superorganizers/the-fall-of-roam]] that you don't need to bother with organization of notes during note taking when everything can be organized from the ground up using a graph of bidirectional-linking or back-linking.</p>
<blockquote>
<p>The idea was to create a highly-networked system of notes with lots of links between them. By doing so, you could increase serendipitous encounters with old notes, and decrease your risk of losing a note</p></blockquote>
<p>However, that appears to no longer be the case according to some users who have noted that:</p>
<ol>
<li>They never review their back-links, so they sit around as stale data ([[exactly as we observe in other apps like Pocket and Twitter|Lost utility of what we collect online]] where users cannot easily link up their old ideas and review them in a natural way)</li>
<li>The most common behavior in contrast was to write notes. However, because of the above problem, one tries to achieve better discoverability via better organization. However, the need for better organization recreates the original problem that Roam claims to solve.</li></ol>
<p>Hence the problem here is effortless review/discoverability without distracting from the primary problem of writing. Something along the lines of Google Photos is required, which allows for automatic curation and review of past photos with context provided, allowing one to recollect the moment instantly without expending too much thought power to remembering. In other words, we require:</p>
<ol>
<li>Automation in organization and recall</li>
<li>No distraction from writing</li></ol>
<p>Editors note: there is an entire conversation around this article over at HN. <a href="https://news.ycombinator.com/item?id=30320977" target="_blank">Check it out</a></p>
For some time, I've been agonizing over what mission statement would guide OnePlaybook's design and development philosophy. Talking about our mission and vision using abstract and clinical corporate language is mundane and uninspiring.
Wikis are a way to democratize the process of open knowledge creation and publishing. It ties brains together into grand, centralized projects that benefit many others. However, [[classical wikis|Limitations of classical wikis & other media & alternatives]] can be blocked by those who'd rather have us live in ignorance. Therefore, we believe we should have more decentralized wiki systems. The [[Federated Wikis]]' architecture has many [[practical advantages |New Generation of Wikis]], and will be the core offering in OnePlaybook, whose mission is:
<<<
{{OnePlaybook's mission}}
<<<
From [[ideas behind wiki|Wikis, Design Patterns & Agile: What unites these concepts?]], we can derive our singular values:
# openness (explore, discover and share and discuss freely without fear, prejudice or malice)
# cooperation and support (support communities in a digital environment)
# empathy (understand the problem with others, and encourage [[generative building blocks|TiddlyWiki's Generativity]] that can lead to an organic solution versus prescriptive solutions)
# audacity (because we need to DARE MIGHTY THINGS! Even in the face of naysayers.)
You’ll be surprised that there is actually no universal definition of a business model. According to the St. Gallen University in Switzerland, a business model provides answers to the following four questions:
# Who is your target customer?
# What do you offer to the customer?
# How is the value proposition created?
# How is revenue created?
Before this, people used to create a business plan, which usually described the entire business and all its aspects from top to bottom for the benefit of investors. But most of the time, those plans were pure speculation and, as a result, many startup businesses died a natural death because no plan survives first contact with reality.
Business model innovation is a //__process__// of doing the three following things:
# Customer discovery
# Business model design
# Business model validation
The ultimate aim of doing business model innovation is to take a customer-centric point of view in generating business value.
<<list-links "[tag[Deno]sort[title]]">>
```javascript
import { serve } from "https://deno.land/std@0.50.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
req.respond({ body: "Hello World\n" });
}
```
Sometimes also known as a 'pattern language'
{{pattern languages}}
{{History of Pattern Languages}}
Here I summarize the design direction and actual language for describing the new direction we're taking for OnePlaybook that is Glassmorphism:
* Each layer of glass will be prefixed as ''glassmorphism-'':
** The `-base` will sit atop the colorful background shapes which will help emphasize the sheet of glass, conveying
** Subsequent higher layers will begin from `-base-primary`
** Each sheet will be frostier (blurred)
** There will be nothing higher than `-base-secondary` layer
** Sheets can be colored. The default color will be white or light grey. I'll need to see how I can inherit different colors into these sheets
* Buttons will be rounded (how rounded?) and highlighted with a dark gradient primary color and a lighter secondary color
* Links underlined will be either black with a hover action (should explore other ways here)
<ol>
<li><strong>Understand</strong>: Discover the business opportunity, the audience, the competition, the value proposition, and define <a href="https://en.wikipedia.org/wiki/Key_Performance_Indicator" title="Key Performance Indicator">metrics of success</a>.</li>
<li><strong>Diverge</strong>: Explore, develop and iterate creative ways of solving the problem, regardless of feasibility.</li>
<li><strong>Converge</strong>: Identify ideas that fit the next product cycle and explore them in further detail through storyboarding.</li>
<li><strong>Prototype</strong>: Design and prepare prototype(s) that can be tested with people.</li>
<li><strong>Test</strong>: Conduct 1:1 <a href="https://en.wikipedia.org/wiki/Usability_testing" title="Usability testing">usability testing</a> with 5-6 people from the product's primary <a href="https://en.wikipedia.org/wiki/Target_audience" title="Target audience">target audience</a>. Ask good questions.</li></ol>
Your plot needs to master three important things:
# Goals
# Stakes
# Urgency
Goals are things that your characters want. You need to turn those goals into //needs// in order to create a sense of urgency and make the reader care about these characters. While characters may be lovable, if they do not have a goal that you could identify with, your reader will lose interest in them rapidly.
Stakes, are the consequences of achieving or not achieving a certain goal. These stakes need to be big and consequent and with a deadline in mind, which brings us to
Urgency, where you illustrate the limited time left for the characters to complete their task.
This unifying principle allows you to weave multiple subplots into a coherent narrative to answer the reader's what, why and when questions that they will obviously have as they watch or read your story.
[[Source|https://youtu.be/7x4VehVJ1kI]]
An [[interesting app|https://deta.sh]] that makes it easier to deploy a database for your apps.
<p><a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#p19" target="_blank">Source</a></p>
<p>Memex was a future technology. It was originally proposed as a desk at which the user could sit, equipped with two “slanting translucent screens” upon which material would be projected for “convenient reading” [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#bush1991c">Bush 1991c</a>, 102]. There was a keyboard to the right of these screens, and a “set of buttons and levers” which the user could depress to search the information using an electrically-powered optical recognition system. <span style="background-color:Yellow">If the user wished to consult a certain piece of information, “he [tapped] its code on the keyboard, and the title page of the book promptly appear[ed]”</span> [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#bush1991c">Bush 1991c</a>, 103]. The images were stored on microfilm inside the desk, “and the matter of bulk [was] well taken care of” by this technology — “only a small part of the interior is devoted to storage, the rest to mechanism” [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#bush1991c">Bush 1991c</a>, 102]. It looked like an “ordinary” desk, except it had screens and a keyboard attached to it. <span style="background-color:Yellow">To add new information to the microfilm file, a photographic copying plate was also provided on the desk, but most of the Memex contents would be “purchased on microfilm ready for insertion”</span> [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#bush1991c">Bush 1991c</a>, 102]. <span style="background-color:Yellow">The user could classify material as it came in front of him using a teleautograph stylus</span>, and <span style="background-color:Yellow">register links between different pieces of information</span> using this stylus. This was a piece of furniture from the future, to live in the home of a scientist or an engineer, to be used for research and information management.</p>
<p><a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#p55">55</a></p>
<p>{{Memex Trails}}</p>
<p><a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#p56">56</a></p>
<p>The Memex described in As We May Think was to have <span style="background-color:#ffff00">permanent trails</span>, and public encyclopaedias, colleague's trails and other information could all be joined and then permanently archived for later use. Unlike the trails of memory, they would never fade. <span style="background-color:Yellow">In Memex Revisited, however, an adaptive theme emerged whereby the trails were mutable and open to growth and change by Memex itself as it observed the owner's habits of association and extended upon these</span> [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#bush1991d">Bush 1991d</a>, 213]. After a period of observation, <span style="background-color:Yellow">Memex would be given instructions to search and build a new trail of thought, which it could do later “even when the owner was not there”</span> [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#bush1991d">Bush 1991d</a>, 213]. This technique was in turn derived from Claude Shannon’s experiments with feedback and machine learning, embodied in the “mechanical mouse”;</p>
<blockquote>
<p>A striking form of self adaptable machine is Shannon’s mechanical mouse. Placed in a maze it runs along, butts its head into a wall, turns and tries again, and eventually muddles its way through. But, placed again at the entrance, it proceeds through without error making all the right turns. [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#bush1991b">Bush 1991b</a>, 171]</p></blockquote>
<p><a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#p57">57</a></p>
<p>In modern terminology, such a machine is called an intelligent “agent”, a concept we shall discuss later in this work. Technology has not yet reached Bush's vision for <span style="background-color:Yellow">adaptive associative indexing</span> [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#meyrowitz1991">Meyrowitz 1991</a>, 289], although intelligent systems, whose parameters change in accordance with the user's experiences, come close. This is called machine learning. Andries van Dam also believes this to be the natural future of hypertext and <span style="background-color:Yellow">associative retrieval systems </span>[<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#vandam1999">Van Dam 1999</a>].</p>
<p><a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#p58">58</a></p>
<p>In Memex II, however, Bush not only proposed that the machine might learn from the human via what was effectively a cybernetic feedback loop — he proposed that the <em>human might learn from the machine</em>. As the human mind moulds the machine, so too the machine “remolds” the human mind, it “remolds the trails of the user’s brain, as one lives and works in close interconnection with a machine” [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#bush1991b">Bush 1991b</a>, 178].</p>
<blockquote>
<p>For the trails of the machine become duplicated in the brain of the user, vaguely as all human memory is vague, but with a concomitant emphasis by repetition, creation and discard … as the cells of the brain become realigned and reconnected, better to utilize the massive explicit memory which is its servant. [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#bush1991b">Bush 1991b</a>, 178]</p></blockquote>
<p><a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#p59">59</a></p>
<p>This was in line with Bush’s conception of technical machines as mechanical teachers in their own right. It was a “<span style="background-color:Yellow">proposal of an active symbiosis between machine and human memory</span>” [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#nyce1991">Nyce 1991</a>, 122] which has been surprisingly ignored in contemporary readings of the design. Nyce and Kahn pay it a full page of attention, and also Nelson, who has always read Bush rather closely [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#nelson1999">Nelson 1999</a>]. But aside from that, the full development of this concept from Bush’s work has been left to Doug Engelbart.</p>
<p><a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#p60">60</a></p>
<p>In our interview, Engelbart claimed it was Bush’s concept of a “co-evolution” between humans and machines, and also his conception of our human “augmentation system”, which inspired him [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#engelbart1999">Engelbart 1999</a>]. Both Bush and Engelbart believe that our social structures, our discourses and even our language can and should “adapt to mechanization” [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#bush1991d">Bush 1991d</a>, 210]; all of these things are inherited, they are learned. This process is not only unavoidable, it is desirable. Bush also believed machines to have their own logic, their own <em>language</em>, which “can touch those subtle processes of mind, its logical and rational processes” and alter them [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#bush1991b">Bush 1991b</a>, 177]. And the “logical and rational processes” which the machine connected with were <em>our own memories</em> — a prosthesis of the inside. This vision of actual human neurons changing to be more like the machine, however, would not find its way into the 1967 essay [<a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#nyce1991">Nyce 1991</a>, 122].</p>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'dev'>>
</div>
The most practical way to develop plugins is to use Node.js with the tiddlywiki5 repository to build your plugins, and to use ~GitHub to manage you files.
! Step by step
!! 1. Installation
First read http://tiddlywiki.com/static/PluginMechanism.html.
Install Git from http://git-scm.com/downloads
Install Node.js from http://nodejs.org/
!! 2. Create a new blank repository on ~GitHub
Hint: ~GitHub repositories cannot be grouped together into directories, so it is only possible to group by using a naming scheme, e.g. use 'TW5-' as a name prefix with tiddlywiki5 projects to group them together.
Go to https://github.com/ and create new a repository 'pluginname' - choose to add a readme file.
!! 3. Setup a working environment
Choose a location in your file system (eg TW5) for your plugin project; issue commands to:
!!! 1. Create the directory
```bash
mkdir TW5
```
!!! 2. Make a local read-only copy of the ~TiddlyWiki5 repository
```bash
git clone https://github.com/Jermolene/TiddlyWiki5.git TW5
```
!!! 3. Make a directory for your plugin
```bash
cd TW5
cd plugins
mkdir yourname
cd yourname
mkdir pluginname
```
!!! 4. Make a local copy of your plugin repository
```bash
git clone https://github.com/yourgithub/pluginname.git pluginname
```
!!! 5. Go to your files
```bash
cd pluginname
```
Create the file plugin.info with content:
```js
{
"title": "$:/plugins/yourgithub/pluginname",
"description": "summary of the plugin's purpose",
"author": "yourname",
"version": "0.0.1",
"core-version": ">=5.0.8",
"source": "https://github.com/yourgithub/pluginname",
"plugin-type": "plugin"
}
```
!! 4. Create the files for your plugin
For example files see the plugins in the ~TiddlyWiki5 repository i.e. those located at plugins/tiddlywiki/. See [[TiddlerFiles|http://tiddlywiki.com/#TiddlerFiles]] for details of the supported tiddler file formats.
!!5. Build your files into a ~TiddlyWiki
Modify `editions/tw5.com/tiddlywiki.info` to include a reference to your plugin directory, i.e. find `"plugins": [ ` and add `"yourname/pluginname"`.
From the TW5 directory issue the command
```bash
node ./tiddlywiki.js editions/tw5.com --build index
```
The resultant file (index.html) will be placed in the `editions/tw5.com/output` directory of the TW5 repo.
!! 6. Save your work on ~GitHub
From `plugins/yourname/pluginname/` issue commands to:
!!! 1. Add all files
```bash
git add -A
```
!!! 2. Commit to your local repository
```bash
git commit -am "something meaningful about this check in"
```
!!! 3. Copy local changes to github
```bash
git push
```
~DevOps is a set of practices that combines software development (Dev) and information-technology operations (Ops) which aims to shorten the systems development life cycle and provide ''continuous delivery'' with high software quality.
The goals of DevOps span the entire delivery pipeline. They include:
* Improved deployment frequency;
* Faster time to market;
* Lower failure rate of new releases;
* Shortened lead time between fixes;
* Faster mean time to recovery (in the event of a new release crashing or otherwise disabling the current system).
Adoption of DevOps is being driven by many factors — including:
* Use of agile and other development processes and methods;
* Demand for an increased rate of production releases — from application and business unit stakeholders;
* Wide availability of virtualized and cloud infrastructure — from internal and external providers;
* Increased usage of data center automation and configuration management tools;
* Increased focus on test automation and continuous integration methods;
* A critical mass of publicly–available best practices.
DevOps principles have been applied in other fields like DataOps, SciOps and ResOps
<p>I found this interesting table illustrating a possible way of matching communication with the appropriate channel, allowing organizations embracing remote work to lay down some ground rules on how to effectively collaborate without duplicating things across multiple communication channels. Quite interesting. But it requires constant adherence and therefore human champions to encourage this new behavior.</p>
<p>I wonder if we could automate that call to adherence. 🤔</p>
<h2> </h2>
<h2>Setting Collaboration Channel Norms</h2>
<table style="width:100%">
<tbody>
<tr>
<td style="vertical-align:top"><strong>Tool</strong></td>
<td style="vertical-align:top"><strong>When to use</strong></td>
<td style="vertical-align:top"><strong>Response time</strong></td>
<td style="vertical-align:top"><strong>Norms </strong></td>
</tr>
<tr>
<td style="vertical-align:top"><strong>Instant messenger (IM)</strong></td>
<td style="vertical-align:top">
<p>Time-sensitive, urgent messages</p>
<p>Short and simple conversations</p></td>
<td style="vertical-align:top">
<p>ASAP</p></td>
<td style="vertical-align:top">
<p>Use with fewer than 6 people (otherwise call)</p>
<p>Set your availability</p>
<p>Avoid complicated questions or conversations that require visuals</p></td>
</tr>
<tr>
<td style="vertical-align:top"><strong>Email</strong></td>
<td style="vertical-align:top">
<p>Provide directional, important, and timely information</p>
<p>Ensure there’s a record of your communication</p>
<p>Direct the receiver to an online source for more information</p></td>
<td style="vertical-align:top">
<p>< 24 hrs; priority dependent</p></td>
<td style="vertical-align:top">
<p>Use identifiers in the subject line for urgency and response expectation</p>
<p>Use to share attachments</p>
<p>Avoid when immediate response is required</p>
<p>Not for random chit-chat</p></td>
</tr>
<tr>
<td style="vertical-align:top"><strong>Video call</strong></td>
<td style="vertical-align:top">
<p>Use for meetings, including external ones that could benefit from visual interaction (e.g., project check-ins, introductions, deck sharing)</p></td>
<td style="vertical-align:top">
<p>Schedule in advance; priority dependent</p></td>
<td style="vertical-align:top">
<p>Use mute if you’re not talking</p>
<p>Meeting host clarifies if video functionality is required for participation</p>
<p>Record calls for those who miss them</p></td>
</tr>
<tr>
<td style="vertical-align:top"><strong>Text</strong></td>
<td style="vertical-align:top">
<p>Time-sensitive, urgent messages</p>
<p>Only use if you were unable to reach the person via other channels</p></td>
<td style="vertical-align:top">
<p>Within 30 minutes if between 7AM and 7PM; priority dependent</p></td>
<td style="vertical-align:top">
<p>Use can be adjusted if it is the preferred communication for your manager</p>
<p>Avoid texting during meetings/working sessions</p></td>
</tr>
<tr>
<td colspan="3" style="vertical-align:top">Source: Digital Body Language, by Erica Dhawan</td>
<td style="vertical-align:top">© HBR.org</td>
</tr>
</tbody></table>
Everyone would like to lose weight, or gain some. How do you do that without resorting to expensive consultation?
iVBORw0KGgoAAAANSUhEUgAACTYAAANYCAYAAAD0HiDvAAAgAElEQVR4AezdB7QsRZ348SIYiJIVFBBEggTJOecM7xHVh6yYWNFVV13jWRUVc1jFPQYWRQREEZAkQZLknLMCAiLwEBAQUNL/fOvvb6jbt2fuTM/ce+e9961z7p2eme7q6k/39ExV/7pqtueee+7FF198MZF4fOH5F1KaLaU55pgjzTbbbPn1vv+9mNKL6cW+87Oc/9oTenp89vGh9HPk58jzvN9Hfr83O4l6/vT86fnT86fnT8+fzQQ8f3r+9Pzp+bPZ2cPfn54/PX96/vT86fmzmYDnT8+fnj89fzY7e/j70/On50/Pn54/PX82Exj/8+fsfRXMhRVQQAEFFFBAAQUUUEABBRRQQAEFFFBAAQUUUEABBRRQQAEFFFBAAQUUUECBcRCYkzxbkXd03PSvTpp4jb+Izm3N02chIp9qvt08j2WT5WzthTDpxq/c18wfy+rZ4myZ6DmY3triGNNTTz5l3RwHccx4XvK8xLHAX/W4eUmm2VQcY9V8u3key3p8vmQfJt34sVQ5f0zrqSfHAn/V4+glmWZTcYxV8+3meSzr8fmSfZh048dS5fwxraeeHAv8VY+jl2SaTcUxVs23m+exrMfnS/Zh0o0fS5Xzx7SeenIs8Fc9jl6SaTYVx1g1326ex7Ieny/Zh0k3fixVzh/TeurJscBf9Th6SabZVBxj1Xy7eR7Leny+ZB8m3fixVDl/TOupJ8cCf9Xj6CWZZlNxjFXz7eZ5LOvx+ZJ9mHTjx1Ll/DGtp54cC/xVj6OXZJpNxTFWzbeb57Gsx+dL9mHSjR9LlfPHtJ56cizwVz2OXpJpNhXHWDXfbp7HsuXxOScLxsLl9AsvvJBmn3321ntR3Jg3Muv2eblS8orlqvl2eh7L8BjTlvP/i4VHJ794j8fSsJzWU8/qccJzP+/tj4v47Pk54sTCwfLSERQ28Uo3z2MePfX0+6j9eSc+UzzGZyZeKz875bSeesYxUh43fr+3Py7is+XnyO8jz5/tPyd155V4rfzslNN66hnHCI9xrvX7qP1xEUZ+jvw+8vzZ/nNSd16J18rPTjmtp55xjPAY51q/j9ofF2Hk58jvI8+f7T8ndeeVeK387JTTeuoZxwiPca71+6j9cRFGfo78PvL82f5zUndeidfKz045PaN4zvnYY4/FtviogAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCgyFwOxDUQoLoYACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoUAnPG9HzzzReTPiqggAIKzAACTzzxRC6l5+8ZYGdZRAUUUEABBRRQQAEFFFBAAQVqBKzb16D4kgIKKKCAAgoooIACCiiggAKFgD02FRhOKqCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiigwHAIGNg0HPvBUiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooEAhYGBTgeGkAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKDIeAgU3DsR8shQIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACChQCBjYVGE4qoIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKDAcAgY2DQc+8FSKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiigQCFgYFOB4aQCCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoMh4CBTcOxHyyFAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKFAIGNhUYTiqggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooMBwCBjYNBz7wVIooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKBAIWBgU4HhpAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCgyHgIFNw7EfLIUCCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoUAgY2FRhOKqCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiigwHAIGNg0HPvBUiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooEAhYGBTgeGkAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKDIeAgU3DsR8shQIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACChQCBjYVGE4qoIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKDAcAgY2DQc+8FSKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiigQCFgYFOB4aQCCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoMh4CBTcOxHyyFAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKFAIGNhUYTiqggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooMBwCBjYNBz7wVIooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKBAIWBgU4HhpAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCgyHgIFNw7EfLIUCCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoUAgY2FRhOKqCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiigwHAIGNg0HPvBUiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooEAhYGBTgeGkAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKDIeAgU3DsR8shQIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACChQCBjYVGE4qoIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKDAcAgY2DQc+8FSKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiigQCFgYFOB4aQCCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoMh4CBTcOxHyyFAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKFAIGNhUYTiqggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooMBwCMw5HMUYuxTPPvtsevrpp/OML3vZy9Jcc8019kLOoYACCiiggAIzrcA///nP9Mwzz+Tte/nLX55e+cpXDmxbn3zyyfTCCy/k/Oadd940++zGgg8M14wUUEABBRRQQAEFFFBAAQUUUEABBRRQQAEFFFBAAQUU6FJghrlKd8ghh6TFFlss/+20005dbp6zKaCAAgrM6gLHHXdc2nfffdNXv/rVRJCsaeYR+PjHP976bbDPPvsMbMOee+65tMgii7TyPv/88weSN8FS9913XyIgy6SAAgoooIACCiiggAIKKDC8Atzo8sADD6RHHnlkeAtpyRRQQAEFFFBAAQUUUECBWURgwnts+sAHPpDOPvvsrngvvPDCtNBCC+V5X3zxxdYy5XTrRScUUEABBcZN4NZbb01Tp04dlf9ss82WFlxwwbTwwgunRRddNG277bZpl112GZpe9R599NF0wAEH5ECSE088Ma266qppxx13HLUds+oL1e9kekS86KKLEj0UdUpPPPFE2mijjRIBQJG22GKL9P3vfz+eTshj+XugnB70ypvmTU+TJ5xwQvrJT36SbrzxxsTxSOJzQ+DUKquskgjI2n333dMCCyww6GKbnwIKKKCAAgoooIACCigwSqCsB06ZMiV96UtfGjXPrPrCzTffnA4//PB0yimnpD//+c+tm6PoHXjJJZfMbR7cOLXOOuvMqkRutwIKKKCAAgoooIACCigwKQITHthEpfDOO+/samPt0aArpq5mOvnkk9Ntt92W1ltvvbTJJpt0tYwzKaCAAiHw1FNPdXXu/vnPf57mn3/+9J3vfCe99a1vjcUn7ZE7LMvgm+eff37SyjKMK677Tub74i1veUvH4hIkdvvtt4+YZ/nllx/xfFZ/cvXVV+egpXvvvXcUBYFS06dPT+eee27+O+2009Ivf/nLUfP5ggIKKKCAAgoooIACCigwaIGyHviXv/xl0NnPkPnRbkCPwO1u1mEI9DvuuCP/Mc/ll1+eVltttRlyWy20AgoooIACCiiggAIKKDAjCgz1UHSzzz7UxZth9jcX9t///venz3zmM+mkk06aYcptQRVQYHgF6HGG3n3mmGOOUYV8/PHH03ve8550wQUXjHpvol+gJ6mDDz44rbzyymnatGlpyy23nOgizHDr6ybA5uijj57htmsiC3zWWWflY60a1DT33HOnpZdeOnG3b5ne+c53lk+dVkABBRRQQAEFFFBAAQUUmCABboDadddda4OaXv3qV6fXvOY1I0pCb00GNY0g8YkCCiiggAIKKKCAAgooMO4Ckxo5RI8QDNPS7m+xxRYbd4BZYQUEFzz44IOzwqa6jQooMEECdM/OcGR///vf0wMPPJDOP//8EUPVcbfjscceO0Gl6byaj370o+mqq65Khx12WJpnnnk6z+y76Xe/+1165JFH2kpwRy/721QvwHBz73rXuxJ39EbabLPN0pVXXpl7aaL3RHzp0enDH/5w2nTTTfNwBjGvjwoooIACCiiggAIKKKCAAhMn8I1vfCOdc845rRXONddcOcjp/vvvT3/605/S3XffnR566KF0xBFHpM033zx98IMfbM3rhAIKKKCAAgoooIACCiigwMQITPhQdOVm0eMHf4NMXHDlAvZ1112XuLi44oor5p461l9//dp13XLLLenGG2/MRdh+++3TfPPNl/74xz+myy67LF1zzTVp8cUXT2uttVZac80183vMSA9IXNRnnhtuuCEtssgiadVVV03bbbfdqF4Yqts2iPLRZTRdHrOdDGez3HLLpY033ji98Y1vrK4uXzz91re+1Xr91ltvTb/61a9az/Gh7CYFFFCgqcACCyyQh7lkGDqGu+S8SCJwo0wEsZ5yyimtl3bcccfaQKPf//73rWDMN73pTfkc3lroXxOcfwkU4XxIAAnn6te97nW5lxzuqIzEOfL444/P521eo8cmenEile8ttdRSuewMgXrttdemK664Iv3hD3/Iea6wwgqJ74c55+z8ldnr+T3K2O22xPw8NlmmXL5uGkO24dlnn81mBOfUpV/84hctT77/Hn744brZRrzGsGscD3x33nPPPWmZZZbJ3z18t77qVa8aMW/1CUFy8Z1HgzLHBN/Lb37zm8fcJ5EX28R+vf766xPf+wsttFDOZ4MNNkjl8RLz9/P4uc99rnX8kg+9l337298e0bsZPVKyHV/+8pfbropjkcBkjkPMCCTkGOc7e6uttkovf/nLRy1b95umm98M//jHP0b06MjnmM9EXeJ3RHzG2Y6pU6eO+H1111135eOTMnMhgN6pVlpppbThhhvW/k6JdTz22GPpt7/9bb5oQDA2Q1ouscQSaZVVVsnL2otnSPmogAIKKKCAAgoooMDkCvRTv+q1vjDoentVjjrLl770pdbL1HEZKrzaIxP1k3322Sf/tWauTEzktlG/pv2aNO+886YddtihUpqXntImQq9UJHqzpi4aqUm9M5Ydj3aJyNtHBRRQQAEFFFBAAQUUUKAq0PkqbXXuIX5ORZcLh5/97GfzRdlqUekt4Yc//GF6/etfP+ItehT5yle+kl9j+B0qhvG8nJFuh+nFggu/e+2114g7eWK+5ZdfPnHBt6wgxnuDKB8BSVzg/NSnPpUvyEfePDIk1Ic+9KH0hS98ofXyz372s0RPJQwLFYnhcfiL9B//8R/pa1/7Wjz1UQEFFGgsQODBG97whlbQA+e9MhFgsd9++7VeIniUgIdqIjDk4osvzi9zDvviF7/YmoVGR87BBHbWJcqwxRZbpFNPPTW/TePd2972ttasNFDGcHTlewTJcI6dMmVKuummm1rzxwSNfz/5yU9GNW7yftPze6/bwrqaLBPbMNbjbrvtln7wgx/k2fhubBfYdMwxx7Sy2n333XNPWK0XKhPY/O///m8eCpXAtmoiyIx17rLLLtW38nMCovbdd9900UUXjXp/7733zoG9o96ovEBjL8ddNdCO2WgAphGb4KNBBFoThFUGDxM09dWvfnVEUFOleKOeEmT0sY99LB133HFte84iMOz//u//csBPmUH5m6aX3wxsO78h/vrXv+bs2PeHHnpomXVr+pOf/GQOQOIFAqv32GOP/B6/kbC85JJLWvOWE3w23/GOd6Tvfve7ozy+853v5M/5k08+WS7SmqYHz+9///ttj5PWjE4ooIACCiiggAIKKKDAuAo0rV81rS8Mqt7eDoV6F8E9kT7+8Y/X1vvj/brHydi2Cy+8MP3Xf/1XLg51LfYLbdbVRNvJW9/61tbLtGvQbt1PvXM82yVaBXVCAQUUUEABBRRQQAEFFKgITOpQdJWy9PX07W9/ew744a6husSwOfQWEBft6uY56KCDaoOamJehluixg16Zyu6Jy3xuv/329L73va98qTU9iPJ94AMfSFxQrAYLsBK2++tf//qIoZ+oWJdBTa3COKGAAgqMgwDnG3o6ikQw0CATQSPTpk1rG9TEuuhRb9FFF+15tfTkQ893dUFNZMbr+++/f6IM1dTk/N5kW5osUy1rp+fbbLNNost9EoFENFZWEw5YkdZYY4207LLLVmcZ8ZyAoo985CN5yNkRb/zrCd/JBKrVBRQTCLXJJpvUBjWxOMHIhxxySF22rddoxKX3obqgJmYikIZhBMrgudbCDSb4rVEO40eAUph2m90rXvGK3ONRmU91We4EpnGaninbpV5+M9D7E8MDR+KO3rrfU5SJ3xaROPYjPfXUU22DmpiHzybBWGUvkrx+5pln5t827YKamIcAN3pOMymggAIKKKCAAgoooMDkCfRTv2paXyi3tp96e5lPOU3dJxI3prz73e+Op10/Tsa2UX/jJlcSda3yBpuy4Nz8Eonekrk5idS03jne7RJRVh8VUEABBRRQQAEFFFBAgarApAY2MeQNd5jU/UV3utUC1z0/99xzR1TgqITecccdeXico48+ujXsEBfkPv3pT9dlkV/jwhm9FnAxkOFQvvnNb44YNuW+++7LQx8xrAo9I3Ex7r//+7/zUCmR6aWXXjrqAuqgykdwFYnKKxVvKq1USMvhkegZItLBBx+ch7FZffXV46XcswJD28Sf48K3aJxQQIEeBBiKiqG96HWJc9yPf/zjPDwWvTKRCJSgB5hBptNPP73VkxP5fv7zn8+9QzE8GT3RffjDH8698hGk2msiYPShhx7Kw5LRUw3BG/QAWPbyxzBfJ5100oism57fm2xLk2VGFHaMJzSKRvf1NIwSOFRNZW9NfBdxl2e7xD7h7tdIBEIdccQRieAfelBccskl460coFT93icIhn0bae21106s/+yzz85DuNHb0liJwKIImGEYtxNOOCEHOLMvCaiK9I1vfKPVjX+81uTxtttuG7EYvYc1SXx2CND7z//8z3xs/+lPf8q/lehZKhK/Ccr9Ea/HY6+/GcogpWoAU+RZBjzNMcccOdAw3tt5550TPVduvvnm6fDDD8+/hRiOjnMDPblFonfNMvE7KgK26cGNz969996bzy0sS0A5PXqRt0kBBRRQQAEFFFBAAQUmT6Cf+lXT+kK5tU3r7WUe1WluUo3EDbG0+faaJmPbqC9G/Z3ylgFMUf5qwBN14PLGmyb1zvFul4iy+6iAAgoooIACCiiggAIKVAUmdSg6LgjzV5cYOoiLmt2kz3zmM63Zdtxxx/S9732v9Xzq1Kl5HPEY/ojh2bioVlbkWjOnlHsN4CIbiQuSXLhlqBXuvon005/+tHWHy6abbpqn11prrdaFOYaLW3PNNWP2PARPPOm3fFywJ+AqEhf76MUpLhQS0EU3zVxw5II8fwsssEDMnoOw1llnndZzJxRQQIEmAgwD1i4RxED35qusskq7WRq9Xu1xjx5rIjiG4ULp3efLX/5yo7xZiO8FhtFaYoklch704ESgLAEV8R1w6623jsi/6fdPk21pssyIwo7xhB6S2K9xxyqBTWVwGo3IDLdK4jtmn332yUEr7bLluykSXd0TsDLPPPPkl+hFie9DhgAkiIau/7EsA3XKnn3YBzSgRjDTRhttlNZff/38PR3rqD4SoBxDGtI1P2UnOIrEUG58l9MD1c0335wDtHheDudaza+b5xFMFPMuvfTSMdnTI8PvsS9wjsTdw/y2IDiLQGxSNZAq5o3HXn4zrLbaaolAaAIWSez/sqGc12L/M7311lu3Pis8x5g7uOOuYV4j8fuL4DICD0ns74cffjgtssgi+TnTkdg/fO5INNQT6BS/32IeHxVQQAEFFFBAAQUUUGDiBfqtXzWtL1S3tEm9vZpHPOdGHeonkcobm+K1bh4na9u4OSVuvqIuRns0bdiRuKmVm4oj0Qt1mZrUO8e7XaIsn9MKKKCAAgoooIACCiigQCkwqT02lQVpOs3FZipvkcreDOK1slcj7lYh+KcuURF973vfO+KthRZaaMTY6lxE32233UbMwwVbLjhGomenSIMsH71JxYXByJ9HejOIxNAxZaU1XvdRAQUUmCgBzpMPPvjgwFdX9vpC5nvssUfboUGbrJxGvQhqiuUJvqCnoUj0nBOpn/N7k21pskyUtZvHZ555Jg+5Ov/88+fZGb6NhtFINIrG9xuBv3zvEUhblwhkufHGG1tvEWATQU3xIoErZTf/5B+JwJ1yKLx///d/bwU1xTwbbLBBWnfddePpqEd6g4xEQFAENcVrBA1NmTIlno4ZJNSascNEGaRDN/8RiNVhkdq3+L4vg5piJn6nlN/5sT/i/fKxyW+Gstemk08+uRXQR770xsYQhZGqjeK8Xg1qinkJYisTPTJFKo9rAtvoKa28uBDz+aiAAgoooIACCiiggAKTJzCI+lWT+kJ1i3utt1eXL59Xh/autgeU8441PRnbtv3226fFFlusVbRqr03lc9quqze6Nql3lvU3VjzodpnWxjihgAIKKKCAAgoooIACClQEJrXHJnpM2GqrrSpF+v9P6f63m3TnnXeOmI3An8997nMjXuMJY4BHIrCJngmqicpgGaAU73PxNdIKK6yQh6uL5/HIstFTA8FFkQZZPi6wM5RONZWVWN4r11+d1+cKKKDAIATozY7AT3rx+dvf/pYDXgh64Fx73nnn5T96T6oLxmy6fr4XCFAh4IZ0/fXX515/6NXlwAMPTPT01zSQhPzKAKayjOX3Qnl+7ef83mRbmixTbsdY0wT+0u0+PQEeddRReXZ66IleqRjaNRK9ZXVK1WHl2n2nE5wUiaCgxx57LPcyWAaQ8T69cdUlehi6/PLL694aMbQcQVb08FRNZWBQu6Dn6jKdntNzWKQnnngifx+3a+CO+do9ErR9xhln5O3gWCM/gs8YMjFSDOEWz8vHJr8ZuEjwiU98IvegRXDaqaee2hqyjx6cYn189hluoZpY5te//nUOauMYINCansCix7OYP/Lh+fvf//48PCHTnD8YUvd//ud/0p577pkIaKNHTJMCCiiggAIKKKCAAgpMrkBZx2tav2pSX6huda/19ury5fOFF14431ASN+z0c4PFZGzbnHPOmdtBohd/6myf/vSn8ybSKzK9/UYqb2KJ13jstd453u0SZdmcVkABBRRQQAEFFFBAAQVKgUkNbOKC5qGHHlqWp+fp6oXlu+66a8w8uMhWl6oBQjEPPSREKi9wx2s8lvOUrw+yfIsvvniZdWu63bpbMzihgAIKDFiAITsJTi0TQSIExdxyyy355YMPPjhNmzYtDylVzjfWNAE2dYlz3SmnnJKDHX7zm9+0ZmF9H/zgB9PnP//59MUvfjEdcMABrfd6mSiDUsrl2p1j+zm/N9mWJsuU29HtNEPMRWDTr371qxzYRBf90Sg699xzp1133bVjdlWbdt+dVfN77rknBzaVPfqwonZ3zlaXLwtVloGAoBhirZynnK4G35TvdTtdfiY4jvlMlK91kw+N6dz1yrCI/aQmvxkIWOIzTHASiTt899prr9Z0lIfAxpe//OXxND8edthhuRGdQMdeEusjaI4Ap7iQwP76+c9/nv8YDo8hhusCu3tZj/MqoIACCiiggAIKKKBAc4F+61dN6wvVErerA7art1eXL59zE8prX/vaRD2UVL3Bppy30/RkbhtDd0dgE0OVU+/lBqAzzzwzRY9UbCc3gpWpab1zotolyrI6rYACCiiggAIKKKCAAgogMKmBTYPYBdULawx3Mt9883XMutptbsxcHSYnXi8fuRumlzTR5eulbM6rgAIKDFKAwAN6W4mgF4JI6V2pHDqrm/VFcEPdvAReEGxxzjnn5F5daKyL3l9Y7n3ve18iCIeeXnpNvfb21O/5vcm2NFmmV4ctt9wy0dsPPdkEQosAACAASURBVChFwyiN2BGwwnCsY1lVbQhUqUvsqzK94hWvyE/pOapMZa+L5eudGq/LMhAY1a7Xp8ivXXBzvN/N47LLLjtiNu5k7jWwiSFxy6CmVVZZJW277baJIR7Z/z/5yU9yj2gjVlTzpJvfNDWLJe7kjcCmaAxnaMAyMKx6t++VV16Ze2eLHs0i+G3FFVfMFwp4nc9muzR16tS02WabpR/+8IfpBz/4wYheqX7729/mntnoCY7tNymggAIKKKCAAgoooMDEC/RTv+q3vlBu7Vh10XLebqapw0Vg00033dTNIiPmmextiyHmrrjiilwuem0isInHSAxZV45GwOv91Dsnol0iyu6jAgoooIACCiiggAIKKBACvUXpxFJD9Lj88suPKM0nP/nJUWOGj5hhgp8Me/kmmMPVKaDATC5Q7SXm/vvvb7vF1aCWmDGG9YzndY8E3/B36623pm9961vpyCOPbAU40ZsUjXSdgl7q8uz1tUGd35tsS5Nlut0+AngJNPnRj36UF6FBtBymjd56xkrVu2jpuaiu16WyZyb2VwQBEcRTpj//+c+pLvCoHEqunJ/pN77xjYlGZtKqq66ajjjiiOosA39eDZz+5je/mXtA6nZFJ598cuIvEr2QffzjH4+n+ZHh6cYzbb311onPMcPIMXzB2WefncreMGkkf/Ob3zyiCAcddFBrGNyllloqDy1XngvK5UcsWDxhGIhPfepT6SMf+UgOXjzkkEPS3Xffnee4/fbb8/4b5NCWxaqdVEABBRRQQAEFFFBAgTEE+qlfDaK+MEbxGr9NHY6bKEjXXXdd+t3vfpeoE3WbhmHbuPEkAptOO+209LnPfS5xg0ik/fffPybz46DqnePZLjGiwD5RQAEFFFBAAQUUUEABBRhBbUZXWHrppVP08MC2nHjiiUO1ScNQvtlmm61l8vjjj7emnVBAAQUGLXDhhReOyHKBBRZoPZ9//vlb00zUdfN+0UUXpV7OU/QIQwAOvbxEeuKJJ1oBEfHaeDwO+vzeZFuaLNONBcPRRTr88MPT6aefnp8SXLTVVlvFW20fuWu0vJOWIe3qUvQMxHsEM8VdwATHlIkhCKuJnro4XtqlFVZYofXWxRdfPKIXoNYbA54goGv33Xdv5XrppZem4447rvV8rImbb765NQuBXnWBPDS2j2eaY4458hCSsQ56R6NxPFK1UZzXY/hJphnioAxq4rVrrrkmFh/zkd90NMxffvnlaeWVV27Nf/3117emnVBAAQUUUEABBRRQQIGJFeinfjXI+sKgt7p6UxRBQX//+9+7Xs0wbBvDh0evx9z8xc1JtIuQqMPTY1OZBl3vHK92ibLMTiuggAIKKKCAAgoooIACM3xgExfg9txzz9ae/N73vpd7F2i9UExw53+ni6DFrAObHIbylT1ncMfO888/P7DtMyMFFFAAAYYa++lPf5o+/elPt0AIUtliiy1az2lQK4NdCEgqz0ePPvpo+sxnPtOavzrBsGgEWbzwwgvVtxK9vZSpXW9Q5Tz9Tvdzfm+yLU2WabqNG264YWJoQdJjjz3W6o1n7733Tmz3WGmuueYa0VMRw6ddcMEFIxb7zW9+k0466aTWa/vuu29rmiC49dZbr/WcwLWywZg3OH6qr7UWSClNmTKlFShFoy5DoUXjbjkfvRIRuNVLQF25fHX6C1/4QiqHrSVIh56XWE81McQfPUnF8VoG/3GcV4dCwKH6WjXPQTwvh5ojqCx6viLoqNxPsa7yc10NQOJzTS9q7RKBX3W9tDGscAS6sWydX7s8fV0BBRRQQAEFFFBAAQUGK9BP/aqf+sJgt2J0bquttloqeyWm7kN9uO6Gkqeffjq3OZc3dA3DtnFDGUPGR/rsZz8bk/nGk7J+yhv91Dsnsl2itRFOKKCAAgoooIACCiiggAIppUkdiu74449PZWWwukfo6YBxu8dKX/nKV9Kpp56aL75y4WunnXbKf2ussUa+AMtwKldffXW+MEdPChtttNFYWQ70/ckuH91FR3rooYfyUH2bbrppevjhhxNjyR988MHxto8KKKBAVwLbbLNN647AJ598MveGUw04es973pPKHpvIeN11183BSUwzxNUmm2ySNt988/TXv/41nXXWWanT0HWXXXZZIk96g9lhhx3y+Yu7EhmmqgyQ4f3yvNfVBjWcqen5vcm2NFmm4WYlevrjrs9vf/vbI7IoG3xHvFHzhGHY+O6l4ZNjZMcdd0wcN6997Wvz0Gbsf3pdIhGA+7GPfWxELp/4xCdycBIvcnxwnPD9zjFFcM/5558/Yv7qE+4o/tCHPpS+9rWv5bcI0OF3wc4775x7h3rkkUfSPffck487grdowF5llVWq2fT8nGPvwAMPTIceemhels/Fl7/85fSNb3wjcScrPX3x/UuPZfw+IVEmgobKHop4/a1vfWs2ePWrX52HRyiHE8gLjtM/tmGDDTZIl1xyyYiernbZZZe04IILjlor5Y7ANYLECH5af/31E8b0+MX2tksMIcxQg+zftdZaKx8Lf/vb3/K6y56e+N1iUkABBRRQQAEFFFBAgcEKcKMBdbN2iXra+9///tRP/aqf+kK7cg3ydXppok0hboShDsuNNosuumge1pybe6i7MUQ7N6VQ39t4441zEYZl2+hZ99hjj81lon4Vqa7H3X7qnRPZLhHb4KMCCiiggAIKKKCAAgoogMCkBjbRwwcXFdulbu/Op6JJbxDvete78sVP8iPQib9hSJNdPly4OB0VdLocjm6HuUhsUkABBXoVuO+++9ouQlAMw1F99atfHTUPgUAETERPTQS+8BeJXlo222yzVDf0WMxDgyLBEnWJ4bsIZKnekVg37yBe6/f83mRbmizTZFvpnakMbKIhm8CTbhOByexHAlZoWH322WdHDGkW+WBIb1/lna68R/AaQ+JF4yzBLkcffXQsll72spflu1I7DfVGcBSNzyeccEJejuO2HLawldmAJ77+9a+n17/+9bkHMn7rkNj+G264If+1Wx2BfvxFkNBdd92VvvWtb42Yfb/99ktHHnnkiNfG4wkN4AQ2lamuUZz36akthjfgs82wwOXQwARK0asaAet1ieAvemPjry6tvfbaie02KaCAAgoooIACCiigwGAFaHt98MEH22ZKPSxS0/pVv/WFWP94PTIsOkNhv+Md7xhRZ5k+fXrbOkqUZVi2jXo323HvvfdG0fKNZdxcU02DqHdOVLtEtew+V0ABBRRQQAEFFFBAgVlXYMKHoutmCJvYHVygjlQuV07H+1wAZfiTadOm5fHD4/V4pCcEekR45zvfGS/lxzKvcrqcqXy9nO5lnokqH2Uq3XjO8E9c1K3rwYT3TAoooMBYAu3OfbEcwSnrrLNODj6gQfCwww6rHbKMbt65G5Sec8rE0GX0pkdgw0c/+tHWW+X5jKAahshaZpllWu/HBMFUnGfp9YmehspU5lHdjk7vRR7lMuX88X6T83uTbWmyTJSx3WO5beU087OPyu+Nut6aymXK6VgfDav04MOQsQQilYlAF/K89tprc/BT+V5MM0zbF7/4xUSPRZHYB9xhylB2DD8b+6Ru/XPPPXc65phj8t+qq646YmizyI+eC7kLmbKWKfLltbq8y3mr0xyP3NVMYNDUqVPTcsst1ypnOS++733vexPlJLHcUUcdNWq4N8pCYBkeP/7xj1vDBFbLVT4vp8t1Vl8vt7Ocb4899miVi9fpaWurrbYqZ2lN04j+85//PPem1noxpdy7FgFyfOa5SBCpLMNBBx2Ugxk5B1QT+527p0877bQRZanO53MFFFBAAQUUUEABBRToXqD8PT7WUuW8TetX/dQXKF9ZZynLU5a9fL2cv5yn0zTtDNRbDjnkkHwz1qte9apRs7P92267bdpuu+1a7w3LtrHN1ZtB2t2Y0k+9czzaJVqYTiiggAIKKKCAAgoooIACHQRmmz59eh4Hhl4yZqb06KOP5qFuGOaG4B3+CG4aljRZ5eOOmrvvvjtfIHzd616Xe1AYFhPLoYACvQlEL2wz6vmb8tObDg2QBKr00ssSPQDR4x/neIaeW2KJJYbmHN/r+b3JtjRZpreja/BzP/XUU3mf4fOGN7yhNgi501oZpvCBBx7IwVZNj/nnnnsu3XnnnYm7jsmD3wbdDHnbqVzdvvf000/nYfkYuoCgLoIB6xrLIz+G7/vDH/6Qj/GVVlqpNfRjvD+Mj3we6RWLv6WWWioHQ3VbTu4UZ4hBtnv++efPwVs4mRRQQAEFFFBAAQUUmNkFZtS6fa/1q37qC5NxDFDvpg2VuuMiiyyS64/t2i1mtG0Lz37qnTNiu0Rst48KKKCAAgoooIACCigw4wnMtIFNM96usMQKKKBAbwIzauNnb1vp3AoooIACCiiggAIKKKCAAgrMvALW7WfefeuWKaCAAgoooIACCiiggAIKDEbgpbHeBpOfuSiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACfQsY2NQ3oRkooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKDAoAUMbBq0qPkpoIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKBA3wIGNvVNaAYKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCigwaAEDmwYtan4KKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCijQt4CBTX0TmoECCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoMWsDApkGLmp8CCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgr0LWBgU9+EZqCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAKDFjCwadCi5qeAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAJ9CxjY1DehGSiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooMCgBQxsGrSo+SmggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooEDfAgY29U1oBgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKDBoAQObBi1qfgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKNC3gIFNfROagQIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCgxawMCmQYuanwIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCvQtYGBT34RmoIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAoMWMLBp0KLmp4ACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAn0LGNjUN6EZKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiigwKAFDGwatKj5KaCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiigQN8CBjb1TWgGCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgooMGgBA5sGLWp+CiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoo0LeAgU19E5qBAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKDFrAwKZBi5qfAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIK9C1gYFPfhGaggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACgxYwsGnQouangAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACfQsY2NQ3oRkooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKDAoAUMbBq0qPkpoIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKBA3wIGNvVNaAYKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCigwaAEDmwYtan4KKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCijQt4CBTX0TmoECCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoMWsDApkGLmp8CCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgr0LTDb9OnTX+w7FzNQQAEFFFBAAQUUUEABBRRQQAEFFFBAAQUUUEABBRRQQAEFFFBAAQUUUEABBQYoYI9NA8Q0KwUUUEABBRRQQAEFFFBAAQUUUEABBRRQQAEFFFBAAQUUUEABBRRQQAEFFBiMwJyRzSKLLBKTPiqggAIKzAACDz/8cC6l5+8ZYGdZRAUUUEABBRRQQAEFFFBAAQVqBKzb16D4kgIKKKCAAgoooIACCiiggAKFgD02FRhOKqCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiigwHAIGNg0HPvBUiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooEAhYGBTgeGkAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKDIeAgU3DsR8shQIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACChQCBjYVGE4qoIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKDAcAgY2DQc+8FSKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiigQCFgYFOB4aQCCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoMh4CBTcOxHyyFAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKFAIGNhUYTiqggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooMBwCBjYNBz7wVIooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKBAIWBgU4HhpAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCgyHgIFNw7EfLIUCCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoUAgY2FRhOKqCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiigwHAIGNg0HPvBUiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooEAhYGBTgeGkAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKDIeAgU3DsR8shQIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACChQCBjYVGE4qoIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKDAcAgY2DQc+8FSKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiigQCFgYFOB4aQCCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoMh4CBTcOxHyyFAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKFAIGNhUYTiqggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooMBwCBjYNBz7wVIooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKBAIWBgU4HhpAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCgyHgIFNw7EfLIUCCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoUAgY2FRhOKqCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiigwHAIGNg0HPvBUiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooEAhYGBTgeGkAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKDIeAgU3DsR8shQIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACChQCBjYVGE4qoIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKDAcAgY2DQc+8FSKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiigQCFgYFOB4aQCCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoMh4CBTcOxHyyFAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKFAIGNhUYTiqggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooMBwCBjYNBz7wVIooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKBAIWBgU4HhpAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCiiggAIKKKCAAgoooIACCgyHwJyTVYwrrrgiXXLJJT2vft55500HHHBAz8u5gAIKKKCAAjOTwFNPPZX4m3POOdMCCywwM23aLLUtjz76aHr++efTPPPMk+aaa65ZatvdWAUUUEABBRRQQAEFFFBgVhP4xz/+kZ544ok022yzpYUXXnhW23y3V4FRAn4mRpH4ggIKKKCAAgoooECNwKQFNv35z3+uKc7YL80KFb4rr7wyPfvss2mDDTYYG8Q5FFBAAQVmSYGLLroo3XLLLTkY5t3vfvfQGtxzzz1p+vTpacUVV8zBO+Nd0GeeeSa7zD///OkNb3jDeK+u7/yPOuqo9MILL6Q11lgjbbLJJn3nN94ZTPT+HO/tMX8FFFBAAQUUUEABBWZlAW6yePzxx9Pf//739MpXvtIbLibgYLj++utbN/seeOCB6eUvf/kErLX5Kma0OnbzLXXJyRKY0T4Tk+XkehVQQAEFFFBAgVldYNICm9Zee+200korjfB/8sknExdqSa9//evTCiusMOJ9niy44IKjXpuZXrjvvvvSxRdfnO/YMbBpZtqzbosCM7bAY489lo488sj04osv5sbOadOmpbnnnrvjRp1++unp9ttvT0suuWSaMmVKx3l9c+YU+Oc//5lOPvnk3CPRI488krbZZptx39Crrroq8Uf6t3/7t0SAk2kwApOxPwdTcnNRQAEFFFBAAQUUUECBUoD2x8suuyzV3Xj6ile8IrfLcnPK0ksvXS7m9CwoYB17FtzpbrICCiiggAIKKKCAAkMoMGmBTa973etGcdx2222t16g8L7/88q3ns8rEhRdemDe1zmdWMXA7FVBg+AToUYagJhJ365177rlpp5126lhQ7vwkxWPHmX1zphXg2CHRtXi/ibz4nlxkkUXSm970ptrs4jgd1DprVzILvzjI/TkLM7rpCiiggAIKKKCAAgpMmsDVV1+d61XtCkDdjTZa6lZlYFM39bF2eQ769bvuuivRm+w666wz5k1Xg173rJafdexZbY+7vQoooIACCiiggAIKDKfApAU21XGUdwl1E9jz3HPP5TuL/va3v+WxyalgzzfffLknKO4uqibe/8Mf/pBffuMb35jHMucCPRXhhx9+OJEfwVSvec1rWovSHTPlYh1PPfVUmnfeeXPvD7PPPntrHiboYaradTD5PfjggznvRx99NJdt0UUXTa997WvTHHPMMWJ51nPNNdekhx56KL/+9NNP555OYiaG06kuE+/5qIACCky0wB//+Md8Pl1uueUmetWubwYS4Htxo402Sn/5y19yg3O/Rb///vvTtddem79z2wU2rbzyyokeIF/1qlclvnNNgxMY9P4cXMnMSQEFFFBAAQUUUEABBboRoCfduKmStk3aMwleoi2UHlrprZmgoT/96U+jetLvpj7WTRkGMQ+9CFEebowdqzfpQaxvVs7DOvasvPfddgUUUEABBRRQQAEFhkdgqAKb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P9vd6+emn3V1sy3Oo4ACCiiggAIKKKBALwL8fuavSeqmPtbk93mTstCGS09SnVI/daVqvuNZN2+SN73ajrX91W3g+UTtn7p1d3ptvOtZ/W73eNdRO9mU77EdTdrQmh4v5bp7me51f3bKm5vTo53F3po6SfmeAgoooIACCigw8wrM8oFNDF/Cj3ruWKBHhjvuuCPf3UMlnTuXuAMiEvMxLFGvwxnF8j4qoIACCiigwIwnQKASibshOwXaPPDAAzmoiXknumevGU/VEiuggAIKKKCAAgoooIACCiiggAKdBbg+c8EFF+SZaJdZeeWVOy/guwoooIACCiiggAIzpcAsH9jEsCZTpkxJ1157be6Zie6X6co1Enf1MIbziiuumJZffvkRvTnFPD4qoIACCiigwMwrwO8Aem+km/5zzjknrb/++nlYtNhihtIjOPrSSy/NL9GjE0PWmRRQQAEFFFBAAQUUUEABBRRQQAEFehOg/YUen/7yl7/kkTSeeOKJnMGqq67athft3tbg3AoooIACCiiggAIzmsAsH9jEDmPokm233TZtvvnmOaiJuwDo0pVeGejSmOAmkwIKKKCAAgrMmgIEKd1yyy3pkUceSTfeeGO66aabcu+ONLI988wz+S9k6PFxxx13zO/Haz4qoIACCiiggAIKKKCAAgoooIACCowt8OKLL6Yf/OAHiccyLbzwwmm99dYrX3JaAQUUUEABBRRQYBYSMLCp2NlNx6cusnBSAQUUUEABBWYyAYainTp1arriiitygBMB0HG3YGwqvTTRuyNBUAsuuGC87KMCCiiggAIKKKCAAgoooIACCiigQA8C1aCm5ZZbLm266ab5ZvQesnFWBRRQQAEFFFBAgZlIYLbp06fn0PdFFllkJtosN0UBBRSY+QUefvjhvJGev2f+fe0WDpcAQU1PPvlkLhRD2tLD45xzGis+XHvJ0iiggAIKKKCAAgooMGMIWLcfvv301FNPpUcffTTRI+/iiy8+fAW0RLOMwAMPPJCef/75NP/886f55ptvltnup59+Ot9QRoDTAgsskLjhzKSAAgoooIACCigwawt4FW7W3v9uvQIKKKCAAgr0KEBj4qzUoNgjj7MroIACCiiggAIKKKCAAjO0ADew8GdSYLIFXvOa10x2ESZl/fSKzZ9JAQUUUEABBRRQQIEQmD0mfFRAAQUUUEAB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kIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUyDgIZN08gHpZCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEEgENmxIMTyUgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCCBaRDQsGka+aAUEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkEAioGFTguGpBCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJDANAho2TSMflEICEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISSAQ0bEowPJWABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEpkFAw6Zp5INSSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAKJgIZNCYanEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkMA0CGjYNI18UAoJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIIBHQsCnB8FQCEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISmAYBDZumkQ9KIQEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQkkAho2JRieSkACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQALTIKBh0zTyQSkkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggURAw6YEw1MJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIYBoENGyaRj4ohQQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCSQCGjYlGB4KgEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQ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9gReeOGF8uGtttqq2GSTTdq/uB49KYP1KDHHRKVJp2v9PwaatyQgAQlIQAISGBHQsGmEwhMJSEACEpgGga997WvFX/7yl+Kggw4qjj322FEQ9913X3HzzTeXv88777zWypsm/0YeL9jJ73//++Khhx4qUFDtuuuuCyad4khAAhKQgAQkIAEJSEACEpCABOZPINUR/Pu//3vxlre8Zf5CKYEEpkyABX/nn39+GcoJJ5xQ7L///lMOcfG8l8Hipcm0JGrS6ab1fxcd8bTk1F8JSEACEpCABBaTgJ+iW8x0USoJSEACElhPCNx5553FDTfcUFx22WXFq6++up7EymhIQAISkIAEJCABCUhAAhKQgAQkIAEJ9CHw17/+dfR6ej66uAInabzT8xWIulGUgAQkIAEJSEACEuhAQMOmDrB8VAISkIAEJNCVQKqUYWtlnQQkIAEJSEACEpCABCQgAQlIQAISWEUCjz/+eHHdddcVv/vd7xYi+uwwfv311xcPPvjgQsijEPMnMOs8Mevw5k9YCSQgAQlIQAISkEAeAQ2b8rj5lgQkIAEJSKAVgX333bfYY489ikMPPbR45zvf2eodH5KABCQgAQlIQAISkIAEJCABCUhAAusbAXa1vvfeews+P7YI7le/+lVxzz33FI899tgiiKMMC0Bg1nli1uEtAGJFkIAEJCABCUhAAlkENsp6y5ckIAEJSEACEmhF4O1vf3tx8sknt3rWhyQgAQlIQAISkIAEJCABCUhAAhKQwPpI4Pe//33xzDPPLFTUfv7zny+UPAozfwKzzhOzDm/+hJVAAhKQgAQkIAEJ5BHQsCmPm29JQAISWEkCf/7zn4unn366+M1vflO8+uqrBb+33nrrYocddije9a53zZTJBhtsUIb30ksvFc8991zx8ssvF5tuumm5K9L2229fbLLJJuvIg7w/+9nPyus8s9VWW63zDBdeeOGFAn833njjYpdddlnnGbZMZ/t0Vhi+8cYbxWabbVa89a1vLfCzyuGVV14pfv3rXxfIu9tuu5XH8BBZkOl973tfKTvPPvvss+XzG264YbHNNtsUO++8c3mMd+qO+AGD559/vuTwtre9rdhuu+2KHXfcsYxD3Ttc++Uvf1m+8/rrrxd8Mo84kJ7valWcGwAAIABJREFUfe97S3mq73WJd7ybK1tOWBGmRwlIQAISkIAEJCABCUhAAhKoJzDUOJQxJOPQF198sfzbaKONynHou9/97nJcWR96/lX0EISHYwFR7Ig8j/j89re/LXUjyMKYfYsttlgnYoy30Rfg0AUwxq+6Rx55pLz0jne8o2THj6HiUw0r/Y38kXacwxMdAmlHOta50G2gN9hpp53KR9Cd/OIXvxjpRdipusmhd7j11ltL3QPPoFMhTcOFXiR+c8zVJ7TRdZB/keHRRx8tg0THFenBhS233LLUqQwhD36gF+KP8kJ+QXeELi3XRXqEnBiNoU8iXTknPQkjykk1nMhn6H/Qaf3xj38snnjiiVJGPo22++67lzqu9L2+ZT6HAe8Q1yb9HPIhL/FBvnG6PvJ6pAH6vM0337xAf0Z+Rv/WNU/01Vt1DS/SIqf8xrtNx5y45JbPJhm8LgEJSEACEpCABCYRqB+pTHrL+xKQgAQksHIEfvzjHxcPPvhgqSCpi/yuu+5anHLKKbXKurrnh7h2xRVXjJRQqX8oiZAllG1xD0XalVdeWf487rjjigMOOCBurTned999xQMPPFAaR5133nlr7t12223F7bffXirY1tz42w+UIp/73OdKBQmXUJLdfPPN5V38Sg2ukB8FzCc+8YniySefLMOs+ony88ADDyyOOeaY6q3yN4rAyy+/vDRQqj6AYobdoqrGVijsvve975UKteo7/CbMww8/vPx8XtzvGm/ey5GN93LCCjk9SkACEpCABCQgAQlIQAISkEAzgaHGoT/4wQ8ad9856KCDiqOOOqp4y1ve0ixIhzuMLS+88MKCCX3Gq4yhw2BjHvHBeCR0Cx/+8IfLMXsaHSb8L7300uJPf/pTefnMM88s3vOe96SPlOPx8ONDH/rQaMw/RHzWBFT5wWfXbrzxxlqdBgud0CFg4FR1odvAGOf0008vLr744tKQJp5DF9Jk2PTUU0+Vz6P/CMe4P3VnnXXWGh1Ojj6hi64D+TGACsfitkgPrmGw9ulPfzpuZ+s3yAM//OEP1xhNhacY1nzkIx+Jn52OkR7oe8iD5DcMmqpur732KsOoGqxFPiNvUq6QkXwbbtttt11j2ER65Jb5PgzIrw8//HC5+O5f//VfQ7w1RwwIiQ+urjxy/e677y5uuummNXFMPTnnnHOK66+/vnWeGEJv1TUPIm9u+U3jWj3PiUtO+ayG628JSEACEpCABCTQlYCGTV2J+bwEJCCBFSXAN99DSYKCA6MZlBPs4ITyg9VRd911V3HIIYfMhBBh4VCUsrqR1VusuOKPlUbf+c53SmVbVXnYRzhWIt5yyy2lF+zARLisbCQ8dkuCB4op/ro4lGco+FDQ4h87ScVKMq4TV5RVe+yxxxpvWen3rW99q1xZxw3eZbUe8nCPVW3c/8IXvlDe4xn8+/73vz8yamJlHn7DkV2veIdnWN0XLifeObIRXk5YIadHCUhAAhKQgAQkIAEJSEACEmhHoM849Jvf/ObIaIfxL+NHdnxhBx/0AxgRsHvM2WefvWbX4naSrX2KBUqM7xkjMw4/6aSTig984ANrHyqK0igld1zdNT4YvTB+JzyMdliMlDp2vkE/EI5PTVV1E6lRDbsVVV1u+lT9SX9fddVVxUMPPVReQn50GiwMQxeALgVjBXQIp556au3u1bxIerC4ivTFsYMT+hj8anLchxnvYkCEwzAt1Z2ku17l6BO66jqQl/wUOi0WobHbT7jUuCtHnvDnoosuGu00BofQv1BW0N1cdtll8WjWkR2IKB+UO9ICfRLn+A8TjIIw+KIs1jnu//SnPy2fRS+EcRu6P/RL4Yh/1zIS73KcNoM0rLpzDLKIZ7jgRH4k32OUh56zbZ4YSm/VNryQe4jyG37FMScufcpDhOtRAhKQgAQkIAEJ5BDQsCmHmu9IQAISWEEChx12WLkac5999lmzrTwD2gsuuKB48803SwXZrAybSAKUAKzU5Bju3nvvLVdZocBhNdZnP/vZuNX7yLbpOFa6nXvuuaXyIzwl/igvU2Vc3Jt0RFaURqyMjFWnvPPYY4+VCkPOMW6qGjYRP5THKONOOOGEYr/99hsFxY5T11xzTanQYtUZKypx7Az1zDPPlOcf/OAHi+OPP370DicYNqFgff/73z+6nhPvHNkIMCeskaCeSEACEpCABCQgAQlIQAISkEArArnj0BtuuGFktMP4/8gjjxwZL2F8hNELY07+2PV53333bSVP3UPsxILRBoYZOMa9e+65Z92jpWFGzrg6Jz5hBMMCMAxj+KQU4/JwLPxKHYZN7BqdujBsQr/AZ+SrLjd9qv7Eb9IjjJpYqIbxEsYc4dAhXHfddSMdAp8oq9txKxaUYQDDTtkY6kxyGAmdccYZa3Qc7FSUGg+lfuToE7rqOiI9vva1r5ULv0iD0047LRVjdJ4jDy+j04nPJ8IavQyL0XAYH7EzOjqsvg6/2CHt4IMPHuVDdHXs1E3ZIZ9iwJLqeSLMyBPsGkZZrkvznDIS/s+KQYRXPZLvw6gJgyb0bunu7ujAYhFn2zwxlN6qbXjEaajyW+WTE5fc8lAN298SkIAEJCABCUigK4F1P+7d1Qefl4AEJCCBlSCAAgQlB8qr1KGcCcUiChMUerNyKMJSoybC5fNyIQ8KJFZPDuUwIsKxGpUVXalDGcnn+NiWPcedeOKJa4ya8GO33XYrYuUmypbUsTry8ccfLy9h0JQaNXGR37vsskt5H4MrlI+4iAPncb+88bd/KDj333//kTIsfadtvHNlywkrld1zCUhAAhKQgAQkIAEJSEACEmhPoOs4lPE1BiQ4xqsYU6QGPRgOYLyx6aabls/wWXYMdHLcH/7wh/LzZewmhDv22GPXGfdW/Z1lfDD8wSEnOziHI74xVg+jH8bj7KwTDr0JBlE4jCzqjEm41zU+4X/dEWOEcFWjJq6jQ4hPybFzE4ZOTQ7Drs985jOtjJqa/Gi6nqtPyNF1NMmQXs+VBz/uuOOOkVcsygujJi6S5hi2pMZlo4c7nqCvw8gwLYv4ixFPuFSWuBbH+BRiXT7sW+bTcKfJIOJSPVIHhfvkJz+5xqiJ6+jA0p264tlxx8hrbXVk4/xqe2/I8puG2TUufcpDGq7nEpCABCQgAQlIIIeAhk051HxHAhKQgATWEIgtqlklFoPiNQ9M4Qdh1q1qJCgMc8Kx/fZQLpQdDOTZDSlWdfX1H4VTk0FU7OAE15QtK+7CsfNSnUsNl0IZHHHg+auvvnqklK57P67FO23jnSsb4XUNK2T0KAEJSEACEpCABCQgAQlIQALtCeSMQ2P3GUI56KCDagPD6CUW3vCpLYxkujp0C5dccsnIYOiII45oDC/8nnV8wrCJ8GP3Jc4xWApdATtfh7FJuosTHGN8H4uZIh5xzIlPvFt3jLQjPPyucywUC+MWdohpchjR5OxW3eRfej1XnxC6BPxqq+tIw206z5UH47XQR/EZwtCbVcOJslK93uV3065oMAkuIUvV380226w4/PDDq5dHvyPfcKFrmZ8lg5HAlZOQn08hNu0QVnll4s9g2lZHNtHDFg9EPIYov2lwXeOSWx7SMD2XgAQkIAEJSEACuQT8FF0uOd+TgAQksIIEWInIykN2ZmLFIdvMo3CMbeFniYRVVU0u3cVpSNlYxUb8UVKyepHtrPk8HIqoUAY0yTTuenUXrPRZlEzhYB0uVQ7zqbkNN1zXVjmMmXgnnt9qq61KeZGf9Lv44ovLHahQhO29994FSuiq6xrvCAt/usjG813DqsrqbwlIQAISkIAEJCABCUhAAhKYTKDvODR2I6oLKTUgYPfhJqOOune5xifRwrCGsSoGQpPcrONDHNmZCj0Ju9rwGTBcGDAxtmYnHXQFxIXP0bELNi7dWTo1kCpv/u1fTnzS99Nzxv5vvvlmeSkWT6X345z4oGvhM2bVXaPjGY7pp7zS60Oc5+oTcnQdbeTNlQfmsVtZWh6qYY7TbVWfbfo9Lq9QTjHAwZCOvBq7qYVf3N94443j5zrHNP5dy/wsGawjeFEUGFb+6U9/Km+Nk73u3XHXZq23Grr8pnHrGpc0P3TV96Xhei4BCUhAAhKQgARyCGjYlEPNdyQgAQmsGAEUASgWH3nkkZEybN4INt9880YRUNSwyhBDoPgEW+PDHW6wqvGss84qrr322oJVSigGH3zwwfIPJckxxxxTsAqsq0u3I2/7bmqwla4ObXo/lJjc5xN+fErvzjvvLJVbrNwjfdnaGiMtVsOmiq2u8e4jW9ewmuLrdQlIQAISkIAEJCABCUhAAhJoJpAzDo1JbcbbsbNPXQh8ki4cxgVd3UMPPTR6hfElO7/EzkejG5WTWccHediJ57HHHiv1AxixsOAoDJvYWYXfH/jAB0rDJoyF4IcRSozhGZenC7PSKOXEJ30/PU/H6HWLmdJnSTtkHZduQxjjpGGm56mswSm9Xz3vo+uo+lX3O1eeVBeVlodqGOPuVZ9t+j3Oj/Te66+/vo5h06S07FPmZ8mgjk3Izr0hy9Os9VZpHhyi/KasusYllaVr+UzD9VwCEpCABCQgAQnkENCwKYea70hAAhJYIQIo5y699NKR4o3txnffffdy63KUcBgRsfsPBj6zdOnuRdVwkTlWxm20UfemLraEr/rLbwb9Z599dsE20Pfdd19p7IUsv/71r4uLLrqoXIF56KGH1r3aeG2cQrjppXSHpuOOO67psdF1FK6pQ0a2mWfXKeLx0ksvlSvZ7r777nIl6ac//enS+Cne6RLvvrJ1CSvk8ygBCUhAAhKQgAQkIAEJSEAC7QnkjENjgdEkI6Nx4/W2EqJrYIcZJs9vu+22sZ/Lws95xIfdljBsYjEYOgK4sLsKbtdddx0db7zxxvKcXZv4lHzsRtW0WxMP58SnDKTmX7oT9KS0Sw2FarwqLw0pWzWMvvqErrqOavjV37nypIxCP1X1m99peqTndc82XaOcRNmsPpOmZypTPFd3Le5xDH8nyVZX5lO/p8mgSYfXNvw0vm3PZ6m3Grr8VuPYJS655aEapr8lIAEJSEACEpBADoHus705ofiOBCQgAQksLQEUbrEKh+3GTz/99KJqLPToo4/OPH6hLKwLmJWFrOjEsR15nYv7dffSVWV197nGVuInnXRSuUvTXXfdVWAQhKLmlltuKXbbbbfOW+03hdN0PV1VR3jpKrymd6rXWemFUpW/J598svjxj39csHsTq9pQvJ588snVV1rFewjZCHjejNeJvBckIAEJSEACEpCABCQgAQmsMAF2Ko6dnPlEezrhnmJJx9TjPpOVvpOes8vwLrvsUpx//vnFG2+8URo27bjjjuUOSelzfc/7xic1THr66adHn73CoAL5cYyP2ZWJxUSMu/kUXBibpO/3jcu495GB8T8GIOzaM87F/Zx0G+dv23tD6BNydB1N8uXKw0LAcOP0V+m9cXqq8KvuiA4slTN9JtITw6RUpvSZced9ykgaXhrPanjpvSYGTdfxK+JY9TfNw2mdVH2uz+9Z6K1mVX7bxCXNZ7m6yD68fVcCEpCABCQggdUmsOFqR9/YS0ACEpDAJALPPvvs6JFDDjlkHaMmbj7//POjZ2Z1QpihDKyG+cQTT4wupYZN6ZbNqeJk9HBRlH6+/PLL6aWx56xeO/roo0erR1G2zILH29/+9pFcrPrs61CoshNVKKbZgWqcGxfvoWUbF9Y4Gb0nAQlIQAISkIAEJCABCUhAAsMRYOI73LhxaHovnQiPdycd995773Lxzsc//vFyRxvG2VdeeeVoN6RJ77e93zc+6Bsifhg2/eIXvyiD5jN06efd+Rwdjk/aY9yEw9BkVoZNhIWBCu7xxx8fLQQrLyT/WOgUn5qKeCW3Bz1ll6s6N7Q+oa2uY2h50GNEHog0r4vvEPoj8lWdYxelyJMshkt3MKp7vu5anzIyBINgiFFekw6wSX/Frm/84eAwzjiqLu5NeaLu2SH0Vk3hzbr8jovL0OWzjqXXJCABCUhAAhKQQBMBDZuayHhdAhKQgATWIZB+nz5uspvTU089FT9ndmSr7Z/85CfrhIfi5p577imvs0Vy+gm2NkqV+++/v2DlaVeXKiTrtuDu6t+k51GUxs5Z7BLVZKg1yZ/0PoZf22+/fXkp3V46faZ6XhfvachGuHVhVeXxtwQkIAEJSEACEpCABCQgAQlMhwC7DTHJjrvzzjtHOxSloWFk8LOf/ay8xPhyyy23TG93OmcMyAIrHDs3YdzU1ThhXIBDxCfGqRivYBiEi8/QRdjxG8OF0FdgMBJGF/HcNI9hoILhUp0uBa633nrrSAR2YxnaxUIq/G0y9pmGPmGcriPSgEV9dZ806yNP5A3yRboAL7iiO7r33nvjZ/bxvvvuqzX64TrlBvf+978/y/++ZaQvg3TXpTqGGDtFmaqLYMQbfWZdvq97Z1KeqHsnrkV8+d1WN9gmvHmU37q49CkPwcijBCQgAQlIQAISyCWgYVMuOd+TgAQksCIE+NZ6OJQFrO5DcYAhDZ9fu+yyy+L2zI/XX399qXh75ZVXSoUBCtTvfOc7xYsvvljKss8++6zzKbpYpciquB/+8IcF21HzCTn8uOmmm8rPsTVF5MILLywuv/zygtWnbHWN4o/3H3vsseLaa68tX8PYiC3yp+3Y0jtV8H7ta18rHnjggTLuKK5gwCcCrrjiipJJyMMqta985SvlVv4o11CsomxBiYcSMxRF2223XbxSdI13rmwE2DWskZCeSEACEpCABCQgAQlIQAISkMBUCWAgcsIJJ5RhsNPxBRdcUC50ik+cYTjw7W9/eyTDscceOzrPPTniiCOKnXbaqXydXZFY2DOUGyI+MfmPfoA/FgnFDk0hJ0YJ8fn42HUm3otnpn1Ef8An8XDoL+CIHgR50KVccsklI4M0jBf4G9qlRioPP/xwqVuBGToM9DK4XH1Cjq6D8EIm9CI33nhjqetBljAIypUHvw877LAyTvxDd/bggw+W/lJeWCD4zW9+s/EzaqMXW5ygn0rLInqq22+/vbjhhhvKt8mThx56aAuf1n2kbxnpyyB0eEj2ox/9aKSTZLEjxnHf+MY3xi70O+qoo0Y7VV1zzTVlGpPfMXRCl0eaX3rppWsMJifliaH1VpPCI+7TKr9d49KnPKybu7wiAQlIQAISkIAEuhHYqNvjPi0BCUhAAqtGAGUbigQG/ii9vve9762DYIcddiieeeaZda5P8wLGQ2y3jTFOuqowwkRhd/jhh8fP0fGYY44plUcoz1C6VldsofBhRRrxrTp2ciJMlB9N7sgjjxwpxpqeGer6wQcfXMqJoRWyoaSpc+kW8hgykY4oMZsUwqyiRHkcLifeObIRXk5YIadHCUhAAhKQgAQkIAEJSEACEpgugf32269c4IPhxEsvvVRcdNFF6wTIrk6MKdEV9HX4dfLJJxfnn39+aRRCuOgDhjK86RufnXfeuTRmCsMcfscOLGncMXZih+hwQ8kf/k06ItPpp59e6kNYqHbbbbeVf9X30KUcf/zx1cuD/MYognizoApjHAxKwpHGe+yxR/kzR5+Qo+sgsP3337946KGHynBJH/7Ic+hRzj333Gx5eBHdEnFhdzMMyK6++urSv/Rf6NvSa13PkZXFbU1l8eijjy4Nxrr6G8/3KSN9GVCedtlll9KgiXxbp5PEcPC5554LcdccyXPHHXdccd1115WL+kgL/qqO8huf6puUJ4bWW00KD1mnVX5z4pJTPqu8/S0BCUhAAhKQgARyCLhjUw4135GABCSwQgQw9PnkJz9Z1G1DzqoiVmueccYZpeIH5Q9/qeN9XBzjXigM6t6JZ+qO4c+pp55anHLKKaWyKX2O1WR777138dnPfna0IjK9j8IDedOdqLiPvyhcTjvttNFKtpAx3j/ggAPKlaIhQ1znCAuUfwceeGB6eaQYqYtn+BPHNS/+7Ufc4/04j+eQj7T5+Mc/XvCd+yp7nkNJlspEHPfdd9/azwHg/5577lmcffbZa7jmxrurbMibE1bw8CgBCUhAAhKQgAQkIAEJSEAC4wnEuDKOdU/HvbpxKM+zoIdFQxgNpI4xKmNuxpRdd4iJ8XeEnfrLbkcf+9jHRpeuuuqq0Q4r8XwcRw8lJ3FvGvFBBxGfdCfIOt0J1+NzdJxjpJC+k4g6GveHzOm9OI97TfGJ56pH0uvMM88sd5Sq6g9gjO7g85//fO1irUgf3qu+Ww1n3O8TTzyx9rNoESfenZWug7BIB2RKjdFi562IR4488S5GRRhtxa48cZ0FZeiuzjrrrFIXxfVgHM+0PX7mM58p8x15MXUYqaHjOuigg9LL5XnwjuM6D1Qu9CnzfRmg8yJvVvlsvvnmBTu1wzB2Ha+LD4ZZ6AgxiKz6gS5tr732GpU7oj0pTwytt5oUXiRFn/IbflSPOXHpUx4ifeIY8kS69K1fwj+PEpCABCQgAQmsnwQ2eP755/9K1KLzt35G01hJQAISWP8I8Bkx3Czrb7bLZrcflDwoSDbeeOOFAItcrE5DqZHuTjRJOLauZvt8Bs4YOvEZuTYuOLAiEMURygWUUvN2bJ1OfEgf0maLLbYo5WuSi7Rke3We33LLLUtDsFAm1L3TJ95dZesTVp3sXpOABCQgAQlIQAISkIAEJLCIBOYxth+KA2NJdt7hD8MQxuPVCeuhwpqFP+tbfMYxY8z96quvlp+nJ93Qp8zSsVMMOgkc+gj+mlxXfUJXXQfhsmMPPNgVCP0OTJr0I13liXihg2KXM3Q1VUOneKbtkZ3Lbr755vLx8847b6T7QSdEXLbaaqup6Oz6lpE+DAibT8iRRsSvaljZhh1+kD9IQ/yoGoOlfkzKE0PrrSaFl8o2dPntE5fc8pDGx3MJSEACEpCABCTQhoCGTW0o+YwEJCCBBSSwzMrPBcSpSBKQgAQkIAEJSEACEpCABCQggZkTcGw/c+QGKIGlJ9Bk2LT0ETMCEpCABCQgAQlIQAISaCDgp+gawHhZAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpgfAQ2b5sfekCUgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCCBBgIaNjWA8bIEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkMD8CGjbNj70hS0ACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAINBDZquO5lCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCCBBSKw7777FjvuuGOx4YYbFptssskCSaYoEpCABCQgAQlIQAISmA4BDZumw1VfJSABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkMCgBLbYYouCP50EJCABCUhAAhKQgARWhYCfoluVlDaeEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISWCICGjYtUWIpqgQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABFaFgIZNq5LSxlMCEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAJLREDDpiVKLEWVgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpDAqhDQsGlVUtp4SkACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIYIkIaNi0RImlqBKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACElgVAho2rUpKG08JSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQksEQENm5YosRRVAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACq0JAw6ZVSWnjKQEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggSUioGHTEiWWokpAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSGBVCGjYtCopbTwlIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCSwRAQ0bFqixFJUCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJrAoBDZtWJaWNpwQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABJaIgIZNS5RYiioBCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIIFVIaBh06qktPGUgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpDAEhHQsGmJEktRJSABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQksCoENGxalZQ2nhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACElgiAho2LVFiKaoEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgARWhYCGTauS0sZTAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACS0RAw6YlSixFlYAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJhs2qVAAAgAElEQVSQwKoQ0LBpVVLaeEpAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSGCJCGjYtESJpagSkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJYFQIaNq1KShtPCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJLBEBDZuWKLEUVQISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAqtCQMOmVUlp4ykBCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIIElIrDB888//9clkldRJSABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIIEVIOCOTSuQyEZRAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACy0ZgoxD4bW97W5x6lIAEJCCBJSDw2muvlVJafy9BYimiBCQgAQlIQAISkIAEJCABCUighoBj+xooXpKABCQgAQlIQAISkIAEJCABCSQE3LEpgeGpBCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJLAYBDRsWox0UAoJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIICGgYVMCw1MJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIYDEIaNi0GOmgFBKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpBAQkDDpgSGpxKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpDAYhDQsGkx0kEpJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIIGEgIZNCQxPJSABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIIHFIKBh02Kkg1JIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAgkBDZsSGJ5KQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAotBQMOmxUgHpZCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEEgIaNiUwPJWABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEFoOAhk2LkQ5KIQEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQkkBDRsSmB4KgEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQksBgENmxYjHZRCAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEkgIaNiUwPBUAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACElgMAho2LUY6KIUEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkkBDQsCmB4akEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQksBgENGxajHRQCglIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUggIaBhUwLDUwlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhgMQho2LQY6aAUEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkEBCQMOmBIanEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkMBiENCwaTHSQSkkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggYSAhk0JDE8lIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggcUgoGHTYqSDUkhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACCQENmxIYnkpAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACi0FAw6bFSAelkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQSAho2JTA8lYAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQWg4CGTYuRDkohAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCSQENGxKYHgqAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCSwGAQ2bFiMdlEICEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISSAho2JTA8FQCEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISWAwCGjYtRjoohQQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCSQENCwKYHhqQQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCSwGAQ2WgwxlGKeBF5++eXiz3/+c7HlllsWm2222TxFMWwJSGBFCaxqPfS73/2u4G+jjTYqttlmmxVN/XbRXtU88te//rV49dVXC+K/8cYbF9tuu61tdbss41MdCfzhD38oXnvttWKDDTYo81nH15f68VWO+1In3HosvP2D9ThxM6P2xz/+sXjppZeKN954o+wzbr311sWGG7Zbp2ZfIhO6r3Um8OKLLxbkN/In/dahnO30UCRn48+qjttmQ3dxQpl3uZx3+IuTEnmS9C2nfd/Pk9q3JDBfAtPq5wwZK+vGIWlO9mt94W2dPjmtq0/IrEqk3+/1pSz1o+DbbQkshGETSjqUH0zsvuUtb2kru88NRODrX/968Ze//KU48MADi2OOOWYgX/VGAhKQQHsCq1oP3XzzzcVDDz1UbL755sWXvvSl9sBW8MlFzCO//OUvi+eff77Yc889i7e+9a2Dp8qzzz5bXH311cUrr7yyxu8DDjigOPbYY9dc84cE+hK4//77i1tuuaX05stf/nKxySabjLycdl4fBTSnk3Fxn5NIBrviBOwfrHgGSKLPAiTq5nvuuafUmcQt9Cb/8A//UGyxxRZxqfY4ri/xwQ9+sHj00UeLnXfeudh+++1r31+Fi+t7GzerNMQ4mv467vjjjy/222+/wYK2nR4M5Uw8WsRx26SIr2o90Cfe8y6X8w5/Up5a9Pt9y2nf9xedj/JJoEpgmv2calh9fs+7buzTrvSJ97zenTfvoeJtnd6dpMy6Mxv3Rt+y9Pvf/754+OGHi6222qr4wAc+MC6oqd5bFDmmGskF8Hzuhk2vv/568X//93+lkg7FBwoQnQQkIAEJLBaB3/zmN8VXv/rVsq4+4YQTin333XexBFxSaTDq1S0nAYyyL7300nLHQ1ZpfPSjHx00InSEL7nkkoJwwrGTDnlmhx12iEseJTB1AtPO61OPgAFIYAkJ2D9YwkSbksi33XZbcffdd498Z5cmFiWhsJtk1DSpL3HdddcVTz75ZLkTJAb29DNWzdnGDZfiab2Vng8Xgj4NSeCqq64qfvrTn5aLM/7xH/9xSK+Xzq9VrQdWNd5Ll0EVWAISWAgCad8mPV8I4RZECNuVBUkIxZDAChK46667Cv5wX/ziF0t9yTwwLIoc84j7LMOcu2HTgw8+OFp5+Mgjj5Q7BrFzk04CEpCABBaHAKvFY+DGedUxwXLjjTcW2223XbH33ntXb/tbAmMJ/OIXvygn1g455JCJk3RjPZrhTSb/yPc4Jg6Hdvfee+/IqIkdFQ4++OBy4pHP0LzjHe8YOrjB/Fv2umDZ5R8sIROPhs7r82C8jHVMkgRzOZXZXLAbqATWEPjTn/5U3HfffeU1DJnYrfH9739/8dvf/rZ488031zxb92NSX+InP/lJ+RrhUDev4u7ZQ7dxdengtckEbHMmMxr6iRjTxzH1fx59tTT8WZ+vaj0wKd7zLpfzDn/W+dDwJCABCSw6gUn9g0ntyqLHr04+26I6Kl6bJYFJ5W6WsixLWBhZLoJbFDkWgcXQMmw4tIdd/GOSnE/whCOh2QpdJwEJSEACy0XgV7/6VcHkyWOPPbZcgivtQhDAmp2JO3ZxXBa38cYbF0cddVSx6667FoceeujgYr/wwguln3zijolMjkw4vvOd71zoicdlrwuWXf7BM2JRFEPn9XkwXsY6Zhpp2cVPmXWh5bMSmA4BPkWL0RHuQx/6ULHLLruUuyptueWWxTbbbDMx0El9CYym8fO4445b6L7FxIj2eGDoNq6HKCv9qm3OYiX/PPpq8ySwqvXApHjPu1zOO/x55knDloAEJLCIBCb1Dya1K4sYp0ky2RZNIuT9aROYVO6mHf6y+M9GC7vvvnvBonk2XpiXWxQ55hX/WYU7162R+OYq36fF0fChtGMHJ3f7mFXyG44EJCCBYQg8/vjjw3ikLytHgN2OnnnmmaWM90EHHTQ1uV999dXS77e//e1L9WmYZa8Lll3+aWXIIfP6rBkvcx0zrfSc5K/MJhHyvgRmQyB0JYSWs1vjpL7EzjvvXPC36m7INm7VWebE3zYnh9p035l1X226sWnn+6rWA03xnne5nHf47XKNT0lAAhJYLQJt+gdN7coykrItWsZUW/9kblPu1r9Yd48R8ycf//jHu7848BuLIsfA0Vo47+Zq2BRbn7MLASsQb7jhhnJy8+WXXy7IAHXu5z//ecFWye9973uLTTfdtGAV4nPPPVe8+OKLxeabb17uZLD99tuXn2uZ5vvvec97yjAwxnriiSeKX//61+X27VgFvvvd714TNFvFcx8ZOWd1JVaDPDfps3vEFavM3/zmNwWKSX5vvfXWBXF817vetSac6g+2qXv++efLcPl0DTtksboTtsjftNU8CtRnn322fBf52PZ+p512Kt72trdVg/C3BCSw4gSoV9iWNXZqov5Id96jztlhhx16U2pbF1Lv/exnPyvDo65ld5smR1sTK9nf9773FZtsskn56O9+97syTsTljTfeKOt62inq7En1bl1YMRCiPv7DH/5Q1v/4s+2229Y9vs41GEcbQjtCvUwbgh+0B6mjjaHNwFFvb7HFFunt8hyjYmTCsdvQhhuuu3ljpCHtRVi5V9tfdhGg/UU2/IA3YbbZQSCEQt5bb7119JlDOuu0d+GirY/f6TG3rSIvITN/xIG2jTiSTzGy7uKCCWmZTjgSB/wn3+y4446l4Ta/aVuRmzB5nnxX5U96w5V8iCOtIj34zSdokLMaBvfIH5THyLesUkgd7+A3/QmeIc8jO5wj/6fPx/lTTz1V9gliRy3yFXmPvgR9MVyXuiC4TepLkVY8i6P80R+pc5RjyjNlg50n6lz0xegPkQb0GUkH0oc820V+yjJ5h3QgPeocdRGy429V9rbxT/0dMt+m/rY9D5mreT3eHzqPdPE3nq075tYxwZsyS76PMkueZXv1cY78RTkjn+APzOi3N41txvkV3KMuzK13u5T9tsz6loOcOizSZYj6O7jjZ9ex1lDp0rd/EHGoHtuUx+o71FVwpR2Z1NeId+eRB3LGtzllcui+IMyiHYIv57Q943QCtNNPP/104C7PeQ9HnUS90uRIzzZ9CdKcskhbTj2TuqHyeZf6h/CrdQP6lrZ9qFR+zoN5U9sfz0dcq23cULIgB/1v/CNdGR+RhtU+YFPfPeRMj/Osu0gPyj95mf4U/Zxx+TGVu3oOm5yxQLQH826nq/FZ9t9d+sNt4hp5nDJIvqG/Tn3DGJ18M278gf+RzrzbZdyWU+amXQ/ktM3BmPhMe4yf1n/zKJcRV47zCD+nr5DKHOfVdoO+HvUUeRhdEJzJ/016qur7+EtdO26MH8wIo20fI+Tl2Lecpn5Vz7tyjXIYYx/iwyI4joylaGtgGPMZ9AvRBURfnraV++hZhnY57W6TDNV0nkU+yenrI381TbrOwwWD3PB5P6f+zG0/CI+yNFQ/J+KfO7agPswt2xF2HGFCeuKqOqp4hmOdfq1L/yDyTNqupP5znhOvarnpM0aoylP3e5nbojQ+OeNn3qf+pv2iLHSZHyaduuid+6Zr3/dTVl3brPTduvOcuiv1p0u5i/f61LXhR92xTxuYmwejHm873ou8gM6W+a463W34Sb06bmzBffzD7bbbbrV+cQ/eMSfKnAV16zg5on6Mfk6ujhfdAn0j5neifMb8TKTfZpttVs7bxO/17Tg3wyYa9LA2ZBKKDPLjH/+4zAzs2nT00UfXsr7yyitLA6JPfOIT5eT1T3/603WeQ7mCdV7d6sOh3j/99NPLScdrrrmmHGyHEDTaZOBwfJrppptuWvNM3GNSEDmbJspvvPHG8lN9dHDrHAWU92MQkj5DAfrBD35QNiTp9Tjn3VNOOSV+jo4//OEP13weMG4waMD47PDDD49LHiUgAQkU3/3ud8tBZqBAafn9738/fpaGLmeeeebod85Jl7rwzTffLKjHOFIff/7zn28MEn9REOG++MUvlorV22+/vbjjjjtq62yeYyLic5/7XKPxbDWwJ598sqyL6+rxffbZp7FjFP5Ql1911VXlYCKupccDDzywOPLII0eKHTpewZ/Plx1wwAHp42W8Lr/88tFnTWjLmKhPHR2j8IN6Pwybov08+eSTy8mZME5O36U9IsymNjx9lg7+JZdcUrbpcR3+qSPvMMlTdbltFTyvuOKKkUFb6i8TjB/72Mca2+T02TgPJqTDMcccE5dLQ6RbbrmlZPeRj3ykuPTSS0eGSqOHiqJUzhFmKDaZwMRPJr3CoVSI9ODa2WefXSr0MHYiDAyyTjvttOLiiy9e0+aTV8OwiUEl+T0U4uF3HOk3nXTSSetMatJBRnbKdZ0jvQ877LAynC51QXCb1JdCkRBxr8vPIdP9999fkB+ZHPnyl78cl0fHe+65p7j55psbyzX1BMb15Mlw4+oy/KP/yaDhX/7lX+KVNUfSkHjiqrK3jX94OHS+DX+7HEPmal6fVh7p4m9TPHLrGOpR4ltXb9OuUGY51jm2KadcMnCvOurTI444orbfXn02fgf33Hq3a9nvwqxvOehSh8FjGuWgS/8i0oRj33TBj779g1SeOM8tN137GhHePPJA1/FtTpkcui8Ir646AfIYhvooysJh/BEORRhtf53r0peAD4o4lHD0hVPXN593rX8i7Kgb6H926UPF+3Fs0/ZHXR5xrbZxQ8jCuII/xiaTHHU9erFJbl51FxNI6L/gUnX0JY8//vjq5bG/u7Q5qUeL1E6ncq0P5136823jS/kKhX/6DgslyPMsMqhzue1+bpmbVj2Q2zanTGYxxo/6bx7lMo3rPMLP6SukMqfn0W6g52cMeNlll9WOKfbcc8/ihBNOKCej6t5vM8aP97r2MeK99JhbTlM/quc5XKMcMtdBvRGLFlO/6R98+tOfLnUm6ECYiK46+DHnUbfQr/psm9+57W6T37POJ7l9feSPNMmdh8OP3PBz68/c9mPofk6kf+7YYoiyHTJw7KNf69I/iDwT7UoqA+e58Ypy03eMUJWn7veyt0URJ8pC1/Ez7+bo3Oc19hsqX+S0WcG5esytu6r+dCl3vJtb11bDrf7u0wbm5sGc8V7kBeRnbqC6gKJL2/DII48U6BNwdYvAghG6l5i32H///Uu7kHFyRP2Yq+NlkcjVV1+9Zv4nZKkeMQg/55xzqpfXm9/rbtMwo6g9/PDDI6U/n55jV4MwROIe1nPjHJmASSUMbpgQpNOKHzgmkyj4KIybXN/3CZtKHjmRgZ0X6DCnq7HJZEyU8QyTfzS8KCGZbMRRmC688MLRxHpVVlYlxKQKSrcPfOAD5fuxMoEO/t133119rZyw/cY3vjHK4DxP2HDCgg9Xt3qBwvrQQw+VshIeuxDEZCtxoCNWp5BYRwAvSEACK0OAuo96LeolOg38jj/q5r6uS11I+Oych8NAh45QnaOdiDYCZSoTOhg5MWlEfYdVN/UgRqDcj518UNpj8dzGYbz7ve99b1SPY8yKIS/1MW0CRrzUuU0O+anLsUzHETbtJEqy4E29jTInJr4wAsJvHAOxqiPODNbDhYFx/OaYvlc1euI+gyKMSAin2lYwmU+7RCdukiOtiE/abtLmRN7hWKeIym2rMFS54IILRkZNhEv4xAGHlfy3v/3tciXxJNnb3sco6Tvf+U5p1BTpR7wiD0WHNIwgYBoMYmVBdKCDC/6kDkUexmoMInH0hTDSivaba6wODaMmwiafkLd5Dkd5oM/Cc+GQibQOo6aw9KdvEO/xTPDLqQva9KVCntwjhoEYzlOucfBhpSerOXGxqjNH/tKDHv/axH8e+bZtlKaVR7r62yRvbh2DMR/977oyS71Mnoo6Nw2byV4WMyA/bQbljPYDOXAoSngmx+XWu13Lfi6znDjFO23qsGmVgy79i5A3PeamS9/+QSpDnOeWm5y+RoQ51LFNHqA97Tq+zSmTQ/cFYZSjE4g2N+0j0f+LvsC43XFy+hLj0jI3n3etf6oydO1Dpe+3bfvTd8ad58pCPx9jV4yaSBd0MCwAqO64ytgFY3TGCG3cvOouxhzRx492jrEC/XX6kiwe6OJy25xFbKe7xHuRnx26P0zfBx1i6CTRDUQfnMWu5ClWHFddbrs/rTKHfDn1QG7bXOUxizF+hDnrchnhxnHW4ef0FULWcUf0UORvxhSMP8n7jM9pC3CMA5m3aHJt+ka8m9PHqIaZW06r/qS/+3Kl78GcB3MY9Hno/8ROBJRF2F500UWlURPXKSPodkJvRztJ+zuU69vuNskxi3wyVF8/dx4tN/zc+jO3/SCNhu7n4Gfu2GKIst2U73KuD9U/GCJeOe1x1zivD20RnLqOn+GUq3Of59gPufvki75tVpq/cuuu1I8471LucuvaCGvcMbcNzM2DyJI73muKR9e2AXuVcNiqNDn6c+HSd+Ja0zFHx4JOIZ3/YUyFboG5xpgnJDz6nR/84AeL9emzoHUc57ZjExO6OApo7HBE4jOoRSmCwnfcajUqCSbTsG5LFX5MKNApZ8KBTiyd3zrX9/3I0LGLUZp5CI8CH88wAchKgZj84z6Twtdff3050cYRhVDVD5RbTFTutddea5RfVFTf+ta3SgUZYRx88MFroogVZUxcsyPIhz/84ZFBEwWAyc0mYwNYprtH4DGDiVBSwXZcuqwRxB8SkMB6T4D6BXf++eeXBhDULZ/61KcGjXfXunDfffcdGQzR1tTtiodSnnYAFx2P2267rfyN8gSL5lC6cpG6E6OgOkOb8qWaf7RBMfnNbj6sVgmHsRKKgfi0V1xPjxhjRF1OPc9OH2Hswkob3qet4Q8lLvU9gy/aVK5R1xN+vIPfse1whMPvSMO4FoZNcKhbQQu3SW0Fxk1hYBb+Vo+kC7sNoOwmLjhWLdalV/XdSeHXtVXs2PPHP/6x5MGKcvJJONrka6+9tmyT4T5kHiYNycPsbBSKTAZ8dEax7KdNJ29hMET5iR0Y/t//+3+lATRKOlbHNTnyEH8Y59EnquNHH2O//fYr+xp0eEMO8gcDOPIPkwvIEelGfyyM6lh1cNxxx60RAUMw8kp8ii3yUZe6IPpJTX2pNQFm/KAcxCCDjj0rP9M8TRzCgDxH/gyR1rzSJv7zyrdrBG34Ma080tXfBvHKspBTx1DfjyuzDM4pK+kiAZTSMbZB+U5ZjIUM1Nes1uYZ0jxW8TTJXXc9t97tWvb71Mt1cre51qYOm1Y56Nq/qMYnN1369g+qcvA7t9zk9DXqwu9zrU0e6Dq+zS2TQ/cFaYeiru+iE4idb2jDMNLBffSjH12jT2hintOXaPKL67n5vGv9UydDlz5UvN+l7Y932hxzZKE/iqMvfu65547GFuziEXor7tOXYveOtm4edRf99TCiR4dH+xrtHMbjlNH77ruvbRTK53LbnEVspztFfIEfnkZ/mHEb+lDyTTh2a6D9oX6hTaS+SF1uuz+tMheyda0HctvmCC+OsxjjR1izLJcRZnqcZfi5fYVU3nHn1I3srs1YN3QyTKwxWcduDrRXGD3EeDr1q03fKLePkYYT5znlNN6tHofgip6CvIAeJNoa5oowPEF/Qhg4FoCfeOKJo4UkcGWxGuMvdBzUabHAuypnl999291xYU07nwzV16e+zpmHyw0/t/7MbT+m0c8h3XPGFkOW7XF5r8u9IfoHQ8ara3vcJa48uz60RV3HzymjHJ37vMZ+qdw5+WKINiuVIbfuSv2I8y7lLreujbDGHXPbwD55MGe8Ny4OXdsG2jvqAfIHc2fkrTCejnCQMXaWjOfj3qRjjo6FPiML5HHMaTGHFo65jf/93/8t5y+xMYm8E/fXx+NcdmxiIo/JJFxMKHNOh5QBGy4mB8ofDf9Q7lHRpu6oo44aTRaX0v4AACAASURBVDSQ8WKCNn0mzvu+z+CE8KoGSfjP4Dxc1aiJ62Q+KgUcHW8mVauOwQ2ffquu6KOg7LHHHqN3Y+KcC0xkU4HimHBh+/a0E885xl7Vgli+UBTl8+kuD1xnV4eYvIl0i+c9SkACEpg2ga51IZPK1JM4to6ko1F1YexAXRjGmnRScLybGjVxjbqTNmrcCvk0DDobKFxw1NepURPX8Cf9dFn6Lue0k1GXIx8KsVCGcR8jDYxvYtUabQ6dIlwY9GI8w7eww3E/dmiic4ZDYRZKIX7TnhA2DoOauvaNe7Qt82wruobPREzEnfY3NWoiPvwOheITTzxRu515CSXjH4O76uenSDf6D+H6tq30nfhEXaRr+BtH8g6TpLTnYdTEPa4jW7hUDozAwmEMVXVM0GIslebL6jNtfo/rS7V5f9wz6Wd7Tj311DVGTbxHHNqW6XHh9Lk3Lv7zzLdt4jStPDItf9vEiWdY7du1zEZeo61ggUAo4PGP+jqMFPj9wAMPtBVlzXNd6z1ezin7awKd0Y9xddg0y0HX/kUdjq7p0rd/UCcD13LKTZ++RpMcudfH5YGc8W1umRyyLwiLIXQCuUyHfK9rPifsIeqfnD5UpD0yDNn2d5WFfngoHulTV8cWqSFTGAy1TbN51F1hMIKM6LfSdi6UpzH+ahuP3OcWtZ3Ojc/6/h71R2rURHxZXRw6TfJ/qrfNbfenWeYijbrWAzltc4RVPc5ijF8Ns8vvnHLZxf9Jz+aEH+3FtPrv1NUsUEvHy5QFFtuES+vWuBbHcX0jnhmyj9G1nIaMdcehuDJnk7Y17KYb8yiEi04lNWriGou92KUAh26L+ZYh3BDtbpMc08wnQ/f1u86j9Qk/p/7MbT9Im7QsDtnPyRlbDFm2m/LdPK4PGa+u7fGs4rsobVHO+DlltExjv1TunHwxVJsVcuTUXfFu7rFPXdsmzJw2sG8ezClLTXHJbRvCbiU1YErDwOAp0jueTe9POu9azmLxOf6yEU7q2PE77Dfo+8Qi7vSZ9e18LoZNYcTD5Fqq0GEwke4UwNarTY5tupsm8Bgkh4uJ5fgdx77vk1kOPfTQ8G6dIwUGx+CzScFDZzsmjbFa7uKYjMNh2R8FiN9pBmeyrItDzqadnGJbdMJKw+viv89KQAISGJpAU12IwQWO+iqspyNsjDeijsbQIww9Y/dA7rF7T59OQGpQxO4cdY6wq58Vi+dCPn5XjaLiGRRdYaDDbjt83hRHRz5cqiSmUxlxov0KBVsY/PAORk5Rx4fyNPyK47zbipzwiXu4pvRIjXdSA594L/cYebH6frSrXB/X36m+V/cbhWmX3cRSPzC6oP+Fi/zBeZQHzvn0LjvUDO0m9aX6hhfliAnFpj5j3zD6vD8p/vPMt23iNa08Mi1/28SJZ5rqiLTMVpXkkVYMJFGoVx35j7KGy6lfcuq9qgzV301lv/rcLH6Pq8OCLXI0pc006u+m/kXKIydd+vYP0vDT85xyE3Uk/nTta6RhD3E+Lg/kjG8j33Qtk8FxiL4gXILxtHQCQ7Cf5EdOPp/kZ9v6J6cPFcyHbvu7ypIurKguBoBPuniNfvxQbhp1F5PD7FaIY5xRXVwYsse4JH5P69jUFsyznZ5WXJfdX/JKk44xLVOp3jbqb+LelNZ17f4sylwqc5o2ad5Lx3XRpvBs3/HUtMf4aXxyzpvSKmVT7T/nhNP0Tk74kde69hWaZKheZ0ftOke+iMU1UbfWPTeub8Tz0d717WPklNM6eePaEFwZO9H/qLrUSDJdHJ8+lz7DQr5puzbt7jgZpplPIo8Qft++PmW5SafSNA/XJ/yc+jPyHvFtqhPq2o9p9nMiHrBoq2cObn3L9rh8N497Q8ara3s8q/g25btxbWHk2yHbopzxczBatrFfyM0xJ18MzT/KPPL07fulcRt3HmWLZ/rW9ePCqbvX1Ab2yYOEk1OW6uTjWqTxOH/r2gbsVMJ2I3bhTsOITROqNi7pM03nOeUs5uvwM/qRqf+RFlwbUr+QhrFI5zP/FB2TZjHJzCRctRMfSn86FezaxI5Fda5u0iCeSztaTQOnvu8TRkyGR7hxZMvTGFTXKbHiOVYXoNBiK9qmSQ5WHbGyl3gwQCZT4nc6WA7/OKbxTSvS9Jmm83FMYlcQ3o1dQZr88boEJCCBoQl0rQsxmmXLS+pLtqBOjWij44GMqUU1356lvqWdwgCX5+jE0DHuWp+mdXTaJqVcMCyiDWBL7aoLIyWuj2tHUr9pR1BKISt1Nsyw2g8j12h7MYhiwEQnCKNaLMyjrU0NoZoMm+bdVuSEn/Jke9Yw6kq5p+0wz6fK4/S5rufpxFX6Lp1jDIrIo33bVSbv2jjSm0l14kceJeym8OHMBBVlgX7NJZdcUioXucbKAPJRXzeuL9XXb/pLsTqua/ntG3bb9yfFf575tk0cppVHpuVvmzjxTNcySx0eeY2d9igrdY5yhEvrmrrn6q7l1HupP13KfvrerM7H1WHTLgdd+xcpk5x06ds/SMNPz3PKTcq2a18jDXuI83F5oOv4tk+ZHLIvOKROYAjGuX7k5PM0rD71T9f6eJptf1dZ0GuxSxNlPnZuSrkw5giXKiHj2qTjLOsu8nL0VdOxR1XGnHhU/Wjzu2ta9KkT2sjjM80EmtKKN1Ljg7SeT9umLuO2aZc5ZG6KT9O4LqdtbqI57TF+U7htr3dl09bfts91DX8W9UKTTMSJfheTfkxSUZ+nOveI87i+0ZB9jHFyNpXTkLF6HIprdZfDCCfVQTQ9k7Jkbmko16fdHSfDOP5980lan/bt64/rD6Z9g6b6vGv4OfVnGt8u7cc0+zldxxZDlu1x+W7W94aOV1O5aWqPZxXfrnINVWdW45eWw6760HFlPa1fY2xQDXuWY79q2IvAP6fuqsaj6++07uta17YNq2sb2CcPIlPXtBwXj5RPl7aBxcgYPPGpUubXqMfCdoWyG19aYUerpo0LmuTKKWcsFomvnDG3k7a9hBMbF1APNvWRmuRZxuszN2xiophdhnBYzjcp/7nPZPRhhx1WOwEZmagOOpkOSzkq2Cbr/L7vNxUu5EkLbtrprpOVbVUxbKIwpI4Jkuuvv7549NFHy0nH9N648wibhiZ2YBj3fHpvHJP0Oc8lIAEJzIpAbl1I3YtREu0IxjrUjdFp4PN0OH6nyiKspc8888ziRz/6UWnwE0ZR+EFngU+HsRVmGxcTl7RHdCiaXNMuO1GX8+6499OtuaMdwWgHOTFkwiqdtpA2EQMmHAZL/KZzxoCDFbLBJzpl+Nu0GjsNsyle07ye01YFT+SKOI6TkbQfyuXI2zXsSRNJdG75njT9jS6O7zXTGWZbbpSu5BX6JviFgRMGcU1G3m3CGdeXavP+uGfSNJ9FGoyTpenepPincZh1vm2SuXp9WnlkWv5W5a/73TW/pINkysmk3c1iHFQXdtO13Ho3t+w3yTGt6+PqsGmVg9z+RcogJ1369g/S8KvnXctNsM3pa1TD7vu7TR5oO77tUyaH7AsGX9jk6gT6ch3i/Zx8TrhD1D9d6+OUedd3J7HK8Y8+NwbiGDFdc8015ae3mCTm9z333FMGSb+dXSfaunnUXVFvIeM4DuPutY1fm+e6htOnTmgjj880E2ga6/IGdTrtD/2iVG+bluOu/d9plLk0dl3zHu92bZvT8NLzaY/x07ByznPY5ITT9E7X8GdRL4zL/6m85P90sjji2KZvxLN9+xjj5GwqpyFj9TgU13EyRZjo2mbhhmh3x8k5Lq5D5ZMh+vqpLNX4NM3DRX2eG37X+jPCQ74u7cc0+zldxxZpHPqW7Wo6zfP30PEalx/nGc+ucg1VZ1bjHLzbjp/T97vGId6dx9gvwo5jV9mnxb9r3RXy5x4jvXPr2nHh5raBIVNOHkSermk5Lg4hC890aRt4nl0VMWzCUBq7ltg8gLnFMO5LN00YJ0d6L0fHkm5A8P3vf7/8tDd6BNowbEhizofn+szVpHIu8vnMDZvCqqwNFDr3TA6ws0TVYSXY5BgYR8ZqMu7p+z4VRZNLO9d1u0Kk78XkabqKANkvv/zyUUGjk8sEPUowMj0VAgoyJturjslqXMS/en/c7yZW497xngQkIIFpEehTFyITOy1FPckRIwy254yOa13Hg0HnWWedVT53//33lx0D2hQ+0XbxxReXfoz7DGmwiDZiUl0cdXa8F8doR9q2IfFeHOnEYNhEB5Q44w+W5Tg+gYej83PTTTeV5xg9sc1nbBWadpbKB5J/Ebfk0kxPc9qqlPOHP/zhifK2NWCb6FFRjDVMa/N+m2fS+FWfpx91xRVXjPoFxI1+Ff0JBgp0di+44ILqa6PfhxxySMGnc+nAUyboKJOvmJBj4HrGGWdkrwQYKi+l27GG4CmTSeUw3hnyWCdT1f9J8U/jMOt8W5V13O9p5ZFp+TsuLtyblC7V99N02nHHHYvddtut+sia3zkDzK4yEWDfsr9G6MwfbcoBXqcMq0Gl94YqB337FyFjTrrEO5PqpTTeEV6bY5dy07ev0UaeIfPAJGYhT8oup0wO1RcMvsjVtj+X6gQiPvM+Rp7tIsdQ9U/XsNO0b5tf2sarqyz4yyI9xhCsqEQPVqcLO/LII9dZbdkk07zqrjTu47im+Tw9b4pP7vVUnjZ+pPkip05oE4bP1BMIfWfdXfJS5Kd0fJemV9d2f+gyV5W7a96L97u0zfFO3XGaY/y68Lpcy2XTJYxxz3YNP81n06oXmHdoWsGflo00/6dxTGVMr3M+ZB8jlaUaTlM5rT4Xv1OZ+3Btk55N7Uzal0rPQ8YuR+KfOz/TNpxZ5JMmViHjuDwQz+TMo0U+7RN+l/ozzX9d2o80v0W7FPFOj2k80vP0mbrzLmOLYIY/k8KIdOubz6sytx2/Vd8b93voeKVpNi7cWd/rKleaZ/vUmdV4hr/j8nP1nfjd1CbF/brjvMZ+VVkWhT9ydam7qvHo+jvKV9s6o63/fdrAPnkQ+bqm5bg4hSw806Vt4Hm+5sHcCXNqqWET5zjsNupsV8qbY/7lxA85jjvuuHLBOXObLDznL3Vs4oBh3Sq4mRo2MWEa307ne49h4VYFjZXZt771rfIyBjx1mWPcdwJj8hYPmrbd6vt+Veb0N6sqsKqmI5CuPEqfifO4n67EgFNYD7KbyKc+9al1dl/CUrDOxep/Jh3pdGIEpZOABCSwjAT61IXEl+1W+Y41nzzFkhrDptitift8TqvJ8S5/Rx99dHH33XeXRhx06G677bZy0rppN6PwL9oe2gHq46aJ7GgD4r04skNU7NjHp/Gikxr345i+H/U/99LPqLFrEzLg6DixRSaOdod48HkM2hy2K42B8TjDpvLlJfuXtrEYdg1p+b/oKO64445y0oABzic+8Ylyp65U5jZKC/o0GL7xx4CVzzzSn6Mjze5NH/vYx1IvZ36eloMIPC0PdffjuT7HcQqkIcJcpnw7rTwyLX/7pHv13TSdqFMxBFwEN0TZbxOPZSwHffsXbbg0PdO3f9Dkb3q9bbnp29eIMKedB6I+bzu+HapM9u0LIgdpkasTCL7LeJxV/VNlE3mF60O0w1X/u/6mv8mOr9/97nfLV2OigHqASS70YdUt5MeFMa+6K3a9RbZU11aVNWU+rl6ovjft30PVCdOWc330f5zelXuRT6JthEGaXl3HbUOXuSHTpG3bPC5Mx/jj6HS7l+azafXfyeNpOKmEUV8yRs9ZtY+/Q/UxcsppGpf0PI3vtLim4U37fBbt7jTzyVB9fTiPyydp3yCtz4cKv239mea/Lu3HrPo5bcYWQ5bt3PIR9VPu+3XvLUK86uSa97U0zw5ZZ8aYqO34uS+HeY39+so9Lf4hV9u6K57PPQ5V11bD79MGzjoPVmVPf6fp3KVtwA/6aWyMQB5nHoQ/5tZYvITbc889xy7UTOUY4pyvZ7B5A+EjG0Zb2H/Am/k+bG5yjKaGkG3Wfvz/2/vMKNR0hRo7aWDRVvdHQ4+VKo5tuus6T6x6iwnYqvjsUhEu7ZzENY5930/9qp6TqeJ7lsgfg/XqcxSE2AotCjvPUGmEO/jgg9cxauIeE/V1Lo1vfHao7jmvSUACEpgGgaZ6OSesPnVhhEeDj8MAA/8wFsKxa0064C4v1vxjhR0TErFLE/U57cckl9bFYahafYedoF555ZXq5fJ3OsnBrjhNLq3n03aE8OM3hk20RTgMllIjq/j0Bc9gsIKjDUuVpuXFGf0LA6yhg0s7seN4Dh3uIvgXnW36Vnx+sOqa+hPV5+I3eYhdzcLYLvyP+3Ecoi5I82qqLIswOBIOxnlVR8c+jLtJ86a+WPW9+D1O/pCLyeqm59rUExFW03FZ8+208khbf5t4cn0adQzKCsYzOOpR6vZFcFE2+5b9JmbLXA6G6F/kpnHf/kHXcMeVm759jVnlgZRZ2u9pYjF0mcztC/bVCTTFbxmuD1X/dI1r37a/a3iTnmdxwqWXXlo+hhHTeeedV/6dc845xcknn9zJqAlP5lV30eeL8t40rkG+rn3KOn5NbU7ds22vDV0ntA13fXiuqZ/bNm7j9K4x9sSvtJ7v0/8dusy1jWfX58a1zeP8mtcYfxrlclw8q/emEf4s6oVnnnmmGpXyN2OFJ554ojxnDJEzATVkHyOnnNZG7G+fxVvEcVGTvJOuz6LdnWY+6dvXT/mMyydN83BDhh+yjKs/c9uPWfZziMe4scWQZTuYxTH6cvzuql8LP+LYtX8wzXiFTNM+LlNblPar2oyf+7Kb19ivr9yz6AuEjOPqrnhm0rGp3E2jrkWWPm3grPPgOHa5bUP4mW6MwGYzMbfI/bqvwcR70zjecsstpVETRvFf+MIXin/7t38r/umf/qmcp8GOJKdPOQ05Z+HnzAybqPwj0TFaSjNUXURjMpodMh5++OF1HmE3otRQKh7g+n333Vf+xGKt6XMyfd+P8JqOTCLgMFyqk5MJtltvvXX0etNnK+KTSaMH//YtyKeeeiq9NDqnkqSzgLvrrrvKFaKjm55IQAISmBKBMHKg0zONzn7XujCiieV0DN7YWSYMZbt2PNKdA9ts5ZoaBrHjU907tA0oX+scndK0Lq9jysAhBijbb7/9Oiv9aA9wKI0xpMVhmZ66MGzC/3vvvbe8RdhhEJI+O63zyDv4nyq4hwyP9ItV8rS9TYP4IcNcFL8iH9EfqcuHdIq7OgZ/0c8J/8OPSM8h6gIUPlF+mybSHnjggcZyFLuTEXd2AG3j2sgfRoP4V5dnGWxGeWoTZtMzffItclH38BdG9E3hTOP6tPLIOH+b4hFpyv269Gp6r8v1qEvZdZaVPIvgomzmlP02zJahHLRJh9z+RRu/657p2z+o83PStaZy07evMas8kDO+nUaZ7NoXJF2iraQc9tEJTErjRbvfp/7pG5ectr9vmE3vo7MJY9d99tmn6bGs6/OquzBeqmtLiWfo4bpGqE2b09XP6vPTqBOqYaxPvyNN+vbnm/Su5JfoK1f1tn36v9Msc0Onb1PbPCmcWY3xIw8gT12ZnyRn3/uzCH/a9QKfca+bhOT6G2+8USKKNiuH11B9jJxyOk7eaXMdF/ake33GyNNqd6eZT/r29VOeTfmE69H+V+vzIcNPZWmqP/u0HzFGm0Y/J5U9PW8aWwxVttOwOO+rX8OPqJtz+gfTilc1nnW/WZQY+rH4hFTdc9VrEV+uT6stnEadmTN+rsa9y+95jv26yFn37DT414XDtaa6q+n5uB75sKncTauujfA5dm0DZ50HU1mr533aBvzCjmWHHXYovcWQN76kBfd3vOMd1eCm+js2LmAekF3eVtnN7FN0fP4nJmbbKHWYfL3uuutKwxyUgHWfrbvhhhvKySwmrtlyGOvxa6+9tmBSAcfEdWodWE3ovu9X/Ut/YyFHRnvppZeKH/3oR+VW6MiJNR3XmFiNFRoU9Bic4kdaIBjs8w4dLDqLGIfxKaQmR4bGKIyJPnYw4JN+7DbCVudM6D/33HOlVR/hIY9OAhKQwBAEmNxi1x+UlHymim8Js1KLeovBU47rUxdGeHQad99993Iy6emnny4vc61q4MONb3/726XMWGKz6x7tClvwYkAUE9UYx0RnJsKoO/IJPDrHGB6xAovV2tTF1NEY1TCQuv322+teLa9hzMF3c2k/oi7nO8B0mmhLaT9ow8Idc8wxcTo6Us+jJImdalAyVHfsYWBJPJEplG5pezTybIon6cQoXOicoeDD6AsDK+Tu69idi3aZthcl4te//vXiiCOOKHeHJH/SPmL8RXoR7hlnnNE3yIV5nzxHHiaOGPfRR4AHCpubbrqpLLd1wpLH+FYz5YF8QzqRFvS1GNDHoD52qAw/hq4LyPOUXcK95ppryt3TyLNMErP9KkbcTY40ZsBBvURZ4h0MyclXxJ8+EeWLT/TFQLyN/MgUjr5qKPAIB9aUzSGM5/rkW+os6mQcaTSuPxxx6XqcVh7J9bdJ/lnUMZHXqD+o26lP+CQd5Y98QVuCcR51DG1BqsRskrvv9dyyT7htmC1DOWhiOET/osnvSdf79g+a/M8pN337GrPKA+TlruPb3DI5ZF+QtOqjE2hK62W43qf+6Ru/SPsubX/fMJveTz8vRN6i/MdOFrxDf4ZrjEvarK6cZ9112GGHjRZUXH755eU4hf46ctNHo++T++mSNm1OE+O21yNfLFI73Vb2eTzXpj/cVq5U70qZoI/EtVh4U9Xb9un/Dl3m2sax6bmctrnJr7g+qzH+LMplxKnuOIvwp10vUCeik0ePw3iMiXXGr7HImTEkerNcN2Qfo2s5HSfztLmOC3vSva5j5Fm0u9PMJ337+lWeaT6hDzNpHq5P+Dn1Z5/2Y1r9nJyxxZBlu5qGffRr+NWnfzDNeFXjWf2Nno65Chw6/bZzosvaFuWMn6vMuvye59ivi5x1zw7dZuXUXXVypdcmlbs+dW0aTvW8Txs46zxYlT393adtCH+wZ2F+D7uOcG1sXOLZoY6MdZABA6tvfOMbpdFV6BGYs8QIi7ECtiDru5uZYVOslGdCuWl3ohQ2CUEjw6Qsn+phUmunnXYaPYKlIkoJjHzqDH0oeHRKmlzf95v8jetMmn3qU58qLrzwwnJyi0mOukls5GTyOnVkPjoaNLrE/bLLLktvl+c0wk3blR5++OHlu7zPhF3d++mAfx3PvSABCUigIwE+L4qSBodhJX8YCtCg8rmFHNe3LowwmQxLV8nTBsXuPfEMR4ywqFf/P/bO9Nt+okrYQXEAR8ARR0RBUBlUVEQUQQZFREAau9W2XS5t/yI/9Ide3ctWl622aKuogDigMgkIIogjKDiAOM+o73rS7vPWLzfJSVWSM9z71Fr3JiepYddT885OJd1GOb3PORPedGHTvJ/+PvHEE+uFPsa2qSFI+IEPCi6UAW0OphhHMHYwabn44ot3eCMOxjqMgZqOMRNlWezSww6GbTsxYbRCeYWD+yodE0we8jP5R6mTjllnnnlmbZg2hTwYSDMu8lky5g8YurS5ZTtKtoXZ5GsoS3kAhYs3lFJ5UUgxCcboJ3UY0PFGBorXUL6m9zlnLtWca03dF5x00km1QhgDPdpx2paRgTrOQ8G2dkTdOvnkk+uHJzzgxAiqzRCKNhILgSHy07Z4mIcBO200PjOT8sFoEMOpsa603mK4haPNx+edx8rSDD9XHSmNtylf/F5FH0NbeNWrXlVddtlldf+CARN/bY6xZhWutO0j2xBm29AOujhPNb/oin/Z9bHzg7b4S9vNmLnGKutA7vq2tE1OPRccoxNoK+dtuTam/xmbx5Kxf2yaXeHR9WBAj1E9f127T6Kbwah+2Rx0nX0Xcy3mJMyjeBni8ssv35Ht0GHtuLHkwpAxZ0kUS2+X9glLI96lHobMh4dkPfSWuXrb0vnv1G1uSB77/JSOzX1xrmqNv4p22ZfPVaQ/d7+A3ggDvo985CM7sooeh5cdyGepm2qOUdpOu+Sem2tXukOu566RVzHuzl1Pxsz1U6aUa8lzuNL0S/vP0vFjrnlOydpiqradll+cj9GvEceY+cGc+Yr8dR2j7XM/dujp8pte3+axKHf9nOY793yda79cWZv+px6zSvuuplzp7yHtrrSvTdNpno8dA1dZB5uyN3+Xjg0RD88Sefmb8sXxDIGNFFbteCGKZ4w8I6FfS/u2kAUjzuOPP76iv9/Nbvw2CAPo8NCHh4m4I444ovWBcls0qdVb8+EAjfWss87aofzBcIo3fi688ML6Dbi2eLlWGp4HaLg4dsXPdQa/c889t97pgEVL6niQeOyxx1YXXXTRjofkxM3uAW07ijDhPeWUU6rXve51tdEA8TbjRnn2hje8YbGrQZoufHi4nT4Ej7zEMfUf5/HAry298ONRAhLYvQSiDyCHbX0FD/FPO+20fQxnGGTb/LZRCn9xjHTG9IWRDrJhKR6u6zN07K4RisLwG0f6XoxQ6beHOtKkj6cvx3o+HP0oltOvfe1rF0Yhab7DH0cmgUxEmsaolAcPD84///y6r0/DxDn9PXkP17V4S6+z0EzHhwjLMWSMY3ovzqOe5I4Vp556ausOJmlacR7HSDM99qXPvbPPPrs6/fTT6/rQHDuJB6Y5ZRyyxDFkid/LOIS8cYzwHCOOtnvp/WVpUL60zXSHAMJTPzBqY74Qk/FIk/sY3TEPY77SdPhjPkf9az6EG9IXRDpxbMaf/qZMmPM03zYgLMon2tEJJ5xQB2ljxXyPOSEK2+Z92ihG9KkcQ+QnsTPOOKOuK804mYPB7bzzzqvlw28af/q7eb3OROMf8efWW4zUeCMYRxkPSQe/4a+tTsW9OOJ/rjpSGm+d4Y5/y/qYyFdb3tMoo7zjmN7D2I1vnNOe6EubjmvsgJb2y00/zd8hVxyb9/kdsjRlL237kcYyZviboh005Y7002NJO0jDN8/h864YCAAAIABJREFUOWZ+EeURx2b8/O4qF+5NMT9opjmm3YyZa6yqDuSub+FT0ianngsiR6lOgLBRjzjvq2/cb3MRJo0n9dd3P+7FMQ0X5xFvsx2P6X8ivWackWYcI+04xnWOuWN/pBnHiCt+l8iCwfV73/vexeeGqMMY8sOGsRmj4xgrMOz/zGc+E8l2HpFnnX0XD+F56aC5CyQPBBjfmPvQF+HayqUzY1VVLRtzxpRFpFvSJ0TY3XiMMgq2aR6HzofTMOl5xEl9LdHbIlvu/HdsmwuZ4xj5id8l/cCYsTnSbx5XucZfRbts5i/9vYr05+wXWGfzIIwySx3zQF6EPu6449LL9fnQ+hYBx8wxIq3Sdhrh4xgycSzlGnHFMY2T8/R6ep76i76Na+l5yRqZNMaMu6lcXeerqCdj5vohd+lzNMKXpF/af5aMH5HHOeY5pWuLKdp227g1Vr82ZH4QbTOOwZfjXPlK04h2H0fupS9Ctj1vTcM3z7d1LMpdP0d5xbHJgd/BtFm31rn2C3mbMjXlD9njmN6fcswq7btSeZrnQ9odYUr62mZa6W/YjhkDS+tgaVn21QXKPXdtkbLguV7ad3Aea/nUH+d9csS9ODbD8jvqaJMDL+jztTIc9+jPaXv8YYSWPjfhxfb4bF1bGrvh2n733HPP38gIA8s2uHe/+9317hMsAOLTOzy8YUcMduDg4XOfGxu+L+6+e1jzxSSaRQzKnyGOcOzaxG4CvH2UPhwfEh4/WIejLKPBkLZOAhLYHQTis5ub1H/TV9HX8dkrBniMHmJAHkN9TF+IgdV//Md/1DurIM+b3/zmXlEYU+h3SZM8YFQ0tM/uihgZiJP+mIlGbl9OePpx/oJr3ySoS45Nv84bYOwSRH6p121GNVPlgR18YnylPDD8aSodp0prE+KJOkS/QZ1uPpTqkxFO7DSAo0z4W9au5+gLaD/IgqMdte28Vt/s+BftENmoX33lPVR+4qTPo23CdO7+eEi95ZOOl156aU0BozAWOHO7uepISbx9eV1lH8OLHYyFOPoXFvXr6LfHtH1kH8JsE9tBXz1I742ZX6TxlJ5Hv1Q6P2hLt7TdRF0pmWusug6UrG9z2uQcc0HKivpWohNoK+dtuBZ1qmTuMVX+oo0NGfunTPN973tfvXs2cw0eYPPiAArI1CETW8jHlvbvfOc7e+cmadh19120QeRmfFumg0vlXnY+ZMxZFsfQ+zl9wtA4x/jb7Wt7+lV2rympM8vmv7TzudvcmLIlbOnYPDbdKcKvsl22ybvK9Mf2C3zq7KqrrqqzkfbpfE2BPp/1Yq4uqI1J27Up5hhj2mmbTHFtLNeIZ8xx7Bp5ynF3XfUk5mU5c/0pn6OVpE+Zj+k/l40fXXVq6nnOmLXFFG27LZ/kEba4XP3aUH1ZW7pxba58Rfzp8T3veU+ta2Y+jjFhidumsagtfyXr57Z4+q5FG1/n2q9PvqH3phqzxvRdbbIObXdRDjl9fVt66bUpxsBV1MFU5r7z0rGhL84576VzGAyNMWJDx9x0t99+++KFqd2+a9PKPkXXhDzlb5RFqUVabtxjww9Jj4VLiYyEi7fehqTT5oeH4PzpJCABCcxNgIe2GA81d3EZm+6YvpAd/5iU4rp2a0rlY0zA6nlKx4OMMYalhMdgYm6jiSnzXBIXBmRjjciGpothTsm4PDT+TfM3pg6VtOk5+gLmMjm73TTLIKcdDpWfOHmgN+VDvabc6e8h9TY+VYxMqzBqQr656khJvCmv5vkq+5gwAmzKsOrfY9o+sg5htontYCjnMfOLoWn0+cvpl/riSe+VtpsxdWXVdaBkfZvTJueYC1JGpTqBtHy36XxMnZoqn3O0sWWyYaTPQ2wcO1yya2SbY67B/XgIjhE5dW+IW3ffRRvsytcQ+bv8DBlzusLmXs/pE3Lj3i3+h86Hh+SXul1aZ5bNf1fR5obksc9P6djcF+eq7q2yXbblaZXpz9UvjNEFtTFpuzbFHGNMO22TKa7NxTXiH3Icu0Zexbg7dz2Zal5GPSnRpZWmP6b/XDZ+dNWdqec5MCvVM0/RttvyOUa/NsX8YK58NfPK/Jp5Ag6DgFK37WNRyfo5l1VpG89NZ27/U41ZY/qutjwObXdzlMMUY+Aq6mAbt7ZrpWNDW1yruHbHHXfUyVC2fLWizagJD3xBgE/GY7gVL9quQr51pLGST9GtI2OmKQEJSEACEuCtmC9+8Ys1CHZ3ec5zniMUCUhAAruaQChtxyhtdjUgMycBCUhAAhKYkQCKxHB9hs+8TXv33XfXXlFSNj89HXF4lIAE+gnY5vr5eFcCEqgq18jWAgnsTQLR9jFM4qG/TgISkMC2EYi1Ds82Mbzrcj/+8Y9roybu53ypoyu+Tb6+K3Zs2mTAyiYBCUhAAqslwPaYWF6zeLn++uvrT0QhAQ/5WcjoJCABCexmAieddFL9+TC+E6+TgAQkIAEJSGC1BA4++OB6dy7WJKxF2NXgKU95yj6forvrrrvqe3feeWct3POf//yln/ldbS5MTQLbQ8A2tz1lpaQSWBcB18jrIm+6ElgvAXZ9P+OMM+ovIPCsQCcBCUhg2wjQj33nO9+p0C9cccUV9afo+Lx3OHam4zN0V199dX2JHZ12++YOGjZF6XuUgAQkIIGtJ8Cbz//2b/9WcUwdDxT4/qxOAhKQwG4nsKrPz+12juZPAhKQgAQkUEKA3Zd4gPq5z32uQsn4sY99rP7EHMrH+++/v74Wb10SP+P2S17ykpKkDCMBCVRVbTRom7MqSEACfQRcI/fR8Z4Edi8Bdjfh0886CUhAAttKACOl2267rbrvvvuqW265pfrGN75R79zEDk5/+MMf6r/IG58sPOuss3b9btAaNkWJe5SABCQggV1BoGnUdPjhh1cvf/nL6zend0UGzYQEJCABCUhAAhKQgAQksLEE2CmWByk33HBD/bk5Po/NXziMn574xCfWb1I+85nP3Gc3p/DjUQISGE7ANjeclT4lIAEJSEACEpCABCQgge0g8JCHPKR6/etfX1133XW1gRN6hd/85jf7CM8uTUceeWStXzjooIP2ubcbf+x3zz331NtaPOIRj9iK/P3kJz+pvxPINwIf/vCHZ8s8Nnx2ggaQgAQkMBOBX//613XM29J/z4RhR7S8GR1sHvWoR1UM/joJSEACEpCABCQgAQlIQAKrJsAuTb/97W+r3/3ud/WLFuzchOIR4yadBIJArF9d2weR8qNtrpydIccRoJ//xS9+UffvGK/qJNBGYJvqic/R2krQaxKQgAQkIIH1EWDdGIZN6BZ4oYrdm/aS2zrDpr1UOOZVAhKQQB8BlZ99dLwnAQlIQAISkIAEJCABCUhAAhLYfAKu7Te/jJRQAhKQgAQkIAEJSEACEpCABNZL4AHrTd7UJSABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJ7CSgYdNOJl6RgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABNZMQMOmNReAyUtAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACOwlo2LSTiVckIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggTUT0LBpzQVg8hKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpDATgIaNu1k4hUJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIYM0ENGxacwGYvAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCSwk4CGTTuZeEUCEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISWDMBDZvWXAAmLwEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQnsJKBh004mXpGABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAE1kxAw6Y1F4DJS0ACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAI7CWjYtJOJVyQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCCBNRPQsGnNBWDyEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkMBOAho27WTiFQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhgzQQ0bFpzAZi8BCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJLCTgIZNO5l4RQISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJYMwENm9ZcACYvAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCewkoGHTTiZekYAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgATWTEDDpjUXgMlLQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAjsJaNi0k4lXJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIIE1E9Cwac0FYPISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQwE4CGjbtZOIVCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSGDNBDRsWnMBmLwEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQksJPA/jsveUUCEpCABCQgAQnsS+B3v/tdxd/+++9fPfrRj973pr8kIIGtIfCnP/2puu+++6rf//73dVt+1KMeVT3gAePedfjjH/9Y/frXv67222+/6pBDDtkYFj//+c+rv/zlL9XDH/7w6qEPfejGyKUgEpCABCQgAQlIYNMJOI+qqk2d42563VG+vUdg29rKbtRvzZknx4O916a3Icc/+9nPqr/97W8VOq0HPehB2yCyMkpAAhKQwAQENGyaAKJRSEACEpDAegn84Ac/qO65557qyCOPrB72sIeNEmbKuEYJsmGBv/KVr1S33nprdcABB1Rvf/vbN0w6xZGABJYRwMDnqquuqm688cZa+RP+H/jAB1ZvfetbqwMPPDAuZR9vvvnmOm4CvvOd76we/OAHZ8cxR4D3v//91V//+tfquOOOq172spfNkcSkcf7hD3+obrvttuqRj3xk9YxnPGPSuI1MAhKQgAQkIAEJ5BDYtnlUTt6G+l33HFfdxNCS2k5/u2nuv+62klsDdqN+a848OR7k1bAp2/aUceXlYrN982Id9RJ3yimnVM997nM3W2Clk4AEJCCByQho2DQZSiOSgAQkIIF1EGD3kY9//OP1rhy8RXTaaacVizFlXMVCbGhA3oLRSUAC20vgmmuuqW644YZFBtilCaMfjGjGGDUtIvRkNIHrr7++4g/3z//8z3XZjI7UCCQgAQlIQAISkIAEto6AuomtK7JsgZ37ZyObLMBu1G/txjxNVuArjmjKtj1lXCvGMGtyaX1Pz2dN1MglIAEJSGAjCGjYtBHFoBASkIAEJNBFgAfvX/rSl6rHPOYx1VFHHbXDG58+wg+ON1nGuCnjGiNHM+wyBk3//pbA3ASsk3MTnjb+P//5z9VNN91UR4oh08knn1w9/elPr377299W999//9LEvv/971d33nln9cIXvlAjqKW0pvHAwyydBCQgAQlIQAISmIOAc/k5qObFuawMNlU3kZfL7fK9rEzmzI1z/znpGncfAdf6fXTa7+Uwm7JtTxlXe86GX81hMDxWfUqgnIB1spydISWwbQQesG0CK68EJCABCewtAnfffXf1ta99rfr2t7/dmnG+o/3Sl760Ovzww6sTTjih1c/Qi1PGNTTNIf6WMRgSh34kMCUB6+SUNOeP6xe/+EWFcRPu+c9/fnXYYYdVPCx5+MMfXj360Y9eKgBvCWIY9Zvf/GapXz2UE8B491nPelZtQIYxr04CEpCABCQgAQnMQcC5/BxU8+JcVgabqpvIy+V2+V5WJlPnxrn/1ESNr4SAa/18asuYTdm2p4wrP6fdIZYx6A7pHQnMQ8A6OQ9XY5XAJhJwx6ZNLBVlkoAEJCCBBYHvfe97i/Ouk+OPP77rVvb1KePKTrwjwBAGHUG9LIFZCFgnZ8E6W6S//vWvF3EffPDBi/MhJ+yE96Mf/WiIV/2MJHDQQQdVZ5555shYDC4BCUhAAhKQgAT6CTiX7+ezirtDymATdROrYLOuNIaUyZSyOfefkqZxlRBwrZ9PbQizKdv2lHHl57Y9xBAG7SG9KoF5CFgn5+FqrBLYVAIaNm1qySiXBCQggQ0k8Je//KXiLbZf/vKX1a9+9auK34961KOqJzzhCdXjHve4Vom/+93v1v6e+tSnVg95yEMqdg75yU9+Uv30pz+tHvCAB9S7hTzpSU/asWsI38hmG9HYqYkH89/61rcWabDTyBOf+MT6d6RxyCGHVF0P7dlW/J577ql+9rOfVffdd19F/MTBIvEpT3lK9cAHPnBpXJFO5OXee++t80KcBxxwQPXYxz62ZvHQhz50IWfzJIdhDoM0HVjBmPySHlwoI/La52IhQLg//vGP9ef/KFfClzjqCeX8sIc9rDr00EPrKGBFuf7+97+v4MSnrVKHvIThj7ryiEc8opaDsuat1XD4ozxw5Ktvd5Moc/yyU83++///6c/Q9CLdZp7YBQdZf/zjH1dwR17q4NOe9rS6fke4OMKWfJEXPgXW5qir5I3yf/zjH1/x6bA2V1rObXFx7Yc//GFdZ2JXngMPPLBu37QP2i4up05GeyE8ZQ2rO+64o+ZFHtmZhvylLrc8IizhxvZN1BMMeDhSp2gz1P3oG5CZNh/pUNbcp6y73O9+97u6vlNWUedpD+S7q8/siiuu8/k46hxycs6OS9R/4kzrdvgn3bvuuit+1ueEw5EH8tnl8Hf11VfX5Y4flP20gXDRF8bvOEY50i6oT9EuqAvsFNXnpq7XpMVYg6Pvh93Pf/7zuk7TZ8PtwQ9+8A6RyEP0MfjpaofUCeKDPf1L0+XUgehfYMQuhCmraE/BfOhY2pQnymZZH9sMN6R/SMPk5DsN57kEJCABCUhAAvMRyJnLN6VgjsbcjvUM8x7mRqzjmef1udK5R1+cufMS4iLvMYdmHk0emEMzJ0enkePGzBNzyiDmf6w5uvQcJfmKOWes03PXtDms2vzGeoa5OfUKXQr1CJ1B226yJXmMdIfUlZwyyYk3/HYdoxymmvun9XKMjmQM7zSvtLdYOz7zmc/cZ22T+iO90PvRr7D2Sl3p+nBq/VbIBOfQCcytF4004zhlnkrX+siySeMBdQz9J2WB7oO1PX0m6+a2dX60u5L+byizSKOtbUdZchzSF/bFFfciL9QPxmnaHjpdOKDz4K/PEc9QhkMZpOmNmQeQF+YdjNuMFfQPfTqsNN228xhXc/SUQ/ugdfV5kacSXVE6bozRe8F6TDm3ldVQnVJOnQxWc5R/Mw857YqwzfZMG0ZHzR/jJPWeMqK9h4MR4xHtl/6GORT1gOddXW7IvKgrrNclsCkE/v+TvU2RSDkkIAEJSGAjCXzpS1+qbr311oqFUpvjISw7TcQD5PDzqU99qsIg4Kyzzqp+8IMfVLfcckvcWhwJc+yxx1YnnXTS4tpHP/rR2tAiLqD0+vSnPx0/ayXqeeedV/+ONI477rjqZS972cJPnDA5/MxnPlNP9OJaekT2V7/61fWlvrji3mte85rqO9/5TvXNb34zjaY+Z6EFhyc/+ck77uUyzGEQibH16lVXXVUzj2tx5BNUL3nJS3aUEffvvPPOmlFb+R599NGdSqiIu+2IIRqyYJT0ute9rrr44ov3KQMm2qlhE+V0ySWX1MYjzfiYnJ9xxhkLYxCUr5deemmdTyb2F154YTPI4vfnP//5eqLPJP9tb3vbwvgjJ72ILPKEEvzUU0+tPv7xj1csJJoORSLyNhUIN954Y11vMBR6xzve0QxW/0YZQ13DnXzyyXXbaHosLedmPPxGAUQ+aGNtjvb5ohe9qC6rnDoZ7eXcc8+tGX32s5+tF7qRBkoWyi5cSXkQNrddRXohH+0VRSptuuko5/PPP79WkFF/UWg0HfWb/gNDsNRde+211XXXXbdPntP71P83vvGNtdFXer3vnM9yfvnLX26Nkwcy5CU1mCKP5ItFcDgMlcKx4KVttjkWux/72Mf26UvIU+rog3mglTqUOaTb1pdQ5rQLjm1uynrdjB+ZQmGe3qPcGJ/C+DLuoRyJMaerHeL35ptvrsc1lKbvfOc7I3h9zK0D0b8QmLhSRWzU19yxNBWopI3l9A+RVm6+I5xHCUhAAhKQgATmJZAzl08lufzyy2tdQHqNc14AYI354he/uHmr/l0y92iN6O8XS+YlBEUO1o488G1z6BFOPPHExQsNbX7Sa2PmiTllEPO/Pj1HSb5izlm6pk1Z5J6zHv7KV77Sup4hrn/8x3/cZ61QWnY5dSWnTHLiXcYmygF/U8z9p9KRlNSptrzefvvtFeWNQ//B2rPN8RJOrLue97zn7aMjKF0fzqHfQvaxuocxa7kp81S61ofBpowHPMinPHio3+bQzZ5++uk76l20u9z+L4dZpIFczbYdsg7tC/viinvogNBZfOITn2jVwxx55JHVK1/5yoUuNGTIZZjDINIonQfQn6FDJI9NR9mecsopzcuDfse4OlRPmdMHravPizyV9C9j5jMp8NJyTuNIz4fqlHjRMEdvGazmKP+QP7ddRbhoz/RN0Z7/9Kc/xe3F8VWvelX17Gc/u55LffWrX11cjxNepObZ2HOe85y4VB+nnL/sE7E/JLAGAho2rQG6SUpAAhLYRgJYiMeDah5K8xD9/vvvr3f/wCqfh+c33HBD9YIXvKA1exgWYeCEkQRGH7yRxwSaNy+4TlgWY+ziguONRPyi5CB+HvCmb2WkD+9bE/z7RSa5H/7wh+vdYriE8pX0MXJhlw3y0LfjSlvcMREmLuTkbU8miOQHoxQUY+ecc86OBXQuw1wGLPq+8Y1v1CIzkYURBg0wYDLMggwjHCbBqWMXlk9+8pML4wfKlrQx4sDYJeJMw+ScEw/xM7nH8XYB8lEO4UjnQx/6UC0n17iHP3jyZg67k1COGIJwjx2A2B2Feke83G97u5NyCUUH5RzGJ7nphZxxhOlHPvKRul6xqKZNUF8x6qCdULcuu+yy6qKLLmo1JIt4So6l5dyWFm2PthlGTXDFGIu6DVP+8BOGKLl1kjQxAGSBTzzES/2C0ZjyT/OS267SsJyTf9pJvLVNX0Od4u0YyhmDJto2fyhkWWTSf+AHZQvpY8CHoVs4diULAyL8wo36SX2mzyMc9QbeQx316bbbbqu9U9eIk/pM2bErEooE2hCGl7EbGPHzJhJtkDqJo1+IdNM+tSkHHDDQTMNSN5A7XLSn+M0RIzn61bZ2QVtGUU67gEvqpqzXabyc0/fhov+n/4EZeaNPpIzps2E1lZujDiBb7lga+Snp83L7B9KaK9+RD48SkIAEJCABCZQTKJnLh2FC2zqedToPn1grsCNL6krmHmn45nnJvIQ4mH8yR2b+jYs5Kutj7pEH8sjcnhcamnPUphxjf5eUQVuaU+Rr1Wta1gHpy2Gs90MvxLyc81h3kufSPObWlaFlkhtvW7nlXsuZ+7PGG6MjKeXdlaejjjpqYdjEOrbLsCmtE4QJV7o+nFO/NYXugXrU1p9yvakXDRZT56l0rb8p4wFc0NeEro+6T9/BkXqMHgvdCzqUN73pTYsdyIMnx9z+r5RZmmac5/aFEa7riB4SnQbjGf0qO5+hk4EF9Yo2hm70ggsu2CeKXIa5DMbMA8gP4zIu9Nu0G/KEDoeXYse4IXrK3D5oXX1ecMgZLyLMFMcx5dyWfo5OKbdORnpzlH/EnduuIlwc6Zsw1qI905bRnVPn0SXjqJcYQfFFBBxzGPyhE0bvy3z3C1/4Qq3PRf+OW8f8pU7YfxKYiYCGTTOBNVoJSEACu40AO+uwqMAqPCZG5JFFxQc/+MF60YSyosuwiUkUk7HmLjYYpsSChEV8GDa9/OUvrxG+733vqx/csysKD55zHW/whBKTnYeIFwMGHAs9FsLEnePIC4tm3oZIjTPYSYUH6BhJYOjQVNzkMsxhwEI2DJAwVkC22HoUgwze3MEPZdR8Cw5ZY0cXrPp5IzQcb7ViyBWfJ4vrOUfC8sdEG7najNJ4axPlMopk3rxJ3yxgl68rrriintRfeeWVi3rAopH6g2NR0vamMNfDpUqykvQinjhSryhTdjNigY1jAYMRFwZ5tA3eqgsjkwg35jimnNvSZRe1eHOZevGKV7xiH28ohHgrK/KQUycjojDGibe5MS5pujHlkduummlT96mTGARFm0EJhiKFMoQ57hnPeEZtFMjCGYdiCGM72he72aV9yzXXXFP7oa9BkYaSPhz9DvWizSgo/DSPKFCDIwZS7BCVKv1pIyxcWfhyxEAHzvEWG+0A5RnutNNO2ydsM634DRN2c2KXI/oAHG/5tbXfCMOR/PW1Cxbp5D81KJ26XqfyxDl9Ndy+MQvDAAAgAElEQVRY9IdjByz6FPp0+sEpDZumrgMhc+5YGuFK2lhu/0Bac+U78uFRAhKQgAQkIIFyAiVzeVJbto5nDdw0bCqZe/TlrGReQnzM9UIfgK6CHYzDeIl5PPNc5tr8MadHZzCnKy2DpkxT5WtVa1r4xtqcB+/sNJvumMq6M16ki7yW5jG3rgwtk9x4Ix9jjrlz/zE6klLeXfljvcrakbUen/+hrmGgkDrWjqHTCf/cH7M+nFO/NVb3kFuewWrqPJWu9ZFnE8YD5GDt/tznPrc+YtAXOjn0Ozz4pz/HGADdQ+iZg2ccc/q/McwiPY4lfWEavuscXRA7D6J3izEOgxNePEN3RboYjIRuj3hyGeYyKJ0HoIMKoyb0N+ilQldHPtHz33TTTV0oBl0P/VqXnrKkD4o+bNV9XmS4tH+J8KXH0nLuSi9Hp5RbJyPNOco/4s5tVxEuPVKW6OfR04f7+te/Xn3uc5+r9ZcYNaGb5hlb2qYpC3Zxop2gJ37pS19aB1/H/CXk9iiBOQj831O4OWI2TglIQAIS2FUEmChhOJIaNZFBJu5HHHFEnVcWS2Eg05Z5djRpfpqLz8DFA26UWVM6jJaYvOFIg/TDqIlrnGN81FSuDJEB44DUqIkwTBgjLyxkMAhJ3RQM0/jS89gdhjwxsY1FH35QHIaBA7+ZDIdjYYvxBo5yTI2auIaRVNvn/SL80CMT7je84Q2tRhEsWHkDDYdBU2rUFNdios7knbc5cZRdGIeEkrS+kfxjpyAcb25FHKXpJdHWpyxWmp/2Y0efWDjgaeo6XVrOTdnjd7qtLcqgpsOIBmVRKEaa94f+RlkAlzajprHlMUW7oj2nbYY3uVFahqNc2eksjJq4jqHeMcccU3uh36P/CxcPT+gfU6Mm7tNGMZLq2y0p4okjisxwTaMmrtNmQl7kaPvkZ4Sf+8guT7ntYup63ZZH+v/UqAk/fAI1xi/qYbPPbotn6LWp60Cabu5YWtrGSvqHOfOdMvBcAhKQgAQkIIHVEVjV3KMvRyXzEl42CX0Ahlc89E3XNayTeXmKuT6OOTcPkzbdTZmvVa1pY74P27PPPnsfoyause5M10dj8lhSV4aU+VzxLks7p/2V6kjG8O6TP14uSw2YUv8YPAXX8Mv9qC+bpt+aQveQU56wWJXOLi2XvvNc+UvXon0ycI++HD0nOuUwaorr6CPC9enkVtX/hSwco25zPqQvTMP2nVM3Md5Nxzj0HxiRhoudrOP3FAwjruZxTLmncqL/SnV16BQxRkXXNtb16SmjnHL7oOjHVtXnNRnkts9m+NzfY8q5K61V6ZTmKH/yNEW7QmecGjURL7r59DnU8ccfv3jOESx58Tr01qmOOsZZ/M2p+w85PEpgbgIaNs1N2PglIAEJ7AECKKFwWISnk6U06yw6unZG4tNOOMJ2hU/jGnoeO9HgnwnrVA55eSugzfGgPFwYDMXvvuMQhn3hYwtmDKswuGg65EVxi0sX9rGVKdebk+aIA0VB+vmpuJ5zZIEdRkjNcCE717tkSCfeIT/KC3YQwzFh5w2k1GFcFp/f4pvyYVRTml4aN+csKtpc1GfuhRFWm7+SayF7bjl3pfX4xz9+cevyyy+v32ZbXJjoBKOyE044oTO2yBMecsq/M8LkxpB2RdtoU4qkRjAsKmNxmES/j6FMuqtZcGWRz25jzbeP0ziGnBMPDkV1m6zcw8gq6nizLQxJYyo/XWWYtot0gU26UQemqtfNvLD47xp/0nac02c302j+nroORPwlY2nwJY6u8mnrYyMPhBvaP0SYqep+5NujBCQgAQlIQALrIbDKuUdfDmOOgZ+h85KYQxOm+QJPpMUcP16sYXcPPuWx6W7KfKVz4TTf6dx9ijVtyPykJz2pU5eSph/+uZZbdiV1JU2763yueLvS43pu+yvVkYzh3Sc/O+XEGjV2yEj9xwtqyI3OJlysX3LXh6vSb4Wc6XGI7iG3PIl/nXlK88d5ifxRloTPWYs20875je4TgxRcny5mVf1fKnu0taF9YRq277xrt0H6rTAaZffsoW4ow674SsudlwZDTgzPUkOONK0Yt9NrOedD9ZS5fdCq+7w0zyXtMw1fcl5azn1pxVhLW5lCn9qW1lzl35ZWem1ouwoDuTQs56meOp6HpH4Yb2NDgjYdNX6HzqHTeD2XwKYR8FN0m1YiyiMBCUhggwnwmS3eFuKhNMotFH+8hTBE0dVmbBNZjTck+T3lG5Lpw/OYGEeaY459eUkNntL0I70xDCOO5pHPZsUbDbyRyreY2xxb7ePCMIjztOxS2dPwvG3AxJh0Sh2L9i6XKo/Z/jx9wyjCpDLjnwUujsl+vM2Doiw1XkgVZ+miYEx6IQ/HWCyk1zhnIYEShbYxZX0eU85NGeM3dRmFADv8UD+oOyyGucYiqc2YJ8IOPVKv+nZFm6I8xrSr5o5Kka80711+0r4r3a2ON2foK1GiwRaFLQoOFGe5fRHlQl3CNXe8C1k5Igt1ku3G0/aS+lnFeW67mKNeN/PZJRP+UsVAW5/djGvo7ynrQJpm3/iT1se07yltYyX9w1z5Thl4LgEJSEACEpDA6giscu7Rl6uSeUk6B+qbR6frYObRXQ9S++Rb5b0p89U1T55yTYveKPQVQ9dCY/JYUleGlN9c8falXdL+xupIpmwrPDzmBQo+LcWuUKxt44U71oGxoxq7zcTLdGPWh6vQb43RPZSU5yry1FcH03sl8qdtOVffl6bddc5LXRh/kQ6s0J0M1cWtov9L5S7pC9PwfeddeSEMbZoXf3mRmPqb6g24P4Zhl0yl5U4fEbqMdGxuphOGhM3rQ3/36SnH9EGr7vPS/Ja0zzR8yXlpOfeltQqd0lzln+ZrTLvq0kGHnprnJulOZmm60b6jHXGPujG37j+VwXMJzE1Aw6a5CRu/BCQggV1AACXUF77whepb3/rW4gF7bra6Jly58eT4j4fUTOribZ2c8F1+QxHTdp9FDG+bMYFMreOnYNiWHtfShQQLVb4h3+fYWStcKEmQO96ki3vpsWu3pdRP33nfojPKifCh2OqLK4w88IPSGeUob3KgLGNLYvIBf+orjkV8+sbpmPRSufrqQepvqvMx5dwnwytf+cr6c2kYiFF/2LWG9s63uVn48AnKPsOkvri516dg4f6Y8piiXQ2p27SPHIdx2HnnnVd//5zFLHX21ltvrf9YQPNZPj7ZNsSlfGIR2xWOfhbDJhQx63K57WKuep3mv6+MGR/oM+gX0z47DV9yPmUdSNMvGUvTOpTbx+b2D3PlO2XguQQkIAEJSEACqyOQO7dDsjFzj76c5c5LQg7men1r3XR+tc55dF/e03tT5qukfFNZhpyHvPgdml6EKS273LoyJB/4mSvervTTutnlp3l9jI6klHdThvQ3O8mgq+FFIF74id3Ub7/99oUBQ9eLaJuk35pC91BSnqvS2aVl1nU+tP2m4aMtcy13LZrG0zz/3ve+V+us0H+UupL8lKZFuJTF1Gn36TzStNB5hOHDFAy7eKR5zSn3qO/Em8rdTKfvXtNv2+8+PeVYHdUq+7w0byX9Sxq+5Ly0nPvSWoVOac7yn6Jd9bVn2NGG214K7+O66vlLnyzek8BYAho2jSVoeAlIQAK7nAAGIp/85CcXC1AmV+w8wi4XTJqZTLEjCQ/t+1yfIrEv3Jh7GBjhUiv1MfFFWN5w6XI8HI/0wphqKoZdaUY+uX/ooYdWz3zmM7u81tdTI5Uol5C5K2CaRpefvut94dN7GCYtc02DEBaNGDbFm3N8Oo+FcyilUyUZcY9NL+QLdvF7qiPKuzaXyp1bzm3xpdde+MIX1p8yQ9F4880318YxKO5uvPHGikXZ61//+tr4KQ0z9HwZpzRfOeU/VbtaJh/57Fowprs0peeEYTF+wQUX1HUTphja0T/wicSLL764Nhjr+0Rf8E2NqrrkCL9h9NeUJe6v4jiEZypHWv5T1+tIJ7jE7/RIPYr+L/rs9P6y8672Srip6kAqQy5fwqaMc9pYpJvbP8yR75DFowQkIAEJSEACqyVQMj8aO/foy2HOvCTm0UPn0H3pltzrmyeWxBdhpsxXydwy5Bh6TOtDzLuXhZ0ijzl1ZZk86f254k3TiPPS8snVkUzBO2RuHtltGyMEdmJJDZs4x6Fj5HNP4dL6krs+DF7L6lmaRqTbdyS+delF58pTX3677m3KeMDLnJdccsliHY+OkDqEjpq6hs7zAx/4QFc2FteD7eLCzCdpvVtWR3NFQR8au541w6b6kCjDqRg204rfaV5zdBBpmfQxSsf19DzSX3ZM02n6TWXP7YOIa5V9Xip7X55SfyXnXfOZlFVOOS+TYW6dUh+rNE+55T9Vu+qTbxm7Pn3wKucvy+T0vgTGENCwaQw9w0pAAhLYAwTYrjberuBzYuecc86O3Y94+2oTXVjgY6DRtt1uqcxsH9zlUNaEi61D52aY7obE23nHHHNMiLD0GDKySIFTavSUBp5yJ5M0Xs5T+TFKyn3zBkO7L37xi/WuOLz1RxyhJGMxcMQRR+yT5Nj09oms8EffQqOLdSp3bjkPEZPdgJ73vOfVfyzGvvSlL9W7N/G2Ers3nXHGGUOiyfaT5iun/OduV9kZ6QjAjmL8nXTSSdUNN9xQG4uhoLnmmmtqI0TKss/Bh7KhjXbVjQgf91OmcW9Tj6msc9Rr8t3XZ3Mv2mP0hzmsgnlfmLF1oC/uIfdSxjltLI27pH9Yd75T+T2XgAQkIAEJSGB1BKaYe/RJO3Rewk6pses0n4gO441m3Ol8LnQITT8lv9N4S8J3hVl3vrrk6rqeMh3KZKo8Dq0rXbJ3XZ8r3q70cq/n6kim4t0mJ0YHvGx23XXX1foFdohGT8MLP7gjjzxynxcx0v4jd30Y67mp9Vvr1D3Mlae2sprjWlqepWvRplzUJXQq1K3XvOY19ecOUz9dRhipn3Wcl/SFQ+VEr5GyTsNFvwuv2NVnboapLDnlnn5OLdWvp/nhPPLEeehzmn5Kf6ey5/ZBpLnKPq80j7nhUt5p2JRVTjmncfSdr0OnlOYpt/znbld9rIbe2/T5y9B86G9vE/i/rSz2NgNzLwEJSEACPQRYwId7wQtesMOoiXv33ntveJntmL5hMjSRdEH03e9+d2iwpf74fnuXPN/5zncW4SP9qRh2pcmkNLYpxSAl/dTcQpiOk5CR22HA1vRKfL/4xS+alyf7nS4a2B0o15F/FlC4O+64o96pKeI57LDDdiiwx6aXK1/qPwzHULR0lSf1q82NKee2+PquPfWpT613Gwrlfygdm2G68tD01/e7tDymald9sk15j7fn+ARd7NKE8qWrrNN0UYrwOUXc97///U6lDQri2AY6VZilcY09x/hxareKet3XZ9Nnhkv7w2ir3OtSqFH/f/7zn0fwpcfSOrA04iUeSttYV7RD+4cIv658R/oeJSABCUhAAhJoJzDFXL4t5qnnHm1pxLW+eQnGGuFifRi/02OqKxgyj55ynlhSBnPlK2Uy5Tm7fKefPhryEHqOPPbVlTS/uWUyNN40jbnPc3Ukc/BO8/jsZz978ZMXIzE4DNfcYXvM+jBdz02p31qn7mGuPAX/OM6x1ifuOcaD0E9h9IDOr+lWoaMmzVxmJX1hM29dv3/0ox+13kKfi54Uh944doKZimEXg9JyRwcZY2xXGyYvc5bxmD4oCmFVfV6kV3oM1oQv0XuVlnOuvDk6pa46OTTNMeU/VbsaKutYf5s4fxmbJ8PvDQIaNu2NcjaXEpCABCYhkH5nOiJkofHDH/4wfk5+DMMKFAm5k1MmaBgF4K6//vp6x5MpBGT3p2984xs7ouL6TTfdVF9n69LmJ9O4UcJwCINnPOMZdbp8j5w3BIY6tsgNx24ybVv9klfecJ3LsWV0bId89dVXdy6m+tIPZRhKyM9//vOLuhLX07BTpJfGl3OeKspTg4qIA/m/9rWvxc8dx9Jy3hHRgAss5lAU4aIdRbAhdTL8LjtOUR4l7WqZXHPdJ7/h2tpb3EuPUQ4YLrX1PTwcoO2EW/Y5yvA35Bhljd+2OjskjmV+5q7XXX02Sr5ob80+G8VJKHm6FGpf//rXi/rGkjqwjGHf/SnaWDP+vv6h6Td+rzrfka5HCUhAAhKQgAT2JRDzu5I19r4xtf+aY+7RntL/Xe2al2CsEesY9AFt+gQeQoVh0xOe8ITFbhZ96U0xTxxTBnPlqy/P6T3WBOgO+IsXK9L7bedPf/rT68v4v+WWW9q87HNtrjx21RUSH1MmffHuk7EV/ghdyBAdyVy8I7s8/H7iE59Y/+RlwNj1nXQPPvjg8LY4lq4PV6HfWrXuYc48RZ0H/Fxr/TnGg+jX6U/adCpXXXXVoi5NfTKWWW5fOFT+m2++ufXlSa7//ve/r6OJtPkxhuEQBmPKPeo8xktt9RI9Tujeh/LJ9VfaB0U6q+rzIr3S49j5zJhyLpGZ9MKlbX9InYxwQ46l5T+mXQ2Raw4/mzh/mSOfxrm7CGjYtLvK09xIQAISmJxAqmTgATBvOqIYwZL/xhtvrL9rPnmiSYRhCMLChU9jsf0pk9dYmCVed5yyZehznvOc+jq7anzwgx+s5WfxixKX/Fx66aWLz5btiKDnAp8+41NSKDXgwdsxH/7whysMi3AokeLNqrEMhzB4yUteslDEXXvttdUnP/nJ2uCMciK/d999d2348P73v3/xtg5yPuYxj6liwk4ePv7xj9dvvsCbcMRFXud0bK3NbmA4yhUZMRi477776t/sRMMn5j71qU9VF198casoGJHFFt2hJOOTdhi3Nd0U6TXjHPobxV04DLDYgYf6g+EFxhP//d//3WvYVVrOkWbzyJtb73nPe+pyRmmAsp+yp31Qv0OJEDsGRfghdTL8LjuWlsfYdrVMrjH36QsuueSSur+hz8LwiL4BJe4VV1xRR40xXyh3l6VF+4j8fu5zn6vbMruoUXd4GEO7jQcy1Pm2er8sja77Udbc5xOPjAHkh7aaKhK6wg+5PnW9bksz7bOp43CjP6F/waV9doSP9sqOT5/97GfrMiTPsOfzjIxJXW7qOtCVzpDrpW2spH/YpHwPYaMfCUhAAhKQwF4kEPO7kjX2EF6lc4++uEvmJRipv+IVr6ijDX0AL2Wxey7rZF4Y+MhHPrJI9mUve9nifNnJmHkicY8pgznztSzf3OdFKubB/KEzGOKY78dOIaxnvvzlL9fzcfQprJH4/YlPfGKxO+2YPJbUFfKwrExK4x3CZw4/OTqSMbyHyn700UfXXtHzxBosrjXjKF0fzqXfirU4cq5aLzpXnshL1HnO51rrzzEeoOvF8fk11uWszxnPfvKTn9R9OvrPudxYZrl94dB8oHdC533XXXfVYxy/0edeeeWVdRS8yPXCF75wEd0YhkMYjCn3F73oRQs50W3feuuttf6JsZv8kU/yN6cr7YNSmaJ/m7PPS9MrPR8znxlTzl3yluiUhtTJrvTarpeW/5h21SbHVNe2bf4yVb6NZ/cS2H/3Zs2cSUACEpDAFAR4QM4kl4fALBZRNjUdD+e7tr1t+s39/dznPrdexBAOYxf+sIDn7Yc3velNS6N78YtfXMuO/Cgz2+SPb4wvjezvHngTgB2MMPzgr+lQeqQLsbEMhzBAple96lXVZZddVsuGkUMYOjTlw4gmdSeeeGL9SSwMLzBkCWOW8ANvDFuGfDYrwuQen//859flhNEEbFF2trl0m9vmfbb6ZeEejt/xtkRci+MU6UVcOccnPelJFW9JYdCEMh2DlKZjdx4UMm1uTDm3xYchE8pkdvtJd/xJ/ZJmWp+5N6ROpnEsOy8pj7HtaplMY+7TxugT009TNuNjoZwuvpv3099sWX7OOedUH/rQh+p6Qz1P63r4pe+JhzdxbewRRQVvRbEQRnmU9qFnnnlm9axnPWtsErVRZmn/NSTxGKOG9tkR50knnVQrzTDk4sFXc7cslIMomtv6xqnrQMhUeixpYyX9w6blu5SX4SQgAQlIQAK7mcDUc/k2ViVzj7Z44lrJvISw5JV1F3NnHi62vSjDmpH1Djs2DXVj5okhFw9rcSV6jrnyNST/8Qkg1iiHHnrokCD1S0gnn3xy/dIUBgjsoMVf0/ESQRhAleZxTF3pK5PSeJt5XOXvHB1JKe+h+WFX4S984QuLndMo56615Bi9xxz6rXXrHubIE+W2irU+6Uw9HmCgg8ELLnaPq3/8/R8vOVK/hhpepmGXnY9lRvjcvnCZTNxHt4TBYGqsG+EY41760pcuXgbl+hiGQxmUljs6FsIyRvAy3+WXXx5ZWRzjOcXiwsQnY/qgEGVVfV6kV3ocO58pLecueUt0SkPrZFeazeul5T+mXTVlmPL3Ns5fpsy/ce0+Au7YtPvK1BxJQAISmJQAD25f85rXVIcffviOeFk4nXLKKdXrXve62oCExVLTkITwuDjuiKSqFoqrtvAYeZx22mkVSrNwPGRO44vzOIY/jmyr+oY3vKE64YQTKha3qWO7Td5iSxWYEUccU/9xjsLnrLPO2udb8dwjPnb9uPDCC/dJi7jGMBzCgPQxmPmnf/qnWjmU8gq5uYZiKz5rFdd5o+Ciiy6qy5g39cJRHoccckj12te+dmHY0sclwsUx/LaVa/iJI0qHs88+uzr99NMr5GnWI/yxcD322GMjyI5jbLUeN8hrlytNb2ieiB8Xx1SOM844o85H8x51lTd6zjvvvNpYgjCRXhq+tJzTOOIcgzXSbLaNSPuII46ozj///B11fUidDNnjGGm2HUvKg3jHtKuQK45NudLr6XnqLy3D9PyYY46pMGJrC0e/ifFRX11O04hzFurnnntuddhhh+1oH5Qf8dGO24ylUtnaZIo0uo6nnnpqbdzUvB9xxXFZWw854pjGN2W9jnhDLupJTp8d4elzGN/oB1NHvCjb6BsZW3DNPJXUgZC3jWPci2MqT5yHDG3huZfbx5b0DyX5Dvk9SkACEpCABCSwGgJTzeWnnnv05b5kXhLx8bITD+6aLzQhP/M91jsxp4swHGPe1Ta3GjNPJO4pymCOfKX5j/KNI/cwFGDXDBzrkmCUhus6R4+CroSXDtI48Y8O4Mgjj9wRX0keS+vKsjIpjbeLR7Brq19xL45tcQTDtvDhP0dHQpgS3oQLOftkQdeU6hU5b9Nbheyl68M59Fvkb07dA3nuK8858hScl6310/KNco6w6bFPfu7lrkXTuJvn7DqPnvjAAw/c5xY6WfoldMBhNNeUOX731VUijfzEMU1oGbNlaeT0hcviCrnIM4Y0MEgddYeX5I477rj0cr1zfylDIlrGAD9jyh1DLF6kiy8hhPAYnKDrRW9KnxzpxP1lx+AZxz7/pX1QxLmqPi/yEsdIPz1GPW6r92PnM2PKOZUxzkt1SkPqZDCKY6TZdiwp/7n7pijHOLbJHffiiJ+p5y9t6XpNAqsksN8999zzNxLkYYlOAhKQgAS2h0B88myV/TcW3uzaxFt07AySGsHMTY40UaKx1TDKD3buSSdpQ9PH8p9dR5jEssDLce9+97vrvLMgjG3qUepRFnxWqs2goBn/GIa5DHgzFV44FvwYziybvGM0RhnDiYf5qyzjlBVvcUZdQwbkby7QU/9jz1edHvLCmjpNfWSxXtqWS8q5jRe84xOPGMrwt6yN5dbJtnTbruWWx5h21Zb+VNfoH+CKfPRbPExBETPWEV88VKAfmyLOITKxmxo7fFF3qa9tBnFD4hniZ6p63UyLMuFNRvqUIX12hKdPpCxx9I30+UPcXHVgSNp9fnLbWG7/sKn57mPiPQlIQAISkMC6CKxjbU9e55rLt3HMnXu0xRHXcuclEY45LGsv/kKnsGx9HGH7jqXzROKcogzmyldbnvlc1aWXXlrf4gUAdrIpcchMOZJ/1hXL1vqleSypK0PKpCTeEk7rClPKe055S9aHUc+m1G+tW/cwR54ot1Wu9acaD6KeMoaia2kawcxZH6diFuU5tC9M88RnQa+66qr60jvf+c5FP8rXCogPHst0umMZ5tSb0nKn/bLjYq4OJ2U1xXlJHzQm3VWnh6xj5jOR19JyjvBxLNUp5dTJSGvIMac8xrarIfKU+tnt85dSLobbLgIaNm1XeSmtBCQggQWBdSk/FwLswZM2w6Y9iMEsS0ACEpCABCQgAQlIQAISkMBEBFzbTwTSaGYnwCfj+XQeLwi85S1vmT09E5CABCQggXYCXYZN7b69KgEJSEACEtgdBPwU3e4oR3MhAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpiFwI9+9KM6Xj6lpJOABCQgAQlIQAISkIAEJLBKAsO+obBKiUxLAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCCBjSFw0kkn1Z+sevrTn74xMimIBCQgAQlIQAISkIAEJLA3CGjYtDfK2VxKQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABIoIPPWpTy0KZyAJSEACEpCABCQgAQlIQAJjCfgpurEEDS8BCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJTE7AHZsmR2qEEpCABCSwWwlccMEF1V/+8pfqkY985G7NovmSgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCCBDSVw9NFHV4ceemi13377VQ9+8IM3VErFkoAEJCABCUxLQMOmaXkamwQkIAEJ7GICj3/843dx7syaBCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJbDKBAw88sOJPJwEJSEACEthLBPwU3V4qbfMqAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCCBLSGgYdOWFJRiSkACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSJcqZTsAACAASURBVEACEpCABCQgAQlIYC8R0LBpL5W2eZWABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkMCWENCwaUsKSjElIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCSwlwho2LSXStu8SkACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIYEsIaNi0JQWlmBKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEthLBDRs2kulbV4lIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCSwJQQ0bNqSglJMCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJ7CUCGjbtpdI2rxKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEtgSAho2bUlBKaYEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAT2EgENm/ZSaZtXCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJbAkBDZu2pKAUUwISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAnuJgIZNe6m0zasEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAS2hICGTVtSUIopAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCCBvURAw6a9VNrmVQISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAltCQMOmLSkoxZSABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkMBeIqBh014qbfMqAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCCBLSGgYdOWFJRiSkACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIYC8R0LBpL5W2eZWABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkMCWENCwaUsKSjElIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCSwlwho2LSXStu8SkACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIYEsIaNi0JQWlmBKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEthLBDRs2kulbV4lIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCSwJQQ0bNqSglJMCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJ7CUCGjbtpdI2rxKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEtgSAvvdc889f9sSWRVTAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEtgjBNyxaY8UtNmUgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpDANhHYP4R9zGMeE6ceJSABCUhgCwjce++9tZT231tQWIooAQlIQAISkIAEJCABCUhAAhJoIeDavgWKlyQgAQlIQAISkIAEJCABCUhAAgkBd2xKYHgqAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCWwGAQ2bNqMclEICEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISSAho2JTA8FQCEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAIS2AwCGjZtRjkohQQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCSQENCwKYHhqQQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCSwGQQ0bNqMclAKCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSCAhoGFTAsNTCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSGAzCGjYtBnloBQSkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQQEJAw6YEhqcSkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQwGYQ0LBpM8pBKSQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCCBhICGTQkMTyUgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCCBzSCgYdNmlINSSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAIJAQ2bEhieSkACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAKbQUDDps0oB6WQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABBICGjYlMDyVgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABDaDgIZNm1EOSiEBCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJJAQ0bEpgeCoBCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJbAYBDZs2oxyUQgISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJICGjYlMDwVAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhLYDAIaNm1GOSiFBCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJJAQ0LApgeGpBCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJLAZBDRs2oxyUAoJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIICGgYVMCw1MJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIYDMIaNi0GeWgFBKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpBAQkDDpgSGpxKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpDAZhDQsGkzykEpJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIIGEgIZNCQxPJSABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIIHNIKBh02aUg1JIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAgkBDZsSGJ5KQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAptBQMOmzSgHpZCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEEgIaNiUwPJWABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAENoOAhk2bUQ5KIQEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQkkBDRsSmB4KgEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlsBgENmzajHJRCAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEkgIbLRh0+9+97vqpz/9aXXXXXdVP//5z6s//elPieieTkHgnnvuqa699trqvvvuK4pubPiiRA0kAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJLDrCey/STn829/+Vt1xxx3VbbfdVn33u9+t7r///h3iHXTQQdWzn/3s6phjjqke8pCH7LjvheEE/vCHP1Qf/vCHa4OxX/ziF9Xpp58+PHBVVWPDZyWmZwlIYM8QwIj1Zz/7WfX73/++evSjH13/PeABG22Hu2fKZq9k9I9//GP161//utpvv/2qQw45ZK9k23xKQAISkMCKCfAiD3/7779/Pd9ZcfIrT46Xlf7yl79UD3vYw6oDDjhg5emboAQkIAEJSEACqyWw6WvrTZdvitLa1Dw6L5yidNcbh2W4Xv6rSJ3ntb/85S8rnh0+6EEPqnWkD33oQ1eR9EamsdfW7xtZCAo1CYFNnRtMkjkjySKwjf3axhg2sWPQZZddVv34xz/uhc6E6atf/Wpt3KRhUy+q6t57761uueWW6ogjjqie+MQn7vDMQ9vYBQvlctONDd+Mz98SkIAE+gjwoOsrX/lKdcMNN1QsnMI98IEPrN72trdVBx54YFzyKIFZCdx00011XSSRd73rXdWDH/zgWdMz8s0lcOedd1bsTolRfdtcqU9yDMBvvfXW6pGPfGR1+OGH93ndmHvbKPPGwJtJkE0vkzFtZCZkWxXtl770pbqfwMjnHe94x1bJXiLse9/73uqvf/1rdfzxx1cnn3zyPlFscl3aZNn2gegPCUhAAhKQwIYR2PS19abLN0Vxbmoe++aFU+R76jicD+4kum1luDMHXukjwHPaz3zmM7VRU+rv2GOPrV7xilekl7LOt7kt7bX1e1bB6nmrCGzq3GCrIO4SYbexX9sIw6ZvfvObtVETD7VxPDjiAdJjHvOY+mEQ17AKvv322ysGvtNOO616xCMesUuqzXzZ+PznP19/xu/JT35yayIwhDMGYi984Qt3+BkbfkeEXpCABLaWAH3we97zntrg6NRTT62e+9znTp6Xq6++urr++usX8bJLEw+/HvWoR2nUtKDiiQQksCoCGH//7//+b727CAb4uTtbYojPH+5f/uVfFnPaVclfks42ylySz20Ks8llMraNbFM5KOu8BDa5Lm2ybPOWirFLQAK7mQAPKtktH/3r29/+9t2cVfMmAQlIYDQB54OjERrBlhHgKwoXX3zxYlMExGdXe15EPvTQQ4tzY1sqRmdACUhAAhL4O4G1GzbxyblLL720fnjN4Mgn5k488cQduyOw49BRRx1VD6bunLC8/n7ve9+rjZrw2TXZYNvIM844ozWyseFbI/WiBCSwtQQwMIpdlMIINc0M96+88sraIPXoo49Obw06Z2Hzta99rfbL7ia8+fH0pz+9+s1vflMbFQyKRE8SkIAEJiZA34Zji96mY66Ewf0JJ5zQanwZfWZX+GZ8m/B7G2XeBG6lMgwZO/vKZEj4UtkIt6yO46evjYxJ27B7j0BfXRpSF0uJDWlHfbKVpjt1uCH5mDpN45PAMgLWy2WE1nc/1vRxTCWx3FIanm87gTnnEJvCZi/kcRNYb8N8cBM4KcPuIICOHl09jh2a2BSBZ4k/+9nP6s/RjcmlbWkMvenCOnZMx3ITY7J8py0VeU7Lc2xsazVs4u33Sy65ZKEQf81rXrP0Ux1dRk18Vo1PhTC4/va3v60OOuig6rGPfWz1+Mc/vuIzRm0O/3za7pBDDqn/sET+0Y9+VH8Oj4GbOGJHowhPOmzD+JOf/KS6//7763CHHXZY9fCHPzy8LI7N+PlWIeF++tOfVnxWgh2pnvCEJwyaDPAtW8IRJ4oHwmKwxE4mqWNiQCPDwADHjic/+MEPFl4e/ehHV4973ONq5t/+9rfr6zCKeMaGXyT095MpyoWygBt/xMcOU+T9qU99ap2/Zpr+loAEVk/g7rvvrm688cbaGKnEsIkdof785z/Xgr/gBS+o6Fdx7s63+rI0RQlI4P8IMOc86aST6rkhxktNx0469H3MFds+lfmc5zynNs5kjsWcdBvcNsq8DVy7ZBwydvaVyZDwXWkPub6sji9rI0PS0I8EILCsLi2ri2MoLmtHy2Qbk/aUYZflY8q0jEsCQwlYL4eS2ix/lttmlYfSjCMw5xxinGTThd4LeZyOVllM2zIfLMudoSSwkwDPIHHs7Pjyl7+83q2J3zxXHONsS2PoTRvWsWNanpsWm+U7bYnIc1qeY2Nbq2ETnzqLt4Ne/OIXLzVqasssBkJf/vKXq1tuuWWxm0jqDwOYc845pzaGSa9zzrcDedOeBwYYMRFPWAyHXwyEXv/619eGRGzVjNFQ0xHuvPPO2zGwR/x8sgnjKeKK/KZxnHzyydXxxx+fXlqck78vfvGL1a233rq4FicYbPFZlCOOOKK+hN//+q//qjCgCkd+PvWpT8XPOq98yg8jobh+yimn1DtljQ2/SKSqasOtseUCNyZLX/jCF2ojsjR+zjEKO//886v9919rNW6K5W8J7EkC7L43xmG0GO7ggw+OU48SkIAE1krg+c9/fmv6zJkwhu9zzC3POuusPi8bd28bZd44iBkCDRk7+8pkSPgMcfbxOqSOE6CrjewTmT8kMIBAV10aWhcHJNHqZUg76pKtNcI1XRySjzWJZrJ7mID1cjsL33LbznJT6p0E5p5D7Exx9Vf2Qh5XT7U9xW2YD7ZL7lUJ5BMIPT36CL6yM6WzLU1Jsywux44ybtsSyvKdtqTkOS3PKWJbm0UIC+XYSegpT3lKhWFTrmMHI771SsXCHXDAAbUBETspxc5GvGmEn4suumif6DH4iQdSGEXhMJDBkIYdgTD8IV4MkS6//PLaaIpdk7iHkRJ+Cc8OI3yehDhSi+U0/q9//et1/Bgi8cY+YX/1q1/VO0txA8Ml4mQHotSRh49+9KMLQyUmElhJI9e9995by4ZxEumyExM7G7GTE/fCuIndmJA53DOf+cz69K677opL1ZOe9KT6fGz4iHCqcgluTJ7gw+ep2I2L+HHsnPWd73ynOvLIIyNpjxKQwIoJ8IkcDD6/9a1v1SnTt91+++0LKdjNrutzmOGJ3fJ++MMfxs96BxTaOo4dm/gUaeq4Rx+d7tBH30d/N8TQMfoRwrNQY+wgHfpC+lIc/Qy7SD3oQQ9a7B6VysA5/Tx9EAwwtKSPajrGOfpyPqmHP/pwdm+hv0/75jQc4w75Ixy7CiJb7NKHPF2uJK2uuLiOvMEZVrANzrHLXzM8zGAX5c4YSRz017AmLxiu8ZlBdhRc5mABYxzhSL/LISN/uGc84xn71IWQi3Gc8ZE3hBiPKQfOc9xUdaO0nNtkjfwFd+YJsbsk53BjrtC1a1CEp37GnIC5xPe///2K9sl2080di0rqB7JTnuT9aU97Wt0GqOdRz2iLyEl7Is0+V5o+cea0lZCXeQh/ONrz1VdfXbcRftMHUrfCRd6CK/MY5l9tyqDSfIRcaVqUOfWTtkVf9uQnP3nRp4Vsy459Ms+VZioT9ZX5Nflgfk2dpT4wB+YeLyTQZulDwqX9RFdfjF/qNLvF9vXrkf+hfUX4j7Y3tM+j3IeOnZFGWo9ywgeniGdI3obWceKOehFtJPpI7j3rWc9qrffcIw8xd2BMYQxPHWMGdZo+gjKO8afU+Jk4WP+Qf+Yq/CZd5hjpGi6VIfI2tp2l9Zpz6jX5jT4lTTP3PI171W2mhGlf/oJ31CX85tRF/OfIlNOOmrJNVc+Rt2TOl3LMyUcaLreNBQPmTozR6A7uuOOOur9mTkx7pw+Ovib6Reol/Tp6GWTFD3/MOcIxN+M+bZ6+jjGMdJg3drmcsbwrjvR6yD2kj0zDjZGDNUnoZRiz23Z/JH7mYjjmEm3z51h7NefKQ9sD5Re7ecO+q09EBtYm9Ms4xuKueXRJvSRMzAmHrj1qQfw3GYGScutLfFXtij6EeRX9Wqxd6GPoa/rqc24/SF5L0irpJ0rHh5K0ogzn7pMiHfLGOMrYQBmgR6H/ot9vWy9FOI45ZZY7h4h0ViUf6Q0dW0O25nEb8tiUue13lDtrNcYBxhr0ZbEWbBtrKCf44Wjrbfo47i1bA+a06SivdK5KGtHXxdxn6JqwFr7xL6eOp0Fz236u/zStvnPkj/U8627KhTlO35yO+ILhKudhzXxQp9a1XmzKEmuNPt1Fn046eJbUSeYCzMkZE3CsN2Ouye/m/G8Mt662lKObbLKL3yVyRdh0jb1s/Z72Rc25eMQXxyn11mPKOHfsGMMSHR75RgfDs3F0MM3nIeiCsQ9outL+sBlP+jtnvRHtkPCr1G3FWLNs3Z3mKz3PLd8ISzmvYn4W6XUdS/JfUleGjv+lPNvyV9KWgscm6yXb8jr3tbUZNn3jG99Y5K1rt6KFh5YTFquf+MQn6sGVQf6lL31pvetQTIbpLP/nf/6n7jRjUsxDkXA0Uiaa4Q4//PDqla985UKZxODN7kco4hgocMcdd1z1kpe8ZKG8oVN+3/veVyvomLSlrhk/FY/4Y6JNJ4pRUij0UQrSWYUjXfJHA0NxSFg60HDshnTdddfVP1FC8Z1b4mZ3KXbC4ju4uNe97nX1Q/sIF8dQoIUxGNfHhieOqcuFyS87SqUPMa6//vrFp/bgrGFTlKpHCayeAIajLIjDoYiI3eC4RhtmZ7Uu98lPfrJWRtAnhvvKV74Sp7Xxw7nnnrv4zefu2A2PiUDTMTlmd5Tmw9HU3w033FDvztcWHn9vetOb6geNpHPbbbfVk+1//dd/TaNYnNPf8TlVHNvyMkaEYwz63//934WhTVyPIw8lMOhtGouwiIdJPDAI/xx50ED+msrZ0rTSuJvnyMEuhc2xLfwxbjPuNj/1yphG+fEAmt0BYcA41nT06WeeeWanoU3456EZcrBgR1n1D//wD3Frx/GKK66oH4oxD3j7299eGzaxGKe+xJjXDMQYeMYZZ9T1rHmv6/fYukG8JeXcJQ/Xgzt1g7r48Y9/vJ4fNcPwybRTTz11H6OvNDwP+GlvtGvYhUMJldbV0vpBfPEJ4rPPPrtu+7SzpqNcqOttC1v8lqZf0lZCXuo8O2xihAkf6mS4a665Jk7r4wUXXFAbiEW5cPFd73rXYv4YnkvzQfiQi884oygIY/CImyP9DP3Sy172svRy73mfzHOlGQKRD8YPFEdNxy6ezJO5T/14xzvesfDCIjPGnVe84hXVscceu7iXntx00001JxTjlEfqSvuK4JXb5+WMnZEG8kY9ygmfm7ecOo5MUS+ijXzzm9+sGGtxKKxYA7U5+uUot2OOOWafsZu5fttOusTD252MP20P99vS4Rq75rL2bKtb3Gcd+OpXv3pHnJG3Me2MNd6nP/3p1rT5dG+sXbtk77u+zjZTyrQvP8E76lJuXcyVKacdNWWbop5PNRfIyUfwL2ljwYCdqtGV8PJXOp/mwQRzteiz6BdjTsJ8runYefqoo46q23roNVI/6HgYd+n/U1cylqfhm+e5fWSEn0IO9FTRDzbXEqQDX+Z0obeCfXNuhE4q4qB/jDE/pz3wYuBll11W75JNObIe6nK8lIfhO+6tb33rjrlNhMutl2PmRJGmx/EEcsutK8VVtivm4ddee+0+/VEqF+uYN77xjTv0oiX9YG5apf1EyfhQmlbKas4+KdJBh8t4gi6l6Rg30BHQD7W5nDLLnUNEequSL9IbOraG//S4LXlMZe47hwVziKbD6Jd5eryAFfenWAPmtukor5irhizp3GeMHiynjkfauW0/13+kM+TIXCJ93hdh0BsyRznxxBPj0uK4yvFikWjLSc68KQ0edWLMejGNL87H6h1L6yRrdHTSaR+NcWDMNZEPvSxzftxYbl1taahuMng1j6VyEU/u+n1deuvSMs4dO0pZYqB66aWX7qNbbpZT/OYZwZvf/Ob4WR9L+sN9Imj5kbvemGLNX5KP6FeWrbtbspils07Dr3r+k6bdPM/NfwnjoeM/a23WR0OeATTz0fxd2paCx5hxJrdfa8q+ib+Xb5cwg9QY7QATh+Vwl8K7L2kKFEs8HBNcHmKkimGMdNJdoCK9iJNOPByDMRUjfUMOy+D04Tifq0PZlL4lwGKLB+m4pqVpGj8PGl/72tcujJrwj6zEF46JXOpQgDPZZPJH2NSoCX8M/OEYKFIXD3CRj4c/TUdD5I1IXHNhwLUx4acsFxa1PGBNjZqQj4cP4dI3PeOaRwlIYHUEaJ88bA4DF/pIfsdfc7elpmT0USjoU8NT+swIH4slwjEh5tOUKPl5oEkfgb9484cJ6gc/+MH6bc1mOvzGQAZlfDyEof9AvgjPsUuJ1hZf1zX6WPpwJj84jFOR87DDDlvsnoIf5E8d/t///vcvjJpgApuQCSNb8pf2+aVppek2z5EDo90waooyYkyMcuahNcbDqUFaGg8LX+5j1ER4DNxgELvwFOyYEwAAIABJREFUYAAXBktpuOY5YeGGY5wMQ+OmP8bLGNeYU8R4znwjxjTSRg7edsdIDMdinXqFv1W5knIeKhsLkY985CP1A/So37SnMADAiIgJeZdDOYgSI+YkxAGrdKenKeoH6TNfQB7qFDLSFmNMp1yQszl3I1xp+lO1FR60Uo/SuQl8os/iGPWvi/OYfDTjRMGEURNlTF9Be4EnjjyzwEvfrmuGL/k9R5o8JGWX0jA8od6RF/pJ5szkkX51Lje2r8jt88aOnTnhc/M2to5jqBCuzXAx7qWf2cbAJxzGEiz4qb/IwlqFv1iDUafxk+MYH6Ju0U5YS9BWY0zjDSji7XKldZ7dIz72sY8t0o56TZ9Bm0Xx36b875Ijvb7uNjOWaZqXrvPcupgrU047aso4tp5PORfIzcfYNka75sEV82naEOkz7qVzeXjRL9Kvo+xHN8P8LMYn7iMH98OoibbJG+DEh8OYhxe2mN+Hm2osj/g45vaRhJlKDuYTMUdL9UchH/OgMGriWtvnwdIXTFK9Wk57oH8NfRN1E+OGNsf8DINKHP1y6MLa/ObUy9K5XVu6XhtHIKfc+lJaVbtiLLzqqqvq/oj5Iv0Iaz12jGYMwbGe5C91Jf1gblql/UTJ+FCaVsqE8zn7pEiLeRF9SZuOgHGD+X6bjiG3zHLnEKuWL9KL49CxNfxz3LY8prI3z5mH85CeeQXzZNpw6OnQKaHjSMe7ZviS37ltekgauWvCNM7cOk7Y3Laf6z+Vb9k5OkLWNW16CeaMGKDG7pBpXKsaL9I0285z5k1t4UvXi21xTXktt05SfqHfiuesPPNM9V3pmDqWW1deh+gmu8JyvVSukvU7PNapt84t49yxo4QlL02wYUfolunPeXbP1xVCB0M5oQPmevqcm+sl/WFffeBeyXpj7Jp/bD72+txgSP5LGOeM/7ntpa8elrSlNL7ScaakX0vT3dTztezYRCHGg2UMhmKgHAqJB3eh+Hne8563z+co0jhSw6RQGMX9eNDJb6zp22RgEMWh6EmNkCIO8sCCDNdU6qTxv+pVr9qn047wdN4oAWNXprjOTh00MByde9tnnGhU4dIHaCjtGdBwbUZLXIdfKMiafsaEn7pceIszHewiv8Gc3/EQNO55lIAEVkuA3TFw733ve+tJIv0VO8UNdexGh2OygqELjj6zafSDkU08BOXBILu9oLgMx0NvHn7QL2P8lD6wxA/hSQNHv8FuMGn/h8FMPPSMOEuPKPzDKIhdKNh1LnWkhVIm/ZQS99mdgoc/jEdwSd9QJ3+f/exnF/mLXaxK00rlaZ5j/BVjBLsB8lZVjJG8oY/hC/njD8UF43ibIw52+cHIOMZglBa8ec4YyaIC+ZscmnHxwJuHzjjKkJ0Tm463KMKlD8ipB8wTMBBjARVyoCxl8ov8jME8ODriiCMiilmPJeWcIxBtgN1MXvCCFyzKDdbsnhUGYMwx2rhjMM4fcxqMxtMHkCHDVPUDpRptGMPy9GEoO2x99atfrRXa7P6VPqRDhtL0p2orzC3ZHROlHG0Bxy5Y6ZwzWPUdS/PRjBOO8KNPQwEVLpUPRfGU9XuONGkX8RCDHTpSxQZ9Dazpf+ZyU/QVOX3e2LEzJ3xu3sbWccZv+g7WBfTdcEnXLZQhiq7o1+kHoq8hTHwiPF484SUYHOVPP4Yf5gP07anxc1/deNGLXlSPWYwP6ZqNvvEDH/hALQ9xMua1udI631evUfKlL4S0pdt3rS/uVbSZsUz78hb3cutirkw57ShkiuOYek4cU84FcvIxRRuL+Xi8ed+2Xg9OtB3mwcyHw8WclnvMv9C1sENHPBAIPhg8MafB/0knnVQHn2osD1k45vaRhJlKDvJOP4Z+jLkx42DMuUkn+smQF8OmKO+4Fg96+WR0qjfKbQ/0qVG29MNt8xoMpSk3XKroD1nSY8g5ZI041ZwoTd/zMgI55daXwqraFZ+GxlH/3/KWtywMIbjGXIM+JtWXcr20H8xNq7SfKBkfStOq4SX/5uyTIhnKpU9HgD6bckvXqiVlljuHWLV8kV4co/8dMrZGmG3LY8jddcSwEt1AGDjjj69RoN9j7KFtXHTRRV3Bs6/ntumhCeSsCSPOkjpO2Ny2n+s/5Bt6RC/BnC7WdoRL9RLoeTA+Td2qxos0zbbz3HlTMw7q6Kr1Mk0Zun7n1EleOETfhfvP//zP+gUDjF7Rwbe5sdza4uTaEN1kV1iul8rVt8buW7+vW2+dU8a5Y0cJSwwpeKEZx7MNdKbhePby7//+7/U8jflbzD3jfml/GOG7jiXrjTFr/inysdfnBsvyX8o4Z/zPbS9d9Y/rJW0pja90nCnt19K0N/F8LTs2pQ8mhiqkU3ih8OZa+uAj9cM5nXq41ACGSoDyCMdkK304Hv4xaooOmLd6mwp5/PEmGw9pcVTycM34mw/owx/H2JadtxjDpW/usqDjTcbm34c//OHwvo9xT2pQxcSjzYVRGPeafsaEn7JceDiXPqBL84GyPlz6MDSueZSABHYfAQbhcE2jJq4zUY5PZfFmNw9BUpd+3o5d8FKjJvxhLFUyHqVpxHn06/xOH9LEfdLi4UH64IIFEhN/HHlJjZriWsTFuBA7FpakFXK0HRkfUHbgUDhgIJPKyViKUVXsUghXxrw2hzERRlFhTIQfwsUnMvid7j7VFgfX0h2Ywjit6Teup2/K4AfZMRIjL6kcXE8NpNLdAJpxT/m7tJxzZEAJzMP5tNyY52D4Ei52R4jf6RGF9oUXXriPMiruT1k/iBMjxuY4zsPLMGZikZLOWcakP3VbCSYlxzH5aEsPjs05E3U+OHbtdNYW19BrU6aJoV0Y5fN54ebcHuUaxk5zuin6iqn6vKnzOUXecmUKA1MeXrW9mcvD+WiT4Zc0YqxGwUWfFUZN3GP8SRVizXG+T0b6Rcaj1KgJ//SN8UlrDD/DuK4trtw6z5iO4RSurV4z5yit15vQZqZg2sZ5zLVVyxR1N7eer2Iu0MVxqjYWnzzrM2pCBvQoqVET15jjpmM/ccUcN+TGKJ75CI62GS76DX43w3CtbY4dYbuOJX3klHLwQA+HXin9FDXz61gbxANC5v/MjcLRZ4X+hrVNWh657YE+KfRWGDBRr5su5tvoxmKHp6af3N9Tz4ly09f/PARW1a6iLVJ3Y3eXyBFzCfog5pGpK+0Hc9MK/6Q9tL8qHR9K0kqZpOdz9UmRxpD5cnPtUlpmkWbOcZ3yDR1bc/LT5nedeWyTJ64xz0+NmrjOy94xV+cZTKobiHClx2g3Of3HkLSG8G3qwUrreOQBuYb0M7n+h+Q39cPGATFnieupXqKZb/ysarwIebqOufOmtnhy14ttccxxraRODpVjCm5dafXpJrvCxPUSucas39ett960MmY+E+7Zz352nNZHvqZA+eDQxTdfMi/tD/dJpPFjzHqjdM0/VT72+tygL/+ljGMsnHr8b1S7HT9L+qVmJLnjzJh+rZn2pv1ei2FT7IQEjFRhPQQOCp7YmQFlNMqrLheGSdxP/aEMCqOnrjfYQ0FE2C6lTeonfUiexh8T8DYZ6bxDYRQcyF8ojAiDQpyH2M2/dHvwdAGfTvJTmdL0Q24GkqZRV2n4qculj1vIyASn+SAvzafnEpDA7iEQfR6LhWa/FblE6REK/dQAkvsRHmPO1BA1wk55TA2k+FRHGAr1pRHGtvhpPgCKcKmiIhQCJWlFfG3H4MS9pnFB+KfvDcMrdjvqMgrqykc8NCG+MNCKuNuOGCTFQih2HEr9IXPwYOyIOpD6aTtn3EXhjSMfq3Cl5ZwjW9cOWtSVqC9hRNIWL0ZRzTebw9+U9YN60NUWjzvuuEhyYfDChTHpR96JZ2i7XAgx8cmYfDRFoT9sPrAJPzFHYtEWC7e4N+Y4dZrpg9yufgOFaLrl+Rj5c8MO7Su6ZM/t83LlG+N/aN5y02B9FX1xuq6JeOJa2r9zL/pIxvr0pY8Ih6I8XlaJfj/ulR7DwIKdYbraSUmdH1KveeBaUq+HxL3ONjOEaWl5lYabQ6ax9Zy8dPUbbXO+0ryn4aZoY+gQMDwa4rp29Unn8m1+6D9Cf5POFVc9lnf1kVPKEUYE8IzdlzhHZxOKft7u5MEfLt3FiflE9FthzFx7WvKvqz3E/J44m0apGBrE/IX+pe3FvyXJtt6OOLk5du3RmoAXN47AlO0q2iIP0NjdONpMX6ZL+8HctMI/sgxde4RshMkZH0rS6mI0d5/EC15tLp0vpwat+A0uq5gfrku+nLG1jV/OtXXlsU9GxqV018HUbypvnx4jDTPkPNpNTv8xJN6utpvW8XRuQ5yldTzyQBxD+plc/0PyG36Y23WVYaleYsrxIuQsOXbNm9K4StaLafg5z0vq5BTyDOHWl06fbrIv3LJ7XXINWWN3rd9TvcY69NabVsaxPqEs2vSVsc7jfroBCr9L+8O+ch+z3hi75h8zd9nrc4Nl+S+tKzEWTj3+99XBZfe6+qU0XMk4M6ZfS9PexPO1fIouncBRQXMcD1Cjc+wzfiHO2K6MB5ep8U8Y9uCnSwEUxjMokLomZuEHhXT6VkFcJ/5oKG15DPm4FxbtvKkXu0AhW1iwtoWPa1jlhou8UdHbFOUYIEWjbzN8Kg2/qnLhrcRU/lDwRf49SkACu48Ak9wwAo0FcVsu2Q2IyTEGoelbfhithDFr9LVt4ae6xsNYHgywmwSyX3zxxfUb0Bic8PAm3kBP00uNg9hqO91dKPylD3HDf0laEV/bMeLlXh+r1CAF1jEBS+NseyjNfR5WMS5TpoxJQxxvSPA5LRwPxNNxOR6Qcy/epGjGybjBZI78MQch7Zz0m/GV/k755pRzTnrNHUnSsJQpE3fmUcw1Yuet1E/b3CDup/KPrR/L5Iw0U8X2mPSnbishX8lxTD6a6fVxTOfYGG1M5aZOMy3jrnpFn0i66eeIp8pPGs+YvmLKPi+VaarzMXnLlYG6x+c/v/Wtb9VvVvNSC4ppHGUYBr8Yb8R6hesxVvNwn91q21wovtJxvs1f8xp9Hm8rUd8YB4iHdpHWv2aY+F1S59P1ble9Zh1TUq9TmbviXkWbGcM02E59XKVMJfWc/KZjwFxzgTauU7Ux6txQo5aufjHmwrSB6BuaMoefdCe1OcfynD5ySjmYUzMfo+6iR+JTwrgwYIIDOiH0Sry4wY537ECHS/VOqTFCffPvu0Dl9Hu8SHDllVfWc2R2EY8XC4hvyHw70s05pu2hqz8jviFrj5x09bsaAnO3K97ipo5j0MTam3rKAyjW4m262DH9YG5aJf1E2h5yxoeStLpqwJx9Eml2zam6dARjyqwrj33X1yVfztjaJ/+Qe+vKY59s6UPupr/0eUs6B276y/2d26aHxk97bHNz1PHctp/rvy0fXde66hX+h+gl5h4vuuROr49ZR4zNfyrH1Oe5dTI3/THc+tLq0032hYt7uXKNXb+vU2+9aWWMzj6+7IMuvjnHZ+6Go19MZZ9rzE/nV01Zor5wbFtvlKz5p8rHXp8b9OV/DOO5xv+0LnWd5/ZLaTwl48zYfi1Nf9PO12LYFAppYKCc4Y2voS7tiPoKk0ILRQ87LoVijHTiOh0TBkBtLgx8aEBp2PDLw9jYEaTvc259k/PYeQqjqzBOStlguJUqkyLtriOL+Xh7oWvwT3eTaso9JvyqyoXBkA4A15XHLj5el4AEtpNAqrxo64/TXLGTA4ZN6Q48af/U9fAkjWOKc7bRpm/nG/IYkdA3f/7zn6/4pB6KVj6Dlj4USvOYvq3dJUsYenE/N62uOLkerFhc8NflYscM7qesU/9TskaZhXIaoxwelPMNbuRjLOZzGTiM3tK34LjGwx+2Jo3PAaXyreN8TDkPlTctm2aY9B6GBm2GTX3zlinrRypLU04MHXgoT/mmk/Cx6U/ZVpoy5/wem480rSnbWRpv3/nUaUYZMy8f2u/0yVdyb4q+YmouJfloCzNF3triXXYNxR79NUYJrHniYT19dhi1pju1RLsgXsZNdqvtc0ON9TCWYvzt+rRSXxpxr6Rs56zXc8Ydee47TsG0L/6Se+uSKbeek7dVzAXaGE7VxvrmCc10u3aADH/MQ3JfVJp6LC/tI6eSg/yjC2KHJB7q0T8yBwrDJl524zfGouifmNNSlujCYs3AmiN98FvaHlhnYRSCURM6s0iH8grdFelOqYeJejnF2iPqlcf1E1hVu0Kfe8EFF1RXXHFF3X5YI1N/+UOXyyfQU71n1DcI5c41ctMijdx+Ysz4kJtWVy2Zo09K08qdU40pszTdoefrki9nbB2aly5/68pjlzxcjxcd2vwwV2CMYO4fc+A2f7nXStr0kDRWzTe37ef6H5Jn/PTpd/riWNV40SdD6bwpjTO33NOwc5/PJdsU3PryXtovlsoV/UupXmqdeutNK+P0hYtLLrmkYld+druCMXqZ0NGzzkmfjcw15ke8peuN3DV/pEf9zp1vpm2itA2kcQw9z61DU+WxT76+/I9Jf67xvy8vpf1SGmduGRF2bL+Wpr9p52sxbOLhY7yp+/3vfz/LsCl94BEGLm1QedMsXGypzW8URSiMcF0KGR72xVvAXX7Ywi4eLKd+0vhJg8Gwzd14442LB8ip8VJq2ETHl+N44Bsu3c0irnEMgy3OU7n5PSb8KsqlKX+qoOCeTgIS2J0E0n502cOP6JdTEmn/FA9T0/ul58v66BNOOKHi83i8OXrTTTdVfB6VicwNN9xQG9ycf/75i90EeWARDqOdZS6MYcNfTloRpu0YCqVlnIc8UP5/7L2Hsy1VmbjdwBXkEgUUL2YlByUjSYJkkCQGzLmomZr5ayxnpsaaz/EnYyQjGRQl55wURURELkEFARX1q6eHd886fbv37rjDOc+qOqd7d6/wrmelXm+/a3XKvSytpteYSDBOhXU7RtE8S2Clj+N+6rh3ySWXjF6gM2aw4p0HQZQuTJ6+853vpEF6O6+qG13LuY6A8IlyLPpP20dV+VRdJ66It4/6Me4ZjvoVbTU+F9hX+n21lSLbJr/75DiuvJrI1MRv32lGu4gyr5JlUr2rChfXq9plX31F31xC7i7HvvLWRgaUWfS3zKsYB8OwKXb9wOAh3Zk26gFpMUeZtPBlkqEz8VCnLr744tHLf9JkwQuKDAwBeFHCDg+8AB3n2pRt5GeIej1k3CmHsjbTF9M0na7ns5SpaT0nr1F+nLd55mvLK023Sxtr0h4m+a3Tr6c7NkXe+xrLu/aRfclBPcKwiXkCeia4hF6IlwA4jtdff31+zktAPjkRC+3Slwdd2wO6s+gT2WGcxRg8f4fyODVIjfLocuzzmaiLHIbtj8C02xVj+hlnnJG3HebcvDBjLsGiznPPPTff4Yy2iuvaDzZJK4g26SdS+dqMD03SCvnKjn32ScX4J40LRf8pky5jVzHeqt+zkq9pulXy17neNK1plME4/RLjGn+4VDdQJ6/4KXuejbBt2nSErTrOgm/Ttt/Uf1Ve0+ttymba40Uqb5x3fW6KeJqWe4TrchxXt9N4h5CtL26pnMXzNnJ3kSv6uuhvivLE73Hzl1nprduwivxUHbuwROd++OGH5wvMmEOw0Iy/1LFTE4aWqYsy4FqfY37X+UbTOX9f+RiiXFPe6XnTtPrKYypD8XycTF3TH2L8L8ofv7u0pYiD4zgeqb/0PDh16dfS+ObpfCaGTaw2YxcLHMoStnlLv5k8DlD6gpsVaqnRUoS7++678xXC/GbFWfotz3E7FkX41Pinyngmdn0iTOonjZ97WKAWd5BAMRRKKRT+WK2GS/PHqji4jBswIxxHXhyEq1L2h9ykU5SrS/hU7qHKhbxF2ZC/cZ+kCg4eJSCBxSeAhTZtnklb2k+V5Szupzv6pedhqVwWtuxa2cuU8Bdpxe+yI3Lz4oE/Ju0Y3bJ7Ew/2jAPHHXdcHiy1QudlbpvVTnXTKpMzrrGyNXa1YBe/tG8PPxxTjinf1E/f54znbMmPcQ4ywilekPNwV/w87a233porwBhDTzrppIxPHqWurhIgDZOet6kbfZRzKkPZOTtopemkfqLOwoSX+k1dn/UjXtiVyZDeS7cl7iv9PtpKmdx1r/WVj7rpzbu/KGPaJH+UT5lLV7GX3efauHaZ9ltp+KH7ijStaZ/PMm/0M7wARwbmQ/zRV/PSHsfCjphk8zvtt/i8KYbBXR0v/WNHExRjp5xyyjovRNhVagiX1muMFdKViGl6aX+XXh93nsY97TYzS6ZVTGYpU9N6Th7Sut72ma+Kxbjrabp9tbFx6Q19r4+xvI8+sg85UsMk9B30GTj6zHh+pfxYCc5CCeYU6ELCYD0N37U9sEMqeiLmK+ijMGyK3ZqQqW/DJp+Jhm4p049/Vu0KvfLRRx+d79LEJ8xZTIQS/6abbsrnjfR7ffWDddJKydftJ1L52o4PddNK5Suep31K1z6pGHfT3ymTeRy75l2+przL/E8jj+Oeh9FvxBwvnoGLcsb94nV+V80BU79N23Qatut5X3ybtv2m/rvmsyz8rMaLVJauz01pXEOcj6vbod8bIt1Jcc4rty5yRf/C/Lrt/H3e9NaTynHc/S4siTcWS/CunDkzuh8WlvEOgfnNXnvttY6hRl/9YTFfXecbTef8Q+WjmK9Z/p51HvtKfxrjf9e21KWc++jXuqQ/ZNj/2yJiyFQKcaMsia2zGKDZNvjyyy/Pv72JspsOj5eVfD6G3RaYkIbDmi62NEcRzWd9eNHBgIPB0A9/+MORBSjKnqOOOiqC5scwjOEHCu4yF37otKp2PgoDISw+022/I2zEizzsEIV8yHnbbbdl55xzTr6CiPh5qR1Wo4ShMUWFo9JfeOGFuTEPD/K8CCf+m2++Od9lglV9qUsf1mFDGFY9xK4ITOqJE1eW9y7hp1Eu1JXgi/zw00lAAvNFIBTxfUpFW+chFMd3mKsmdijg48V3+oDDgzN/OHYJrAqfe3jtX7yAZEITLw3S+5wzVjVxKAhZTRrGQml4lHThWIXd1Y1La1zcjEHhxsmR3ktZR9ghjiheYtU65chOTfFdbiZFwTXSjpfn5CleCsU9jtSXNq5L3ei7nMvkj10pi/d4HoAbDsO5Npb+fdYPPi1b1bbS55t4JkLuPtMPPm3bSoTn2LTfGyIfqTyLdp6WcRihFPNAXYndVIv36BvCVSnFCf/888+HtyXHofqKJYlM+NG0DhWjqwrfV96q4i/KUfydvgBnboJRarj0Htcox5jj8Rm6cSu3I45JR+aG4fbdd991jJq4R180hEvrNUYIZY48VtXLMv9xLY172m1mlkzJf1ld7EumsriD+bhjWpcn1XPiGfpZoCofQ7SxcVymea/tWN5XHxl5bSsHbTqep9F3xPNa8fMMLBDE8awX/QrzJNIN10d7iMWD6J+Ij3qNY0FfG8N4wlbVS5+JouTm81hVbuOknXW7Qr968MEHZwcccEAuJnP/GOv77gfHpVXFaFw/0ff4MC6tKvm43mefNC6dOvf6LLM29XmSjH3KNymtOvcXNY/jdAPp56nTZ2DYh2szB4yw6bFNm07Dtzkfog41bftN/bfJZ1mYWY8XyNTHc1NZ3rpe66J37Jp2nfDzyq2LXGn/Es/ZRRaT5u+053nQWxflnvS7bOzowpL0eGfPew9sAD71qU9l//zP/5x96Utfyj7ykY9k6GbKdNJD9IfI0sd8o8mcf6h8TCrHqvtl5Vvlt+71Weex7/SbjP9NeXZtS3XLpMxfH/1aWbzzcG0mhk0oX/gOemoQxCqwq6++Ovvud7+bG+1cccUV+Qrf2JI7YGHdeeCBB8bP3FDoG9/4RvZv//Zv2fe+973s0Ucfze/xmZ4PfehD6yiwwyCJF6DFHYsi0vCDYRSNpOhSA6F0tyb8RVgaA2FRBv3gBz/I5UNOOnUGQe6xmqjMcIpVcbGCmQd4DKG+/vWvZ//93/+dn2PYFANDKlsow7jGTliE+drXvpZdddVVuTfC8JIeV5Sba13CT6NceAkdRlplhll5xvwnAQnMhEAYDjFYRz/TpyDxEIrh0v33379O1Cgs6RvDscIxdfG5G/rksvCpX87TXYhSRUr44yU5nxRt6uj7Me7FRT/POS8uYutmVpVWKWaapFeV1rg4GPfCaJSdFcse1hhLYqxNDZXHxdvXvfjcHPx//OMfj+SL62k6kQ/qTNmWm4zHbVyXujFEORfzwCcY4FN0XI/P9kV7KPqZ9LvP+sF4XtYWuc7OmzjaSPrZxT7TT/Papq2khnRVSo80jfR8qHykaSzSOYrUcKywL2uv9957b+XYwjN3KP6qyoLw7EJX5obqK8rSKl7rOnZOCt8lb13qeOSTuUXMdZjTxctxxnQWRRRdKAFZbHHLLbcUb3f6zfhfdBgFxdyteK/r77TvqqrX9IFV9XJc+rNuMyHbtJg2qYttZJrUjiK/Vcem9XyoZ4E6+RiyjVXxmdb1NmN5lz6yKl9t5CCuaNeMY2F8H+UVacVvns9jHkJ/GmUf/uLYpj0Qlh31Ylxlh1kWzOHKnrcjrapjyFY1R/SZqIrcbK9PKrdx0s1Lu4o2haypsXS0oz6fNarSquJU1U8MMT5UpVUlW1yPPPXZJ0XcTY9dyqzJM0RTucJ/F/kiji7H5ZDHKt0AbTfGu6JuoOsccBzzqP/4SfuPcWG63BuiDjVt+039d8lvhJ2X8SLkafvcFOH7PHbRO/YpR5245olbKm9Tufqav8fz8iz11imHqvMmY0dTlqQZCzV4b5AablfJE9eH6A/7mG80nfMPkY9gVOfYpHzrxFfmZ9Z5HCL9qvG/L55t2lIZ+7rX+urX6qY3TX8zMWwigwzQH/3oR/Nt6VBspy94uc9EGiUNSpXiC+rddtstO+aYY0Y7GwUwLD3pqI4//vjstNNOG+0KFfc5hpKoyjAGJVFUsDLjH+Lgfrw0TONJDZ7YHYKrsdKrAAAgAElEQVTPHRQ7bh4UaXSf/OQn87ylssU5eUZ+uMRDXtzjSB7333//0Q4mcY/P8ESDjmu87I8XCpF37qVyh9+u4YcsF2RM5a8qm8iLRwlIYLoEYtLFpB8FOFvi0ieGIUVXabDmD2NYdvnD+IfdO+iLMbRhd7swtkEhyF/qDjrooNFqgGuuuSaXkXD057xsReaLL754tJtT7BBFHBjQsDMQaaFwQbn3ne98p9L4iIf3b37zm/lLWfotxhW4oNDH+CoMpVLjWlY/k0cczM4+++zsvvvuyz/dw28+4cNOF5deeml23nnnjbLWJq1R4JITxqgjjjgiv8MuEhgb89IXYzXKlJewGNuGO/TQQ+N0KkceyGKleLwgZ/ehYnkjTIy/vIzBiIn6EuVw7rnn5qvd2wjdpW60LecmclJOabmhtGeL75/+9Kd5NDxv7bfffk2iHPntu37waUHaRLRldiDAGDx2kEQhkK4u6JJ+320l+jzgsMsou5jxzEV7LTPMGUF8bWeaeW5nqazTOKcvjOfX2K2UVbu0VwwTqSP00eNctEvCsVCCOkQ5ULdo/3wGtMoN1VdUpZdej3rUduycFL5L3iJu5G1ax9M8hmKPzycxluHiWuqPcxavhMKAfoudbxmDMPalLtBHMP4zRsZYWowj/Z0aT/FSJMZy4mNHYOIfyjFfq6rXPHtguEUf2MbNss3MgumkuthVpoi/bTukDKNO16nnQz0L1MlH322sTf3tEqbvsbxtH9m3HDAJJSrPEvzxvBY7NAUz9GPxuerQR0W48NO1PRAPz1s77LBDHmXsmM21ol4u0hx3nFQvuzzbjUvXe90ITCq3cbFPs10xb2CXf57DmQPRdngGZH6PzgDH4qHQifK7bT/YNK02/UTb8aFNWuPKkHvRt3TtkyalU+d+2zIj7qjLnHd5nh0nZxf5xsVb995yyWOqG+CZDH0duq90/pDqBuDTZQ7YtE3XLY82/trWoaZtv6n/NnlpEmaa40WVXH08N1XF3eV61G3iaKqT7pJu3bDzyq2LXH3N3+dBb12nHCeNHV1Ykn7o7nlX8+1vfzt/n8EXm/jjvQyLv6J/T+Vt2x+mcRTP+5pvNJnzD5GPYr7G/Z5UvuPC1r036zy2Tb/N+N+FZ9e2VLc8yvz11a+VxT3ra6tmKQCdypFHHpmLwEMrikCOWECGUrtKPox/MMRh8srEFf+EKxpIFcN/8YtfLF5a8puVaf/yL/+y5FrxBw9e//qv/1q8nG9vHDuVUGnWrFmTffrTn85fCKOMJ+60EawTQXIBwyOMn+ARL2PhxScaOJY58n7iiSeOmGAUxSASyi+2FI9txYcIT5xDlQtxs+Vfuu1fWR68JgEJzIbAHnvske8UR+rsjMEffRD9Mv1gV4exK8ai7MzHC0leCJbt5oDx0+GHH75OcvSFhx12WP6pUvpVdiPir+h4EY6RLMaTGKjyEpT0LrrooqLX3Pg2tk5Ob2LIRL/Ny1f+yhxjFrvzpW6fffbJlTcoZtnBgQf9MgfTcG3TivBlR8YJxlVeKjMuYwRUdJQt8jPOTdsxDqRlz+8yI2CMd+KlNRMm/lIXn2NjfG7iutQN0mlTzk3ko34wOawqNz7NEBPMJvGG377qB22Aeo7RCn9FR1uOT0ik99qm33dbgSEGdRhX8CyKYWQ4PjO84447xs/SY9t8lEa2DC5SLzFKoj1iPMpf6njGpc3SH5e5Qw45JB8fePmCAWZxNzDC82yOgrzohuoriumU/e46dk4K3yVvXet45JeX49dee+1ohz3G2Kr2Qb/A4hV27qV/QAkWRssRXxwxNJ7keCmHUphyZ1wuG8sZx+JT3ZPia3ofo2rSZkwtq9eMXSFf07hn1WZmwXRSXcTYIji2KedJ7ahO2TSp58Q3xLNAnXz03cbqsOnTT99jeds+sm85YMTzJWNVGEfzO3bNSRli7MQ8K1zRuL+vNkp9euCBByKZ3NApdpcdXaxxUqde+kxUA+SUvdQptyqRptmueFbA6BlDpirHS49UD9u2H2yaVtt+os340DatKmZc76tPGpdG3Xtty4z4Jz1DVD2T1pUNf13ka5JOld/lkEeMD2nLTXUDXeaATdt0Ff8+rretQ03bflP/feRtXBzTHC+q5Ojruakq/rbXu+od26ZbN9y8cusqV1/z91nrreuU46Sxo+scm0Ve6EvR0aHr46/oWIC49957Z/Tl4dr2hxG+6tjHfKPJnH+ofFTlr3h9Uvkuh+eftozbjP9deHbtl4pl2/R3X/1a03SH9j+zHZuKGYvdltiejkpZx6EMplLxAMwLMBRBs3TppwzSHZEwRGJlbTqZrisnXLDqQ1nLy8oqo6Y0Pr5dipIelmHUlN6fdN41/LyVy6T8el8CEphMIO1f6ZeKjv7mqKOOWqKA5+E1DVcMk/5O40zPUz/09+xmh0K/aMhCX7fnnntmZ555ZmVfy0Psxz72sXzMKKaBwSqGmam8xx57bB5n0S9bXmOlzydVY9elNBwvz9nBjr606PCHUe4ZZ5yR9+npfdI56aSTMtJFnmIe8ctYQD7DtU0rwlcdUQAzsYB56pCR1eLIjxKi6IIVspfJH/7DXxzjep1jrJAIv1UGr0yi+OQrBsGpYxylDrFrZDzIF+WI31X5aFs3kIO4m5ZzKv+kc75XzgS0+LzAc9LJJ5+c7bXXXutEMSm/xQBt60caDy9M2GEzNdTjPnJTprTVqmeYNum3bSvRtuOY5oE+r+yzfuF3Etc2+Yj0I404xvX0GPeox3Ge3i87HydzxBHHsvBxr0maxEM9+PjHP57vcBOfv+E68dDPYtiKsWmVo1869dRT1/m8GfJQ9tT96LMijxHXkH1FpBFpxjGu1xk7I0xZfzQpfJe8IeOkOo6fKPM4Rt7iSHmmu3wgU9nL+vBPm/rUpz6V989l/rhGH8F4OMkhE/1tmn6EYV7GzmnUm2DLMXWRpzim9+I87hE2zuMeYznPJaRfrNfM7/hsOrvw4qKcI+yk46zaDHkcimnwi2PKYFxd7CrTpHaEHCFTHFPZOG9azynvvp8F6uQDWdu2sch7HIsM4nfU5WhXcT09RhxxTO/FedyL+LjediyPOIvHtn1k33IgF88/lGG4sn6Le8gcjv4wDcN1uHVpoxE34yrPjuGKz99xfdKxbr3s8kw0SQbvlxOINhbH1FfdckvDxPk029X73ve+fDf6sjwwzrPgKZ07h4xt+sGmabXtJ9qMD23TCh5lx776JOKOfnzcuJD6C/+pXG3KLMKPe4ZI052FfFF34xgyNz3Ocx7H5SXyzSLtNrqBLnPApm2afIS8cYy8RZ2ddh1q2vab+o/8jTsGiziW+Y178Ilz/E1zvCiTi2vI0+W5KfITx7J04l4x/2V+02td9Y7E1aVORr2OYyrbUNwirUlyp7Kk513l6mv+XnxunoXeOrgE0zjGdY7jxo4uLNk1MxZrU5bobmjv/GHkke5gwyJkdpNLXZcxP42neN51vtF0zt82H9FnxLGYj7q/x5UvcUSdmNTewl8c0/Tb5jGNo3ge+Y5j8X76u036bcZ/0pzEM5UrPScfsxxn+urX0jzNw/l6a9eu/QeCxMvZeRBqUWW44IILcktUDLO+8pWvLGo2lFsCElgQAvF5xnnqv1llzI4b7KpBX8iLt7IHn66I2R2PdFhxRBoYGzVxGF3FbnhsZ100Aknjwi+fjSFP+C0a+6R+i+ekwaepiANDJww16vJgZyk+B0dYHp7H7dhHul3SKsodv0mb3Wj44+UJrOs8WEb4eThGHtgxA/5tjIyr8kHcbetGxNm0nCNcemR3rRtvvDG/dNZZZ43qM/WHNkm9TV+qp2G7nAfbJvXjq1/9ai4TBlbxKcNoz+wEQB2r69qkT9x9txVWexAnjnZeZtQ4Lk9t8zEuzkW+B4/o+2ivsUPElVdeme8MSH//5S9/uTKL7ORDeCbnKEwifGWA125EOQzRV0xKu+vYOSl817x1reOT8j/uPmMvnxQlD4yD/LUZh+hnaKfEw8v6IfrEcfkgXdKnflIv+0yfuGfRZmbBdFJd7CLTpHY0rny73uvjWSBkaJqPvtpYpD+tY59jOW2IZ5k2/X+fcvTNrkt7gMl//dd/5fMfns0+85nPdBKvbr2MsmjybNlJsDkKvNzm9lGW02hXUdfRDTCvZ75ed8EsVaBJP9gmrS79RNPxoUtac9QcJorSpMwisknPEOGvj2Mb+fpIdznkkTbGDtTM+ZroBtrOAdu06T7KalIcTetQ07bf1P8kebvcn+Z4MU7OqAvIM4v5YpVsyNNV71gVdx/X55VbV7ngTjsZYv5e5N6lDRTjavN70tjRhOXDDz+cf24OOVhgjjFR2TubRx55JLvssstycYu7NhXz0LQ/LIYv/g7e055v9J2PYr6qfk8q36pwba7PKo8ha5P0o143nT904RlpUgdnMc5Ms1+LMhnqqGFTT2SpFP/xH/+Rf3YO61NWG+gkIAEJDElgHpWfQ+bXuCUggXICVYZN5b5ne7XMsGm2Epn6ohCoa9i0KPlRTgkMTcA2MzRh45fA8iXAp70uueSSPINsX7/vvvsu38zOSc6c289JQSiGBCQgAQlIQAISkEArApdffnmGcRMLDb/whS9U7sTPu/Svfe1rGQbcfNmCHcp0EpCABOoSmO232+pKuQD+nn766dyoCVHTz9AtgOiKKAEJSEACEpCABCQgAQlIQAISkIAEJLDCCbCS9Kc//WlOgV0P+cS2TgISkIAEJCABCUhAAhKQwDgCGCrhmEPw1YQq99RTT+VGTdzv88sKVel5XQISWF4ENGzqqTyffPLJUUxvfetbR+eeSEACEpCABCQgAQlIQAISkIAEJCABCUhgHgmwBT+fi/vNb36TXXrppfln+ZBzjz32KP18xDzmQZkkIAEJSEACEpCABCQggdkR2HbbbfPEmVtcc8012UsvvbREmJdffjm76667sgsuuCC/zmfq+GSdTgISkEATAquaeNZvNQG2zHvTm96Ue9h6662rPXpHAhKQgAQkIAEJSEACEpCABCQgAQlIQAIzJsCnIP793/8945g69FoHHHBAeslzCUhAAhKQgAQkIAEJSEACpQQwUnrwwQez5557Lrvvvvuy+++/P9t0002zDTbYIHvllVfyvwi4/vrrZyeccEJ+P655lIAEJFCHgIZNdSjV8LN69eqMP50EJCABCUhAAhKQgAQkIAEJSEACEpCABBaBQNGoafvtt88+8IEPZBtuuOEiiK+MEpCABCQgAQlIQAISkMCMCWy00UbZ6aefnt166625gROfuH7hhReWSMUuTTvvvHO+U9Mb3vCGJff8IQEJSKAOgfXWrl2bL8vaZptt6vjXjwQkIAEJzAmBZ555JpfE/ntOCkQxJDAjAmzt+/zzz2esdlmzZs2MpKiXbHxHffPNN88222yzeoH0JYEsy/74xz/mCpHXve51o11SBSMBCVQTsM1Us/GOBCSwlACfheClAwZOW265ZcZLCd10CTi3ny5vU5OABCQgAQlIQAISGJYA84sXX3wxT4RNQTbZZJNs1Sr3WhmWurFLYPkT0LBp+ZexOZSABJYpAZWfy7RgzZYEJCABCUhAAhKQgAQkIAEJrBgCzu1XTFGbUQlIQAISkIAEJCABCUhAAhJoSWD9luEMJgEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIYDACGjYNhtaIJSABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIIG2BDRsakvOcBKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpDAYAQ0bBoMrRFLQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAm0JaNjUlpzhJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIIHBCGjYNBhaI5aABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAE2hLQsKktOcNJQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAoMR0LBpMLRGLAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQm0JaBhU1tyhpOABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEBiOgYdNgaI1YAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEmhLQMOmtuQMJwEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQkMRkDDpsHQGrEEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQk0JaAhk1tyRlOAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEhiMgIZNg6E1YglIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUigLQENm9qSM5wEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkMBgBDZsGQ2vEEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkEBbAho2tSVnOAlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhgMAIaNg2G1oglIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggbYENGxqS85wEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkMBgBDRsGgytEUtAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACbQlo2NSWnOEkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggcEIaNg0GFojloAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgATaEtCwqS05w0lAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACgxFYNVjMRiwBCUhAAhKQgARmQODPf/5z9sILL2TrrbdetvXWW89AguWb5PPPP5/97W9/yzbddNPs9a9//fLNqDmTgAQkIAEJSEACEpDAMiUQz/SbbLJJtvHGGy/TXJqtRSBgXVyEUiqX8S9/+Uv27LPPZi+//HK25ZZb5n/rrz/7NfTqg8rLy6vTJ/DSSy9l/K1atSpvH9OXwBQlIAEJSEACy4+Ahk3Lr0zNkQQkIAEJSGAqBB5//PFs7dq12c4775yhFJ8Xd88992Q33nhjLs5ZZ52VbbjhhvMi2sLLcfbZZ2d///vfs3322Sc7+OCDFz4/ZkACEpCABCQgAQlIQAIrjUA80++1117ZoYceutKyb35LCMxqbj+uLs5KphI8C3XplVdeyR588MFs8803z97znvf0LjsLndC33Hnnndk//vGPUfwbbLBB9vnPfz5bvXr16NosTtQHzYK6aZYRuP766/O2iAHxl7/85SVe7N+W4PCHBCQgAQlIoDYBDZtqo9KjBCQgAQlIQAJBgNV5F110Ub57z3PPPZcdffTRccujBCQgAQlIQAISkIAEJCABCUhAAgtAYB7n9vMo0wIUZS7i7bffnvGH+9znPpcbOPUp+80335zdcccdoyjZpYnFT1tsscXMjZpGQnkigTkmYP82x4WjaBKQgAQkMPcENGya+yJSQAlIQAKLSQDFxnXXXZdts8022a677rqYmVjmUnctI8Lj2Op7mu6Xv/xlxuqm/fbbT8XZNMHPKC3Le0bgTVYCEpCABCQgAQlIQAILTsC5RL0CHDe3nxXDcTLVy9XK9JXuolTU1XTVAWGQcffdd+dg2RHqsMMOy975zndmL774Yr7obWUS/79c1+U7qzb1f5J6NmsC9m+zLgHTl4AEJCCBRSUw+w8fLyo55ZaABCQggbEEnnzyyeyuu+7Kfv7zn4/1583ZEehSRnzejU+RsbX5/vvvP9VMsPoQZdoLL7ww1XRNbDYELO/ZcDdVCUhAAhKQgAQkIAEJLDoB5xKTS3DS3H4WDCfJNDlXK9fHbrvtlu244475QrA3vvGNS0B00QER0e9///vsr3/9ax4nn6d/17vela233nrZZpttlm255ZZL0lqJP+rynUWbWonlMa95tn+b15JRLglIQAISWAQC7ti0CKWkjBKQgAQWkMAvfvGLBZR6ZYnctYz23nvvqQN75ZVXst/+9rdTT9cEZ0PA8p4Nd1OVgAQkIAEJSEACEpDAohNwLlG/BKvm9rNkWCVT/VytTJ9veMMbsuOOO6408111QOnisq222qo0jZV8sQ7fWbaplVw285Z3+7d5KxHlkYAEJCCBRSGgYdOilJRySkACEpgDAr/+9a+ztWvX5ttMs731Jptskm2xxRbZ29/+9myjjTbKJeQ62yr/7Gc/y3//8Y9/zB555JGR9Jtuumm23XbbjX5zwqqvp59+OvvDH/6QvfTSSxmrV1hZRrychyPt559/Pv/JTkEbbLBB3FrnyE5RbO3LyrE1a9asc7/sQp38RbhHH30032r7He94R573Z599NmN1FkcUSW9+85vzz/CFjMiC/Pghn8i19dZb59t2R5xlx7psImz4p2ze8pa35JefeeaZ7LHHHstefvnl7PWvf3227777Ni6jiD89BgPywV+4kCHKmhV9v/vd77Knnnoq32WJvKMEY8vy9devv3kk25vffPPNWWytTj2DZbgoi/gdx7/97W95/cIgCkUcW6aTPvWL1YXjHP6Rm7IjHj6tuO222+bhx4Uruxe8Qs5FqjN89q+OQ5H36quv5l633377dcoXhtSFaMvUBZjSJ7zuda9bkkTb8l4SiT8kIAEJSEACEpCABCQggbEEmPMwV2JOzjM586W3vvWt+Zx1XEDmZTzbM6/hb9WqVaP5EnqC1P3pT3/KfvOb3+SXiHv16tXp7fyc+ThzVlzZXILroVtgPsc8osq1mUs0yU9VumXX0QXAFkbPPfdcPp9lrkwe3va2t62j12DOBCvmuuhT+A1P9BpvetObypLIinNN5ltRNhtvvHEeDh0F+oAyF+HTuX1Thm3kLpMlrpXJhG4BPcAkx+5BZaz6nN+HDG3qzVA6E2SKuNF10I44ImNTPV3kL460zSeeeCJ+5rot2jWuTO/GvaiDnKMnC30KfUWZC9nH6bPq6iaIH30Tn89DDv6oP1E3Uh1WmSxcq1tf6vJt2qaayBB5iHaDvov2Tv5/9atf5X0QfdEOO+yQ6yvD/7gj5fb444/ndQqDLPotyrqox4s+vW35Na0r9DXkE0e/xphV5tCF0ucyrrG7WOqCU+jnkB3dH301+aOekK9JO5GFoRrhOEeXjc5wUv2K9NM+F/mCYVd9atOyS9l4LgEJSEACEphnAuVPkfMssbJJQAISkMDUCaBMu+iii3JFXFniTPoOOOCAfKvr888/P0MhGY5J5GWXXRY/84nh6aefnv9m0nj99dePFJwjT6+doIA75phjMiaaOIyVbr311vz8hBNOyJU0r3ldcmBCeckll+TXdtlll4mGTU3yFwldeumlueEUK+Ew4opJddzniNLmjDPOyI21zjvvvNJPp2HQQV6Kit2mbCJdZLnxxhvzPJ9yyikZ5UFc4VBCoIyqW0YRruwYDPbaa6/s0EMPHXkJGcj/Bz/4wbzuYLBWdChyjz322HziX7xX/I3M5AVFTLhbbrklTvPjhz/84ZExV9ygLiBnKMjjOkfkI/0qhcMdd9yR3XDDDUvSjPCsrjrooIPWUejE/bJj8FrEOlNHeXjddddlMMNRrzE+TB2KedolSvaiQ1kEl1A+ty3vYrz+loAEJCABCUhAAhKQgASqCVx11VXZAw88sI4HFugw5znwwAPXuccFnu2vuOKKyt10mSMyX4qFPhgVhF7gAx/4QLbnnnsuiZcX1RdffPHoM1ennXZabvSTesIwKOJAtkMOOSS9PTpvM5domp9RYhNOeEkNp3ROngbB8AR9QDjmVJQHL8jLHHOs448/fp15aMw1TzzxxFw38dBDD60THP0Kcy6MqYouwsfcvinDtnIX5Uh/F2XiHgvdog6kfovnfIqNvKau7/k9cbetN0PoTCKvETe/zzrrrHyxYBM9XcSTHpnHo/PCgCcceqdw6OzQP4W76667cl0f7broMNKjbDD+KLqQHSO+Kn1WHd1ExIvBJrL/+c9/jkuj46677podccQRoz5qdOO1kyb1pQ7f/fffv7FOq4kMIX+0G/pQjFuuvvrq3Dgy7qP/whhokkP3yl8sXBvnnz4Jg6k25demrmAgFv3AYYcdlr3vfe8rFe+ee+7J7rvvvrwN0BZSF5zofzHewl/RoetmrKoaazAYu/zyy0v7a+rXuIWUkX70uZF2MOyiT21TdpG+RwlIQAISkMC8E9Cwad5LSPkkIAEJzJgAhiRM1FAi4ljxg/EBCkqUSijq8MOkC4exCpM3VhiixGDHpXTSnCovUC7Eqk3iJQ6OrKohXoxRrrzyyuzTn/50vivSbrvtNjJsQtmHErDMpUo8DJvGuab5K8YFG5Q7rDhjZQ75RWlJ3sgHBk1MulEosKsVeWRyjB9Wi7GDE8YzRx111JKom7JZEgEu1hkAACAASURBVDjL8jRR4IQClRVvrFKifDBuqltGxXib/Cb/5557bp5PlKgoUMh7rGTC6A0l75lnnrmOYraYDrKzWgqWhMPBm3jDFY3DuH7hhRfmipiy9JGP8iP9osIB5c/999+fR03aYXCDUQ4r3lAwUT+PPvroSL72cRHrzKTMoTiBCY42fvLJJy9RENJ/fP/738/Z4YfVmqxAw+CNe7R37n/iE5/I77Ut70lyel8CEpCABCQgAQlIQAIS+F8Cd955Z37CHI3nc3a9YN7KfI25PM/4zLmK826e37/3ve+NjJCYazHPZZ7EHIuwxM1clIU+zLWYy5EO82+MZoqGTbwgZn4cjp1giwY46eKcWPwU/tNj07lEm/yk6VWdw4I5TuQLHQqc4cCcFoOBYj7QD4RRE/NnFoAQPvQrGJcw72IX5jIXL8tJi/AcWchFuTJ/xQCDuVox3WJcTRl2lbuYftVv9EXsRFPmMGJJWad+hpjf91Fv+tSZpPktnjfR0xXD8ps2TntkB6PYRR0dCeWBS3V+6PAefPDB/Dp1nbTR1RCO8BiD0S4wwivuopMHmqDPCj91jhdccEHe56APo3+j/6HcaHvoFGkbsfAyja9pfanDt2mbaipDKj/n6EUffvjhPM/0AxiU0bfQB01ylF8YrlGGtDn6InaCR3cTDgNC4mWcSB16uyp9ZOqvj7qSxtfmHAMp6gX5LI6DXKe/pa6T19SxAxrGuGHsBx/Ck3fqWJnBcBp+0nnbvqFr2U2Sy/sSkIAEJCCBWRPQsGnWJWD6EpCABOacACtXUBDh3vve92aHH374EomZ1KJg5LNiOFbL4M4+++x8MsfOLSjOyhyT4z322CNXkLz73e8eGbcwMWQSz0QQwweUnEwiUUSggOM3f0wYMY5IHRNPJu84/KNAHeea5q8YF7JiyMEqHwyGcCgMMehhMsvKVBwrKzGCiU/roUBBmYOCkYknXNPtuJuyyRNJ/qEw4g8lA6unwjAn8VKrjFL/bc5RLLKijh29UBTgMNpCAYByFkaUQdSfqjRgfOqpp+a7dqEgwR155JGlq/zSOFBYjUsfZQF1KU0fRX4YNaGgo2yjnlFe7F6GH8qN+psq8dK0q84Xuc6U5enuu+8eKb1QnrOyMup5+Md4jxcdvNRgVeTuu+8et/KVcddcc03+AuQnP/lJHr5teY8i9UQCEpCABCQgAQlIQAISmEiAF7HsYpvOF9kpOeZct99++zqGTT/96U9HBiQY2LCrUywUYb5EWHQI/DGnZ4FSLHjCAIZ5IHOiCIOQxR2QMWwK3UJkIgybmDejZ6hyTecSbfJTlXZ6nV2MwtAGBuQn5vzMU+FQzAe7usCN3T6Yy4dj3vzd7343N8hgHlpl2IQ+hDkZc9jUgIGdsilLuGOwMMmwqSnDrnJHPicd0fGgFyg65pr/8z//k/OGccpnqPl9X/WmL51JkUn6O9pSHT1dGi7OmcPjMJZhcRqOxXmxwDG/kGV53aV+4jD0wHiJ+hiOXXGuvfba0dwfvRdGN0VXR59VDFP2m/aALor6Gf0NcaOPYtEaRpbog9L20Ka+1OVbV6fVRoZi/qMcYue9Ms7FMPGbvgIHs89+9rMjXSe77UVfwn30aDvvvHMEGx3rlB/9XMjYpa6MEm15Qh2hr2QXsdRAKx0HMW4qGjah46I/xbGDPTsvhcOoFyNTOHRxbfqGrmXXRV7DSkACEpCABKZB4H/fME4jJdOQgAQkIIGFJICCKFzZaiomoBh3hJIg/NY5EgYFCStAw+iFcFx///vfP4qCFV3hwiCCCWRMguMeR5SdGBbhJu3WhJ8+8odCJ4yaiJPVbOn22OzUlBo14QeFXGyXTF4wdEpdGzZpeM5RHn/kIx9ZoqQu+hn6N6v6UHSn5QuPdCvnWPE3hCx10k9XnCFDrExDIYpyI4yauMdKPwyqwpVtVx33xh2XS52hDaKYxNEXsN15rNqM/KPUYTUbjvYbbTju8zv6FpSKXZU/Ea9HCUhAAhKQgAQkIAEJSGA8AT4dnho14Zv5ebzoL87VMARgYUr443NzqS6A+RILHZjz4Zhb8eIYhxEDjoUu6eepuR/zhZCFOQEv98MxZ8YQCPeWt7yl1Bgi/DY5dsnPuHSQNTjx8h/OYdREOM5hzC4uqcMv8+fUqIn7GIfstNNOuVd0B/FCPQ0b58w1U6Mmrh988MGjMoUr+e7T9SF3F3mYk4ZOBSODNP9DzO/7rDd1dBbFdtiF1ZBhMfYIVzRq4jpz/9CVoecbp0/pQ58FWwyb0j4K3R2L/8LddtttcZofh6gvSxKo8aMvGeKTnU2MmuifY5d0Foqmuk5ETw2ZYiFnWZYmlV+fdaUs/SbX6DNToybCpuNgUWfIeIWxKY5+OTVq4hqLH+mHurqmfUNfZddVbsNLQAISkIAEhiSgYdOQdI1bAhKQwDIgkO5Gc9VVV42Uc0NnDWOSUPyxa1M4DCBQluLKDJuafIaOOLrmD8VrugIt5EyvsRsVk/qiS/00MeaoYlOMn1WKZZ9nK/ob8je7fJW5dGVfk7yXxTXuGkZ3ZS5NPxSg4Y9VxDgUzRigFR1lHnWwjYJxOdQZFIOsoqZPwKHswqiprL4FT/xV1YcwbMJPG6a5EP6TgAQkIAEJSEACEpCABGoTYD5a3DEoAsdLXhYCpYuB0hfZxZe5EZa5byxmYC4fC5XCsAl/sfsS5xgBxefX0p1V0l2cSDfkCKOrSK/LsUt+xqWbxrvPPvuM81r7Xhjr8Km/YFEMzDyX3ZbKXPr5P3YunparI3cXWdhZJXRDzCuLOoCYj/Y5v0/Lt2k7KOa1ao6c6iyG1JkU5enyO7jAOtV3pXGywC8Mbdi1p8r1oc9ip7Qyx6IsjEZwqZElv4eoL2UyjLvWhwwsOMOoq6mLXeYIF+NAGkdqdMkOfVVuUvn1WVeqZKhznXq6Zs2aUq+R/+I4mNaZqvbLrv0seu3iquKu6hv6KrsuMhtWAhKQgAQkMDQBP0U3NGHjl4AEJLDgBDDsQCnJSiomreeff36+3TQKAnZEKjPYaZplJu1MDFF4orBhW3b+YmVnGh87/7At+6233pp/2x0lKCs2cUziQvnJyqIyo5Q0Ls675q+4einiT7lUyZH6qVpx2YRNpB3H4BK/Z3GsyjuKLAzXqsq5L1lTpUsaZ1X67PYVygCU7RdccEEabHQeCpziyq2RhzEny6HOkG8+QUe9hSVGTVX5ihcZIOFTc+nuXYEpNWZK/cd9jxKQgAQkIAEJSEACEpBAvwSq5kqkku7CiiFNuPRZPXZXinvpMTWuYe6AcQvX2MmJXSXY8SYMfmIOz/yYnX9YfITBAwsp2L0Il+4wlBpIpWm2Oe+Sn3HppfGmLMaFiXvwYUcQFuCgH2HuSRkUF+SE//Q4rkzT8qoTVxpvnfMucteJv8wPbPisOQ4jAnZeSd1Q8/u0fFOuadqcp2Uf7aDoZ9Y6k6I8bX9TFuh3cGEQUhYXfQCGRex4M06f0oc+i3SqHAYt6HwwWqHuItdQ9aVKhrLrfclAvSzuCFeWXvEaCynR7dD3pHqa8PfYY4/F6ZKd0UYXXzsZV35915Vi2k1+j+szq8bB1NCwqv2zGJC4Kc+2rmnf0FfZtZXXcBKQgAQkIIFpENCwaRqUTUMCEpDAghPg01tMbPlWN5N+Vvex1TdbB2P0xGfj2kyYUVSyxXJs4VsXE0ZVbBeNUcUDDzwwMmxCIRqKlDqfoYv0uuQvdu6JuMqO6WS47H7ZtbZs0rjGKXFSf0OeM7GepWuafqqgpK7zabRxLlXyj/OX3lsOdYZVseEwQHzxxRdz5WRcS4+p0jxdmZ36Sc+jDafXPJeABCQgAQlIQAISkIAE+iVQZ15STDHmSyxu4K/KpXHHDsy86GWXFOYSLOBhHsGihzBsYpcXfrPjMYZN6AlIj5fDMY9AL7HVVltVJdv4epf8jEss4sVYInaiHuefeyywQc/yyCOPjPQak8IU76fci/cw/IEv3NMX80V/TX/3IXfTNMP/lVdeOdrtC6Om4g4pUQ7473N+H/G2aQchexyb6iwi3Lwd03l/uoivTE7qKe07+oYyP33os4r1IU0n3W0afQZtNcoVf33WlzTdSed9ydCFH30xi1sxsLz66qvzz63R7/L7zjvvzLNAf86uRFVuXPp915UqGepcb9P+ov9E11t3HKwjS9FPG9n6KLuiHP6WgAQkIAEJzBMBDZvmqTSURQISkMAcE9hvv/0ytozmU2/33HNP/s11FFhMajHCOf300yt3bCnL1uOPP55dcsklo12Z2GGJ1ZlM3FByYCj1ne98pyxovssSqzQxOvnZz36WHXbYYfnOUQ8//HDuHyUK30Nv4trmb9wkNtJnwt/EdWGTplNHttT/EOezlqFp+uluQqwwm1SPJinsypjWkWkR6gyKP1Y2YmB42WWXZZ/4xCdKP0WXMqWtTnKxJfwkf96XgAQkIAEJSEACEpCABNoTqGtwk6YQhgKT5itVC0CYx2PYhC6BTxERD7t34OIlOcfrr78+v4augc/xxCer+tytiQS65icXsuRfzIHKdqEu8Z7rRS6++OKRARdGFzvssEP+OS+MuZh7YWjAwq5xjvlZlaNMQp42ZV8WL/H1IXdZ3JOusYMwuhMcn59LP28eYaMc+N3n/L7PelNHPxD5medjuqBvUv9QZzFTH1yq+iE4pjJEWkPVlybl1pcMkacmaYdfPmH39NNP53/3339/xl/RHXTQQVnVbkX4HZd+33WlKFv8xjhtkhsnZ1XYKKPoT6v8TWoHVeHiehvZ+ii7SN+jBCQgAQlIYB4JaNg0j6WiTBKQgATmlABGHCgV+UOBdN111+W7N7GiCMXjcccdV1tyPiXHJJCJ3kknnbSOEmrSBJSdojBsQhmBspNVKaHUwhilzQ5SfeavNogSj13ZlETppZoE0lVlfC4BY75FcNOuM2wtf+qpp+afo7vlllvylZYYN/FJuqLyJmVK2xy3ingRWCujBCQgAQlIQAISkIAEVioBXmTHjkKvvPLKkk/WpUxiRwuupZ/6SQ2T+Kw8Bk44XuCGYQrzB3YHee655/I5PnOPMEJIw6fptT3vmp+qdCPP5C8+c1Xll+sYbsWuVBjgnHLKKevs9MSirkkujMTK/KX3qj5xVBZu3LW+5B6XRtk96gb6KBzz9kMPPbTM25Jdhfuc3w9Vb0ozsSAXabfo1NDlsQPSOBf3o52M89vlHjtCpfqINK5oD+gvMB7EpX77rC9pupPO50EGdDYYLp1//vm5uGEISb9B37zvvvuONWqqk8e+6goL7apcOg5V+WlzPfpP6jp9fJX+OepYmzTahhm67NrKZTgJSEACEpBAXwTW7ysi45GABCQggZVFAIXiGWecMVJkspqnzIWisniP1Zm4bbfddqTATP3wubtxDqVnGEiwUxOrPmNCu+uuu44LWute3fzViqyhp65sGiY3UiY3DTdr/1V1q4tcKFdiS3IM58at8OuSTt9hp11naB+sUmU1GLut4Z544onspptuWidrKATDYYTY1g1R3m1lMZwEJCABCUhAAhKQgARWIgHm7+HGPdun99IX9bwQjt8YNj322GN5dCxUSl8O8zk6HJ+siwVMGCC0NWyqmkt0zU+wKB4jj1xPWRT9xe+nnnoqTnOjgTAkGF3Msmzt2rXpz9Jz/IQRWNFD+jnxeDFf9DPudxnDvuQel27xHnP0yy+/PJ+rs3PKscceu44RWIQZan4/VL0JuYc+lpVl1zRpn7GDD58sC/1cMV50ffEpsrSdFP318Zv+o8whW/Qr6BVjZ5y+6ktdvmX++pKhLN91r2G0etFFF+Xe99577+yf/umf8r9PfepT2QknnDAq57rxFf11rSswCldlPEQ/+Pzzz4e3Xo9p/xn1qJgA/dRQ6RfTSn8PXXZpWp5LQAISkIAEZkFAw6ZZUDdNCUhAAsuEAJPJN7/5zXluYiveyBpbpeNQdJXtvsREFodCo2z73htuuCG/X/WP9MKACYOKBx98MPeKYmS77barCtbo+rj8NYqooeeubOomN6mM6sYzTX/pltVVCoSu8sQnEFjdxW5Ei+CmVWeKLEgXRXJsxX/bbbeNFIThl5cUoZjH8KlK8RT+0+M0yjtNz3MJSEACEpCABCQgAQlIoJoAuyfF3OP2228vXSTDoqdHH300jwR9AZ+bT10YJzGfiwVNMQcLf/GbF/933XVXfhljkpjDhr9xxzpziT7yUyYDeQxOzJHKdCJl4bjGjthFx25O6D0mOXaHKvtsFNf5dBsOXUrdz3/XYRgydZE74qhzvPnmm0dGXiy0CWOaqrBRl/qc3w9Vb6ry0Nf1aD9Verqu6YTBF3q+snqIQRHlF44dnYd099xzT6mhH7vOxW4+73znO5eI0KW+1OFbp011kWFJZlr+oL+JRX7slj+E61JX0D+FIWyVXvDee+/NMPIZwqX95x133FGq06b+D5X+uDxNo+zGpe89CUhAAhKQwNAENGwamrDxS0ACElhwAqyg/OY3v5kbeKB0RLHIBBdFCAoJdrXBbbPNNktyGltK45fP1LHVNAZML7/8cu4vdnFha2iMmH7/+9+P4j333HPzlZlLIiz5wQQbZWHIg5dddtmlxGf1pbb5q46x+50+2NSRYlIZ1Ylj2n5CZtJ96KGH8tWvKMeoV2UGcm3kO/DAA0c7kfGJtx/+8Ie5EhmDHBR0rPrDQOfss88e1f826fQZZlp1pkxmVjhi3ISjLFg9G1vLc41t3dmqHEc5we2+++7Lnn322fw3RxSLl156aXbeeefl/uLfNMo70vIoAQlIQAISkIAEJCABCYwnwOKfI444IvfEbhTf/e5387lSfH6Kl7nnnHPOKJKyT4SFYRNzB/4wtIkdmiIgL71jh+bYgSjChZ9JxzpziT7yUyYH87PddtstvxWc2LmJ+SSfb8PIiHkTu0/jtt5661E0GHKx4w35Zg5655135nPSkYcJJz/5yU9yXQ06FuJg/vqDH/xgZMjBArF0x5Fx0U1i2Kfc4+SIe+QFgzocn8RCJ4TRVvEv3QlniPn9UPUm8jnUMcqzSk/XNV3m/ZQL7kc/+lGuN4l6iMHjhRdeODJ6ZAEUf0M69BJpH0V7wtjpqquuypOl79lvv/2WiNClvtThG35ItEqn1UWGJZlp+SM+zUfw73//+/kn6eiv+LviiityHS99F/WoretaV8KgkV3qrr766rx/QydIfUPHHJ+qbCvfuHAYNobxGf059Ro54IGBJwsk6Ydn4aZRdrPIl2lKQAISkIAEgsCqOPEoAQlIQAISKCOAQoiJIYYcZZ+ZIgwrjt7//vcvCb7HHnuMdlFipQx/GCGxo9KnP/3pXHmAwQiOFS78pS62g0bxV+WYsKHcDOMq4t95552rvJdeb5u/0sh6uohipSubOqJMKqM6cUzbD2WO8osyR0l18cUXj0Q47rjjsh133HH0u+0J9fmYY47JFTassGK1caw4LsaJAnUe3LTqTFVeaYfIgCEYxkuXXXZZdvrpp+cvKQizzz77ZCgyUebD9JprrimNqrgV/TTKu1QQL0pAAhKQgAQkIAEJSEACpQQwJmG3E579n3vuuYyFSUXH3BwdwZo1a4q38k9ZY1AQC1P4tHXsdJJ6xtgJPUK4pkYQdecSXfMT8hWPGCcwB+IP46Z07hp+kRHHfIoX9fhF/xKfgQp/HGHJS/Rxjrks8y0WoaU740QYjE7Y5aium8SQHXf6kLuuPBh9YQyHo+7953/+Z2lQ8slns3BDze+HqjelGerp4tA6INrxKaeckn3ve9/LjfIw8CjbBZvyOfzww3vKVXk0q1evzjBAYyFVVR918MEH5wux0hi61Jc6fCe1KXRaXWRI89L2nPJhVyR0O/xV7YqEAdFpp502+rxok/S61pVDDjkkr2f0BxjUFncIY4zBAIk+dQh30EEH5XEzFsKnyIgxMPrGIdKvinMaZVeVttclIAEJSEAC0yDgjk3ToGwaEpCABBaYABNBVhoWt48nS0wUd9ppp+yMM85YZyLLlvNHHXXUEgVlrMYkLKtbjj766AxlQ+pQPKDA/OhHPzoyUonv3af+4jw+R8dvFKKhGIz7k45t80fecXEsppNeT89Tf+n19LwLm2DFJJq/cW5SGY0Ly72QOY7hv64M4S+OEX7SkXpV3C48lSfim8Qg/MUxTZf4UYSiVCpTsnON3cFilVgatuo8OMWx6C+9np6n/tLr6fm06kykWcaMFxfxGUhW0rIrUzj8n3TSSfnOTqxeLqubsNxzzz0jyOg4qbxHHj2RgAQkIAEJSEACEpCABCYSiGf6OJYFiHs8t8d56g+jHV4sF+ffPPez2xI6guJOKBGeOX980p5rVZ+jih0x8MP8Kw0TcU061p1LdMlPlQwYBqDX2H///dfRp8AA/UXkCcbMl8pYsMMLu2Sdeuqp+Txq3DwXw4rjjz9+Hf0M6TF//djHPjbaCSuVO8o4jum9cQy7yh3pxTFNN67FkXvpeeq3eF6cbw4xvyfNtvUm5tPjypL4w18ci/ks+x1+y+LuqgOKuFPZijLQJ2Dsgl6vWA4sYGTOf+aZZ2bpzkURR8RfJnv4mXSMOGhL1HeO1P/UYfxx8sknZ3vttVd6eXTetr7U5TuuTYUQbWWINhLHiK/uEUOg//f//l9u0EQY+jGMSumP3/Wud+U6n9CRYdTDorZwwb5u+XWpK4wz9InprnHIQb7R81K+MQaFXCFn+EuP6b04D4bkJ87jHnot6jH1Kz6Lxz38ItOHPvShvO/nWpP0w+8khuEvjqTTpewiXx4lIAEJSEAC805gvbVr1+bLHIqfEJp3wZVPAhKQwEonwGfhcNPsv1k5yGodDJQwdIpdlcaVBasw2XWJLZ9ZdcSOLOnEi7jYeYcJMfGVKTfGxc820j/+8Y9zL3wOC0Ortq5N/tqmVSdcVzZ10sDPpDKqG8+0/bESlTLDUR/LjO/6kon6y2cTKROM8fgrKjb6SqtLPNOqM11kJCxbdLNqGXlRAsVqynHxTrO8x8nhPQlIQAISkIAEJCABCfRJYBZz+77kj/kHc3pedjPfn8d5Ut25xJD5YbdfOMEnPiVeVg581o95LrJggJG+NC/zz7WvfvWr+bweQ434/B/xoItZtWrVOoZOVfGMuz6JYRu5x6U35L2+5/dD1pshOExLBxR1kJ3S6RswkpmVQ/9AG8TopE6bSuVsWl/q8p3UprrIkIate049/ta3vpXrajAGY/ctjLUwskkd+fv2t7+d74bF9bPOOmsd47HUf53zLnWFcqV8w6iIPm+aDm702W3rVx+yzrLs+pDfOCQgAQlIQAJ1CUx3lK8rlf4kIAEJSGAuCaCI4K+JQ2k3LhwTT1bpFFd61kmDiVvsCsOkO13RWSd80c84OYt+p/G7C5sm8k0qoyZxTdMvhnKxwnXodDG642/e3bTqTFcOGDc2NcqcZnl3zZ/hJSABCUhAAhKQgAQksBIILMr8o+5cYsj8YPgVO52MqxvoNprsDFwVF/E0nXNVxcX1SQz7knucDH3d63t+P2S96SvPaTzT0gH1XQfTPDQ9H2dMOCmupvWlLt9JbSqVq6kMadi653/4wx9yAyH8s2i07FOi3CN/7G5+44035lGzCJCy7uK61BX61WnpBsvySPvvUr/K4mx6bZZl11RW/UtAAhKQgAS6EPBTdF3oGVYCEpCABGZK4K677spidStbrk97Vc5MM2/iEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQ6EmBn7XDjdtNnkemTTz6Zew2jvgjncTYELLvZcDdVCUhAAhKYPgF3bJo+c1OUgAQkIIGWBJg8s+Ux2/v+/Oc/z2644YY8JnZ/Yct1nQQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCdQnEJ++5NOBt99+e/7Zvre//e1LPkX3xBNPZHfccUf2q1/9Ko94n332ydDJ6mZLwLKbLX9Tl4AEJCCB6RHQsGl6rE1JAhKQgAQ6Erjllluym2++eZ1YjjzyyGz16tXrXPeCBCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJVBNg96VDDz00u+aaa7KXX345u+CCC/JPzKFvZUcgPjmX7gz0jne8IzvwwAOrI/TO1AhYdlNDbUISkIAEJDBjAho2zbgATF4CEpCABOoTYLem1DG5Pvjgg7Nddtklvey5BCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJ1CSw++675wtH2ZWJz8395S9/yf8iOAY02223XYa/7bfffsluTuHH42wIWHaz4W6qEpCABCQwXQLrrV279h8kuc0220w3ZVOTgAQkIIFOBJ555pk8/Erqv1kZ9MILL+SrhDBq4pvvTKp1EpCABCQgAQlIQAISkIAEJCCBRSSwEuf2i1hO8yzzU089le+ksvnmm2ebbbbZPIuqbBKQwIIQePXVV7MXX3wx371p1apV2SabbJJtvPHG6mEXoPwsuwUoJEWUgAQkIIFWBDRsaoXNQBKQgARmT0Dl5+zLQAkkIAEJSEACEpCABCQgAQlIQAJdCDi370LPsBKQgAQkIAEJSEACEpCABCSwEgisvxIyaR4lIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggcUioGHTYpWX0kpAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSGBFENCwaUUUs5mUgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpDAYhHQsGmxyktpJSABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQksCIIaNi0IorZTEpAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQksC2DuwAAIABJREFUIAEJSGCxCGjYtFjlpbQSkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJYEQQ0bFoRxWwmJSABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQksFgENGxarPJSWglIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCawIAho2rYhiNpMSkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJYLAIaNi1WeSmtBCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEVgQBDZtWRDGbSQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCSwWAQ2bFqu8lFYCEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAIrgoCGTSuimM2kBCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEFouAhk2LVV5KKwEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggRVBQMOmFVHMZlICEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAKLRUDDpsUqL6WVgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpDAiiCgYdOKKGYzKQEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggcUioGHTYpWX0kpAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSGBFENCwaUUUs5mUgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpDAYhHQsGmxyktpJSABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQksCIIaNi0IorZTEpAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSGCxCGjYtFjlpbQSkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJYEQQ0bFoRxWwmJSABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQksFgENGxarPJSWglIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCawIAho2rYhiNpMSkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJYLALrrV279h+LJbLSSkACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQALLnYA7Ni33EjZ/EpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISWEACq0LmzTbbLE49SkACEpDAAhB44YUXcintvxegsBRRAhKQgAQkIAEJSEACEpCABCRQQsC5fQkUL0lAAhKQgAQkIAEJSEACEpCABBIC7tiUwPBUAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpgPAho2zUc5KIUEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkkBDQsCmB4akEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkMB8ENGyaj3JQCglIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUggIaBhUwLDUwlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhgPgho2DQf5aAUEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkEBCQMOmBIanEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkMB8ENCwaT7KQSkkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggYSAhk0JDE8lIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQggfkgoGHTfJSDUkhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACCQENmxIYnkpAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEAC80FAw6b5KAelkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQSAho2JTA8lYAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgATmg4CGTfNRDkohAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCSQENGxKYHgqAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCcwHAQ2b5qMclEICEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISSAho2JTA8FQCEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISmA8CGjbNRzkohQQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCSQENCwKYHhqQQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQwHwQ0bJqPclAKCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSCAhoGFTAsNTCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSGA+CGjYNB/loBQSkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQQEJAw6YEhqcSkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQwHwQ0LBpPspBKSQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCCBhICGTQkMTyUgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCCB+SCgYdN8lINSSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAIJAQ2bEhieSkACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQALzQUDDpvkoB6WQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABBICGjYlMDyVgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABOaDgIZN81EOSiEBCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJJAQ0bEpgeCoBCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJzAcBDZvmoxyUQgISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhJICGjYlMDwVAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKYDwKr5kOMxZXiH//4R/bss8/mGdh8882zDTfccHEzo+QSkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKYEwJzadj097//PfvrX/+aI9poo43mBFW5GE899VR2zjnn5DePOOKIbLfddht5fOaZZ7LHHnsse/e7351ttdVWo+vzdvLqq69mjzzySIaR1q677pqtt9568yai8khAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJrDACc2nYdO2112b3339/XhRf+MIXstWrV89tsfzmN78ZybZmzZrR+SuvvJKde+652V/+8pfs97//fXbUUUeN7s3bye23357deuutuVhve9vbMnae0klAAhKYFQH6zeeeey57+eWXsy233DLbYostsvXX98upsyqPeU73pZdeyvhbtWpVXlf6lJXdGDH4pf697nWv6zPqmcY1JLOZZmzOE1+u9WnOsSvejAjYz8wIvMmWErD/LcXiRQm0IvDnP/85e+GFF/LFcFtvvXWrOAwkAQnMB4Hnn38++9vf/pZtuumm2etf//r5EGoOpOjaz3UNPwcI5kIE6+dcFINCNCDgHLgBrDn1ukj9zjzJ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IAEJSEACEpCABCQgAQlIQAISkIAEJCCBDUdAxaYNV+RmWAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAqtPQMWm1S8jUygBCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIIENR2CPDZdjMywBCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEBhJ4+umnix07dhSbN28u9txzz4GhrN1jv/rVr4pt27YVmzZtKvbff/+1S4gxtxJ49tlni+3btxf77LNP8frXv77VrzclIAEJSEACEpDA7kxAxabduXTNmwQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAApMRQCHoy1/+chneGWecURx99NGThb2sgO69997i1ltvLaP7zGc+U7zuda9bVtTG04MA9eyVV14pjj322OLUU0/t8aReJSABCUhAAhKQwO5FwK3odq/yNDcSkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQksiACWmsLl87jmUQISkIAEJCABCUhAAhKYloCKTdPyNDQJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKoEHj00UeLb3/728ULL7xQueNPCexMAAs1N998c/HAAw/sfMNfEuhJwLrUE9iCvFsOCwJrsBKQgAQkIIENREDFpg1U2GZVAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkMBaELjrrruKe+65p3j++efXInrjXEcEHn/88WLLli3FD3/4w3WUapO6igSsS6tRKpbDapSDqZCABCQgAQmsZwIqNq3n0jPtEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgARWnMBLL71UPPHEEyueSpO3KgQeeeSRVUmK6VjnBKxLq1GAlsNqlIOpkIAEJCABCaxnAnus58SbdglIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEuhHYPv27cXPfvaz8u+5554r9t133+K3fuu3igMPPLDYc889dwnsv/7rv0q/v/7rv1686U1vKl5++eXy95NPPlls27atfP4Nb3hD8ba3va14zWt2/pb2l7/8ZXHbbbcVO3bsKMNlgZvwwr31rW8t9tprr/IaaYo4uP/0008XbGH34osvFq9//euL448/Ph6bHYn/qaeeKrZu3VqQr/3337844IADit/8zd+c+cknP/rRj0p/Ee/Pf/7z8nni2nvvvYs3vvGN5fPEV+fi+be85S1lmmDx2GOPlTzYbumwww4rfud3fmenR8emkTIij/CB72/8xm8UBx10UHncKaLKj77lDEPiog68/e1vr4T2vz/JIwwoT/K53377zfxV6wk3upRhBECYlHdYaoLbQw89FLeLffbZp6yjswtFUaYDLsTD3x577FHW5d/+7d8uNm/enL32PidcmETdIL/Ura6uS7lTRvDEUWdph02OdDzzzDPl7YMPPrjMa/jtW9bxXNuR8hjCNtrI0DbWlibu/eQnPynLJay//dqv/VpZ1rRJZAluSF0awnDReQ0WIVcpf8rk2WefLfOKvKJevu51rwuvBW304YcfLn8jK/DT5AgHGYhDfudwmp6J66tSDlW5gyItfROcfvWrX5V9AgzaOESePEpAAhKQgAQksLoEVGxa3bIxZRKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJiXAIvDVV189W8zOgbMIfs455xQohWSHcsmtt95aKl2cddZZxRVXXFG88MIL2Ut5jmIGz8cCMgvfX//618uF9vB8xx13xGl5vOiii0olnYgD5aqPfOQjxWWXXVYq84RnlFqqik1sb0e6WMivuuOOO65473vfu4ui1Te+8Y3S//nnn18u/v/Hf/xH9dFSwencc88t3vzmN+9yL57/6Ec/WjL41re+VSpKhUcUq7Ji05g0nnfeecV//ud/Ft///vcj+NkRRYdjjjmmOOWUU2bX8smQcr777rsLeKAc8md/9mc5uNk5SmYwwL3//e8v0xA3h5RhPMvx3/7t30qllbiGEsc111wTP8t6Qn0JRx6vu+66UokhruXjscceW7zvfe8rXvva1+bLc89RVqNcs1JVPITy2xlnnBE/G49dy524yAN1mHpzySWXNIZ50003FWzptWnTpuLTn/70TLFpSFk3RvLqjTFso40MbWNNafvFL35Ryp5Q7qr6o02ceOKJpZwYUpf6ykXiX1Req3mLuELpL99HsQtZgdIp7n/+53+K66+/vjwij/7oj/4oe9/p/N///d9LZUIufupTn+qk2LRq5RByh34LmXTllVcWKDdV3RFHHFGceeaZs3ZTve9vCUhAAhKQgARWm8BrP/e5z/0lSQxN9tVOrqmTgAQkIIEg8N///d/l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
<h2>Cheatsheet</h2>
<table>
<thead>
<tr>
<th> </th>
<th>Vertical Hierarchy</th>
<th>Flat Network</th>
<th>Relational Databases</th>
<th>Single-Purpose Networks</th>
<th>Hierarchical Network</th>
</tr>
</thead>
<tbody>
<tr>
<td>Structured data</td>
<td>💎💩</td>
<td>💩</td>
<td>💎</td>
<td>💎</td>
<td>💎</td>
</tr>
<tr>
<td>Unstructured knowledge</td>
<td>💎</td>
<td>💎</td>
<td>💩</td>
<td>💎💩</td>
<td>💎</td>
</tr>
<tr>
<td>Coexisting organizations</td>
<td>💩</td>
<td>💎</td>
<td>💎</td>
<td>💎💩</td>
<td>💎</td>
</tr>
<tr>
<td>Horizontal connections</td>
<td>💩</td>
<td>💎</td>
<td>💎</td>
<td>💎💩</td>
<td>💎</td>
</tr>
<tr>
<td><br />
<em>collaboration</em></td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Onboarding</td>
<td>💎</td>
<td>💎💩</td>
<td>💎💩</td>
<td>💎</td>
<td>💩</td>
</tr>
<tr>
<td>Knowledge discovery</td>
<td>💩</td>
<td>💎</td>
<td>💎</td>
<td>💩</td>
<td>💎</td>
</tr>
<tr>
<td>Shared knowledge</td>
<td>💩</td>
<td>💎</td>
<td>💎💩</td>
<td>💩</td>
<td>💎</td>
</tr>
<tr>
<td>Cross-team workflows</td>
<td>💩</td>
<td>💎</td>
<td>💎</td>
<td>💩</td>
<td>💎</td>
</tr>
<tr>
<td>Repeatable processes</td>
<td>💎💩</td>
<td>💩</td>
<td>💎</td>
<td>💎</td>
<td>💎</td>
</tr>
<tr>
<td><br />
<em>design</em></td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td>Effort to set up</td>
<td>💎</td>
<td>💎</td>
<td>💩</td>
<td>💎</td>
<td>💩</td>
</tr>
<tr>
<td>Flexibility</td>
<td>💎💩</td>
<td>💎</td>
<td>💎</td>
<td>💩</td>
<td>💎</td>
</tr>
<tr>
<td>Evolvability</td>
<td>💩</td>
<td>💎</td>
<td>💎</td>
<td>💩</td>
<td>💎</td>
</tr>
</tbody></table>
Recent eoi for software development with qualifications inquiries that include:
# Proof for high tech-expertise employed in creating products that bring along revolutionary user experiences in banking and finance with any two of the following: Internet of Things (IoT), Block Chain, AI, Predictive Analytics
# Provide case studies and all the necessary information that can help make decision for at least two of the following digital transformation solutions for finance and banks: Lending, Payments, Onboarding, OMNI-Channel, Trade finance, AI-Based solution (Chatbots, Scoring Engine, Predictive Models, Fraud) etc.
# "Technology stack, skill set and proven track record in working with them on front end, Back end, Mobile application, Databases, Big data storage, mining, analytics and visualization tools and DevOps"
* Note patients who are thought to going to be discharged over the weekend and see how many are discharged on Saturday and Sunday
* Discuss with staff to see how they handle patients who are long stayers post discharge
{{The dispersed knowledge problem}}
<div><a class="domain reader-domain" href="https://www.baeldung.com/cs/heap-vs-binary-search-tree">baeldung.com</a>
<div> </div>
<h1>Heap vs Binary Search Tree | Baeldung on Computer Science</h1>
<div> </div>
<div>
<div>5-7 minutes</div></div></div>
<hr />
<div>
<div>
<div>
<h2>1. Overview</h2></div></div></div>
<p>In this tutorial, we’ll go through the main concepts of Heap and Binary Search Tree (BST) data structures. Also, we’ll show their similarities and differences. Moreover, we’ll speak about their internal implementation and time complexity of operations on these data structures. To do it, we’ll use a <a href="https://www.baeldung.com/cs/big-o-notation">Big-O</a> notation. We assume having a basic knowledge of <a href="https://www.baeldung.com/cs/binary-search-trees">Binary Search Tree</a> and <a href="https://en.wikipedia.org/wiki/Heap_(data_structure)">Heap</a> data structures.</p>
<p>Binary Search Tree is usually represented as an acyclic graph. The tree consists of nodes. In case the tree is binary, each node has at most two children. <strong>The BST has an important property: every node’s value is strictly greater than the value of its left child and strictly lower than the value of its right child.</strong> It means, we can iterate all the values of the BST in sorted order. <strong>Also, this data structure doesn’t allow duplicate values.</strong></p>
<p>Let’s look at the example of the binary trees:</p>
<p><a href="https://www.baeldung.com/wp-content/uploads/sites/4/2020/10/Trees-1.jpg" target="_blank"><img alt="" src="https://www.baeldung.com/wp-content/uploads/sites/4/2020/10/Trees-1.jpg" /></a></p>
<p>The tree to the left is a binary tree because each node has 0, 1, or 2 children. But, this is not a BST. For instance, the root’s right child is 2. 2 is less than the value of the root, which is 15. Furthermore, for a node with a value of 2, its left child has a value of 17, which also violates the BST property. The other two trees on the above image are the Binary Search Trees because every node satisfies the rules of a BST.</p>
<p>Binary Search Tree can be either <a href="https://www.baeldung.com/cs/height-balanced-tree">balanced</a> and unbalanced. We may notice, that the last tree forms a chain and is unbalanced. But, this is still a Binary Search Tree. None of the rules are violated. However, the insert and remove operations are inefficient in such a tree.</p>
<p>Suppose <img alt="n" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-b170995d512c659d8668b4e42e1fef6b_l3.svg" style="height:8px; width:11px" title="Rendered by QuickLaTeX.com" /> to be the number of nodes in a BST. <strong>The worst case of the insert and remove operations is <img alt="O(n)" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-31c2cdca867987ac2a6e27b1434ae748_l3.svg" style="height:18px; width:38px" title="Rendered by QuickLaTeX.com" />.</strong> But, in a balanced Binary Search Tree, for instance, in AVL or Red-Black Tree, the time complexity of such operations is <img alt="O(log(n))" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-8152cfd7484450eacb605d460f954231_l3.svg" style="height:18px; width:75px" title="Rendered by QuickLaTeX.com" />. <strong>The other major fact is that building BST of <img alt="n" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-b170995d512c659d8668b4e42e1fef6b_l3.svg" style="height:8px; width:11px" title="Rendered by QuickLaTeX.com" /> nodes takes <img alt="O(n * log(n))" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-e9e40783aee23b8dc2f2f6822a0b69ed_l3.svg" style="height:19px; width:103px" title="Rendered by QuickLaTeX.com" /> time.</strong> We have to insert a node <img alt="n" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-b170995d512c659d8668b4e42e1fef6b_l3.svg" style="height:8px; width:11px" title="Rendered by QuickLaTeX.com" /> times, and each insertion costs <img alt="O(log(n))" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-8152cfd7484450eacb605d460f954231_l3.svg" style="height:18px; width:75px" title="Rendered by QuickLaTeX.com" />. The big advantage of a Binary Search Tree is that we can get traverse the tree and get all our values in sorted order in <img alt="O(n)" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-31c2cdca867987ac2a6e27b1434ae748_l3.svg" style="height:18px; width:38px" title="Rendered by QuickLaTeX.com" /> time.</p>
<h2>3. Heap</h2>
<p><strong>The Heap is a Complete Binary Tree.</strong> Let’s introduce some definitions to understand what the Complete Binary Tree is.</p>
<p>A node is at level <img alt="k" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-3422b6bb5c160593658b7c39425d9880_l3.svg" style="height:13px; width:9px" title="Rendered by QuickLaTeX.com" /> of the tree if the distance between this node and the root node is <img alt="k" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-3422b6bb5c160593658b7c39425d9880_l3.svg" style="height:13px; width:9px" title="Rendered by QuickLaTeX.com" />. The level of the root is 0. The maximum possible number of nodes at level k is <img alt="2^{k}" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-83a274edbbfe276d5c45acbb02603044_l3.svg" style="height:15px; width:16px" title="Rendered by QuickLaTeX.com" />. At each level of a Complete Binary Tree, it contains the maximum number of nodes. But, except possibly the last layer, which also must be filled from left to right. Is important to understand, that <strong>the Complete Binary Tree is always balanced.</strong></p>
<p>The Heap differs from a Binary Search Tree. The <strong>BST is an ordered data structure, however, the Heap is not</strong>. In computer memory, the heap is usually represented as an array of numbers. The heap can be either Min-Heap or Max-Heap. The properties of Min- and Max-Heap are almost the same, but the root of the tree is the largest number for the Max-Heap and the smallest for the Min-Heap. Similarly, <strong>the main rule of the Max-Heap is that the subtree under each node contains values less or equal than its root node.</strong> Whereas, it’s vice versa for the Min-Heap. Also, it means, that <strong>the Heap allows duplicates</strong>.</p>
<p>In case the Heap is a Complete Binary Tree, it has the minimum possible height for the tree, which is <img alt="O(log(n))" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-8152cfd7484450eacb605d460f954231_l3.svg" style="height:18px; width:75px" title="Rendered by QuickLaTeX.com" />. In an array, where the heap nodes are stored, the children of a node at index <img alt="i" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-695d9d59bd04859c6c99e7feb11daab6_l3.svg" style="height:12px; width:6px" title="Rendered by QuickLaTeX.com" /> are nodes at indices <img alt="2 * i + 1" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-5e56db83944fd253ed6c68198767a6f4_l3.svg" style="height:14px; width:61px" title="Rendered by QuickLaTeX.com" /> and <img alt="2 * i + 2" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-659993e68ec12325ddd4d070efb3c40e_l3.svg" style="height:14px; width:61px" title="Rendered by QuickLaTeX.com" />. It means, that the heap is filled from top to bottom. And at each layer, it is filled from left to right. Let’s look at an example of heaps:</p>
<p><a href="https://www.baeldung.com/wp-content/uploads/sites/4/2020/10/Heaps.jpg" target="_blank"><img alt="" src="https://www.baeldung.com/wp-content/uploads/sites/4/2020/10/Heaps.jpg" /></a></p>
<p>The Heap to the left is a Min-Heap. The smallest value has the root of the tree. And, for every node, all the values under it are greater than the node. The tree to the right is a Max-Heap. We may notice, it has duplicate values. However, this tree satisfies all the Max-Heap properties. This is a complete tree and every subtree contains values less or equal than its root node.</p>
<p>Talking about time complexities, we can build a Heap in <img alt="O(n * log(n))" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-e9e40783aee23b8dc2f2f6822a0b69ed_l3.svg" style="height:19px; width:103px" title="Rendered by QuickLaTeX.com" /> time. <strong>But, there exists an <a href="https://www.growingwiththeweb.com/data-structures/binary-heap/build-heap-proof/">algorithm</a>, which allows building a Heap in <img alt="O(n)" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-31c2cdca867987ac2a6e27b1434ae748_l3.svg" style="height:18px; width:38px" title="Rendered by QuickLaTeX.com" /> time.</strong> <strong>The insert and remove operations cost <img alt="O(log(n))" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-8152cfd7484450eacb605d460f954231_l3.svg" style="height:18px; width:75px" title="Rendered by QuickLaTeX.com" />.</strong> However, the Heap is an unordered data structure. The only possible way to get all its elements in sorted order is to remove the root of the tree <img alt="n" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-b170995d512c659d8668b4e42e1fef6b_l3.svg" style="height:8px; width:11px" title="Rendered by QuickLaTeX.com" /> times. This algorithm is also called <a href="https://www.baeldung.com/java-heap-sort">Heap Sort</a> and takes <img alt="O(n * log(n))" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-e9e40783aee23b8dc2f2f6822a0b69ed_l3.svg" style="height:19px; width:103px" title="Rendered by QuickLaTeX.com" /> time.</p>
<h2>4. Heap vs BST</h2>
<p>The main difference is that Binary Search Tree doesn’t allow duplicates, however, the Heap does. The BST is ordered, but the Heap is not. So, if order matters, then it is better to use BST. If an order is not relevant, but we need to be sure that insert and remove will take <img alt="O(log(n))" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-8152cfd7484450eacb605d460f954231_l3.svg" style="height:18px; width:75px" title="Rendered by QuickLaTeX.com" /> time, then the Heap guarantees to achieve this time. In a Binary Search Tree, this may take up to <img alt="O(n)" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-31c2cdca867987ac2a6e27b1434ae748_l3.svg" style="height:18px; width:38px" title="Rendered by QuickLaTeX.com" /> time, if the tree is completely unbalanced (chain is the worst case). Also, Heap can be built in linear time, however, the BST needs <img alt="O(n * log(n))" src="https://www.baeldung.com/wp-content/ql-cache/quicklatex.com-e9e40783aee23b8dc2f2f6822a0b69ed_l3.svg" style="height:19px; width:103px" title="Rendered by QuickLaTeX.com" /> to be created.</p>
<p>Java implements these structures with the <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/PriorityQueue.html"><em>PriorityQueue</em></a> and the <a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/TreeMap.html"><em>TreeMap</em></a>. <em>PriorityQueue</em> is a Max-Heap by default. <em>TreeMap</em> has a balanced binary search tree as a backbone. Its implementation is based on a <a href="https://www.baeldung.com/cs/red-black-trees">Red-Black Tree</a>.</p>
<h2>5. Conclusion</h2>
<div>
<div>
<div>
<div>
<p>In this article, we’ve described two commonly used data structures: Heap and Binary Search Tree. We’ve talked about their structure and operations’ time complexities. Also, we’ve compared them and shown their pros and cons. These data structures have different areas of use. So, the choice depends on the problem.</p></div></div></div></div>
#### Build your own `Docker`
* [**C**: _Linux containers in 500 lines of code_](https://blog.lizzie.io/linux-containers-in-500-loc.html)
* [**Go**: _Building a container from scratch in Go_](https://www.youtube.com/watch?v=Utf-A4rODH8) [video]
* [**Python**: _A workshop on Linux containers: Rebuild Docker from Scratch_](https://github.com/Fewbytes/rubber-docker)
* [**Python**: _A proof-of-concept imitation of Docker, written in 100% Python_](https://github.com/tonybaloney/mocker)
* [**Shell**: _Docker implemented in around 100 lines of bash_](https://github.com/p8952/bocker)
<div>
<p><strong>Spoiler Alert</strong>: This is a hands-on tutorial, so get a cup of coffee, sit comfortably and let’s create some containers. Today we will learn the basics of Docker and how to <strong>build</strong>, <strong>run</strong> and even <strong>remove</strong> containers. 🐳</p></div>
<hr />
<div>
<p>Do you know the famous phrase It works on my machine?</p>
<div>
<div><img class="fw fy fz n o oa ob x" src="https://miro.medium.com/max/400/1*qY9Mmc2k_agwALr2UGY-8g.png" style="height:302px; width:400px" /></div></div>
<p>Yeah, forget about it, with Docker it is not an excuse anymore. Docker allows you to locally run the same (or almost the same) environment which will be used in production.</p>
<p>So let’s get started understanding what docker is and what docker is not.</p>
<h2>Docker is…</h2>
<p>In my opinion, Docker is one of the greatest inventions of the XXI century, but we’re not here to discuss my opinion, we’re here to read technical content.</p>
<blockquote>
<p>Docker is a computer program that performs operating-system-level virtualization, also known as “containerization”.</p></blockquote>
<p>More than that, Docker is a popular tool to make it easier to build, deploy and run applications using containers. Containers allow us to package all the things that our application needs like such as libraries and other dependencies and ship it all as a single package. In this way, our application can be run on any machine and have the same behavior.</p>
<p>Docker was first released in 2013, only 5 years ago, but it is already used by a lot of companies, like: Spotify, The New York Times, PayPal, Uber and more (<a class="bw dg mp mq mr ms" href="https://www.contino.io/insights/whos-using-docker">https://www.contino.io/insights/whos-using-docker</a>).</p>
<p>Last but not least, Docker is open source: <a class="bw dg mp mq mr ms" href="https://github.com/docker">https://github.com/docker</a>. ❤️</p>
<h2>Docker is not…</h2>
<p>Docker is not a virtual machine (VM).</p>
<blockquote>
<p>A Docker container, unlike a virtual machine, does not require or include a separate operating system. Instead, it relies on the kernel’s functionality and uses resource isolation for CPU and memory, and separate namespaces to isolate the application’s view of the operating system.</p></blockquote>
<p>Based on the short description above, the following image shows a comparison between virtual machines and Docker containers.</p>
<div>
<div><img class="fw fy fz n o oa ob x" src="https://miro.medium.com/max/700/1*gVNbunchCV5wXgnwlT-iGg.jpeg" style="height:394px; width:700px" /></div></div>
<p>As we can see, Docker containers are simpler than virtual machines and using it we can avoid the overhead of starting and maintaining VMs.</p>
<p>As this is a hands-on tutorial, I will not go deep on how Docker works under the hood. If you want to learn more about it I suggest you read the <a class="bw dg mp mq mr ms" href="https://docs.docker.com/">Docker documentation</a>.</p>
<h1>Hands-on</h1>
<p>Now that we have learned what is Docker, let’s start the hands-on tutorial.</p>
<h2>Installation</h2>
<p>Since the installation depends on your operating system, we will not cover it on this tutorial. To install Docker on your OS please follow the official docs:</p>
<ul>
<li><a class="bw dg mp mq mr ms" href="https://docs.docker.com/docker-for-mac/install/">Install Docker for Mac</a></li>
<li><a class="bw dg mp mq mr ms" href="https://docs.docker.com/docker-for-windows/install/">Install Docker for Windows</a></li>
<li><a class="bw dg mp mq mr ms" href="https://docs.docker.com/install/linux/docker-ce/ubuntu/">Get Docker CE for Ubuntu</a></li></ul>
<p>There is also a great tutorial in <a class="bw dg mp mq mr ms" href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04"><strong>How to Install and Use Docker on Ubuntu 16.04 (Digital Ocean)</strong></a><strong>.</strong></p>
<h2>Hello World</h2>
<p>With Docker properly installed and running, let’s start creating containers.</p>
<p>The <strong>“Hello World”</strong> in Docker is simple like that:</p>
<pre>$ docker run hello-worldUnable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for hello-world:latestHello from Docker!
This message shows that your installation appears to be working correctly.
...</pre>
<p>As you can see, it shows the following message:</p>
<blockquote>
<p>Unable to find image ‘hello-world:latest’ locally</p></blockquote>
<p>It means you haven’t an image called “hello-world” locally so it will automatically pull from <a class="bw dg mp mq mr ms" href="https://hub.docker.com/">Docker hub</a>.</p>
<p>Docker hub is basically:</p>
<blockquote>
<p>A cloud-based registry service which allows you to link to code repositories, build your images and test them, stores manually pushed images, and links to Docker Cloud so you can deploy images to your hosts. It provides a centralized resource for container image discovery, distribution and change management, user and team collaboration, and workflow automation throughout the development pipeline.</p></blockquote>
<p>After pulling the hello-world image, it will run the container and will show a Hello from Docker! message with some other information.</p>
<p>Congratulations, you have run a “Hello World” in Docker!</p></div>
<hr />
<div>
<h2>Creating and Running Containers</h2>
<p>Now that we have already created our “Hello World” example and we know basically what is Docker hub, let’s create something a little more sophisticated. Let’s create a simple <a class="bw dg mp mq mr ms" href="http://flask.pocoo.org/">Flask</a> application in <a class="bw dg mp mq mr ms" href="https://www.python.org/">Python</a>.</p>
<p>At this point, it would be great to have a little experience with Python and Flask to know what is going on here, but don’t worry about it, we just need to know that it is a “Hello World” web application in Flask which will run on localhost from inside a container.</p>
<p>First of all, we need to create a directory called my_web_app and save the following code in a file called app.py.</p>
<pre>from flask import Flask
app = Flask(__name__)<a class="bw dg mp mq mr ms" href="http://twitter.com/app">@app</a>.route("/")
def hello():
return "Hello World!"if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0")</pre>
<p>The Python code is just that. It will import the Flask package, create a Flask app, define a route and run the application in debug mode on localhost.</p>
<p>So, let’s start creating our Dockerfile. To do that, just create a file named Dockerfile in the same directory of the Python file, and put the following commands inside it:</p>
<pre># Inherit from the Python Docker image
FROM python:3.7-slim
# Install the Flask package via pip
RUN pip install flask==1.0.2
# Copy the source code to app folder
COPY ./app.py /app/
# Change the working directory
WORKDIR /app/
# Set "python" as the entry point
ENTRYPOINT ["python"]
# Set the command as the script name
CMD ["app.py"]</pre>
<p>As we can see by the comments, it will inherit from the <a class="bw dg mp mq mr ms" href="https://hub.docker.com/_/python/">Python Docker image</a>, install the Flask package, copy the source code of our application to the app folder, change the working directory to the app folder and set an ENTRYPOINT and a CMD.</p>
<p>Now let’s build the image from the Dockerfile using the -t flag, which means tag, and set a name (flask_app) and a tag (0.1):</p>
<pre>$ docker build -t flask_app:0.1 .
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE
flask_app 0.1 c6eb89fefb25 2 minutes ago 153MB
python 3.7-slim 4c2534c95211 4 weeks ago 143MB</pre>
<p>By typing docker images we can see that the image was successfully created. Then let’s run the container specifying the port that will be mapped (-p) and using the -d flag, which means detached, so that the terminal does not get stuck. We must also pass the name and tag of the image as parameter (flask_app:0.1).</p>
<pre>$ docker run -d -p 5000:5000 flask_app:0.1
$ docker psCONTAINER ID IMAGE COMMAND CREATED
03c650a4eb58 flask_app:0.1 "python app.py" 16 seconds ago
STATUS PORTS NAMES
Up 3 seconds 0.0.0.0:5000->5000/tcp gifted_kar</pre>
<p>The docker ps command will show the running container with some other information like the container ID, the image that the container is using, the command the container is executing, the time it was created, the current status, the ports that were mapped and the name (in this case a random name) of the container (we can also set a name for the container by using the --name flag).</p>
<p>Open your browser, go to the localhost:5000 address and <em>voilà</em>, we are accessing our web app which is running inside the container.</p>
<h2>Stopping and Removing Containers</h2>
<p>As our container is still running, we can stop it before deleting. To do so, we just need to run docker stop passing the container name as parameter, for example:</p>
<pre>$ docker stop gifted_kar</pre>
<p>We can also stop the container by using the container ID, for example:</p>
<pre>$ docker stop 03c650a4eb58</pre>
<p>If we run docker ps -a right now we will see that the container is in that list with status Exited. Let’s delete the container and then delete the image.</p>
<p>Similar to the docker stop command, we can use the docker rm command passing the container name or ID as the parameter, for example:</p>
<pre>$ docker rm gifted_kar
# or
$ docker rm 03c650a4eb58</pre>
<p>If we run docker ps -a now we will see that our container has disappeared from the list.</p>
<p>If we run the docker images command we will see our flask_app with tag 0.1 in that list. To remove our flask_app image we can use the docker rmi command, for example:</p>
<pre>$ docker rmi flask_app:0.1</pre>
<p>If we run docker images again we will see that our flask_app image was removed.</p>
<p>As we have seen, the Docker command line interface is very simple to use. You can continue exploring Docker commands by following the <a class="bw dg mp mq mr ms" href="https://docs.docker.com/">Docker documentation</a>.</p>
<h2>Basic Commands</h2>
<p>In this section you may find some basic Docker commands, like <strong>build</strong>, <strong>run</strong> and <strong>exec</strong>, amongst others.</p>
<pre># Build a Docker image
$ docker build -t [image_name]:[tag] .# Run a Docker container specifying a name
$ docker run --name [container_name] [image_name]:[tag]# Fetch the logs of a container
$ docker logs -f [container_id_or_name]# Run a command in a running container
$ docker exec -it [container_id_or_name] bash# Show running containers
$ docker ps# Show all containers
$ docker ps -a# Show Docker images
$ docker images# Stop a Docker container
$ docker stop [container_id_or_name]# Remove a Docker container
$ docker rm [container_id_or_name]# Remove a Docker image
$ docker rmi [image_id_or_name]</pre>
<p>Every command has it helps page, so you can call for example:</p>
<pre>$ docker build --help
$ docker run --help</pre>
<p>And see the OPTIONS you can pass to it.</p>
<h2>Useful Commands</h2>
<p>Some other useful commands to perform operations in multiple items:</p>
<pre># Stop all running containers
$ docker stop $(docker ps -q)# Remove all containers
$ docker rm $(docker ps -aq)# Remove all images
$ docker rmi $(docker images -aq)</pre>
<h2>Integration</h2>
<p>Docker can be integrated into various infrastructure tools, like <a class="bw dg mp mq mr ms" href="https://cloud.google.com/">Google Cloud Platform (GCP)</a>, <a class="bw dg mp mq mr ms" href="https://aws.amazon.com/">Amazon Web Services (AWS)</a>, <a class="bw dg mp mq mr ms" href="https://azure.microsoft.com/en-us/">Microsoft Azure</a>, <a class="bw dg mp mq mr ms" href="https://cloud.oracle.com/containers">Oracle Container Cloud Service</a> and others.</p>
<p>We can easily use Docker to apply Continuous Integration (CI) and Continuous Deployment (CD) practices, making our life easier and the deployment process faster. If you’re not familiar with CI and CD, this post can help you understand the difference between both: <a class="bw dg mp mq mr ms" href="https://www.atlassian.com/continuous-delivery/ci-vs-ci-vs-cd">https://www.atlassian.com/continuous-delivery/ci-vs-ci-vs-cd</a></p>
<div>
<div><img class="fw fy fz n o oa ob x" src="https://miro.medium.com/max/500/1*nWBoq5XMyxogKNGBz_rJ-A.png" style="height:375px; width:500px" /></div></div>
<p>I hope you guys have enjoyed this hands-on tutorial and learned at least the basics of Docker. If you have any question feel free to contact me.</p></div>
Docs for a long time has assumed the expectations of a paper ready-to-print skeuomorphism model. But it appears it's changing; Google has introduced certain updates that make it more like the productivity focused tools of today like [[Notion|Notion: A Study]], including:-
* Mentions
* Infinite canvases
* More integration with the rest of Google's Workspace offerings like Meet right inside Doc
However, there is only so much they can do. That much is [[clear to many|https://www.theverge.com/2021/5/19/22443297/google-docs-workplace-io-changes]]; Docs cannot afford to change too much or they risk alienating most of their extremely large userbase, which consists mostly of Office users, current or former. There has to be at least some parity with Office apps.
This presents an opportunity for other productivity apps to thrive by either focusing on power-users at the expense of a steep learning curve, or building a niche functionality and doing that well. I prefer the latter because there are already too many all-in-one tools out there for users to care about another. However, they all suffer from the same problem as Docs: they're stuck serving one app to many. Given we're a decentralized service, we can afford to experiment easily while we build our core basic features into something that can please as many as possible.
<iframe src="https://docs.python.org/3/" width="100%" height="400px" frameborder="0"></iframe>
Document and file collaboration are the tools or systems set up to help multiple people work together on a single document or file to achieve a single final version. Normally, this is software that allows teams to work on a single document, such as a Word document, at the same time from different computer terminals or mobile devices. Hence, document or file collaboration today is a system allowing people to collaborate across different locations using an Internet, or "cloud", enabled approach[1] such as for Wikis such as Wikipedia.
{{Cloud Collaboration}}
All things about documentation practices and technical writing.
<<list-links "[regexp[(?i)documentation]] -[[Documentation]]">>
<p>Source: {{!!source}}</p>
<p>Pavi has more than 20 years of experience leading documentation and user education initiatives at companies such as Salesforce, Amazon, Mesosphere, and MongoDB. Pavi co-founded Salesforce’s learning platform, Trailhead, which now has more than two million users. Below we will discuss some key takeaways from the discussion.</p>
<p><strong>Technical marketing vs. documentation. </strong>Technical marketing focuses on informational content like data sheets and white papers that are used to encourage product adoption. Documentation comes into play after someone decides to use the solution. It helps them learn how to use the product as quickly, easily, and efficiently as possible. The line can be blurry as good documentation can be part of the selling process because customers understand that they’ll be well-supported and have all the resources they need to use the product once they adopt it.</p>
<p><strong>Content creation should be centralized. </strong>Often teams create documentation and technical content on different teams in an uncoordinated fashion. This can lead to duplicity and customer confusion because the same material is presented in different ways. By centralizing content creation you can make content development more cost effective and the common body of content can be assembled and shared with different audiences based on their needs.</p>
<p><strong>There are five C’s of good documentation.</strong> Documentation should be correct, clear, complete, consistent, and customer-centric. You can evaluate any documentation or educational content by those standards and these factors can also then be a rubric for improving them.</p>
<p><strong>Personas are important.</strong> Throughout the discussion Pavi emphasized that it is important when writing documentation to consider the different personas who may read it and develop content specifically around them. There could be different personas as part of the pre-sales process like the business decision maker, the CTO, and engineering managers. Post-sales personas tend to be engineers, engineering managers, and end users.</p>
<p>Writers should understand the customer journey of using the product by persona and then develop content that assists the customer in that journey. The role of great customer docs is to actually move customers across this journey as quickly and efficiently as possible. The technical sophistication of the persona affects how quickly they move through the adoption journey. Identify each persona, what they need to learn, and write documentation that maps their path.</p>
<p><strong>Think of documentation as education. </strong>Define learning objectives which are simple statements that identify what the customer will be able to learn or do after they’ve gone through a particular set of documentation. Learning objectives provides a focus for defining the content and frames customer journeys as milestones. Documentation should be framed as helping users crawl, walk, run, and fly, which is advocacy.</p>
<p>Think about documentation as an educational course that has sequenced content. Each module should have concepts, tasks, and reference material. It should explain a concept, then it goes through the steps of doing a particular task, and then leaves the reader with reference information for further exploration. The relative portion of concept, task, and reference material will vary based on the stage of the readers’ understanding. For example, advanced user documentation may have a smaller portion of concept defining and a higher portion of task and reference material. When the user has completed the materials they should have gone from ignorance to mastery. Ideally, if someone has gone through the content, there should be a way to assess that they’ve learned it by doing a simple quiz or having them go through maybe a test exercise.</p>
<p>Framing documentation as educational content helps developer relations. It builds trust with the end user and presents an opportunity to be a thought leader for not just your offering but the broader space and vision of the future.</p>
<p><strong>Docs should tell a story. </strong>Stories take readers from point A to point Z in a very structured, specific way such that steps have been organized for the specific customer persona. If you don’t take this approach docs can end up being feature-centric. In other words, when a new feature is built documentation simply showcases how it works. But customers don’t buy features. They buy benefits. They buy solutions.</p>
<p><strong>Engineers should be involved in documentation writing. </strong>Engineers often reflect the end user and can best speak to how the tool works and fits into the readers’ workflow. Teams should create incentive programs to encourage developers to be involved in documentation. For example, set up a program where they have templates, editing support, and recognition for creating content.</p>
<p><strong>10:1 is the optimal ratio of developers to technical writers. </strong>Pavi suggested one technical writer can typically support two scrum teams. When you have about 10 engineers it is useful to have a technical writer, suggesting that early stage companies should have a contract or full-time technical writer. As the team scales, it is useful to bring technical writers in house. Usually a 50 person company should have someone in house working on documentation.</p>
<p><strong>A trend is authoring documentation in markdown. </strong>Authoring docs in markdown and saving them as plain text files in GitHub is becoming the norm. It’s a good practice because it makes it easier for people to collaboratively edit and upgrade the docs overtime. Engineers can contribute to it by responding to pull requests and providing feed all in Git.</p>
<p><strong>Tracking documentation website traffic is a useful KPI. </strong>Tracking website traffic gives teams some sense of the relative level of interest and attention to the documentation overall and specific pages. Tracking analytics can be really valuable because you can find out if visitors are beginners, intermediate, or advanced so you can better understand the customer.</p>
<p><strong>Documentation is part of the product. </strong>The planning, preparation, and creation of docs need to occur hand-in-hand as the product is being developed. Writers should be embedded with engineers as part of the agile process and scrum team. Docs highlight flaws and deficiencies in the product design. If a product needs a lot of documentation, chances are it’s not that well designed. It’s not that user centric. Documentation sheds light on product quality and usability. It can be a strategic asset that can give your product a competitive advantage.</p>
I've never appreciated the problem of scaling documentation until I looked into [[@simonw|https://twitter.com/simonw]] of datasette fame solving the problem of updating screen shots in his documentations with [[Shot scraper using Github actions|https://github.com/simonw/shot-scraper]], where the screenshots are automatically updated every time he runs a build. Adding annotations automatically would also be important.
Documentations can make or break a tool/project online. Yet making docs is hard. Updating them is even harder. These kinds of tools can help with that.
{{Codebase knowledge management}}
We can investigate ways to make to automatically document any software project using TiddlyWiki.
[[Here's a starter with Typescript|https://blog.bitsrc.io/documenting-your-typescript-projects-there-are-options-da7c8c4ec554]]
<p>From this <a href="https://medium.com/swlh/dont-make-this-business-to-business-sales-mistake-17ea14177fff" target="_blank">Medium article</a>, how to avoid asking a prospective for a BCB demo without a buy-in:</p>
<p>Rather than asking for a block of time or sending emails about your product and seeking to set up a demo as Step One, you could cut through the noise a lot better if you offered help first and took a multi-stepped approach. Don’t lead with the demo-ask, unless you’re sure a prospect is ready.</p>
<p>Instead, create a high-value item related to the solution(s) your product offers, like an insightful video or written interview series. Produce a laser-focused webinar people can watch anytime, or write an extremely relevant white paper. You might even be able to re-purpose existing content to create these materials. Whatever your high-value item is, it’s likely to stand out even more if it’s innovative or presented to decision-makers in a unique way.</p>
<p>Take the items you’re going to pass along to people like me and develop an outreach campaign, where you deliver value and build trust, while making subtle requests for time (i.e. “I’m here if you have questions, via email or phone at…” or a “request a demo” button for those who are ready). For a less intrusive and less over-used approach than email or cold calls, do this via a digital campaign in some other format, like targeted video ads on YouTube or something that will spread organically in a community — maybe it’s a series of three webinars, promoted on a landing page, designed for easy sharing so people can pass it along to their peers.</p>
<h2>Plan the journey you want to take your leads on</h2>
<p>Whatever route you choose, map out the whole strategy before you send the first piece of communication, make the first call or launch the larger campaign. Have a plan for leading people through a buyer’s journey that positions you and your solution as helpful.</p>
<p>Deliver value, build relationships and the sales should follow. Earn people’s trust and you’ll probably spend a lot less time chasing them down. Some people might even seek you out after your patient approach pays off.</p>
<p>There is no one answer on how to build a solid sales and marketing plan. But, immediately pummeling your leads with emails and calls asking for their time, is almost never a good way to begin.</p>
<p>Instead of trying to sell to people, help them to buy.</p>
<h2>Don’t forget the low-hanging fruit</h2>
<p>When there’s a goal to hit, it might not seem like you have the time to lead people through a buying process that could take weeks or months. That’s why you need to study the analytics and meet people where they are.</p>
<p>By using tactics like the previously-mentioned “request a demo” option in your emails, you can identify those who might be more open to your requests for their time. If your organization is using a marketing-automaton platform, anyone who clicks the “request a demo” button yet doesn’t schedule one, could get an email (or a phone call from you), leading them there. Or, you can do this manually after studying the click-through stats for your email.</p>
<p>Today’s technologies make it so one size need not fit all. Sales and marketing teams can close deals with some prospects, while gradually moving those not ready, toward ready. We know too much, thanks to data, to spend time talking to the wrong people about the wrong things.</p>
__Important Links__
* [[JS sdk reference|https://www.dropbox.com/developers/documentation/javascript#overview]]
* [[JS sdk Documentation|https://dropbox.github.io/dropbox-sdk-js/]]
* [[Oauth flow guide|https://developers.dropbox.com/oauth-guide]] with [[example|https://github.com/dropbox/dropbox-sdk-js/blob/main/examples/javascript/auth/index.html]]
* [[JS sdk repository|https://github.com/dropbox/dropbox-sdk-js]]
* [[HTTP api reference|https://www.dropbox.com/developers/documentation/http/overview]]
* [[Developer console|https://www.dropbox.com/developers/apps]]
* [[API explorer|https://dropbox.github.io/dropbox-api-v2-explorer/]]
Dropbox's documentation says I could either give my app access to all files, or create a dedicated app folder. Either way, I'm left with a singular question: how do I deal with file/multimedia files from these folders? I don't want to duplicate files and folders so maybe I might have to make a dedicated media adding plugin to allow folks to add stuff from their cloud drives or whatever service they register seamlessly.
The added advantage is that it can become it's own standalone app that's independent of [[OnePlaybook]].
|!Type of site| Word processor, collaborative software|
|!Owner | Dropbox|
|!URL | https://paper.dropbox.com|
<<<
Dropbox Paper was described in the official announcement post as "a flexible workspace that brings people and ideas together. With Paper, teams can create, review, revise, manage, and organize—all in shared documents".
<<<
Reception of Dropbox Paper has been mixed.
''Pros''
* collaboration functionality
* including content available immediately
* the ability to mention specific collaborators
* assign tasks
* write comments
* editing attribution
* revision history
* support for rich media from a variety of sources
* I would also add: supports the easiest and aesthetically pleasing table making functionality I've seen in a while
''Cons''
* criticized for a lack of formatting options and editing features, especially for images (I've experienced this too)
* lack of a fixed formatting bar and missing features present in competitors' products as making Dropbox Paper seem like a "light" tool.
''Collaboration features''
<<<
To start working with other people, Paper "allows you to invite people via email from within a document", with sharing options for who can view the link (anyone with the link or just the invited person), and action permissions (edit or only comment). Regarding collaboration, Ansaldo wrote that "''Creative collaboration is Paper’s marquee feature'', and it provides a variety of ways to work effectively with others in real time". Users can "make any content immediately visible and accessible to a specific collaborator with "@mentions"", and "You can also use @mentions to create and assign task lists within a document." Paper also "boasts essential collaboration tools including comments, editing attribution, and revision history."
<<<
<table class="m_3627305799506373521devicewidth" border="0" width="600" cellspacing="0" cellpadding="0" align="center" bgcolor="#ffffff" style="color: rgb(34, 34, 34); font-family: Roboto, RobotoDraft, Helvetica, Arial, sans-serif; font-size: small; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><tbody><tr><td style="font-family: Verdana, sans-serif; margin: 0px; font-size: 14px; color: rgb(51, 51, 51); text-align: left; line-height: 30px;">Your زيارة قصيرة سياحية/اصدار تأشيرة request, number 0101024180092019320586329</td></tr><tr><td style="font-family: Verdana, sans-serif; margin: 0px; font-size: 14px; color: rgb(51, 51, 51); text-align: left; line-height: 30px;">for ابراهام بشير سما on 18/07/2019 has been approved</td></tr><tr><td style="font-family: Verdana, sans-serif; margin: 0px; font-size: 14px; color: rgb(51, 51, 51); text-align: left; line-height: 30px;"><p><a href="https://beta.echannels.moi.gov.ae/echannels/api/api/notification/report/evisa/0C095F3A1C6547C09E70241631EF5163353/true" target="_blank" data-saferedirecturl="https://www.google.com/url?q=https://beta.echannels.moi.gov.ae/echannels/api/api/notification/report/evisa/0C095F3A1C6547C09E70241631EF5163353/true&source=gmail&ust=1563511809494000&usg=AFQjCNHZ9aBdPPfIUs8C5IlPpuVO0tN4GA" style="color: rgb(212, 27, 41); display: inline-block;">Print e-Visa</a></p><p>To track your application, click <a title="Track Application" href="https://uaevisas.etihad.com/echannels/web/client/etihad/index.html#/etihadGuestApplicationTracking" target="_blank" data-saferedirecturl="https://www.google.com/url?q=https://uaevisas.etihad.com/echannels/web/client/etihad/index.html%23/etihadGuestApplicationTracking&source=gmail&ust=1563511809494000&usg=AFQjCNE1NgF7txUT3WxJbAtgGTgg36BF0A" style="color: rgb(17, 85, 204);">Here</a></p></td></tr></tbody></table>
Duck typing aka //structural typing// a type system that, instead of checking types during compile time (as in static typing) or runtime (as in dynamic typing), instead checks not the type of the objects per se, but whether objects conform to specified attributes and methods.
It comes from the duck test: “If it looks like a duck, swims like a duck, and quack like a duck, then it probably is a duck”.
The advantage offered by this method is flexibility and convenience of adhering to documentation and standards while still being productive. It may come at the expense of safety from strict type checking at compile time, as in statically typed languages which use interfaces (though the latter however, would require frequent refactoring of client code).
[[Read more at devopedia|https://devopedia.org/duck-typing]].
Most people think of a repository as being a static archive of published documents. A dynamic knowledge repository is a living, breathing, rapidly evolving repository of all the stuff accumulating moment to moment throughout the life of a project or pursuit. This would include successive drafts and commentary leading up to more polished versions of a given document, brainstorming and conceptual design notes, design rationale, work lists, contact info, all the email and meeting notes, research intelligence collected and commented on, emerging issues, timelines, etc. In a software project, the DKR would also include all the successive versions of source code, bug reports, change requests, fixes, version release notes, documentation, etc. Aerospace friends tell us that the documentation it takes to design, build, fly and maintain a plane will more than fill the plane.
In many cases, relying on off the shelf commerical software without an easy means of editing it to suit ever-changing needs is problematic. Especially if one does not have access to a dedicated IT expert.
A low-code or no-code service and ecosystem that would allow an end-user to easily create and edit useful software that's free and open for professional developers to contribute to for any given situation; an ecosystem such as TiddlyWiki would be beneficial.
{{Dynamic software needs}}
* Attendees:
** Joe Bordes at [[CoreBOS|https://corebos.com/]]joe@tsolucio.com
*** tsolucio@gmail.com
*** Gitter: @joebordes
** Andreas Alberici
*** a.alberici@studiosynthesis.biz
*** CEO of Business Process Management Consulting company Studio Synthesis
* Agenda: We are very good in designing business processes, not so good in front-end technologies. I would like to integrate tiddlywiki with our internal tools on a "long" roadmap, using it possibly as a front-end tool for easy input processes, but also in the small term as an internal "chatting" wiki
* I would like to leverage your plugin ecosystem using [[Mattermost]] and our backend (probably using PouchDB - CouchDB integration)
* We could create a knowledge base tool for TiddlyWiki+OnePlaybook for organizing, triaging and prioritizing chat items, similar to [[Building Wikis from Slack]], but with other [[Mattermost]]
* My take from the conversation: they don't seem to mind much about what the backend is, though they do want the data to be firmly in their control, and they do want their support for CouchDB
* But the PouchDB - CouchDB route forces us to look into [[multi-user use and solving for conflicts|CouchDB]]. 😨
Since people are actively using bots to get over others during online bookings and e-commerce checkouts, why don't we make it more accessible to level the playing field?
We could make a service that allows people to build bots for task automation. A robotic process automation for Internet users.
The three main components of the Edtech 'bundle' (aka the three Cs):
# Community
# Content
# Certification
Any edtech startup that seeks to solve the [[modern education access pain point|Education is Expensive]] should try to do fairly well initially in at least two of the above, or perform extremely well on one of the above.
Almost the entire planet doesn't have a bachelor degree; this illustrates how education as a whole is so frightfully expensive and therefore inaccessible to most without government intervention. Which is nuts! This is such a waste of potential.
<<<
{{Modern Education gaps}}
<<<
How the hell do we solve this?
Particularly in digitally naive sectors such as healthcare or research, especially in African countries.
Source: {{!!source}}
__Why Email?__
<<<
Email has the highest return on investment of any other marketing channel. On average, email earns you $40 for every $1 spent. And the best part is that email is an owned channel, which means you can reach your subscriber directly instead of relying on social media algorithms to surface your content.
<<<
__Essentials__
1. ''The subject line''
Most ignored part of the email. If people don't open it, nothing else matters. So it is essential to grab the attention of the reader with a relevant, segmented subject line.
<<<
One trick is to write like you speak. Try using subject lines that use informal language and contractions (it’s, they’re, you’ll). Not only will this save character count, it will also make your copy more friendly and quick to read.
Subject lines should be relevant to your sub-audiences. Marketers generate 760% more revenue from segmented email campaigns than from untargeted emails.
<<<
2. ''The body of the email''
There are three outcomes when the reader opens your email:
* Reads
* Skims
* Bounces
To minimize bounces, a good email design can help attract attention to the right place, like a heading. Use visual designs to elevate perception. Accommodate skimmers with action-focused headlines with a conveniently placed CTA. ''Skimmers should be able to understand the context of the entire email and take action without needing to read the body.''
Finally, for readers, make sure you deliver on your subject line's promise. You should do it in an aggressively concise way because even though they are readers, they still value their time.
3. The Call to Action
<<<
The goal of your body copy is to drive people to your call-to-action button (CTA). Your CTA is crucial, because it’s how you convert an email subscriber into a paying customer. To increase the conversion of your CTA, make a valuable promise in your body copy and headers that’s only delivered through your CTA.
<<<
Using a more engaging CTA which teases what's to come on clicking the CTA button or link is more likely to result in engagement than otherwise. For example, "Get your free sample" is better than just saying "Learn more".
Easily add media files as embeds to TiddlyWiki (and wider web) that can be annotated in a wiki-like manner?
"Let us go forward as with other matters and other measures similar in aim and effect - let us go forward in malice to none and good will to all. Such plans offer far better prizes than taking away other people's provinces or lands or grinding them down in exploitation. ''The empires of the future are the empires of the mind''..."
Winston Churchill at Harvard university after receiving an honorary doctorate in law.
''What do EORs do for businesses?''
An EOR allows a business to employ legal, full-time workers in a different country, state, or province. This is in contrast to a [[professional employer organization (PEO)]] The EOR takes on the burden of local legal requirements to ensure the client company can employ workers in the area. Remote operates as an EOR in all our covered countries, states, and provinces.
Without an EOR, businesses cannot employ workers outside the region where they are headquartered, with a few exceptions. Larger enterprises, for example, may choose to open their own local legal entities to employ workers in different places. This process can be both expensive and time consuming, though, especially when dealing with multiple countries. Historically, barriers of cost have locked out all but the most well-funded businesses from hiring global workforces.
Employers of record provide access to global talent to companies of all sizes, not just enterprise clients. If you want to hire someone in a place where you do not own a legal entity (and you don’t want to go through the enormous hassle of creating an entity yourself) you need an EOR.
‘Empower,’ a human capital consultancy firm founded by [[Miranda Naiman|Miranda Naiman interview: founder of Empower]].
Website: https://www.empower.co.tz/
#### Build your own `Emulator`
* [**C++**: _How to write an emulator (CHIP-8 interpreter)_](http://www.multigesture.net/articles/how-to-write-an-emulator-chip-8-interpreter/)
* [**C++**: _Emulation tutorial (CHIP-8 interpreter)_](http://www.codeslinger.co.uk/pages/projects/chip8.html)
* [**C++**: _Emulation tutorial (GameBoy emulator)_](http://www.codeslinger.co.uk/pages/projects/gameboy.html)
* [**C++**: _Emulation tutorial (Master System emulator)_](http://www.codeslinger.co.uk/pages/projects/mastersystem/memory.html)
* [**JavaScript**: _GameBoy Emulation in JavaScript_](http://imrannazar.com/GameBoy-Emulation-in-JavaScript)
* [**Python**: _Emulation Basics: Write your own Chip 8 Emulator/Interpreter_](http://omokute.blogspot.com.br/2012/06/emulation-basics-write-your-own-chip-8.html)
<div><a class="domain reader-domain" href="https://isamatov.com/encapsulation-in-javascript-es6/">isamatov.com</a>
<div> </div>
<h1>Different ways to achieve encapsulation in JavaScript(ES6): - Iskander Samatov</h1>
<div> </div>
<div>
<div>7-9 minutes</div></div></div>
<hr />
<div>
<p>JavaScript is a powerful language full of different paradigms that let you write interesting and flexible code. However, at the same time it lacks some of the basic structural features the other languages have. By far one of the biggest anomalies of JavaScript is it’s inability to natively support encapsulation. </p>
<div>
<p>The scoping system was introduced with TypeScript, which is a superset of JavaScript. But unfortunately its not a clear victory yet since, while it does give you a warning, TypeScript code still compiles and runs even when you access the private variables.</p>
<p>Nevertheless, people came up with ways to achieve encapsulation using other features of the language. And in this post I’m going over the most widely used ones.</p>
<h2><strong>Easy way</strong></h2>
<p>The easiest way to achieve pseudo-encapsulation would be to prefix your private member with a special symbol that indicates the private scope to the client. It is a common convention to use the <code>_</code> symbol as a prefix. Of course this won’t actually prevent anyone from accessing your private variables so we won’t go in too much detail here.</p>
<h2><strong>Factory functions and closures</strong></h2>
<p>Simply put, factory functions are functions used to create new instances of the object. Factory functions are often a preferred choice over the direct object creation using <code>new</code> keyword. The reason is because using factory function gives you the freedom and flexibility to change the object’s instantiation process without client ever being aware of the change.</p>
<p>Factory functions used with <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap">closures</a> are often a go-to method for achieving encapsulation because of it’s simplicity. Let’s take a look at the example:</p>
<div>
<div>
<table>
<tbody>
<tr>
<td> </td>
<td>
<div>
<p>function Hedgehog () {</p>
<p> let speed = 10000; // this is private</p>
<p> this.name = 'Sonic';</p>
<p> this.zoom = function () {</p>
<p> // both name and speed are accessible from here</p>
<p> console.log(`${this.name} zooms with the speed of ${speed} miles per second!`);</p>
<p> }</p>
<p>}</p>
<p>const sonic = new Hedgehog();</p>
<p>sonic.zoom();</p>
<p>console.log(sonic.name) //valid value</p>
<p>console.log(sonic.speed) // undefined</p></div></td>
</tr>
</tbody></table></div></div>
<p>The code above is a typical example of attaining encapsulation via factory function and closure. While the implementation is pretty straightforward, it does come with a memory usage penalty. The reason is because method <code>zoom</code> will be recreated for every new instance of the <code>Hedgehog</code> function. Here’s an identical implementation that uses ES6 syntax:</p>
<div>
<div>
<table>
<tbody>
<tr>
<td>
<div>
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p></div></td>
<td>
<div>
<p>class Hedgehog {</p>
<p> constructor() {</p>
<p> let speed = 10000; //this is private</p>
<p> this.name = 'Sonic';</p>
<p> this.zoom = function () {</p>
<p> // can access both name and speed from here</p>
<p> console.log(`${this.name} zooms with the speed of ${speed} miles per second!`);</p>
<p> }</p>
<p> }</p>
<p> jump() {</p>
<p> // cannot access speed from here</p>
<p> console.log(`${this.name} jumps on top of the building!`);</p>
<p> }</p>
<p>}</p></div></td>
</tr>
</tbody></table></div></div>
<p>As you can see in order for <code>zoom</code> method to access both <code>speed</code> and <code>name</code> we had to put it in the constructor. In some cases this penalty is acceptable and you might be okay using it. Also, to reduce the overheat you can define classes that don’t use private variables outside of the constructor, like we did with <code>jump</code> method.</p>
<h2><strong>Weak maps and namespaces</strong></h2>
<p>The memory penalty caused by using factory functions and closures can be avoided by using <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap">WeakMap</a></code> objects to store the private members. The penalty is avoided since one <code>WeakMap</code> can be used to store private members of multiple instances of the class. Let’s look at the example to understand the concept better:</p>
<div>
<div>
<table>
<tbody>
<tr>
<td>
<div>
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p></div></td>
<td>
<div>
<p>let Hedgehog = (function () {</p>
<p> let privateProps = new WeakMap();</p>
<p> class Hedgehog {</p>
<p> constructor(name) {</p>
<p> this.name = name; // this is public</p>
<p> privateProps.set(this, { speed: 1000 }); // this is private</p>
<p> }</p>
<p> zoom() {</p>
<p> console.log(`${this.name} zooms with the speed of ${privateProps.get(this).speed} miles per second!`);</p>
<p> }</p>
<p> }</p>
<p> return Hedgehog;</p>
<p>})();</p>
<p>let sonic = new Hedgehog('Sonic');</p>
<p>console.log(sonic.zoom());</p></div></td>
</tr>
</tbody></table></div></div>
<p>Here’s what’s happening here:</p>
<ul>
<li>We wrap the <code>Hedgehog</code> class inside of the self-invoking function and return it. This way we ensure that our private data is only created once and our class is instantly available to the client.</li>
<li>Within the self-invoking function but outside of the <code>Hedgehog</code> class, we store our <code>WeakMap</code>. This map is used for storing private variables for each instance of the <code>Hedgehog</code> class. Each value inside of the map is an object that we call <code>namespace</code>. In essence, <code>namespace</code> is a private object with key-value pairs that is only available to the particular instance of the <code>Hedgehog</code> class that holds a reference to it.</li>
<li>As mentioned before, the overheat is greatly reduced due to the fact that we’re only storing one map for multiple instances of <code>Hedgehog</code> class.</li></ul>
<p>There’s a reason why we chose <code>WeakMap</code> for storage instead of using a regular <code>Map</code> or a plain JavaScript object:</p>
<ul>
<li>Weak maps allow you to use JavaScript objects as keys. Other kinds of dictionary collections will only let you use primitives.</li>
<li>Memory leaks are avoided because <code>WeakMap</code> holds weak references to its items. This allows those items to be garbage collected when they loose all other references.</li>
<li>Weak maps guarantee that objects are only accessible using <code>get</code> method. <code>WeakMap</code> does not have any other methods for accessing its items(<em>looping, </em><code><em>Object.keys()</em></code><em> and etc</em>).</li></ul>
<h2><strong>Using Symbols (kind of encapsulated)</strong></h2>
<p>The last approach is using new ES6 feature – symbols. Symbol is a type of primitive that is guaranteed to be unique. One of its primary purposes is to be used as key for dictionary collections.</p>
<p>The trick here is to use closure to define a private symbol. Let’s look at the example:</p>
<div>
<div>
<table>
<tbody>
<tr>
<td>
<div>
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p></div></td>
<td>
<div>
<p>let Hedgehog = (function () {</p>
<p> const speed = Symbol();</p>
<p> class Hedgehog {</p>
<p> constructor(name) {</p>
<p> this.name = name;</p>
<p> this[speed] = 1000; // this is not directly accessible</p>
<p> }</p>
<p> zoom() {</p>
<p> console.log(`${this.name} zooms with the speed of ${this[speed]} miles per second!`);</p>
<p> }</p>
<p> }</p>
<p> return Hedgehog;</p>
<p>})();</p>
<p>let sonic = new Hedgehog('Sonic');</p>
<p>sonic.zoom();</p></div></td>
</tr>
</tbody></table></div></div>
<p>Using this method each instance of the <code>Hedgehog</code> class has its own instance of the <code>this[speed]</code> variable which is still accessible to other methods in the class thanks to the <code>speed</code> symbol defined at the top. Symbols are not accessible when using dot notation and iterating over the collection of objects or using <code>Object.keys()</code>. And so it does provide some level of encapsulation.</p>
<p>While symbols do provide a sufficient level of encapsulation for the most cases, it can still be breached using<code>Object.getOwnPropertySymbols</code>. Although, most of the time the client should get the hint and won’t try to use those private properties.</p>
<p>And that’s it for this post. Hopefully, you learned some new ways to achieve encapsulation in JavaScript. Thanks for reading!</p></div></div>
<div> </div>
TiddlyWiki5 allows the entire content of a TiddlyWiki HTML file to be encrypted with the Stanford JavaScript Crypto Library. Opening an encrypted TiddlyWiki in the browser prompts for a password before decrypting and displaying the content.
For instructions on how to use TiddlyWiki5's encryption features, see [[Encryption]].
The EncryptionMechanism is implemented with the following elements:
* A PasswordVault within the BootMechanism that holds the current encryption password
* The ability of the BootMechanism to read a block of encrypted tiddlers from the TiddlyWiki file, to prompt the user for a password, and to decrypt the tiddlers
* Handlers for the messages [[WidgetMessage: tm-set-password]] and [[WidgetMessage: tm-clear-password]] that handle the user interface for password changes
* The EncryptWidget within the main file template that encrypts a filtered list of tiddlers with the currently held password
* The [[$:/isEncrypted]] tiddler that contains "yes" or "no" according to whether there is a password in the password vault
** The availability of this tiddler allows the RevealWidget to be used to selectively display user interface elements according to whether encryption is in force
It costs a lot to make an app or website.
It costs even more to make a really good app or a website.
It costs a fortune to make an app or a website that will succeed and bring lucrative returns.
How can we make it work for ordinary people with a software factory for idiots that will not introduce tech debt?
What's expected from an EnterpriseWiki (besides the base requirements of such a wiki)?
* It needs integrate well with existing corporate tools & infrastructure e.g. corporate logins, outlook integration
* It needs to have a rich text editor that works outright
* Hierarchical content mapping with things like breadcrumbs
* Charting functionality is needed:
<<<
The charting functionality of Foswiki and Confluence is simply better in meeting the needs of companies.
[[Source|https://blog.seibert-media.com/2014/12/12/the-wikipedia-of-the-company-yes-but-not-with-mediawiki/#:~:text=The%20charting%20functionality%20of%20Foswiki%20and%20Confluence%20is%20simply%20better%20in%20meeting%20the%20needs%20of%20companies.]]
<<<
* A rich ready-made feature set is a must because there may be no budget set aside for editors in the company
* Table creation is essential.
* Importing documents from Word, PPT, etc is essential
* Exporting and importing as PDF is essential
* Blogging support
* Content management
* Knowledge base requirements, including being searchable
What's NOT required in an EnterpriseWiki?
* No need for vandalism control. Only accountability and fine grained user rights management
* No need to worry so much about scaling
Charting the road to TiddlyWiki as an EnterpriseWiki...
How do you improve reproducibility in various software projects, especially in containerized infrastructure?
Case in-point:
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">cc: <a href="https://twitter.com/LostInTangent?ref_src=twsrc%5Etfw">@~LostInTangent</a><br><br>I remember reading something you had written about this a while back–but can't find the link. 😟<br><br>Are there any best practices authors (or github) can use to improve reproducibility in their container infra?<a href="https://t.co/R0FqKDBYxz">https://t.co/R0FqKDBYxz</a></p>— 👩💻 Paige Bailey @ 127.0.0.1 🏡 #BLM (@~DynamicWebPaige) <a href="https://twitter.com/DynamicWebPaige/status/1389338610781069315?ref_src=twsrc%5Etfw">May 3, 2021</a></blockquote>
And some suggestions:
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">We had a similar idea for quantum computing. Most of QC packages are in python. So, we have been able to implement a python environment management using jupyterhub on cloud. check us out, <a href="https://t.co/ftsGrsP15s">https://t.co/ftsGrsP15s</a> :)</p>— Kanav (@kanav_setia) <a href="https://twitter.com/kanav_setia/status/1389378950992957443?ref_src=twsrc%5Etfw">May 4, 2021</a></blockquote>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">💯 I use <a href="https://twitter.com/gitpod?ref_src=twsrc%5Etfw">@gitpod</a> and get the added benefit of prebuilds, a concept where the dev environment is prepared for each git commit. It installs dependencies and even starts the necessary app services so that it's always ready to code. Disclaimer, I work at Gitpod.</p>— Mike Nikles (@mikenikles) <a href="https://twitter.com/mikenikles/status/1389373225088344066?ref_src=twsrc%5Etfw">May 4, 2021</a></blockquote>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">don't forget about <a href="https://twitter.com/mybinderteam?ref_src=twsrc%5Etfw">@mybinderteam</a>! we care about this too! :-)</p>— Chris Holdgraf (@choldgraf) <a href="https://twitter.com/choldgraf/status/1389335988594307072?ref_src=twsrc%5Etfw">May 3, 2021</a></blockquote>
<div>
<div><a class="domain" href="https://www.who.int/publications/i/item/9789240029200">www.who.int</a>
<h1>Ethics and governance of artificial intelligence for health</h1>
<div>
<div>2 minutes</div></div></div>
<hr />
<div>
<div>
<div>
<div>
<h3>Overview</h3>
<p>The WHO guidance on <em>Ethics & Governance of Artificial Intelligence for Health</em> is the product of eighteen months of deliberation amongst leading experts in ethics, digital technology, law, human rights, as well as experts from Ministries of Health. While new technologies that use artificial intelligence hold great promise to improve diagnosis, treatment, health research and drug development and to support governments carrying out public health functions, including surveillance and outbreak response, such technologies, according to the report, must put ethics and human rights at the heart of its design, deployment, and use.</p>
<p>The report identifies the ethical challenges and risks with the use of artificial intelligence of health, six consensus principles to ensure AI works to the public benefit of all countries. It also contains a set of recommendations that can ensure the governance of artificial intelligence for health maximizes the promise of the technology and holds all stakeholders – in the public and private sector – accountable and responsive to the healthcare workers who will rely on these technologies and the communities and individuals whose health will be affected by its use.</p></div></div></div></div></div>
<p>How do you know which MVP to build first? Choose wisely: This will be the next several months of your life.<br>
A successful MVP satisfies three criteria:</p>
<ol>
<li><strong>It addresses a meaningful </strong><a href="https://jtbd.info/replacing-the-user-story-with-the-job-story-af7cdee10c27" rel="noopener nofollow"><strong>job to be done</strong></a><strong>.</strong> A
customer spending their own time or money to do a job chooses your
solution as the best option for them. Pick a meaningful job — the more
frequently occurring the better — and offer a significant advantage
(better, faster, or cheaper).</li>
<li><strong>It has a growth engine. </strong>Build or price growth into your product. There are two viable growth engines for tech companies:</li>
<li><strong>Viral, or “inherently viral” growth:</strong> Customers
either intentionally or unintentionally recruit new customers by using
your product. Social platforms use intentional virality; this occurs
when users get a more fulfilling experience as more of their friends
join the same platform. Unintentional virality happens when customers
inadvertently introduce others to the product experience, similar to how
shared bike or scooter riders serve as mobile billboards for the
experience.</li>
<li><strong>Economic paid acquisition: </strong>Contribution margins
from customers are recycled into advertising, marketing, and other PR
activities that successfully drive additional customers. Note well,
though: this engine is “economic” because it must fuel itself. It’s easy
to simply buy customers, but only real value makes them stay. Your
product must collect far more value over the lifetime of the customer
relationship than the cost of acquiring that customer in the first
place.</li>
<li><strong>It has a rapid time-to-value: </strong>How long must
customers wait for the “aha” moment? With my first Uber ride in late
2011, it took about two minutes for that moment to arrive: I installed
the app, entered my credit card, ordered a car, and it was waiting for
me by the time I walked down one flight of stairs. Aha! I knew I’d never
wait for another taxi in San Francisco again. The faster and more
simply your product can prove its worth, the higher rate of conversion
from tire-kickers to retained customers. For software startups, ask
yourselves this question: What’s the <strong>one screen that will make your customers get it?</strong></li></ol>
<div><a class="domain reader-domain" href="https://venturebeat.com/2020/05/09/moving-to-an-everything-as-code-world/">venturebeat.com</a>
<h1>Moving to an ‘everything as code’ world</h1>
<div>Ethan Batraski</div>
<div>
<div>6-7 minutes</div></div></div>
<div>
<hr />
<div>
<div>
<div>
<div>
<div>
<p>The <em>Transform Technology Summits start October 13th with Low-Code/No Code: Enabling Enterprise Agility. <a href="https://venturebeat.com/event/the-low-code-no-code-summit/register/">Register now!</a></em></p>
<hr /></div>
<p>Engineers are great at making hard things possible. Then repeatable. Then automatable. Then run on their own. Software development has repeated this cycle over and over. We build a new capability; we make it easier to repeat with scripts, we let it run on its own with fixed functions, and then we abstract it into code where we no longer worry or think about it.</p>
<p>Today we <a href="https://venturebeat.com/2020/04/08/tonkean-raises-24-million-to-automate-enterprise-workflows/">build workflows</a> decoupled from the technologies themselves, with code that is expressive and declarative, based on end goals and desired states.</p>
<p>But when it comes to the way we operate and scale the underlying infrastructures that power our software, we look more like a Formula One pit crew — a high-performance team of specialists that need to continually triage, tune, adjust, and repair.</p>
<h2>Infrastructure at our fingertips</h2>
<p>The cloud has transformed how we build software. With a single API call, you can spin up more compute resources than existed in all of the last decade combined. Developers went from thinking about physical machines to living in a world of network, compute, and storage as virtual resources. These resources have led to a generation of “cloudified” (serverless) services and “containers” (self-contained runtime environments) for almost every part of the developer stack, reducing operational cost, complexity, and engineering lead times.</p>
<p>And there is a lot to like about this new world of containers and serverless. Powerful Open Source and commercial projects such as Git, Jenkins, Cloudflare, Terraform, Puppet/Chef/Ansible, and Kubernetes have dramatically improved how we deploy infrastructure, applications, and manage workflows. (Disclosure: My firm is an investor in Cloudflare.)</p>
<p>That’s until you need to start stitching them all together. At that point, you enter an unwieldy sprawl of static configurations, scripts, and files.</p>
<h2><strong>Configuration sprawl</strong></h2>
<p>If this all sounds overly complex, that’s because it is. Before software is even written, it can take hours to configure and deploy the underlying cluster or workflow. Workflows are built on the back of static scripts and configuration files, lacking versioning or testability. Scale and performance require manual tuning. Configuration files and documentation go out of sync faster than DevOps can keep up. Triaging errors and failures requires hours of manual tracing. Best practices and patterns are hard to enforce. With constant operator intervention needed to keep it all running, the teams building and maintaining infrastructure are often larger than the teams building the services or applications on top of it.</p>
<p>This complexity is becoming magnified in a COVID-19 world as companies deal with impacted operating plans and distributed workforces. With limited resources and increasing demand load, unbundling the complexity and eliminating the manual and repetitive tasks that plague DevOps and engineering teams has never been more important.</p>
<p>We’ve been stuck with tools and configurations that fixate on the underlying technologies, not on workflows describing end goals and desired states.</p>
<p>This presents us with an opportunity to build a new generation of tools and workflows that will programmatically operate infrastructure the same way we use code to build our software.</p>
<h2>Everything as code</h2>
<p>The idea of “everything as code” (EaC) is emerging across each layer of the stack. It involves writing infrastructure as software, where everything is expressed with code.</p>
<p>With code, you can describe the end result or the series of steps to take. It’s declarative and expressive. EaC introduces a world where our infrastructures, workflows, and services start to demonstrate the mature, programmatic, and resilient patterns we’re used to:</p>
<ul>
<li>Version controlled and immutable</li>
<li>Maintainable, testable, and collaborative</li>
<li>Modular, composable, and separate</li>
<li>Auto-scalable and resource-pool dynamically</li>
<li>Predictable and consistent</li>
<li>Linters and static analysis to enforce consistency</li>
<li>Graceful self-healing and failovers</li>
<li>No need for constant operator intervention</li>
<li>Secure and upgradable</li></ul>
<p>EaC changes the focus from manual, repetitive tasks to workflows based on end goals and desired states. Bringing how we manage infrastructure closer to the maturity of how we build software.</p>
<p>Companies like HashiCorp, Cloudflare, Confluent, Amazon, Puppet Labs, Astronomer, and more, along with a thriving open source community, are fundamentally changing everything from how we deploy and operate servers, environments, containers, pipelines, and more, as code.</p>
<p>EaC represents a major shift and catch-up. The cloud unlocked new capabilities to build software faster, cheaper, and better. The velocity of new capabilities grew faster than we could imagine. The faster we adopted them, the more the software and tools to operate them were buckling at the knees. Our legacy workflows can no longer keep up with the speed of the cloud. Now is the time to catch up and build a new wave of tools, capturing everything as code.</p>
<p><em>Ethan Batraski is a Partner at <a href="https://www.venrock.com/">Venrock</a>.</em></p></div></div></div></div></div>
Review of paper titled ''Knowledge management practices and performance: are they truly linked?''
published August 2013 in //Knowledge Management Research & Practice 11//
DOI:10.1057/kmrp.2012
Are KM practices linked to improved organizational performance? It depends. In Malaysia, a survey of 180 knowledge-based organizations led to the following observations and conclusions:
<<<
The analysis indicated that knowledge acquisition and knowledge utilization positively influenced strategic and operational improvement in organizations, whereas the positive effect of knowledge dissemination was only evident in the case of strategic improvement.
<<<
But what caught my interest is the fact that organization size had interesting moderating impacts on the benefits of KM practices:
# Benefits of knowledge acquisition via hiring experts are extremely moderated by the size of the organization, probably because of the amount of time it takes for new recruits to familiarize themselves with the organization's system. ''The larger the organization, the longer it takes to see the benefits, if at all.''
## Knowledge acquisition is more impactful on strategic improvement in smaller organizations than in larger ones, even in small amounts. This is related to the level of complexity in organizations
## Reduced flexibility in larger organizations also plays a key role in moderating the impact of knowledge acquisition
## ''All of the above help explain why large organizations have to recruit at a higher level just to get a small advantage in terms of process improvements''
# ''Benefits of knowledge dissemination were not seen in processes improvement''. Workers tend to pick and choose specific knowledge that is most relevant and only when needed when considering process improvement. So automatic, direct improvement of processes from the moment of sharing and storing knowledge isn't a given, but ''dissemination is still an important channel for sharing knowledge for whenever it will be needed by workers'' (like ants storing grain for the winter).
# Knowledge sharing is easier in small organizations, but dissemination is more formalized and established in larger organizations, which in the latter case helps mitigate the ill effects of being large as far as performance is concerned
Why is all this important? It is because most large organizations favor knowledge acquisition via hiring more than via other KM practices such as:-
# knowledge acquisition through existing employees,
# dissemination, and
# utilization
However, as outlined above, ''hiring may not be the most efficacious of KM practices for large organizations''. The use of these other practices must be improved in order to experience the promised performance improvements often touted by KM practitioners. ''Smaller organizations especially stand to benefit most from improved KM practices.''
__Limitations__
This study's methodology (questionnaire based survey) allows for more generizable conclusions vs case studies that typify this field. However, there are limitations pointed out in the paper:
* Limited scope of performance influencing variables examined
* Only organization size was examined as a moderating factor. There may be others like organization culture that haven't been examined
Despite these limitations, these are interesting insights that can guide future research.
Your experiments have to verify the following things:
# Problem Identification: We have verified a customer segment with a burning problem/need that they are willing to pay to fix
# Problem/Solution Fit: We have verified a solution to their problem that they would buy right now if it were available
# Product/Market Fit: We have verified a channel to reach customers for sale and delivery of solution
# Scalability: We have verified that the business model can be scaled profitably and sustainably
/explore
* Plugins
* Themes
* Wikis
* Templates
* Stories
*
__Problem__
There is no useful way to easily and seamlessly explore and save published research, i.e. the Web of Knowledge without resorting to countless search inputs in Google Scholar. It's very tiring and you tend to miss good stuff, or hit the same research over and over again.
An ''Expression'' consists of one or more [[operands|Operand]] with [[operators|Operator]] acting on them.
{{Operand}}
{{Operator}}
<<<
''Warning'': The internal code of the Formulas may still change in a way that breaks extensions. Be prepared to maintain your additions if necessary.
<<<
!Defining new functions
Functions are loaded from tiddlers with `module-type: formula-function` at startup.
Each function is assigned as a field of the module's `exports` object.
Formula-Functions are usually expressed as JavaScript functions accepting some [[Value Objects|Value Object]] as arguments and returning a [[Value Object]] as a result. Functions may throw (string) exceptions if there is a problem.
Formula-Functions that behave differently based on the arguments are expressed as objects with the following fields:
|Property|Meaning|h
|select|Function taking one argument, "operands", that returns the function to be used. The selection is usually based on the number of arguments.|
|construct||
|min_args|Optional minimum number of arguments. Defaults to zero.|
|min_args|Optional maximum number of arguments. Defaults to unlimited.|
Either select or construct must be defined.
See the existing function tiddlers for a starting point:
<$list filter="[prefix[$:/plugins/ebalster/formula/functions/]]">
<$link>{{!!title}}</$link><br/>
</$list>
In the future, conventions for value conversion may change. Currently, all values are encapsulated in `V_***` objects, and must be converted to usable data using `as***` methods. This is being reconsidered.
!Defining new operators
Operators are defined as objects with a small number of properties, and are loaded from tiddlers with `module-type: formula-operator` at startup.
Internally, all operators are converted to functions by the formula compiler.
```
10*3+4^2*2
```
is equivalent to
```
add(multiply(10,3), multiply(pow(4,2), 2))
```
Each function is assigned as a field of the module's `exports` object.
Formula-Operators are expressed as objects with the following properties:
|Property|Meaning|h
| `arity`|Required. The number of operands the operator uses. 1 means unary, 2 means binary. Other numbers are not supported at the moment.|
| `operator`|Required. The operator's symbol, expressed as a string. Should include only symbolic characters, and no spaces.|
| `function`|Required. The function to convert the operator into. Should be a directly-defined formula-function taking `arity` arguments.|
| `precedence`|Required for binary operators. Determines order of operations.|
| `associativity`|Optional. Assign `"right"` to evaluate a binary operator right-to-left rather than left-to-right (the default).|
| `position`|Required for unary operators. `"pre"` for prefix operators, `"post"` for postfix.|
Prefix unary operators are applied first, in reverse order, followed by postfix unary operators in forward order, followed by binary operators. The predefined binary operators use this order:
|Category|Operators|Precedence|Associativity|h
|Exponents|`^`|30|right*|
|Multiplication|`* /`|20||
|Addition|`+ -`|10||
|Concatenation|`&`|4||
|Comparison|`= < <= > >= <>`|0||
^^* Right-associativity is not supported yet, but will be in the future.^^
See the existing operators for a starting point:
<$list filter="[prefix[$:/plugins/ebalster/formula/operators/]]">
<$link>{{!!title}}</$link><br/>
</$list>
# Primum non nocere
# Pathemata mathemata
# Semper exploro
# [[Per aspera ad astra|https://youtu.be/L6zulqXLPUw]]
# Acta non verba which I can modify to actio, non solum verbis
Ideas for organizing feature TiddlyWiki editions from OnePlaybookLab:
* Wikis built with
* Editions which are organized into
* Portals linking to editions and other resources like themes and plugins
Users will have the ability to either fork a wiki, its tiddlers, its base edition or the plugins. Portals being nothing but wikis themselves can also be forked.
<<<
We believe, in fact, that wikis and pattern languages share fundamental structural characteristics – and that it is not
too much to claim that wikis (in their originally intended form) are, in fact, a form of elementary pattern language.
They both share the following unique set of characteristics:
A. Both are open-ended sets of information, consisting of unitary subsets (pages or patterns) connected by
hyperlinks. Each set of information is able to expand, while remaining within a linked network.
B. Both are topical essays with a characteristic structure: overview (with links), definition, discussion, evidence,
conclusion, further links. This limited structure creates the capacity for extensibility and interoperability – the
capacity of new pages to function smoothly with older ones, with the capacity for open-ended growth.
C. Both are structured to be easily creatable, shareable and editable by many people. This capacity facilitates the
creation of user communities, who are crucial to the development of a large and useful body of shareable pages or
patterns.
D. Both are (in principle) evolutionary, falsifiable and refinable. As structured essays, both make assertions about
characteristics of the world they describe – assertions that can be falsified. Once falsified, they can be modified to
correct discrepancies, and to refine accuracy. This evolutionary capacity translates into greater accuracy and
usefulness over time.
E. Both aim to create useful ontological models of a portion of the world, as a more formalized subset of language.
These are models of design specifically for pattern languages, and models of knowledge more generally for wikis.
<<<
We could bootstrap synchronous editing by transcluding/importing data from OnePlaybook [[TiddlyWiki]]s into any collaborative editor, where it can be edited together by others and reflected back to OnePlaybook.
Switching between contexts to search is tiring and few people like the "explore" button in various office software. What if we could have federated inline searching when want to link or embed?
Inspired by the cortex km app demoing one for Wikipedia on Twitter.
Federated sharing is the exchange of information between different organizations that have established some sort of trust infrastructure, (which is itself called a Federation).
Federated sharing is offered by many cloud services today, and allows for sharing information like share free/busy calendar data and contact information with recipients in other external federated organizations or with users that have internet access. However, except for some select functions like email and calendars, most cloud services cannot form federations with incompatible servers.
<$transclude tiddler="OnePlaybook's goal" mode="block" />
The trick here is to ensure compatibility without risking security.
Instead of moving away from your coding environment to explore the web for a solution, you can bring all your snippets, explanations and docs right into your editor via federated sharing.
Federated wikis are a type of distributed wiki. It's hosted, edited, administrated and operated in a part-decentralized way by it's users. It has
# asynchronous and
# (soon) real-time text editing,
# a distributed conflict management system, like the ability to fork, branch and merge pages and so on.
The key to understanding how federated wikis work is that page changes can be pushed or pulled cross-wiki (versus having one wiki you don't own but use in a centralized service). All wikis involved in the federation can share changes to pages.
Federated Wiki (or Fedwiki for short) is a concept from [[Ward Cunningham|https://en.wikipedia.org/wiki/Ward_Cunningham]] reimagining the potential of the wiki, which he is credited with inventing.
* Time management
* Jargon: less of it or more definitions
A ''Filter'' in a [[Formula]] follows the [[same rules and syntax as ordinary filters|https://tiddlywiki.com/#Filter%20Expression]]. The result is interpreted as an array of [[Data|Datum]].
Various [[Functions]] such as `sum` and `textjoin` are made to deal with arrays.
Note that firefox doesn't support `backdrop-filter` so you're going to have to rely on some [[workarounds using `@supports` in your css|https://gist.github.com/mrtcmn/0490fb79fa63418e4409a99553f80e26]].
A first class function is a function that's treated as an object or is assigned to a variable.
A higher order function is one that accepts a function as an argument or returns a function as its result.
Here are the svg icons for Fission codes login button
<<<
What is TiddlyWiki, in your own words?
<<<
Describing TiddlyWiki has become something of a mental exercise for us when introducing it to people outside of the TiddlyWiki community. It's pretty hard because it is more than just another wiki application. For beginners, the succinct description of a "non-linear notebook app" is usually sufficient to get them interested enough to have a look and try it out for themselves. The idea of creating free flowing linked thoughts is appealing because in many ways, that is how our minds usually work. We tend to meander in our thoughts, and at our own pace. It's refreshing for many of us who can't bear to fill diaries on a regular basis!
However, the moment beginners start to use TiddlyWiki and experience the many incredible features it has to offer like transclusion, metaprogramming and the ability to reproduce its own source code (making it a quine) and allowing it to save itself as a self-contained, decentralized HTML5 file, they usually almost always experience a profound aha moment. All of these features aren't really captured by the non-linear notebook description well enough. So I'd prefer calling it 'a metaprogramable environment for your thoughts and knowledge'. Another apt high-level description I like to use is 'like excel, but in notebook form.'
<<<
When did you discover TiddlyWiki?
<<<
I discovered TiddlyWiki around 2016. I was looking around web at the time for inspiration for my next web side project. I wanted to try to create a knowledge management system because, as a doctor and philomath, my primary concern was building and maintaining an organized personal knowledge base for the many things I learned over the years. However, I didn't want to simply use someone else's app though. I also wanted to learn about learning. Meta-learning if you will. That was the motive that led me to discover TiddlyWiki serendipitously. When I first saw it, I was amazed. I remember saying to myself, 'this is it!' It was pretty much what I wanted and Jeremy Ruston et al behind it have done a smashing job! Its many features made it incredibly versatile and encouraged co-creation and contributions via plugins, themes, language add-ons and macros. I went all in and have never regretted it.
<<<
What do you use TiddlyWiki for personally?
<<<
I try to organize my life with TiddlyWiki as much as possible. I use it for brainstorming, creating shopping lists, noting down ideas, even saving web articles for offline saving that are too important to me to be put into another web article saving tool. In some cases, I use TiddlyWiki's built-in building blocks to create my own solutions. Other times I use a solution crafted by other TiddlyWiki users. I do all this not only for my own utility, but also to explore new ideas for plugins to fill in certain need gaps that may exist in TiddlyWiki. I'm heavily invested in my notebook. So much so that it has become a living portrait of my life. I am sure advertisements networks would kill to have this kind of rich information about a single person. But they never will, and that's the beauty of it! It's all yours and no one else's. Oh, it even has a built-in tool to encrypt your notes so there's that!
<<<
What have you built with TiddlyWiki? (We already largely went over this in our first call, so feel free to skip over this or give a very brief answer.)
<<<
I've built a number of plugins, including a Lean canvas manager that I'd like to revamp in the near future, Maarfapad dot com which is a free community cloud service for hosting personal wikis, and now the I am busy with the upcoming OnePlaybook dot app service which will give users the ability to create and use wikis inside their preferred cloud service.
<<<
What are your favorite TiddlyWiki plugins?
<<<
Let me break it down into a list:
* For UI, I love the work that JD mobile is doing. I use his Whitespaces plugin that configures TiddlyWiki into a mobile friendly experience among other things.
* Mohammed's Kookma Todo list plugin is a very compact micro-app todo list maker for your wiki. Highly recommended
* Noteself is an awesome edition of TiddlyWiki that creates a self-hosted wikis with the your data being stored inside your browser. You can also sync it to a CouchDB server that you own
* Projectify is a beautiful edition of TiddlyWiki reimagined as a project management tool with direct inspiration taken from basecamp by its author. Very nice that one.
* Krystal plugin turns your wiki into Andy Matuschak's notebook. If you don't understand, Google this guy's notes. It's mind-blowing and he's awesome!
* There are many more than I can fit into this email reply, but these are my absolute favorite. There is also a plugin that turn TiddlyWiki into a RoamResearch alike called Stroll. This is a testament to the inventiveness of our community. You never know what you might find tomorrow.
<<<
What's one thing that you wish TiddlyWiki did?
<<<
In terms of features, there's not much it can't do that's essential. You can always create a plugin or macro to satisfy your needs. And more will come along, especially as the core developers work to make API easier to understand and work with in upcoming versions. More integrations with other external services for things like sharing and publishing would also be nice. But what I would like is more traction. And that's somewhat more difficult to attain.
Although TiddlyWiki is already very popular as an opensource software, with more than 5k stars on github, it is still relatively unknown to many it's meant to help. Its main 'competitor' in this space is RoamResearch which tends to steal the show among academics, which is ok, we all have different tastes, but I feel people are missing out a lot. Particularly in terms of robustness; TiddlyWiki works fine no matter the browser you use or the state of your internet connection. You can't say the same about most software as a service apps. And when it comes to knowledge management, you want that kind of robustness and versatility. TiddlyWiki is so much older than other similar apps today (more than seven years old now) and it has stayed very stable throughout that time. Backwards compatibility is keystone in the community. A TiddlyWIki from 2014 will work just as well and will be mostly compatible with a version from 2021. That kind of robustness is gold in an age of planned obsolescence and 'move fast, break things'.
<<<
What excites you about Fission and TiddlyWiki teaming up?
<<<
Whenever there is a new service integration for TiddlyWiki, there's more to look forward to in terms of possibilities and opportunities. Hooking up TiddlyWiki to Fission allows for all kinds of interesting things IMO, such as web publishing, site creation, SaaS creation (difficult if you don't employ a MERN or LAMP architecture), things that might require domain experts or teams might now be possible for ordinary people from other fields of expertise to do. The web should be open for creators from all walks of life, not just IT ninjas. I see this partnership as a step towards enabling that vision even more. We can imagine people learning only basic web skills creating B2B web services built with TiddlyWiki and hosted on decentralized infrastructure and improving their livelihood. It may feel like a stretch, but we must remember that all of the web today was once seen as a stretch too. It's up to all of us to make it more mundane!
* Initiation: less of planning and more of defining a high level concept and rationale, followed usually by seeking approval
* Planning: here you set goals using the [[SMART]] framework. Once you have your eye on the prize, you’re ready to address the ins and outs of the project, including the scope, budget, risks, team members, milestones, and more with your team. This can feel daunting, but it’s a whole lot easier if you create something called a [[work breakdown structure|https://marketplace.atlassian.com/apps/1219682/wbs-work-breakdown-structure-story-board?hosting=cloud&tab=overview]] (WBS). This splits your entire project into individual tasks that get displayed in a graphic format. This can help you identify who needs to do what and help create a realistic timeline.
* Execution: get it done!
* Monitoring: this happens in parallel with execution. You check to see if you're staying on schedule and if not, adjust course to make sure you do.
* Closure: here you could do a
** Retrospective talk about what went right and so on
** Write up a final report on the project
** Filing and storing your project documentation so you can reference it in the future
If we need to configure some additional offline behaviors with `gatsby-plugin-offline`, check this web page out: https://www.freecodecamp.org/news/how-to-enable-offline-mode-for-gatsby-site/
A Formula is written as an [[Expression]] inside "mushroom brackets" `(= =)`.
Formulas may contain [[Comments]] in `// line` or `/* multiline */` form.
{{Expression}}
{{Formula}}
!!See also
* [[BNF Grammar]]
!Introduction
The ''Formula Macro'' is an alternative to the [[Formula Widget|FormulaWidget]] that can be [[used in tag attributes|Formulas as Tag Attributes]].
The macro is somewhat less efficient than the widget because it can't store the compiled formula. There are no formatting options at this time.
!Parameters
;formula
:The formula to evaluate. Same as in [[FormulaWidget]].
!Examples
```
<<formula "(5*2+2^8)/3">>
```
<<<
<<formula "(5*2+2^8)/3">>
<<<
Formulas can currently be used as attributes in HTML tags, widgets and by using the [[Formula Macro|FormulaMacro]].
```
<svg
width=<<formula 10*10>>
height=<<formula 10*10>>
viewBox="0 0 100 100">
<circle cx=50 cy=50 r=<<formula 5*5>> />
</svg>
```
<table><tr><td>
<svg
width=<<formula 10*10>>
height=<<formula 10*10>>
viewBox="0 0 100 100">
<circle cx=50 cy=50 r=<<formula 5*5>> />
</svg>
</td></tr></table>
!!Direct Syntax
A direct syntax is also possible, but requires modifications to the TiddlyWiki core. It's shorter, avoids "gotchas" with quotes in formulas, and updates faster than the macro version.
```
<svg
width=(=10*10=)
height=(=10*10=)
viewBox="0 0 100 100">
<circle cx=50 cy=50 r=(=5*5=) />
</svg>
```
<table><tr><td>
<svg
width=(=10*10=)
height=(=10*10=)
viewBox="0 0 100 100">
<circle cx=50 cy=50 r=(=5*5=) />
</svg>
</td></tr></table>
<<<
To enable direct formulas-as-attributes syntax, drag-and-drop this "mod" plugin to your wiki, along with the modloader plugin:
{{$:/plugins/ebalster/attribute-modules||$:/core/ui/Components/plugin-info}}
{{$:/plugins/ebalster/modloader||$:/core/ui/Components/plugin-info}}
<span style="color:red;">This is written as a "mod" for TiddlyWiki 5.1.15 and not guaranteed to work in all future updates.</span> Official support in the TiddlyWiki core is being explored.
<<<
Formulas are created with a "mushroom bracket" syntax:
```
(= 2 =)
(= add(2, 3) =)
(= "That's all, folks!" =)
```
Values in tiddler fields can be replaced by formulas using the same notation, allowing formulas to be [[transcluded|Transclusion]] into other formulas.
See [[Syntax]] for more about this notation.
!!Formatting Numbers
The `<$formula>` widget includes attributes to control how numbers are formatted back into text. The variables `<<formulaPrecision>>` and `<<formulaFixed>>` can be defined to control number formatting in WikiText formulas, as well as any `<$formula>` widgets where these are left unspecified.
For example, an application calculating dollars and cents might define a fixed display precision of two decimal points:
```
\define formulaFixed() 2
(= sum([tag[Expenses]get[value]]) =)
```
This will produce a nice round result, like 3.52, as opposed to the raw floating-point value which could be something like 3.5199999999999996.
!Examples
```
(= sum([tag[Expenses]get[value]]) =)
```
(= multiply(2, sum([tag[Expenses]get[value]])) =)
!Introduction
The `<$formula-vars>` widget works like TiddlyWiki's `$vars` widget, except each attribute is computed as a formula before being assigned to a variable.
This offers some advantages over using `$vars` with [[Formulas as Tag Attributes]].
!Attributes
|Attribute|Description|h
|{attributes not starting with $}|Each attribute name specifies a variable name. The attribute value is evaluated as a formula and the result is assigned to the variable.|
|$numberFormat|A format for numbers in the [[numeral.js|http://numeraljs.com/]] style.<br/>Defaults to variable `<<formulaDateFormat>>`.|
|$precision|Numbers will include this many significant digits. If no number is specified, the number will be shown at maximum precision.<br/>Defaults to variable `<<formulaPrecision>>`.|
|$fixed|Numbers will include this many digits after the decimal point.<br/>Overrides toPrecision. Defaults to variable `<<formulaFixed>>`.|
|$dateFormat|A format string for dates that works like the one in TiddlyWiki's `<<now>>` macro.<br/>Defaults to variable `<<formulaDateFormat>>`.|
|$noRebuild|__Experimental__. Prevents full DOM rebuild when variables change. This can boost performance substantially but will cause certain elements not to refresh.|
!Examples
```
<$formula-vars
catch="14+8"
fahrenheit="6^3+5^3+4^3+3^3+2^3+11">
* Catch-<<catch>>
* Fahrenheit <<fahrenheit>>
</$formula-vars>
```
<<<
<$formula-vars
catch="14+8"
fahrenheit=6^3+5^3+4^3+3^3+2^3+11>
* Catch-<<catch>>
* Fahrenheit <<fahrenheit>>
</$formula-vars>
<<<
!Introduction
The `<$formula>` widget computes a formula and returns its result as WikiText.
!Attributes
|Attribute|Description|h
|formula|The formula string to be evaluated.|
|outputType|ContentType of the formula result. Defaults to WikiText.|
|outputMode|Parse mode used on the formula result: `inline` (the default) or `block`.|
|numberFormat|A format for numbers in the [[numeral.js|http://numeraljs.com/]] style.<br/>Defaults to variable `<<formulaDateFormat>>`.|
|precision|Numbers will include this many significant digits. If no number is specified, the number will be shown at maximum precision.<br/>Defaults to variable `<<formulaPrecision>>`.|
|fixed|Numbers will include this many digits after the decimal point.<br/>Overrides toPrecision. Defaults to variable `<<formulaFixed>>`.|
|dateFormat|A format string for dates that works like the one in TiddlyWiki's `<<now>>` macro.<br/>Defaults to variable `<<formulaDateFormat>>`.|
|debug|Whether to include debug information in the output. (Defaults to 0.)|
!Examples
```
<$formula formula="2 * sum([tag[Expenses]get[value]])" toFixed=2/>
```
<<<
<$formula formula="2 * sum([tag[Expenses]get[value]])" toFixed=2/>
<<<
When you attempt to solve problems by 'maximizing work not done', you solve them by using a small set of simple generative patterns rather than specifying every single behavior from scratch. Here's an outline from [[Wiki as a Pattern Language]] (emphasis my own):
<<<
Cunningham was intrigued by the capacity of language, in its very ambiguity and economy, to serve more ably as a
useful working model for problem-solving. A problem is, by definition, not pre-decomposed into simple functional
units, but as Alexander noted, has many overlapping and ambiguous connections. Language mirrors this capacity, and
therein lies its usefulness. Therefore the goal is, in a sense, to achieve the same robustness of language, by endowing
the model with its own set of powerful (but limited in number) generative components, much as language does.
Thus, the goal is not simply a matter of economy, but one of greater context-adaptive problem-solving power. In fact
it goes back to the heart of Alexander's concept of language-like networking: a simple grammatical system,
functioning generatively, can be far more powerful than a complex set of specification-based processes. As
Cunningham put it, when asked by programmer Tom Munnecke to explain how “the generativity of a pattern is a way
of expressing complexity:”
<div>
<<<
That was an idea that excited me, and that seemed more powerful than most notion that I had seen. ...And
that is, language is generative, I follow some rules, and I can't remember when I learned them, but I was
probably pretty young. And that idea that I can have a set of rules that generates something that I could
value is really important. So the question was, why don't we do everything that way? And the answer was,
well we pretty much did, until we let professionals get involved. And they said, no, no, no, no, it's really
much simpler, you know, and they made it complex by trying to make it simpler, because they didn't
understand how some system of rules could generate behaviors instead of specifying behaviors.'
(Cunningham, 2011)
<<<
</div>
This generation refers to the capacity to reproduce the essence of a functioning structure without having to specify all
of its characteristics. A simple example is the distinction between the way a genetic process generates the blue eyes,
say, of a child, which recapitulates the blue eyes of the parent without having to specify them in minute detail (their
intricate retinal pattern, round shape, etc). Instead, the genetic process is able to generate, and regenerate, an
intricately complex structure from a relatively simple set of language-like instructions.
The result of this kind of work is, somewhat paradoxically, to reduce the complexity of the models we use for
structuring our world – even as we increase their ability to handle real complexity more effectively. This is not so
hard to understand, again, if we use an analogy to language. ''We do not need to draw little pictures to specify
everything we see. Instead, we use a flexible language offering immense versatility, with just a small number of
generative elements. With just 26 letters and a few other symbols, we can cover plate tectonics, or the plays of
Shakespeare, or any of an infinite range of other subjects. ''
<<<
<!--StartFragment-->
<div>
<p>I always start from the Jobs-to-be-done framework. I don’t think that great startup ideas pop out of nowhere- I think they are discovered by observing jobs that arise in the world.</p>
<p>By the way, that’s also how we decided to build <a class="eq ih" href="http://avopos.com/" rel="noopener ugc nofollow" style="margin: 0px; padding: 0px; color: rgb(91, 171, 3); text-decoration: none;" target="_blank">avopos</a>.</p>
<blockquote>
<p>Great products (or services) succeed because they do the Job-to-be-done better than the alternatives</p></blockquote>
<blockquote>
<p><strong>Recommended Pre-read:</strong> <a class="eq ih" href="https://p-zero.fufei.io/how-to-build-great-products-367059df3aa" rel="noopener ugc nofollow" style="margin: 0px; padding: 0px; color: rgb(91, 171, 3); text-decoration: none;" target="_blank">How to build great products</a></p></blockquote>
<p>Here are some frameworks for discovering startup ideas using the Jobs-to-be-done (JTBD) framework:<br />
(1) Bundling<br />
(2) Unbundling<br />
(3) Lower Coordination Cost<br />
(4) Luxury at scale<br />
(5) Reduce Adoption Friction<br />
(6) Low NPS incumbents<br />
(7) Solving issues due to older solutions<br />
(8) One improved Vector of Success<br />
(9) Demand Aggregation</p>
<p>Every company uses a combination of the above. They aren’t meant to be mutually exclusive. 😃</p>
<p>Let’s get down to it.</p></div>
<div> </div>
<div>
<div>
<h1>1. Bundling</h1>
<p>A bundling strategy works when<br />
(a) you are defining your JTBD broadly enough and<br />
(b) you can offer additional products at marginal cost.</p>
<div>
<div><img alt="" class="aj if ig" src="https://miro.medium.com/max/1400/1*HGVhRO7o7ru1BGI-N6dKaA.png" style="margin:0px; padding:0px" /></div></div>
<blockquote>
<p>Create products that align with your main JTBD and offer them at a lower price and/or tremendous value.</p></blockquote>
<p>Microsoft is the common example of a bundler but there isn’t always a clear overlap between their products (e.g. Excel & OneNote).<br />
I think HubSpot does it better in terms of solving for a particular job:</p>
<div>
<div>
<div>
<div>
<div> </div>
<div><img alt="" class="aj kl t u v" src="https://miro.medium.com/max/1400/1*012FX8veWXC5ztkl_p753Q.png" style="margin:0px; padding:0px" /></div></div></div></div></div>
<p><strong>In most cases,</strong> startups should avoid this strategy. If your product strategy involved requiring you to build a lot, it will take you a very long time to launch.</p>
<p>But, there are exceptions, Notion had quite a feature-rich product at launch.</p>
<h1>2. Unbundling</h1>
<p>An unbundling strategy involves carving out a job from a bloated product.</p>
<blockquote>
<p>A <strong>bloated product</strong> is almost always <strong>trapped</strong> because they need to satisfy the needs of the majority.</p></blockquote>
<div>
<div>
<div>
<div>
<div> </div>
<div><img alt="" class="aj kl t u v" src="https://miro.medium.com/max/1400/1*0aDuKBMaPMxu_hf7esIU4A.png" style="margin:0px; padding:0px" /></div></div></div></div></div>
<p>It works when<br />
(a) there is a clear deviation in the Job-to-be-done and<br />
(b) that niche is big enough and/or growing over time.</p>
<div>
<div>
<div>
<div>
<div> </div>
<div><img alt="" class="aj kl t u v" src="https://miro.medium.com/max/1400/1*S2cFH9M1kW3RHISnC04z8Q.png" style="margin:0px; padding:0px" /></div></div></div></div></div>
<p>We use this strategy ourselves on <a class="eq ih" href="http://avopos.com/" rel="noopener ugc nofollow" style="margin: 0px; padding: 0px; color: rgb(91, 171, 3); text-decoration: none;" target="_blank">avopos</a>.</p>
<h1>3. Lower Coordination Cost</h1>
<p>This involves recognizing the <strong>friction</strong> around certain <strong>workflows and reducing this friction</strong> through software (or better processes).</p>
<p>This strategy works when the Jobs-to-be-done require<br />
(1) High number of redundant steps or,<br />
(2) High coordination cost or,<br />
(3) Visibility into each step</p>
<div>
<div>
<div>
<div>
<div> </div>
<div><img alt="" class="aj kl t u v" src="https://miro.medium.com/max/1400/1*3WREzacjQYdu_nfo0-77nQ.png" style="margin:0px; padding:0px" /></div></div></div></div></div>
<p>Some other examples include filling accounting expenses and getting KYC procedures done.</p>
<h1>4. Luxury at Scale</h1>
<p>This strategy involves recognizing a Job-to-be-done that was only <strong>previously</strong> <strong>afforded to the rich</strong> and <strong>scaling it to the masses</strong>.</p>
<p>Some examples<br />
(1) Flagging a black limo (Uber)<br />
(2) Getting food delivered to your doorstep (Foodpanda)</p>
<div>
<div>
<div>
<div>
<div> </div>
<div><img alt="" class="aj kl t u v" src="https://miro.medium.com/max/1400/1*8G5ybqwuRJtTK25jtJOXbQ.png" style="margin:0px; padding:0px" /></div></div></div></div></div>
<p>This works in the B2B world as well<br />
(1) Engineers to build basic automation (Every no-code tool)<br />
(2) Engineers to manage small but important component (API-first company)<br />
(3) Translators to manage different website versions (Lokalise)</p>
<div>
<div>
<div>
<div>
<div> </div>
<div><img alt="" class="aj kl t u v" src="https://miro.medium.com/max/1400/1*juemJ6zqoAvnYjXmMyEUvw.png" style="margin:0px; padding:0px" /></div></div></div></div></div>
<h1>5. Lower Adoption Friction</h1>
<p>This strategy involves identifying a <strong>known job</strong> and <strong>removing friction</strong> from the current adoption process.</p>
<div>
<div>
<div>
<div>
<div> </div>
<div><img alt="" class="aj kl t u v" src="https://miro.medium.com/max/1400/1*vocPB4o8rk7Un59TU5c1dw.png" style="margin:0px; padding:0px" /></div></div></div></div></div>
<p><em>Note: Reducing adoption friction might give you a headstart but it isn’t really a sustainable competitive advantage in the long run.</em></p>
<h1>6. Low NPS Incumbents</h1>
<p>This strategy also involves identifying a <strong>known job</strong> but focusing specifically on areas where people are <strong>unhappy with the incumbent</strong> players.</p>
<blockquote>
<p><strong>Recommended Reading:</strong> <a class="eq ih" href="https://p-zero.fufei.io/how-understanding-vectors-of-success-will-make-your-products-better-81bd50f982e6" rel="noopener ugc nofollow" style="margin: 0px; padding: 0px; color: rgb(91, 171, 3); text-decoration: none;" target="_blank">How to build better products</a></p></blockquote>
<div>
<div>
<div>
<div>
<div> </div>
<div><img alt="" class="aj kl t u v" src="https://miro.medium.com/max/1400/1*Ws6oSfObkjWqplJBjr-K0g.png" style="margin:0px; padding:0px" /></div></div></div></div></div>
<p>Lots more <a class="eq ih" href="https://customer.guru/net-promoter-score/industry/technology-computer-software-prepackaged-software" rel="noopener ugc nofollow" style="margin: 0px; padding: 0px; color: rgb(91, 171, 3); text-decoration: none;" target="_blank">here</a></p>
<p>The internet is full of unhappy customers. It shouldn’t be too hard to identify one that piques your interest.</p>
<h1>7. Solving issues due to older solutions</h1>
<p>Some old solutions never seem to go out of date.<br />
BUT those <strong>solutions might not be perfect</strong>. They could create issues that <strong>unlock new Jobs</strong>.</p>
<p>An example would be a drill.<br />
It is, <em>I think</em>, still the best product if I need a hole in the wall.</p>
<div>
<div>
<div>
<div>
<div> </div>
<div><img alt="" class="aj kl t u v" src="https://miro.medium.com/max/1400/1*iYbJyDNAEGYzsdMJZWDmvQ.png" style="margin:0px; padding:0px" /></div></div></div></div></div>
<p>But what about the mess it creates after?</p>
<p>WordPress is <em>still</em> <em>okay</em> for websites, and they have an entire ecosystem dedicated to solving its shortfalls.</p>
<div>
<div>
<div>
<div>
<div> </div>
<div><img alt="" class="aj kl t u v" src="https://miro.medium.com/max/1400/1*iuP30hSoP73VB4Xk-gMgbQ.png" style="margin:0px; padding:0px" /></div></div></div></div></div>
<h1>8. One improved Vector of Success</h1>
<p>This strategy involves <strong>identifying an obvious Job-to-be-done</strong> and building a product that is better in just <strong>One Vector of Success.</strong></p>
<div>
<div>
<div>
<div>
<div> </div>
<div><img alt="" class="aj kl t u v" src="https://miro.medium.com/max/1400/1*o9VOWkiR4trzXFbd1W6UPw.png" style="margin:0px; padding:0px" /></div></div></div></div></div>
<blockquote>
<p><strong>Recommended Reading:</strong> <a class="eq ih" href="https://p-zero.fufei.io/how-understanding-vectors-of-success-will-make-your-products-better-81bd50f982e6" rel="noopener ugc nofollow" style="margin: 0px; padding: 0px; color: rgb(91, 171, 3); text-decoration: none;" target="_blank">Vectors of Success</a></p></blockquote>
<h1>9. Demand Aggregation</h1>
<p>This strategy involves looking for <strong>almost</strong> <strong>identical</strong> Jobs-to-be-done across multiple users and aggregating that demand.</p>
<blockquote>
<p><em>The key here is that they have to be almost identical.</em></p></blockquote>
<h2>Marketplaces</h2>
<p>In most cases, the aggregation of demand will allow you to build a marketplace.</p>
<p>But:</p>
<blockquote>
<p>The more varied the demand, the more difficult it will be to build up your supply base.</p></blockquote>
<div>
<div>
<div>
<div>
<div> </div>
<div><img alt="" class="aj kl t u v" src="https://miro.medium.com/max/1400/1*Q1OEevCquWDdQzA4LivX-Q.png" style="margin:0px; padding:0px" /></div></div></div></div></div>
<p>If the demand is similar but not identical, you might need to build a service layer to manage the idiosyncratic matching of demand and supply.</p>
<h2>Others</h2>
<blockquote>
<p>Demand aggregation can be monetized in other forms.</p></blockquote>
<p>If you consider “distract and entertain me for 5min” as a Job-to-be-done, <strong>Facebook</strong> & <strong>Twitter</strong> do a great job at aggregating that demand for advertising.</p>
<p>If you consider “inspire and teach me about bootstrapping” as a Job-to-be-done, <strong>IndieHackers</strong> & <strong>Startups for The Rest Of Us</strong> do a great job at aggregating that demand for advertising.</p></div></div>
<div> </div>
<div>
<div>
<h1><strong>Note:</strong></h1>
<p>This list isn’t exhaustive. I will continue updating it over time. Follow me on <a class="eq ih" href="https://twitter.com/SymbolOfFlight" rel="noopener ugc nofollow" style="margin: 0px; padding: 0px; color: rgb(91, 171, 3); text-decoration: none;" target="_blank">Twitter</a> for the latest versions.</p></div></div>
<div> </div>
<div>
<div>
<p>Hope you enjoyed reading this 🚀</p>
<p>If you did, consider following me on <a class="eq ih" href="https://twitter.com/SymbolOfFlight" rel="noopener ugc nofollow" style="margin: 0px; padding: 0px; color: rgb(91, 171, 3); text-decoration: none;" target="_blank">Twitter</a>. 👍</p></div></div><!--EndFragment-->
<div>
<div><a class="domain" href="https://dev.to/this-is-learning/from-developer-to-solutions-architect-a-simple-guide-2b91">dev.to</a>
<h1>From developer to (solutions) architect. A simple guide.</h1>
<div>Natalia Venditto</div>
<div>
<div>16 - 21 minutes</div></div></div>
<hr />
<div>
<div>
<div>
<div>
<p>So you don't have formal CS education and have been doing development for some years, or you are a junior but your manager has already asked you where do you see yourself in tech in a few years. You want to become an Architect, but you are not sure of what it takes and you want to have a better idea of what you should focus on. You want to understand where are your technical gaps and what soft skills are required. This article is for you!</p>
<p>Architect is an umbrella term to designate a role that is focused on either designing or refining software solutions for the benefit of the customer. But it has different accountabilities, depending on the organization you work for.</p>
<h2><a name="presales-solutions-architects"> </a> Pre-Sales Solutions Architects</h2>
<p>Pre-Sales Solutions Architects can also be called Customer Engineers or Sales Engineers, and are usually focused in making sure a technology they represent fits a customer's use case and their required capabilities, while they help them design a system to integrate it, or give pointers about the best application of it. They'll work on high-level diagrams, do discovery, work in scoping, and give support to Sales reps during technical alignments.</p>
<h2><a name="postsales-solutions-architects"> </a> Post-Sales Solutions Architects</h2>
<p>Some of the pre-sales Architects, also do post sales, meaning that after you're done with the sales process, and a deal is closed, you focus in helping with the actual implementation. They may just design the systems at a high level and overview the implementation, or be very hands on, and execute it together with the technical implementation team.</p>
<h2><a name="software-architects"> </a> Software Architects</h2>
<p>Software Architect is a very hands on role, architecting and oftentimes implementing a software solution. Software Architects are an equivalent of the Post-Sales, usually for a product or specific technology. Software Architects are not necessarily customer facing.</p>
<p>Again, it's important to clarify that the designation and accountabilities for each role, may vary across the industry.</p>
<h2><a name="the-technical-common-ground"> </a> The technical common ground</h2>
<p>No matter what type of architect, the common ground is the technical one. Architects are technical by nature, from a perspective that allows them to connect tech specifications to complex security requirements, governance nuances and privacy compliance and sovereignty, and legal liabilities. They are not concerned with the nitty-gritty details of the implementation, rather the big picture. Deployment pipelines, layers of the stack, performance at a system level, user management, locality, infrastructure components...those are the things that really interest and occupy an architect.</p>
<h2><a name="process-phases-a-solutions-architect-participates-of"> </a> Process phases a Solutions Architect participates of</h2>
<p>I work now in the role of Solutions Architect, and will focus on this particular dimension, since Software Architects are involved in processes pertaining the software development cycle, which is much more complex to describe.</p>
<p>Solutions Architects are usually a customer facing role and participate of and are instrumental to a lot of conversations with them. Their main goal is to discover and scope a system's requirements and/or current technical state as much as drafting the desired state and deciding or advising on the most ideal solution.</p>
<h3><a name="discovery"> </a> Discovery</h3>
<p>SA's (acronym for Solutions Architect) participate of discovery. These are the early stages of conversation with a client, where many questions are asked. An SA needs to understand everything about their client, their product or project, their goals, their problems, so they can map those to tangible solution suggestions.</p>
<p>The most important skills at a discovery meeting are not technical: Solutions Architects need to be able to</p>
<ul>
<li>listen more than talk</li>
<li>make good assumptions and validate them with the client</li>
<li>do not propose a solution ahead of understanding well all the problems and requirements</li>
<li>be very objective</li></ul>
<p>Contrary to what many people think, even those architects that represent a brand, are unlikely to push for a biased solution if they assess that's not what the client needs. Not only your reputation is at stake, most architects pride themselves in promoting the foundations of a solid system</p>
<h4><a name="foundations-of-a-solid-system"> </a> Foundations of a solid system</h4>
<p>Solid, well designed systems share certain identical features. They all aim to be scalable, robust, resilient, recoverable and secure, among other important characteristics. Architects also want their systems to be highly available and sometimes they have requirements for them to be globally distributed, which is less of a problem today when global provisioning is guaranteed in the cloud.</p>
<h3><a name="scoping"> </a> Scoping</h3>
<p>Requirements are the documented capabilities used to measure a systems success, according to whether or not they're satisfied. They usually map to those foundational concepts. Like for example, it may be a requirement for the system to have an uptime of a certain percentage (usually 99.995% for mission critical applications, which is about 4s downtime daily - you can calculate that SLA here <a href="https://uptime.is/">https://uptime.is/</a>). That requirement maps to <code>High Availability</code>.</p>
<p>The process of putting requirements and capabilities in scope, is also done by the architect, and usually (technically) validated by the customer with business objectives in mind, at some point. Backlogs are oftentimes the result of generating user stories and functional requirements directly from the scoping exercise, together with the validation and priorization of capabilities, towards a release.</p>
<h2><a name="what-technologies-should-i-focus-on"> </a> What technologies should I focus on?</h2>
<p>That is a difficult question to answer, since it will very much depend on the type of system a software or solutions architect is designing or assessing, the technologies may vary greatly. I will focus on describing a list of technologies and areas of expertise you may want to check out, if your goal is to become an architect working in web oriented solutions.</p>
<h3><a name="the-cloud-landscape"> </a> The cloud landscape</h3>
<p>This is not to say there aren't architects still working on premise in self managed environments, but if you're planning to join the forces, you probably want to have an idea of who are the 3 public cloud providers (<a href="https://aws.amazon.com/">AWS</a>, <a href="https://azure.microsoft.com/en-gb/">Azure</a> and <a href="https://console.cloud.google.com/">GCP</a>), and their offering and topology.</p>
<p>You may also want to learn about cloud-native technologies, and explore what's hot and trending.</p>
<p>Additionally it's very useful to know certain jargon and how some mechanisms work in the cloud. Concepts like</p>
<ul>
<li>what is a <a href="https://www.capitalone.com/tech/cloud/what-is-a-cluster/">cluster</a></li>
<li><a href="https://www.delltechnologies.com/en-us/blog/the-difference-between-scale-up-and-scale-out/">scaling out vs. scaling up</a></li>
<li>what are <a href="https://www.confluent.io/learn/distributed-systems/">distributed systems</a> and how they work</li>
<li>what are the <a href="https://docs.microsoft.com/en-us/azure/architecture/best-practices/caching">caching mechanisms</a> and the best practices in the cloud</li></ul>
<h3><a name="infrastructure-and-infrastructure-provisioning"> </a> Infrastructure and infrastructure provisioning</h3>
<p>Provisioning infrastructure is not really the architect domain and it is usually done by the system engineers, Ops or other roles (the name may vary, depending on the organization). However, architects may have to validate or analyse the deployment pipelines and infrastructure setup before it is executed or afterward, for several reasons:</p>
<ul>
<li>costs assessment</li>
<li>compliance with architecture definitions (security, performance, technology definitions, etc)</li>
<li>risk evaluation</li>
<li>reconfiguration</li></ul>
<p>Although infrastructure provisioning, especially in the cloud, is provider dependent, there are some concepts you need to know and understand.</p>
<h4><a name="networking"> </a> Networking</h4>
<p>You will need to understand well how the internet works and all the layers involved. Some important concepts and focus areas would be</p>
<ul>
<li>the Networking Layer Model per type (TCP/IP, vLab, ISO/OSI)</li>
<li>TCP/UDP/HTTP Protocols</li>
<li>SSL and other Networking Security concepts (Firewalls, Keys, VPN's, VPC, Private Link, Network Peering, etc)</li></ul>
<p>A book I definitely recommend to read to catchup with a lot of these concepts, is <a href="https://www.pearson.com/us/higher-education/program/Kurose-Computer-Networking-A-Top-Down-Approach-7th-Edition/PGM1101673.html">Computer Networking, a Top-Down Approach</a> I had to read it when I was taking credits in Software Engineering, and it's one of the best books on the subject.</p>
<p>I also recommend you download and install <a href="https://www.wireshark.org/">Wireshark</a> for packet sniffing or TCP analysis, to learn more about segments, headers, and other networking concepts. There are more sophisticated tools, but this one is great to get going. It's open source, free and a consolidated tool.</p>
<h4><a name="hardware"> </a> Hardware</h4>
<p>Yes, you need to know about hardware. This is particularly important at the time of deciding on infrastructure configuration and if you detect performance issues and must scale up or down/out or in and system, to decide on the specifications. Concepts like</p>
<ul>
<li>CPU, (disk) SDD and HDD, (memory) RAM(ø)</li>
<li><a href="https://www.quostar.com/blog/iops-explained/">IOPS</a></li>
<li><a href="https://www.zdnet.com/article/commonly-used-raid-architectures/">RAID</a> architecture</li>
<li><a href="https://www.cloudflare.com/en-gb/learning/network-layer/what-is-a-computer-port/">ports</a> -very important for hexagonal architectures-</li></ul>
<p>and concepts like</p>
<ul>
<li>big and little <a href="https://www.freecodecamp.org/news/what-is-endianness-big-endian-vs-little-endian/">endianness</a></li></ul>
<p>Unless you actually work at a data center and walk in between racks, you probably don't need to know about other components like power supplies. Just the necessary specifications to match a software requirement. Although I always advise that the more you know, the better! But you also need to know about:</p>
<ul>
<li>operating systems(ø)</li>
<li><a href="https://azure.microsoft.com/en-us/overview/what-is-virtualization/">virtualization</a> (most servers are actually virtual machines on top of physical servers)</li>
<li><a href="https://www.ibm.com/cloud/learn/containerization">containerization</a> and containerization and orchestration software (like <a href="https://www.docker.com/">Docker</a> and <a href="https://kubernetes.io/">Kubernetes</a>)</li></ul>
<p>(ø)I am not going to provide links to content about physical components of computers because there are way too many sources, and you only need to run a quick google search and pick the one that interests you the most.</p>
<p>One important piece of advise I can give you, is that whatever operating system you love the most, you probably need to be familiar with Unix and Unix-like systems and architectures, and be proficient in the use of the <a href="https://www.unixtutorial.org/basic-unix-commands">shell</a> since it's the preferred means of executing code remotely, deploying packages and code and accessing systems.</p>
<h4><a name="databases"> </a> Databases</h4>
<p>The task of storing and manipulating data becomes more and more important, as applications are more and more user-centric. Storing data is not only about the software used for it. It's a key part of the success of an application. And architects need to be well aware of the</p>
<ul>
<li>different <a href="https://ecomputernotes.com/fundamental/what-is-a-database/type-of-data-models">data models</a> and database architecture</li>
<li><a href="https://www.mongodb.com/nosql-explained/nosql-vs-sql">tabular vs document</a></li>
<li><a href="https://aws.amazon.com/nosql/graph/">graph databases</a></li>
<li>physical requirements of the database software</li>
<li>limitations of certain models in relation to scalability</li>
<li>security implications of data flows</li></ul>
<p>You probably want to investigate what product corresponds to what provider, and want to learn concepts like <a href="https://www.techopedia.com/definition/16455/transaction-databases">transactions and ACID compliance</a></p>
<p>You may think I'm biased, but I recommend you head to the MongoDB free learning platform aka <a href="https://university.mongodb.com/">MonogDB University</a>, where there are tons of information on all those subjects, and a lot of it is -contrary to what many may think- very objective.</p>
<h4><a name="architecture-models"> </a> Architecture models</h4>
<p>Well obviously, an architect needs to know about architecture! And architecture is an evolving and dynamic ground!</p>
<ul>
<li><a href="https://microservices.io/">microservices</a></li>
<li><a href="https://dzone.com/articles/hexagonal-architecture-what-is-it-and-how-does-it">hexagonal architectures</a></li>
<li>monoliths</li>
<li><a href="https://docs.microsoft.com/en-us/azure/architecture/guide/architecture-styles/event-driven">event-driven</a> architecture</li>
<li><a href="https://www.martinfowler.com/articles/serverless.html">serverless</a> architecture</li></ul>
<p>You need to know those concepts by heart and when they're the approach to follow. I am inclined to think that a good architect, just like a good developer, is never biased, and will try to find the right solution to a problem, instead of finding a problem to implement a preferred solution.</p>
<p>All those paradigms have software and technologies associated, that you may want to explore and experiment with. For example:</p>
<ul>
<li>docker (containerization/virtualization)</li>
<li>kubernetes (orchestration/management of containers)</li>
<li><a href="https://kafka.apache.org/">kafka</a> (event-streaming platform)</li>
<li>serverless functions (very much provider dependent, are a way to execute functions on triggers and avoid large backend implemetations)</li></ul>
<p>Needless to say that the many providers will have tools and connectors, modules and best practices or guidelines, to implement each different type of pattern according to their infrastructure architecture and offering.</p>
<h4><a name="deployment-pipelines-and-release-models"> </a> Deployment pipelines and release models</h4>
<p>Architects are usually in charge of designing deployment pipelines, that tend to depend on the application release model. If you are working with a continuous integration pattern, you'll probably have to support it with CI/CD automation tools. And the following concepts should be familiar to you</p>
<ul>
<li>Actions</li>
<li>Triggers/Events</li>
<li><a href="https://docs.microsoft.com/en-us/dotnet/architecture/cloud-native/infrastructure-as-code">Infra as code</a></li></ul>
<p>together with relevant software (again, options may be conditioned by the cloud provider choice)</p>
<ul>
<li><a href="https://circleci.com/docker/?utm_medium=sem&utm_source=microsoft&utm_campaign=sem-microsoft-dg--emea-en-circleciBuildDeployEnviron-eCPC-auth-nb&utm_content=keyword-text_rsa-exact_docker-&msclkid=a0fbd75708d018c80cceb7af26c0bf57">Circle CI</a></li>
<li><a href="https://www.jetbrains.com/teamcity/?msclkid=415bd95bc1411e73c559b9a3f07fc2ff&utm_source=bing&utm_medium=cpc&utm_campaign=EMEA_en_ES_TeamCity_Search_Competitors&utm_term=circle%20ci&utm_content=circle%20ci">TeamCity</a></li>
<li><a href="https://www.terraform.io/">Terraform</a></li></ul>
<p>In the realms of automation you may also have to design means of performing test-automation for different areas, ranging from code sanity to performance, and have to know about the implementation and configuration of tools like</p>
<ul>
<li><a href="https://www.sonarqube.org/">SonarQube</a> (code quality)</li>
<li><a href="https://customerportal.solarwinds.com/">SolarWinds</a> (performance monitorization or observability) and the likes</li></ul>
<h4><a name="access-control-and-governance"> </a> Access control and governance</h4>
<p>Architects are for sure in many cases responsible for software/platform security, if not for its implementation, for its design or assessment.</p>
<p>It is important for architects to understand the many means of controlling access to software code bases and data, and the services provided by the applications they architect.</p>
<p>Architects know well the meaning of</p>
<ul>
<li>authorization</li>
<li>authentication <a href="http://www.bu.edu/tech/about/security-resources/bestpractice/auth/">http://www.bu.edu/tech/about/security-resources/bestpractice/auth/</a></li></ul>
<p>and have to understand the different ways to implement them, at an application level and low level, too.</p>
<p>It is desirable for architects to understand what vectors of vulnerability their apps or platforms, or the software they work with may be exposed to, in order to mitigate risks.</p>
<p>Governance has many meanings and implications and it's so intersectional I can only map it to the different dimensions it may connect to.</p>
<p>For example, designing role based access depending on authorization granularity is part of governance policies for access, while software capabilities providing the ability to set those rules, guarantee legal compliance with standards like <a href="https://www.iso.org/isoiec-27001-information-security.html">ISO27001</a> or GDPR.</p>
<h4><a name="the-api-and-application-layers"> </a> The API and application layers</h4>
<p>Most modern architecture patterns for web development are very heavily API dependent. It is very likely that the software or platform an architect is responsible for, does not only consume from dozens of API's but also exposes some of them.</p>
<p>Needless to say, 100% of the tools I mentioned through the article, are API based, and so are most of the services exposed by cloud providers.</p>
<p>For this reason, architects need to be skilled on API design and maintenance, and very familiar with concepts and patterns like</p>
<ul>
<li><a href="https://restfulapi.net/">REST APIs</a> and <a href="https://www.json.org/json-en.html">JSON</a> standards</li>
<li><a href="https://graphql.org/">GraphQL</a></li>
<li><a href="https://stoplight.io/api-types/soap-api/">SOAP</a> (although less used now, many legacy systems still consume or expose SOAP services)</li>
<li>And other API alternatives like <a href="https://www.geeksforgeeks.org/introduction-java-servlets/">Java Servlets</a></li></ul>
<p>And before you complain about the age of some of the mentioned API architectures, remember that a lot of times Solutions Architects assist in migrating <a href="https://www.techopedia.com/definition/635/legacy-system">Legacy Systems</a>, and for that, they need to know what they're facing!</p>
<p>In order to effectively design and maintain, or even assess in-place solutions, it is very useful for architects to be aware of and implement the <a href="https://www.openapis.org/">Open API specification</a> and <a href="https://swagger.io/">Swagger</a></p>
<p>Architects need to design the connection and sometimes aggregation of data coming from all those API's. For that reason, they also need to understand well how to consume them and distribute them, and need to know concepts like</p>
<ul>
<li><a href="https://apifriends.com/api-management/api-gateway-to-the-cloud/">north-south bound</a> (API gateway)</li>
<li><a href="https://apifriends.com/api-management/service-mesh/">east-west bound</a>(service-to-service or service mesh)</li>
<li>proxy and <a href="https://www.cloudflare.com/en-gb/learning/cdn/glossary/reverse-proxy/">reverse proxy</a></li></ul>
<p>In terms of app development, it may not be necessary for architects to know or understand implementation details of high level languages, but most architects do anyway, since at a great percentage architects used to be developers.</p>
<h2><a name="highlevel-diagrams-uml-and-other-types-of-diagrams"> </a> High-level diagrams, UML and other types of diagrams</h2>
<p>Architects speak in diagrams. Believe me. Oftentimes they need to represent very complex systems and relationships, and the only way to do it is being proficient at representing entities with shapes and arrows.</p>
<p>This is why architects learn</p>
<ul>
<li><a href="https://www.edrawsoft.com/what-is-uml-diagram.html">UML</a></li>
<li><a href="https://www.vertabelo.com/blog/crow-s-foot-notation/">Crow's Foot Notation</a> and other representation schemas</li></ul>
<p>Architects usually conduct and lead calls with customers, and they need to have great public speaking and presentation skills: from putting together impressive slide decks, to expressing complex technical ideas in a language everyone can understand.</p>
<h2><a name="sales"> </a> Sales</h2>
<p>Some organizations hire architects to be part of their sales processes, and advise sales reps and clients from a technical perspective.</p>
<p>Those organizations are very likely to offer training in their sales process and methodologies used, as well as ramping up the architects in a particular technology or software.</p>
<h2><a name="will-all-my-coding-skills-go-to-waste"> </a> Will all my coding skills go to waste?</h2>
<p>Absolutely NOT! I can speak from personal experience that all I have learned as a software developer, helps me quickly understand systems and decisions, analyse existing code bases and configurations, and build rapport with other architects and developers. Some solutions architects are required to build PoC's on a regular basis, and your coding skills are not only helpful but necessary.</p>
<h2><a name="conclusion"> </a> Conclusion</h2>
<p>Well, I know this is already very long, and this is only the tip of the ice-berg! Software and Solutions Architecture is a very rewarding career path and one that many developers follow when they don't want to move to more administrative, project or account management positions, and want to continue to be part of the technical scene.</p>
<p><em>Disclaimer: I added links to resources from pretty reputable sites, but if you want to contribute with better ones, add them in the comments!</em></p>
<p>If you have more questions, hit me on <a href="https://www.twitter.com/anfibiacreativa">twitter</a>, share and like!</p></div></div></div></div></div>
#### Build your own `Front-end Framework / Library`
* [**JavaScript**: _WTF is JSX (Let's Build a JSX Renderer)_](https://jasonformat.com/wtf-is-jsx/)
* [**JavaScript**: _A DIY guide to build your own React_](https://github.com/hexacta/didact)
* [**JavaScript**: _Reverse Engineering React_](https://vimeo.com/album/3930691)
* [**JavaScript**: _Building React From Scratch_](https://www.youtube.com/watch?v=_MAD4Oly9yg) [video]
* [**JavaScript**: _Building Your Own React Clone in Five Easy Steps_](https://blog.javascripting.com/2016/10/05/building-your-own-react-clone-in-five-easy-steps/)
* [**JavaScript**: _Gooact: React in 160 lines of JavaScript_](https://medium.com/@sweetpalma/gooact-react-in-160-lines-of-javascript-44e0742ad60f)
* [**JavaScript**: _Build your own Vuejs_](https://github.com/jsrebuild/build-your-own-vuejs)
* [**JavaScript**: _Build Yourself a Redux_](https://zapier.com/engineering/how-to-build-redux/)
* [**JavaScript**: _Let’s Write Redux!_](https://www.jamasoftware.com/blog/lets-write-redux/)
* [**JavaScript**: _Redux: Implementing Store from Scratch_](https://egghead.io/lessons/react-redux-implementing-store-from-scratch)
* [**JavaScript**: _Build Your own Simplified AngularJS in 200 Lines of JavaScript_](https://blog.mgechev.com/2015/03/09/build-learn-your-own-light-lightweight-angularjs/)
* [**JavaScript**: _How to write your own Virtual DOM_](https://medium.com/@deathmood/how-to-write-your-own-virtual-dom-ee74acc13060)
* https://keithclark.co.uk/articles/pure-css-parallax-websites/
* https://www.npmjs.com/package/react-page-scroller/
A ''Function Call'' is written as a [[function name|Functions]] followed by a parenthesized list of parameters, each of which is an [[Expression]]:
```
multiply(2.5, {{Apples!!number}})
```
Functions with zero arguments, like `pi`, may omit the parentheses.
# FP + Monads
If you're already comfortable with Functional Programming (FP), especially side effects and pure functions and such, you can [skip to "Expansive Intro To Monads"](#expansive-intro-to-monads) below.
## Functional Programming (FP)
FP is a topic that often carries with it a fair bit of "baggage", and that goes even more for monads. It's quite easy to get lost out in the web-of-google-searches when bombarded by the formalized terminology or math behind these topics, especially since so many FP fans believe that the formalism and math *are basically required* to get anything out of them.
Hear me on this: **you DO NOT need a CS or Math degree** to immerse yourself in FP, and further to adopt a mindset around monads. The formalism and math can offer a richer and deeper experience with the topics the further you dive into them, but you don't have to start there (unless you want to!).
Have you written code like this before?
```js
const FPBookNames = [];
for (const record of data) {
if (record.topic == "FP") {
FPBookNames.push(record.bookName);
}
}
```
This is what we typically call "imperative" style code. It's comfortable and familiar to most of us. But it focuses on *how* to do a task. To understand the *what* or *why* of that code, you have to sort of mentally execute the code and infer its meaning. Only after reading it, you might realize: "that code is selecting records with a topic of 'FP' and sticking their book-name into an array".
What if your code could be more "declarative" and state the *what* and *why* more clearly at a glance, de-emphasizing the *how* as a less important implementation detail? Would being able to determine the purpose of a snippet of code more readily and effectively, make that code *more readable*? What if that code was also more resilient (less susceptible to bugs) and more testable (more isolated/pure)?
That's why FP exists.
### From Loop To Map And Filter
For example, imagine you have a single string value, and you want to uppercase the value.
```js
function uppercase(str) { return str.toUpperCase(); }
var greeting = "Hello, friend!";
console.log( uppercase(greeting) ); // HELLO, FRIEND!
```
That's pretty straightforward. But now let's say you had multiple strings to uppercase. You could manually call `uppercase(..)` for each string. But when we have multiple values, it's often more convenient to stick them in an array. Imperatively, uppercasing an array of strings would likely be done like this:
```js
// assumed: function uppercase(str) { .. }
// assumed: `listOfStrings` (array of string values)
for (let i = 0; i < listOfStrings.length; i++) {
listOfStrings[i] = uppercase(listOfStrings[i]);
}
```
But here we modified the entries in the array by replacing each original string with its uppercase version. In FP, we generally prefer not to modify/reassign but rather to create *new* values, as a way to cut down on the chances of unexpected side-effects causing bugs in the program. So let's do that by creating a new list:
```js
// assumed: function uppercase(str) { .. }
// assumed: `listOfStrings` (array of string values)
let listOfUpperStrings = [];
for (let i = 0; i < listOfStrings.length; i++) {
listOfUpperStrings[i] = uppercase(listOfStrings[i]);
}
```
That code is perfectly *fine*. But the first time you encounter it, to understand the overall "what", you have to mentally execute that code and infer its purpose. Afterwards, you can assert, "this code takes a list of string values and produces a new list of all the values uppercased".
Performing the same operation for each value in a list, is a pretty common task in programming. So much so that we have named this task and invented well known utilities for it, specifically `map(..)`. Let's see it:
```js
// assumed: function uppercase(str) { .. }
// assumed: `listOfStrings` (array of string values)
const listOfUpperStrings = listOfStrings.map(uppercase);
```
The array `map(..)` takes a single function as input. This function needs to receive a single value and return a value back. `uppercase(..)` fits that description, so we pass it directly. `map(..)` gives us back a new array, containing all the return values from calling the provided function (`uppercase(..)`) against the original values.
One general assertion of FP is that the mechanics of looping over a list, and calling a function against each value in the list, are so well known as to not need to be written explicitly in code. Instead, we use `map(..)`. The resulting code is more *declarative* than *imperative*. As such, the reader -- if they know what `map(..)` does, already -- can more readily glance at it and recognize, *without much mental execution*, that the outcome (the "what") of this code is a new list of uppercased strings.
FP has recognized a whole bunch of these common tasks, and named and implemented them as recognized utilities.
For example, `filter(..)` does something similar to `map(..)`, but instead of producing new values, it performs an `if` to decide if a value should be kept/included in the new list or not.
```js
// assumed: `listOfStrings` (array of string values)
function isLongEnough(str) { return str.length > 50; }
const listOfLongStrings = listOfStrings.filter(isLongEnough);
```
`listOfLongStrings` will be a new array that includes only strings from the original `listOfStrings` that are longer than 50 characters. And that outcome should be more readily discernable than if we'd written the `for` loop imperative equivalent.
And we can even "compose" (i.e., do both together) the `map(..)` and `filter(..)` operations:
```js
// assumed: function uppercase(str) { .. }
// assumed: function isLongEnough(str) { .. }
// assumed: `listOfStrings` (array of string values)
listOfStrings.filter(isLongEnough).map(uppercase);
```
Now we have a list of long-enough strings that have all been uppercased!
So that's a bit of the early mindset adoption that getting into FP brings you. It's the tip of a massive iceberg.
### Where To Learn More FP?
If you're intrigued, but new to such FP concepts, I invite you to check out -- at least the first several chapters of -- my free-to-read-online FP book: [Functional-Light JavaScript](https://github.com/getify/functional-light-js).
There are also several [high-quality video courses about FP on Frontend Masters](https://frontendmasters.com/courses/?q=functional), including:
* Bianca Gandolfo's ["From Fundamentals To Functional JS"](https://frontendmasters.com/courses/js-fundamentals-functional-v2/)
* Anjana Vakil's ["Functional JavaScript First Steps"](https://frontendmasters.com/courses/functional-first-steps/)
* My ["Functional-Light JavaScript"](https://frontendmasters.com/courses/functional-javascript-v3/) -- a companion course to [my book](https://github.com/getify/functional-light-js) of the same name
I think your first big goal should be to understand and feel comfortable with -- but not an expert on! -- the following topics:
* Side Effects
* Pure Functions
* Higher-order Functions
* Function Composition
* Currying
* Basic List Operations (filter/map/reduce)
### How Do I Know...?
How might you know if you're on the right path and comfortable enough with FP to move on to monads? There's no great way for me to answer that for all readers of this guide. But I at least want to offer a bit of a glimpse or hint instead of leaving you only with the unsatisfying, "it depends".
There are of course many ways (e.g., with `reduce(..)`) to approach the `FPBookNames` code snippet at the beginning, in FP style. I'm not going to assert that there's "one right way".
But one approach that's somewhat common in FP, which relies on chained expressions and composed (and curried!) functions, goes by the name "point-free style", and could look like this:
```js
const FPBookNames = data
.filter( compose(
eq("FP"),
getProp("topic")
) )
.map( getProp("bookName") );
```
Again, not to say this is the "right" way to do it, but... code like this represents the combination of ideas from FP that I think will help prepare you to take on *monads*, especially as I will present them throughout the rest of this guide.
When code like that *speaks to you*, I think it's time to dip your toes into the ocean of monads.
## Expansive Intro To Monads
In addition to the guide I present here, I recommend checking out a [recording of my conference talk, "Mo'problems, Mo'nads"](https://www.youtube.com/watch?v=bg0Wtz3sR9U).
----
*Monad* is a (small) part (formally, a Type) in a broad mathematical concept called "Category Theory". You could briefly and incompletely describe Category Theory as a way to categorize/group things based on how they behave with respect to composition and transformation.
The Monad type is a way to represent a value or operation in your program, which associates some specific behaviors with/around that (underlying) value/operation. These additional behaviors augment (i.e., improve!) the original value/operation with some "guarantees" about how it will interact predictably with other monad-represented values/operations in the program.
That definition is the *WHAT* of monads, conceptually. But you probably also want to see code.
### Simplest JS Illustration
What's the most stripped-down way we could do something like that in JS? How about this:
```js
function Identity(v) {
return { val: v };
}
function chain(m,fn) {
return fn(m.val);
}
```
That's it, that's a monad at its most basic. In particular, it's the "Identity" monad, which means that it will merely hold onto a value, and let you use that value untouched when you want to.
```js
const myAge = Identity(41); // { val: 41 }
```
We put a value inside an object container only so we could recognize the value as having been represented monadically. This "container"ness is one convenient way of implementing a monad, but it's not actually required.
The `chain(..)` function provides a minimum basic capability to interact with our monad instance. For example, imagine we wanted to take the monadic representation of `41` and produce another monad instance where `41` was incremented to `42`?
```js
const myAge = Identity(41); // { val: 42 }
const myNextAge = chain( myAge, v => Identity(v + 1) ); // { val: 42 }
```
It's important to note that even though I use the names `Identity` and `chain` here, those are just plain choices. There's nothing explicitly required by the concept of *Monad* in terms of what we name these things. But if we use names that others have regularly chosen, it helps create a familiarity that improves our communications.
That `chain(..)` function looks pretty basic, but it's really important (whatever it's called). We'll dig more into it in a bit.
I'm sure that code snippet seems pretty underwhelming to most readers. Why not just stick with `41` and `42` instead of `{ val: 41 }` and `{ val: 42 }`? The *WHY* of monads is likely not at all apparent yet. You'll have to hang with me for a bit to start to uncover the *WHY*.
But hopefully I've at least shown you that down at the very core, a monad is not a mystical or complex *thing*.
### Building Up Monads
Monads have somewhat (in)famously been described with a variety of silly-sounding metaphors, like burritos. Others call monads "wrappers" or "boxes", or "data structures" or... the truth is, all these ways of describing a monad are partial descriptions. It's like looking at a Rubik's Cube. You can look at one face of the cube, then turn it around and look at a different face, and get more of the whole thing.
A complete understanding requires being familiar with all sides. But complete understanding is not a single atomic event. It's often built up by lots of smaller bits of understanding, like looking at each face of the cube one at a time.
For now, I just want you to focus on the idea that you could take a value like `42` or an operation like `console.log("Hello, friend!")` and attach/associate additional behaviors to them which will give them super powers.
Here's another possible way of expressing monads, using capabilities provided by **Monio**:
```js
const myAge = Just(41);
```
**Monio Reference: [`Just`](MONIO.md)**
The above code shows a function called `Just(..)`, which is pretty similar to the `Identity(..)` function shown previously. It acts as a constructor (aka, "unit") of the `Just` monad.
And also...
```js
const printGreeting = IO(() => console.log("Hello, friend!"));
```
Here we see another **Monio** function called `IO(..)`, which acts as a constructor for the `IO` monad (which holds functions).
Thinking of our sketch in the previous section, you could sort of think of `myAge` as `{ val: 41 }` and `printGreeting` as `{ val: () => console.log("Hello, friend!") }`. **Monio**'s representation is more sophisticated than just an object like that. But under the covers, it's not that far different.
I'm going to use **Monio** throughout the rest of the guide. The convenient affordances are nice to use, and easier to illustrate with. But just keep in mind that under all the trappings, we could be doing something as straight-forward as making an object like `{ val: 41 }`.
#### Digging Into Map
Consider the notion of an array's `map(..)` method. Its job is to apply a mapping (value translation) operation against all the contents of the associated array.
```js
[ 1, 2, 3 ].map(v => v * 2); // [ 2, 4, 6 ]
```
**Note:** the technical term for this capability is Functor. In fact, all monads are Functors, but don't worry too much about that term for now. Just file in the back of your head.
This mapping on arrays of course works even if our array has a single element, right?
```js
[ 41 ].map(v => v + 1); // [ 42 ]
```
An extremely important detail there, that's easy to miss, is that the `map(..)` function didn't just give us `42` but gave us `[ 42 ]`. Why? Because `map(..)`'s job is to produce a new instance of the same type of "container" it was invoked against. In other words, if you use array's `map(..)`, you're going to always get back an array.
But what if our "container" is a monad instance, and what if there's only one underlying value, like `41` in it? Since the monad is also a functor (able to be "mapped"), we should still expect the same kind of outcome, right?
```js
const myAge = Just(41);
const myNextAge = myAge.map(v => v + 1); // Just(42)
```
Hopefully it makes intuitive sense here that `myNextAge` should be another `Just` instance, representing the underlying number `42`.
Recall this bare-bones example from the previous section?
```js
// assumed: function Identity(val) { .. }
// assumed: myAge ==> { val: 41 }
const myNextAge = chain( myAge, v => Identity(v + 1) ); // { val: 42 }
```
Substituting **Monio**'s implementation, that looks like:
```js
const myNextAge = myAge.chain(v => Just(v + 1));
```
So what's the relationship here between the `map(..)` and `chain(..)`? Let's line the operations up next to each other, to see *it*:
```js
myAge.map( v => v + 1 ); // Just(42)
myAge.chain( v => Just(v + 1) ); // Just(42)
```
Now do you see *it*? `map(..)` assumes that its returned value needs to be automatically "wrapped up" in an instance of the "container", whereas `chain(..)` expects the return value to already be "wrapped up" in the right type of "container".
The `map(..)` function doesn't at all have to be named that to satisfy the functor'ness of the monad instance. In fact, you don't even strictly *need* a `map(..)` function at all, if you have `chain(..)`, because `map(..)` can be implemented with `chain(..)`:
```js
function JustMap(m,fn) { return m.chain(v => Just(fn(v))); }
fortyOne.map( v => v + 1); // Just(42)
JustMap(fortyOne,v => v + 1); // Just(42)
```
Having `map(..)` (or whatever it's called) is a convenience over using just the `chain(..)` by itself, but not strictly required.
### Monadic Chain
`chain(..)` sometimes goes by other names (in other libraries or languages), like `flatMap(..)` or `bind(..)`. In **Monio**'s monads, all three methods names are aliased to each other, so pick whichever one you prefer.
The name `flatMap(..)` can help reinforce the relationship between it and `map(..)`.
```js
Just(41).map( v => Just(v + 1) ); // Just(Just(42)) -- oops!?
Just(41).flatMap( v => Just(v + 1) ); // Just(42) -- phew!
```
If we return a `Just` monad instance from `map(..)`, it still wraps that in another `Just`, so we end up with nesting. That is perfectly valid and sometimes desired, but often not. But if we return the same kind of value from `flatMap(..)` (again, aka `chain(..)`), there's no nesting. Essentially, the `flatMap(..)` flattens out the nesting!
I've asserted `chain(..)` (or whatever we call it!) is pretty central to something being monadic.
Even as simple as it looks to implement, it works in such a specific way that we get some guarantees about how one monad instance can interact with another monad instance. Such interactions and transformations are critical to building up a program of monads without chaos.
Another side of the **Monad** Rubik's Cube is these guarantees; they're ensured by a set of "laws" that all conforming monad implementations must satisfy:
1. Left Identity
2. Right Identity
3. Associativity
The formality and mathematical importance of these laws is not super important to immerse in right now. But to illustrate them very simply with our trivial identity monad `Just` from **Monio**:
```js
// helpers:
const inc = v => Just(v + 1);
const double = v => Just(v * 2);
// (1) "left identity" law
Just(41).chain(inc); // Just(42)
// (2) "right identity" law
Just(42).chain(Just); // Just(42)
// (3) "associativity" law
Just(20).chain(inc).chain(double); // Just(42)
Just(20).chain(v => inc(v).chain(double)); // Just(42)
```
Notice I used the `chain(..)` method in this snippet? The laws are stated in terms of the "chain" operation, regardless of what an implementation chooses to call it.
### Back To The Core Of Monad
Boiling this all down: the *Monad* type only strictly requires two things:
1. a function (of any name) to construct an "instance" of the type (the unit constructor)
2. a function (of any name) to perform the "chain" operations shown in the 3 laws
Everything else you see in the code snippets in this guide, such as wrapper monad instances, specific method names, ["friends of monads" behaviors](#-and-friends), etc -- that's all convenient affordance provided specifically by **Monio**.
But from that narrow perspective, a monad doesn't have to be a "container" (like a wrapping object or class instance) and there doesn't even have to be a concrete "value" (like `42`) involved. While a "container wrapping a value" is one potentially helpful side of the Rubik's Cube to look at, it's not *all* that a monad is or can be. Don't get too *wrapped up* in that way of thinking!
### But... How Do I Get Something Out!?
You may still be wondering: how do we ever extract the value (like primitive number `42`) -- or indeed, whatever *thing* the monad is representing -- out/away from a monadic representation? It seems like every monadic operation just produces another monad instance. At some point, we might need the actual number `42` to print to the screen or insert in a database, right!?
One key idea of FP, and especially of monads, is to *defer* the need for the underlying values until the last possible moment. With respect to monads, we prefer to keep everything "lifted" in the monadic space as long as possible.
But yes, sometimes we *do* need to reduce a monad down to a "real" value. There are other ways of accomplishing that outcome, but here's one approach, a preview of what we'll [talk about later in the guide](#-and-friends). To "extract" the value from a monad like the `Just` identity monad, we can use a method **Monio** provides, called `fold(..)`:
```js
const identity = v => v;
const myAge = Just(41);
const myNextAge = myAge.map(birthday);
// later:
const ageIsJustANumber = myNextAge.fold(identity);
console.log(`I'm about to be ${ ageIsJustANumber } years old!`);
// I'm about to be 42 years old!
```
So yes, there's an "escape valve" (`fold(identity)`) where we can exit from our `Just` monad.
But remember: monads play best with other monads ([and their friends!](#-and-friends)), so it's better to stay in that space as much as we can. Let's hold off discarding the monad representation until (unless!) we absolutely have to.
Also keep in mind: `fold(..)` as shown here, and provided on many of **Monio**'s monads, is **NOT** a *Monad* behavior; it comes [from a *friend* called Foldable](#foldable).
### *Maybe* Something More?
**Monio Reference: [`Maybe`](MONIO.md)**
The identity monad `Just` probably doesn't seem all that amazing. It's cute and *maybe* a little clever, but it's kinda unimpressive. In practice, we'll almost never directly create `Just` monad instances.
It's foundational. It's not supposed to seem revolutionary in and of itself, as that would present too tall a cliff to climb from the get-go. If the first numbers you ever learned as a young child were not 2 or 3, but were instead √2 or π, you might have found learning basic math pretty tough in those earliest days!
If `Just` *seems* (too) simple to you, that's probably a good thing! You're likely well on your way to *getting* monads. But don't let its simplicity bore you as there not being anything worth your time; there is!
There are lots of variations/augmentations on top of this basic monad concept that get more interesting. I could spend many hours and many dozens of pages detailing even a sampling of them. But let me continue incrementally by briefly illustrating another example of monads that builds off the identity monad.
You've probably written code like this before in your imperative-style programs:
```js
const shippingLabel = (
(record != null && record.address != null && record.address.shipping != null) ?
formatLabel(record.address.shipping) :
null
);
```
The `!= null` checks that we have to pepper throughout our programs are to avoid JS exceptions when we do operations against these values that expect them to be non-null'ish (`null` or `undefined`).
However, JS recently (ES2020) added an "optional chaining" operator which simplies that type of code a bit:
```js
const shippingLabel = (
(record?.address?.shipping != null) ?
formatLabel(record.address.shipping) :
null
);
```
The `?.` operator (as opposed to bare `.`), right before `address` and `shipping`, is a short-circuiting operator that skips out of further expression evaluation if the preceeding element evaluates as null'ish. That means we don't need the `record != null` or `record.address != null` checks, because the `?.` operator does it for us.
We're protected now from `record` or `record.address` being null'ish, but `record.address.shipping` could still be null'ish, and we want to skip calling `formatLabel(..)` in that case; that's why we still need the final `!= null` check.
The `Maybe` monad -- sometimes referred to by different names like `Option` or `Optional` in other libraries and languages -- allows us to define a behavior that delegates these sorts of `!= null` checks completely to the monad behavior, freeing up our code from that burden.
To understand `Maybe`, let's first add another monad kind besides `Just` (identity) we discussed previously: the trivial-and-unimpressive monad we'll call `Nothing` (empty). `Nothing` does even less than `Just`: it short-circuits out of any methods you invoke on it. It's like a blackhole where operations are safely skipped as no-ops. `Nothing` is the safe, monadic equivalent of empty values like `null` or `undefined`.
`Maybe` is a *Sum Type*, in that it represents a "duality" of these two monad kinds (`Just` and `Nothing`). That's not to say a `Maybe` instance is *both* simultaneously, but rather that it can *either* be one or the other.
**Note:** Most monad implementations would not expose `Just` and `Nothing` as separate monad kinds, but rather only as part of `Maybe`. **Monio** choose to present them separately as well as combined in `Maybe`, for convenience of illustration purposes.
The way the selection between `Maybe:Just` (aka `Just`) and `Maybe:Nothing` (aka `Nothing`) occurs might be a little confusing at first. You might expect the decision itself to built into the unit constructor `Maybe(..)`. In fact, most popular monad tutorials/blog posts out there in the wild do just that, because it makes the illustration of `Maybe` much more convenient and satisfying.
That's not proper monad'ing, though. **Monio** does the more appropriate thing and externalizes the decision away from the `Maybe(..)` / `Maybe.of(..)` constructor, into a separate helper called `Maybe.from(..)`. `Maybe.from(null)` will result in a `Maybe:Nothing{}` instance, and `Maybe.from(42)` will result in a `Maybe:Just{42}` instance.
By contrast, calling `Maybe(..)` / `Maybe.of(..)` will not do any conditional selection, but only represent any non-`Maybe` value as a `Maybe:Just`.
Moreover, `Maybe.from(..)` delegates the question -- "is it empty (aka null'ish)?" -- to the static function `Nothing.isEmpty(..)`. That function by default does a `== null` null'ish check, but you could override it to re-define what value(s) you want to treat as empty/nothing for `Maybe.from(..)`'s purposes.
So we use `Maybe.from(..)` to create either the `Maybe:Just` or `Maybe:Nothing` instance. In the following snippet, the `.chain(..)` calls will thus in effect be against one or the other (with the `Maybe` itself acting merely as a thin, pass-through wrapper):
```js
const shippingLabel = (
Maybe.from(record)
.chain( record => Maybe.from(record.address) )
.chain( address => Maybe.from(address.shipping) )
.chain( shipping => Maybe.from(formatLabel(shipping)) )
);
```
Here, `shippingLabel` is an instance of the `Maybe` type. It will either represent a `Maybe:Just` holding the formatted label, or it will represent a `Maybe:Nothing` (holding no value).
But whichever one it is, that doesn't matter to the way we write our subsequent monad-aware code! If `Maybe.from(..)` produces a `Maybe:Nothing` anywhere along that chain, any subsequent `chain(..)` calls are skipped as no-ops, thus protecting our program from exceptions like property access on a null'ish value.
`Maybe` safely abstracts away our previous concerns over the conditional decision logic that protects operations from throwing exceptions.
That above code may seem a little cumbersome, so let's further clean it up with a couple of helpers:
```js
// assumed:
// function formatLabel(label) { .. }
// helpers:
const getPropSafe = prop => obj => Maybe.from(obj[prop]);
const formatLabelSafe = v => Maybe.from(formatLabel(v));
const shippingLabel = (
Maybe.from(record)
.chain( getPropSafe("address") )
.chain( getPropSafe("shipping") )
.chain( formatLabelSafe )
);
```
That's much nicer than before. And there's no `!= null` checks cluttering up our code.
Our `shippingLabel` monad is now ready to interact with other monads/monad behaviors, and will do so safely and predictably, regardless of whether it's `Maybe:Just` or `Maybe:Nothing`.
By the way, `Maybe` is also [Foldable](#foldable), so to "exit" from it (as we saw earlier with `Just`), you can use the `fold(..)` function; but since `Maybe` is a *Sum Type*, `fold(..)` here expects two functions, the first invoked for `Maybe:Nothing` and the second invoked for `Maybe:Just`. Again, more on [using Foldable and other adjacent behaviors later](#-and-friends).
You're hopefully starting to see a *little bit* more benefit to representing our values/expressions with monads rather than *just* using bare values.
### I Know, IO
**Monio Reference: [`IO` (and variants)](MONIO.md#io-monad-one-monad-to-rule-them-all)**
So far, we've seen monads that represent concrete primitive values like `42` or a shipping address object. But monads are far more than just "value wrappers".
Monads can also be thought of as "behavior wrappers", representing operations (functions), like the sort of operations that either rely on, or cause, side effects. That's what the `IO` monad is all about!
The heart of **Monio** is its `IO` monad implementation. It's designed as an uber-powerful *Sum Type* that incorporates a variety of useful behaviors, similar in spirit to [Scala's ZIO](https://zio.dev/). I claim that **Monio**'s `IO` is the "most powerful IO implementation in JS (and possibly any language)". But I know that's quite a daunting claim.
Don't worry: to continue, we're just going to focus on a small part of what `IO` can do, just so we don't get too overwhelmed.
What you put in `IO` is (typically) a function, which when executed will perform some sort of operation, (again, typically) of a side-effect nature. It doesn't *have to be* a side-effect operation; it can be static and pure, like simply returning a value.
The key idea behind the `IO` monad type is that it's lazy; it doesn't *do* anything -- like execute the function you put in it -- automatically. You have to evaluate the IO to perform the operation (and thus *apply* the side-effect to the program).
For example:
```js
const greeting = IO(() => console.log("Hello, friend!"));
// later (nothing has happened yet!)
greeting.run();
// Hello, friend!
```
An IO, once evaluated, can also produce a value:
```js
const customerName = IO(() => (
document.getElementById("customer-name-input").value
));
customerName.run(); // "Kyle"
```
The `run(..)` method can be thought of kinda like the `fold(..)` method we saw on `Just(..)` and `Maybe(..)`. It's how you "exit" the `IO` monad, in applying its behavior (side-effects) to the surrounding program.
Like we've already asserted a few times, the "best practice" key idea is to keep all our program's side-effect operations as `IO`s, and only reduce/apply them at the last moment, when our program needs them to be applied.
Here's a more sophisticated example that chains `IO` instances together:
```js
// helpers:
const getProp = prop => obj => obj[prop];
const assignProp = prop => val => obj => obj[prop] = val;
const getElement = id => IO(() => document.getElementById(id));
const getInputValue = id => getElement(id).map( getProp("value") );
const renderTextValue = id => val => (
getElement(id).map( assignProp("innerText")(val) )
);
const renderCustomerNameIO = (
getInputValue("customer-name-input")
.chain( renderTextValue("customer-name-display") )
);
// later:
renderCustomerNameIO.run();
```
As you can see, here we're composing side-effect operations together as predictably as we composed numbers and objects earlier. Monads truly are a transformative, revolutionary way of thinking about our programs.
As a convenience, `IO.of(..)` is generally the equivalent of `IO(() => ..)`; in both cases, you get a lazy IO. But take note of a nuance/gotcha: in the `IO.of(..)` case, whatever expression (the `..` here) provided is evaluated right away, whereas when you do `IO(() => ..)`, you've manually wrapped the `..` expression, whatever it is, into a function, so it won't be evaluated until that function is called (at the time the IO is evaluated).
As such, `IO.of(..)` should only be used when you already have a fixed, non-side-effecting value expression. Always use the `IO(() => ..)` form when the `..` expression is actually a side-effect.
#### But Why IO?
Why do we go to the trouble of putting all our side-effect operations into `IO` instances?
The most boiled down answer: we get a predictable interaction (and guarantees!) between the side-effect (`IO`) that comes from the `getInputValue(..)` call and the side-effect (`IO`) that comes from the `renderTextValue(..)` call.
When the side-effects are straightforward and synchronous like pulling a DOM element reference out of the DOM, or injecting its contents, it doesn't seem like the predictability/guarantees is benefitting us very much.
So really the question I want to address here is: **why Monio's `IO` in particular?**
I strongly believe the most complex side-effects in our programs come from asynchronus operations, like performing an Ajax `fetch(..)` request, running a timer, listening for an event, performing an animation, etc. An `IO` implementation like the one **Monio** provides, which can represent and model any form of asynchrony (and thus asynchronous side-effects) in our program, and thus extend our predictability and guarantees over *time*, is truly a game-changer.
**Monio**'s `IO` automatically transforms/consumes JS promises and lifts the evaluation of an `IO` chain to a promise if any asynchronous operation is encountered. And for event streams (where a single promise doesn't adequately represent the asynchrony), `IOx` is like `IO` plus Observables (e.g., `RxJS`, etc).
And if that's not enough to intrigue you, there's another challenge that programs face (whether you realize it or not) that **Monio**'s `IO` addresses like a champ: how do you isolate a set of operations from the environment (like DOM, etc) around it, so that you can provide an environment/context for the code to run against? This is critical for preventing unintended side-effects in the program, but it's also the most effective way to create **TESTABLE** side-effect code.
**Monio**'s `IO` also holds the `Reader` monad type's behavior. This means that an `IO` (no matter how long/involved the chain is) carries with it a provided "environment", passed as an argument to `run(..)`.
You could define your entire program to boil down to a single `IO` instance, and if you call `run(window)`, you're running your program in the context of the browser's DOM. But in your test suite, you could call `run(fakeDOMglobal)` on the same `IO`, and now all of the code and side-effects are automatically threaded through that alternate environment.
It's effectively passing the entire "global" (aka, universe/scope-of-concern) into your program, whatever appropriate value that is, instead of the program automatically assuming which "global" it should apply against.
But ultimately, the *real power* of **Monio**'s `IO` is not even encompassed by what we've thus far discussed. The *pièce de résistance* is that `IO` provides a bridge back to your familiar and comfortable more-imperative style coding.
Do you like to use `if` and `try..catch` and `for..of` loops? You may have noticed that FP and monads seem to throw all that stuff out the window, in favor of long chains of curried and composed function calls. What if you could get all the power of `IO` but opt-in to the more typically-imperative style of code where helpful?
`IO.do(..)` takes a JS generator, whose code looks like the `async..await` style that most JS devs are so familiar with. When you `yield` a value, if its monadic, it's automatically chained and unwrapped (just as if you had an `IO` to `chain(..)` from). And if the result is asynchronous (a promise), the code inside the generator automatically pauses to "await" the completion.
Taken together with all its facets, **Monio**'s `IO` (and `IOx` superset) is the "one monad to rule them all".
## ... And Friends
OK, if you've made it this far, take a deep breath. Seriously, maybe go for a walk to let some of this settle in. Maybe re-read it, a few times.
We've already seen a decent, if basic, illustration of the idea of monads. And we didn't cover `Either` -- another *Sum Type* like `Maybe` but which holds values on both sides. `Either` is typically used to represent synchronous `try..catch` style exception handling. We also didn't cover `AsyncEither`, which extends `Either` to operate asynchronously (over promises), the same way `IO` transforms/handles them. `AsyncEither` is essentially **Monio**'s representation of a Promise/Future type.
But compared to the expanse of Category Theory that *monad* fits in, it's a fairly narrow concept itself. There are a variety of adjacent (and somewhat related) concepts that come from Category Theory, and more specifically, "Algebraic Data Types" (ADTs) -- or are at least adapted from parts of it. These "friends" include:
* Foldable
* Concatable (aka, Semigroup)
* Applicative
There are many, many other topics out there, but these are the main three "friends" that **Monio** focuses on (and mixes with its monads).
To be clear, these three are *not* monad behaviors. I call them "friends of monads" because I find monads mixed with these other behaviors to be more useful/practical in my JS code than monads (or any of these other types) standing alone; it's the combination of these type behaviors that I think makes monads attractive and powerful solutions for our programs.
I know many in the FP space prefer to think of each type completely independently. That's OK if it works well for them. But I find the combinations much more compelling.
### Foldable
The `fold(..)` method mixed into (most of) **Monio**'s monads is implementing the "Foldable" type. Notably, `IO` and its variations are not directly Foldable, but that's because the nature of `IO` is already doing a `fold(..)` of sorts when you call `run(..)`.
We already saw `fold(..)` referenced earlier a few times. That's merely the name **Monio** provides, but just like `chain(..)` vs `flatMap(..)` vs `bind(..)`, the name itself doesn't matter, only the expected behavior.
We didn't talk about List type monads (because **Monio** doesn't provide such), but of course those can exist. Foldable in the context of such a List monad would apply the provided function across all the values in the list, progressively accumulating a single result (of any type) by folding each value into the accumulator. JS arrays have a `reduce(..)` method which is basically List's foldable.
By contrast, Foldable in the context of a single-value monad (like `Just`) executes a provided function with its single associated/underlying value. It can be thought of as a special case of the generalized List foldable, since it doesn't need to "accumulate" its result across multiple invocations.
Similarly, *Sum Types* like `Maybe` and `Either` are also Foldable in **Monio**; this is a further specialization in that `fold(..)` here takes two functions, but will execute only one of them. If the associated value is a `Maybe:Nothing`, the first function is applied, otherwise (when the associated value is a `Maybe:Just`), the second functino is applied. The same goes for `Either:Left` invoking the first function and `Either:Right` invoking the second function.
But how might we use Foldable practically?
As I implied earlier a few times in this guide, one such transformation is the sort-of "unwrapping" of the underlying/associated value from its monad, by passing the identity function (e.g., `v => v`) to `fold(..)`.
But more commonly, we use Foldable to define a natural transformation from one kind of monad to another. To illustrate, let's revisit this example from earlier:
```js
// assumed:
// function formatLabel(label) { .. }
// helpers:
const getPropSafe = prop => obj => Maybe.from(obj[prop]);
const formatLabelSafe = v => Maybe.from(formatLabel(v));
const shippingLabel = (
Maybe.from(record)
.chain( getPropSafe("address") )
.chain( getPropSafe("shipping") )
.chain( formatLabelSafe )
);
```
If we want to then render the shipping label, but only if it's actually valid/defined, and otherwise print a default notice, we can arrange our program like this:
```js
// assumed:
// function formatLabel(label) { .. }
// helpers:
const identity = v => v;
const getPropSafe = prop => obj => Maybe.from(obj[prop]);
const assignProp = prop => val => obj => (
Maybe.from(obj).map(o => o[prop] = val)
);
const getElement = id => IO(() => document.getElementById(id));
const renderTextValue = id => val => (
getElement(id).map(el => (
Maybe.from(el).fold(
IO.of,
assignProp("innerText")(val)
)
))
);
const formatLabelSafe = v => Maybe.from(formatLabel(v));
// ----
const renderShippingLabel = v => (
v.fold(
() => IO.of("--no address--"),
identity
)
.chain( renderTextValue("customer-shipping-label") )
);
const renderIO = renderShippingLabel(
Maybe.from(record)
.chain( getPropSafe("address") )
.chain( getPropSafe("shipping") )
.chain( formatLabelSafe )
);
renderIO.run();
```
Take your time reading and analyzing that code. It's illustrating how our monad types interact in useful ways. I promise that even if at first this code seems head-spinning -- it did for me! -- eventually you will get to understanding and even preferring code like this!
A key aspect of the snippet is the `Maybe`'s `fold(..)` call, which folds down to either a fallback `IO` value if the shipping address was missing, or the computed `IO` holding the valid shipping address, and then `chain(..)`s off whichever `IO` was folded to.
Again, Foldable is distinct from monads. But I think this discussion illustrates how useful it is when paired with a monad. That's why it's an *honored friend*.
### Concatable (Semigroup)
Concatable, formally referred to as Semigroup, is another interesting friend of monads. You won't necessarily see it used explicitly all that often, but it can be useful, especially when using `foldMap(..)` (which is an abstraction over `reduce(..)`).
**Monio** choose to implement Concatable as the `concat(..)` method on its monads. That name is not required by the type, of course, it's just how **Monio** does it.
The basic idea here is that a value type is "concatable" if two or more values of it can be concatenated together. For example, primitive, non-monad value types like strings and arrays are concatable, and indeed they even expose the same `concat(..)` method name:
```js
"Hello".concat(", friend!"); // "Hello, friend!"
[ 1, 2, 3 ].concat( [ 4, 5 ] ); // [1,2,3,4,5]
```
Since all of **Monio**'s monads are Concatable, they all have the `concat(..)` method. So if any such monad instance is associated with a value that also has a conforming `concat(..)` method on it -- for example, another monad, or a non-monad value like a string or array -- then a call to the monad's `concat(..)` method will delegate to calling `concat(..)` on the associated/underlying value. This delegation to the underlying `concat(..)` is recursive all the way down.
For example:
```js
Just("Hello").concat(Just(", friend!")); // Just("Hello, friend!")
Just([1,2,3]).concat(Just([4,5])); // Just([1,2,3,4,5])
Just(Just([1,2,3])).concat(Just(Just([4,5]))); // Just(Just([1,2,3,4,5]))
// `fold(..)` and `foldMap(..)` provided in
// Monio's util module
fold(Just("Hello"),Just(", friend!")); // Just("Hello, friend!")
foldMap(
v => v.toUpperCase(),
[
Just("Hello"),
Just(", friend!")
]
); // Just("HELLO, FRIEND!")
```
**NOTE:** Despite the name overlap, the standalone `fold(..)` and `foldMap(..)` utilities provided by the `MonioUtil` module are *not* related to the [Foldable type](#foldable) and the `fold(..)` method that appears on **Monio** monad instances.
#### Monoid
Additionally, the term Monoid means a Concatable/Semigroup plus an "empty" (identity) value for the concatenation. For example, string concatenation is a monoid with the empty `""` string. Array concatenation is a monoid with the empty `[]` array. Even numeric addition is a monoid with the `0` "empty" number.
An example of extending this notion of monoid to something that wouldn't seem at first as "concatable" is with multiple booleans combined in a `&&` or `||` logical expression. For the logical-AND operation, the "empty" value is `true`, and for the logical-OR operation, the "empty" value is `false`. The "concatenation" of these values is the computed logical result (`true` or `false`).
**Monio** provides `AllIO` and `AnyIO` as `IO` variants that are monoids -- again, both an "empty" value and a `concat(..)` method. In particular, the `concat(..)` method on these two `IO` variants is designed to compute the logical-AND / logical-OR (respectively) between two boolean-resulting IOs. That makes `AllIO` and `AnyIO` easy to use with the `fold(..)` and `foldMap(..)` utilities mentioned earlier.
**Monio Reference: [`AllIO`, `AnyIO`](MONIO.md#other-helpful-io-variants)**
Here's an example of concatenating these monoids via `fold(..)` / `foldMap(..)`:
```js
const trueIO = IO.of(true);
const falseIO = IO.of(false);
fold( AllIO.fromIO(trueIO), AllIO.fromIO(falseIO) ).run(); // false
fold( AnyIO.fromIO(falseIO), AllIO.fromIO(trueIO) ).run(); // true
const IObools = [
trueIO,
trueIO,
trueIO,
falseIO,
trueIO
];
foldMap( AllIO.fromIO, IObools ).run(); // false
foldMap( AnyIO.fromIO, IObools ).run(); // true
```
As an added convenience, **Monio**'s' `IOHelpers` module also provides `iAnd(..)` and `iOr(..)`, which automatically applies this logical-And / logical-Or `foldMap(..)` logic to two or more provided `IO` instances:
```js
const trueIO = IO.of(true);
const falseIO = IO.of(false);
iAnd( trueIO, trueIO, falseIO, trueIO ).run(); // false
iOr( trueIO, trueIO, falseIO, trueIO ).run(); // true
```
I'm illustrating creating `IO` instances with direct `true` and `false` values, but that's not really how you'd actually use these mechanisms. Since they're all `IO` instances, the boolean results (`true` or `false`) can be computed lazily (and asynchronously!) in their respective `IO`s, even as a result of complex side-effects.
For example, you could define a list of several `IO` instances representing DOM element states, like this:
```js
// helpers:
const getElement = id => IO(() => document.getElementById(id));
const getCheckboxState = id => getElement(id).map(el => !!el.checked);
const options = [
getCheckboxState("option-1"),
getCheckboxState("option-2"),
getCheckboxState("option-3")
];
const allOptionsChecked = iAnd( ...options ).run(); // true / false
const someOptionsChecked = iOr( ...options ).run(); // true / false
```
Bonus exercise: contemplate how you'd compute `noOptionsChecked` -- `true` when none of the checkboxes are checked.
### Applicative
Applicative is a bit more unusual (and less common, in my experience) than Semigroup. But occasionally it's helpful. **Monio** chooses to implement this behavior on most of its monads with the `ap(..)` method.
Applicative is a pattern for holding a function in a monad, then "applying" the value from another monad as an input to the function, returning the result back to another monad. If the function requires multiple inputs, this "application" can be performed multiple times, providing one input at a time.
But I think the best way to explain Applicative is to just show concrete code:
```js
const add = x => y => x + y;
const addThree = Just(add(3)); // Just(y => 3 + y)
const four = Just(4); // Just(4)
addThree.ap(four); // Just(7)
```
If a monad is holding a function, such as the curried/partially-applied `add(..)` shown here, you can "apply" it to the value held in another monad. Note: we call `ap(..)` on the source, function-holding monad (`addThree`), not on the target value-holding monad (`four`).
These two expressions are roughly equivalent:
```js
addThree.ap(four);
four.map( addThree.fold(fn => fn) );
```
Recall from [Foldable above](#foldable) that passing the identity function into a **Monio** monad's `fold(..)`, essentially extracts the value from the monad. As shown, `ap(..)` is sort of "extracting" a mapping function held in second monad and running it (via `map(..)`) against the value held in the first monad.
Another way of expressing the above in a single expression:
```js
const add = x => y => x + y;
Just(add) // Just(x => y => x + y)
.ap( Just(3) ) // Just(y => 3 + y)
.ap( Just(4) ); // Just(7)
```
We put `add(..)` by itself into a `Just`. The first `ap(..)` call "extracts" that function, passes the `3` into it, and makes another `Just` with the returned `y => 3 + x` function in it. The second `ap(..)` call then does the same as the previous snippet, extracting that `y => 3 + x` function and passing `4` into it. The final result of `4 => 3 + 4` is `7`, and that's put back into a `Just`.
All of **Monio**'s non-`IO` monads are Applicatives. Again, you may not use such behavior very frequently, but hopefully you may now be able to recognize the need when it arises.
## *Wrap*ping Up
We've now scratched the surface of monads (and several *friends*). That's by no means a complete exploration of the topic, but I hope you're starting to feel they're a little less mysterious or intimidating.
A monad is a narrow set of behavior (required by "laws") you associate with a value or operation. Category Theory yields other adjacent/related behaviors, such as Foldable and Concatable, that can augment the capabilities of this representation.
This set of behavior improves coordination/interoperation between other monad-and-friends-compliant values, such that results are more predictable. The behaviors also offer many opportunities to abstract (shift into the behavioral-definitions) certain logic that usually clutters up our imperative code, such as null'ish checks.
Monads certainly don't fix all the problems we may encounter in our code, but I think there's plenty of intriguing power to unlock by exploring them further. I hope this guide inspires you to keep digging, and perhaps in your explorations, you'll find the [Monio](https://github.com/getify/monio) library helpful.
\define small(name) <code style="font-size: 65%">$name$</code>
!Introduction
''Functions'' are named computations that can be applied to different kinds of data. The syntax is as follows:
```
function_name(<argument>, <argument>...)
```
Some functions have multiple names, often to help them match up with popular spreadsheet software. Note that function names are case-insensitive.
!Functions
|!Wiki Data & Interpretation|<|<|<|
|!Function|!Args|!Result|!Summary|
| `transclude`|`(title)`| text |Transclude a tiddler's text.|
|~|`(t,f)`|~|Transclude a tiddler's field's text.|
| <<small transclude_index>>|`(t,i)`| text |Transclude a text item from a data tiddler.|
| `variable`|`(name)`| text |Get the text value of a variable.|
| `datum`|`(text)`| * |Interpret some text as a [[Datum]].|
|!Arithmetic & Operators|<|<|<|
|!Function|!Args|!Result|!Summary|
| `uplus`|`(a)`| * |Result is `a`.<br/>Same as `(+a)`.|
| `uminus`|`(a)`|number|Multiply `a` by `-1`.<br/>Same as `(-a)`.|
| `add`|`(a, b)`|number|Add numbers `a` and `b`.<br/>Same as `(a+b)`.|
| `sub`|`(a, b)`|number|Subtract `b` from `a`.<br/>Same as `(a-b)`.|
| `subtract`|~|~|~|
| `minus`|~|~|~|
| `mul`|`(a, b)`|number|Multiply numbers `a` and `b`.<br/>Same as `(a*b)`.|
| `multiply`|~|~|~|
| `div`|`(a, b)`|number|Divide `a` by `b`.<br/>Same as `(a/b)`.|
| `divide`|~|~|~|
| `quotient`|~|~|~|
| `mod`|`(a,b)`|number|Get the remainder when dividing `a/b`.|
| `modulo`|~|~|~|
|!Math|<|<|<|
|!Function|!Args|!Result|!Summary|
| `abs`|`(a)`|number|Return `a`'s absolute value.|
| `sign`|`(a)`|number|1 for positive `a`, -1 for negative, 0 for 0.|
| `sum`|`(a...)`|number|Sum up the arguments (including arrays).|
| `product`|`(a,b..)`|number|Multiply the arguments.|
| `min`|`(a,b..)`|number|Get the lowest number.|
| `max`|`(a,b..)`|number|Get the highest number.|
| `clamp`|`(a,L,H)`|number|Limit `a` to a range from min `L` to max `H`.|
| `sqrt`|`(a)`|number|Get the square root of `a`.|
| `cbrt`|`(a)`|number|Get the cube root of `a`.|
| `gcd`|`(a,b)`|number|Get the greatest common divisor.|
| `lcm`|`(a,b)`|number|Get the least common multiple.|
| `mix`|`(a,b,x)`|number|Get a value between `a` and `b`.<br/>Same as `((1-x)*a + x*b)`.|
| `step`|`(a,x)`|number|`0` if `x<a`, `1` otherwise. (GLSL-inspired.)|
| `smoothstep`|`(a,b,x)`|number|As `step` but ease from `0` to `1` as `x` moves from `a` to `b`. (GLSL-inspired.)|
|!Math (rounding)|<|<|<|
|!Function|!Args|!Result|!Summary|
| `round`|`(a)`|number|Round `a` to the nearest integer.|
|~|`(a, n)`|number|Round `a` to `n` digits.|
| `roundup`|`(a)`|number|Round `a` away from zero.|
|~|`(a, n)`|number|Round `a` away from zero, to `n` digits.|
| `rounddown`<br/>or `trunc`|`(a)`|number|Round `a` toward zero.|
|~|`(a, n)`|number|Round `a` toward zero, to `n` digits.|
| `floor`|`(a)`|number|Round `a` down to the nearest integer.|
|~|`(a, m)`|number|Round `a` down to a multiple of `m`.|
| `ceil`|`(a)`|number|Round `a` up to the nearest integer.|
|~|`(a, m)`|number|Round `a` up to a multiple of `m`.|
| `fract`|`(a)`|number|Get the fractional part of `a`.|
|!Math (exponential)|<|<|<|
|!Function|!Args|!Result|!Summary|
| `_e`||number|Euler's number ''e'' (approx. 2.71828).|
| `pow`|`(a, b)`|number|Raise base `a` to the power of `b`.|
| `power`|~|~|~|
| `log`|`(a, b)`|number|Get the logarithm of `a` in base `b`.|
| `exp`|`(a)`|number|Raise ''e'' to the power of `a`.|
| `ln`|`(a)`|number|Get the natural logarithm of `a` (base ''e'').|
| `log2`|`(a, b)`|number|Get the logarithm of `a` in base 2.|
| `log10`|`(a, b)`|number|Get the logarithm of `a` in base 10.|
| `expm1`|`(a)`|number|Get `exp(a) - 1`, more precisely.|
| `log1p`|`(a)`|number|Get `log(a + 1)`, more precisely.|
|!Math (trigonometry)|<|<|<|
|!Function|!Args|!Result|!Summary|
| `pi`||number|Get ''pi'' (''π'', approx. 3.14159).|
| `degrees`|`(a)`|number|Convert radians to degrees: `180*a/pi`.|
| `radians`|`(a)`|number|Convert degrees to radians: `pi*a/180`.|
| `sin`|`(a)`|number|Get the sine of `a`.|
| `cos`|`(a)`|number|Get the cosine of `a`.|
| `tan`|`(a)`|number|Get the tangent of `a`.|
| `sec`|`(a)`|number|Get the secant, `1/cos(a)`.|
| `csc`|`(a)`|number|Get the cosecant, `1/sin(a)`.|
| `cot`|`(a)`|number|Get the cotangent, `1/tan(a)`.|
| [`a`]`sin`[`h`]|`(a)`|number|Get the [arc and/or hyperbolic] sine.|
| [`a`]`cos`[`h`]|`(a)`|number|Get the [arc and/or hyperbolic] cosine.|
| [`a`]`tan`[`h`]|`(a)`|number|Get the [arc and/or hyperbolic] tangent.|
| [`a`]`sec`[`h`]|`(a)`|number|Get the [arc and/or hyperbolic] secant.|
| [`a`]`csc`[`h`]|`(a)`|number|Get the [arc and/or hyperbolic] cosecant.|
| [`a`]`cot`[`h`]|`(a)`|number|Get the [arc and/or hyperbolic] cotangent.|
| `atan2`|`(y,x)`|number|Get the arctangent of `y`/`x`.<br/>This is useful for computing angles.|
|!Math (Statistical)|<|<|<|
|!Function|!Args|!Result|!Summary|
| `rand`|`()`|number|Get a random number between 0 and 1.|
| `random`|~|~|~|
| <<small randbetween>>|`(a, b)`|number|Get a random number between `a` and `b`.|
| `average`|`(a...)`|number|Average the arguments (including arrays).|
| `percent`|`(a)`|percent|Return `a/100` as a percentage.|
|!Strings & Text|<|<|<|
|!Function|!Args|!Result|!Summary|
| `t`|`(a)`|text|Turn `a` into text. (Often automatic.)|
| `value`|`(t)`|number|Turn `t` into a number. (Often automatic.)|
| `cat`|`(a, b)`|text|Append `a` and `b` as text.<br/>Same as `(a&b)`.|
| <<small concatenate>>|~|~|~|
| `len`|`(text)`|number|Get the length of `text` in characters.|
| `mid`|`(t,i,n)`|text|Get `n` characters from `t` starting at the `i`th character.|
| `substr`|~|~|~|
| `substitute`|`(t,a,b)`|text|Replace any `a` in `t` with `b`.|
| `join`|`(d,...)`|text|Join arrays & values into text, with `d` inserted between each element.|
| `textjoin`|`(d,a..)`|text|As `join` but if `a` is true, omit empty values.|
| `split`|`(t,d)`|text|Split `t` into an array, starting a new element whenever `d` appears.|
| `trim`|`(t)`|text|Remove whitespace from the beginning and end of `t`.|
|!Regular Expressions|<|<|<|
|!Function|!Args|!Result|!Summary|
| <<small regexreplace>>|`(s,R,b)`|text|Replace all `R` matches in `s` with `b`.|
| <<small regexmatch>>|`(s,R)`|bool|Test whether `s` matches `R` at least once.|
| <<small regexextract>>|`(s,R)`<br/>`(s,R,i)`|array|Get all `R` matches in `s`.|
| <<small regexextract1>>|`(s,R,d)`<br/><<small (s,R,d,i)>>|text|Get the first `R` match in `s`.<br/>Result is `d` if there are no matches.|
|!Note:| //`R` are regular expressions like in the `regexp` filter operator.<br/>These must be strings with double-escaping, ex. `"\\s*"`.<br/>Supply `i` to get the `i`th [[capture group|https://www.regular-expressions.info/brackets.html]] in the regex.// |<|<|
|!Comparison|<|<|<|
|!Function|!Args|!Result|!Summary|
| `exact`|`(a,b)`|boolean|Test whether `a` and `b` are exactly equal.|
| `eq`|`(a, b)`|boolean|Test whether `a` and `b` are equal.|
| `equal`|~|~|~|
| `ne`|`(a, b)`|boolean|Test whether `a` and `b` are not equal.|
| `not_equal`|~|~|~|
| `gt`|`(a, b)`|boolean|Test whether `a` is greater than `b`.|
| `greater`|~|~|~|
| `gte`|`(a, b)`|boolean|Test whether `a` is greater than or equal to `b`.|
| <<small greater_<br/>or_equal>>|~|~|~|
| `lt`|`(a, b)`|boolean|Tests whether `a` is less than `b`.|
| `less`|~|~|~|
| `lte`|`(a, b)`|boolean|Tests whether `a` is less than or equal to `b`.|
| <<small less_or_equal>>|~|~|~|
|!Logic|<|<|<|
|!Function|!Args|!Result|!Summary|
| `true`||boolean|The value TRUE.|
| `false`||boolean|The value FALSE.|
| `not`|`(a)`|boolean|Test if `a` is FALSE.|
| `and`|`(a, b)`|boolean|Test if `a` and `b` are both TRUE.|
| `or`|`(a, b)`|boolean|Test if one or both of `a` and `b` is TRUE.|
| `xor`|`(a, b)`|boolean|Test if just one of `a` and `b` is TRUE.|
|!Selection|<|<|<|
|!Function|!Args|!Result|!Summary|
| `if`|`(q,a,b)`| * |If `q` is TRUE, return `a`, else `b`.|
| `iferror`|`(a, b)`| * |Return `a`, or `b` if there's an error with `a`.|
| `ifs`|`(...)`| * |Test-based select. See: [[IFS Function]]|
| `switch`|`(n...)`| * |Value-based select. See: [[SWITCH Function]]|
| `choose`|`(n...)`| * |Return the `n`th element (after `n`).|
|!Arrays & Filter Results|<|<|<|
|!Function|!Args|!Result|!Summary|
| `array`|`(...)`|array|Put the items into an array. See [[Array Literal]].|
| `map`|`(f,a)`| array |Compute [[Function]] `f` for every value in array `a`, producing a new array.|
| `count`|`(a...)`|number|Count all non-empty items. Each array item is counted.|
| `counta`|~|~|Count empty //and// non-empty items.|
| `nth`|`(a,n)`| * |Get the `n`th item in array `a`.|
| `first`|`(a)`| * |Get the first item in array `a`.|
| `last`|`(a)`| * |Get the last item in array `a`.|
|!Date & Time|<|<|<|
|!Function|!Args|!Result|!Summary|
| `now`||date|Get the current date and time.|
| `date`|`(y,m,d)`|date|Make a date from `y`ear, `m`onth and `d`ay.|
| `time`|`(h,m,s)`|date|Make a date from `h`our, `m`inute and `s`econd.|
| `date`|`(stamp)`|date|Make a date from a TiddlyWiki timestamp.|
| `tw_date`|~|~|~|
| <<small to_tw_date>>|`(date)`|date|Make a TiddlyWiki timestamp from a date.|
| `julian`|`(n)`|date|Convert a Julian day to a date.|
| `to_julian`|`(date)`|number|Convert a date to a Julian day.|
| `year`|`(date)`|number|Get the year from a date.|
| `month`|`(date)`|number|Get the month number (1-12).|
| `day`|`(date)`|number|Get the day of the month (1-31).|
| `hour`|`(date)`|number|Get the hour from a date (0-23).|
| `minute`|`(date)`|number|Get the minute from a date (0-59).|
| `second`|`(date)`|number|Get the second from a date (0-59).|
| <<small millisecond>>|`(date)`|number|Get the millisecond from a date (0-999).|
| `weekday`|`(date)`|number|Get the day of the week starting Sun (1-53).|
| `weeknum`|`(date)`|number|Get the week of the year (1-53).|
| <<small isoweekday>>|`(date)`|number|Get the day of the week starting Mon (1-7).|
| <<small isoweeknum>>|`(date)`|number|Get the ISO week of the year (0-52).|
| `years`|`(d1,d2)`|number|Count the whole years from `d1` to `d2`.|
| `months`|`(d1,d2)`|number|Count the whole months `d1` to `d2`.|
| `days`|`(d1,d2)`|number|Total the days from `d1` to `d2`.|
| `hours`|`(d1,d2)`|number|Total the hours from `d1` to `d2`.|
| `minutes`|`(d1,d2)`|number|Total the minutes from `d1` to `d2`.|
| `seconds`|`(d1,d2)`|number|Total the seconds from `d1` to `d2`.|
| <<small milliseconds>>|`(d1,d2)`|number|Total the milliseconds from `d1` to `d2`.|
| `add_years`|`(d1,n)`|number|Advance `d1` by `n` years.|
| `add_months`|`(d1,n)`|number|Advance `d1` by `n` months.|
| `add_days`|`(d1,n)`|number|Add `n` days to `d1`.|
| `add_hours`|`(d1,n)`|number|Add `n` hours to `d1`.|
| <<small add_minutes>>|`(d1,n)`|number|Add `n` minutes to `d1`.|
| <<small add_seconds>>|`(d1,n)`|number|Add `n` seconds to `d1`.|
| <<small add_<br/>milliseconds>>|`(d1,n)`|number|Add `n` milliseconds to `d1`.|
| <<small is_leap_year>>|`(year)`|boolean|Test if `year` is a leap year with 366 days.|
| <<small days_in_year>>|`(year)`|number|Count the days in `year` (365 or 366).|
| <<small days_in_month>>|`(y,m)`|number|Count days in `y`ear & `m`onth (28-31).|
!Defining new functions
See [[Extending Formulas]].
<ul>
<li><strong>Arrow functions don’t have their own context.</strong> This is especially important if they’re defined inside another function. For example, as a callback for a <code>forEach</code> execution. If inside the arrow function you use the keyword <code>this</code> you’re referencing the context of the parent function. This is a big difference because before arrow functions, you’d have to save a reference to <code>this</code> before calling the callback function, and within the callback use the new reference, otherwise the <code>this</code> inside it would be a completely new context.</li>
<li><strong>Arrow functions don’t have the </strong><code><strong>arguments</strong></code><strong> especial hidden variable. </strong>Inside a regular function you can call a variable you never defined called <code>arguments</code> which contains an array-like object with all the arguments received during the function’s execution. This is great if you wanted to create a function that would receive a variable amount of attributes. Arrow functions don’t have access to it, however, now thanks to <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters" rel="noopener ugc nofollow" target="_blank">rest parameters, this is also not needed anymore</a>.</li>
<li><strong>Arrow functions are not valid constructors. </strong>Believe it or not regular functions are “constructible”. Meaning they can be called with the <code>new</code> keyword and return a new instance of that function. Why is this possible? Because back then, before ES6, we also had prototypal inheritance as our main way of working with objects, and functions (regular functions) were the constructor for them. However, now with classes that is no longer the “way to go”, and arrow functions reflect that change in direction. Arrow functions while callable (just like regular ones), are not constructible, so you can’t really put a <code>new</code> before calling them, it won’t work.</li>
<li>Finally, the last minor difference: <strong>arrow functions don’t allow duplicated argument names.</strong> This is acceptable for regular functions in non-strict mode. However this can’t happen with arrow functions, regardless of how strict you want to be.</li></ul>
<iframe width="100%" height="350px" src="https://www.youtube.com/embed/videoseries?list=PLhuBigpl7lqtMdPkejuo3mHdLFX53ftXJ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>For more detail see <a href="https://collectiveiq.wordpress.com/2016/04/14/the-true-promise-of-interactive-computing-leveraging-collective-iq/">The true promise of Interactive Computing: Leveraging our Collective IQ</a>, as well as the excellent summary in <a href="https://www.dougengelbart.org/pubs/alliance-980.html#2d">End User Systems</a> in the <a href="https://www.dougengelbart.org/content/view/110/460/">OHS Technology Template</a>.</p>
#### Build your own `Game`
* [**C**: _Handmade Hero_](https://handmadehero.org/)
* [**C**: _How to Program an NES game in C_](https://nesdoug.com/)
* [**C**: _Chess Engine In C_](https://www.youtube.com/playlist?list=PLZ1QII7yudbc-Ky058TEaOstZHVbT-2hg) [video]
* [**C**: _Let's Make: Dangerous Dave_](https://www.youtube.com/playlist?list=PLSkJey49cOgTSj465v2KbLZ7LMn10bCF9) [video]
* [**C**: _Learn Video Game Programming in C_](https://www.youtube.com/playlist?list=PLT6WFYYZE6uLMcPGS3qfpYm7T_gViYMMt)
[video]
* [**C**: _Coding A Sudoku Solver in C_](https://www.youtube.com/playlist?list=PLkTXsX7igf8edTYU92nU-f5Ntzuf-RKvW) [video]
* [**C**: _Coding a Rogue/Nethack RPG in C_](https://www.youtube.com/playlist?list=PLkTXsX7igf8erbWGYT4iSAhpnJLJ0Nk5G) [video]
* [**C**: _Tutorial For a Brickout Clone_](https://dashgl.com/)
* [**C**: _A tutorials for a basic Invaders game made in C with GTK: and OpenGL_](https://dashgl.com/Invaders/)
* [**C**: _Astroids Tutorial written in C using GTK with OpenGL and DashGL for matrix manipulation_](https://dashgl.com/Astroids/)
* [**C++**: _How To Make Minecraft in C++/ OpenGL_](https://www.youtube.com/playlist?list=PLMZ_9w2XRxiZq1vfw1lrpCMRDufe2MKV_) [video]
* [**C++**: _Breakout_](https://learnopengl.com/In-Practice/2D-Game/Breakout)
* [**C++**: _Beginning Game Programming v2.0_](http://lazyfoo.net/tutorials/SDL/)
* [**C++**: _Tetris tutorial in C++ platform independent focused in game logic for beginners_](http://javilop.com/gamedev/tetris-tutorial-in-c-platform-independent-focused-in-game-logic-for-beginners/)
* [**C#**: _Learn C# by Building a Simple RPG_](http://scottlilly.com/learn-c-by-building-a-simple-rpg-index/)
* [**C#**: _Creating a Roguelike Game in C#_](https://roguesharp.wordpress.com/)
* [**Go**: _Games With Go_](https://gameswithgo.org/) [video]
* [**Java**: _3D Game Development with LWJGL 3_](https://lwjglgamedev.gitbooks.io/3d-game-development-with-lwjgl/content/)
* [**JavaScript**: _2D breakout game using Phaser_](https://developer.mozilla.org/en-US/docs/Games/Tutorials/2D_breakout_game_Phaser)
* [**JavaScript**: _How to Make Flappy Bird in HTML5 With Phaser_](http://www.lessmilk.com/tutorial/flappy-bird-phaser-1)
* [**JavaScript**: _Developing Games with React, Redux, and SVG_](https://auth0.com/blog/developing-games-with-react-redux-and-svg-part-1/)
* [**JavaScript**: _Build your own 8-Ball Pool game from scratch_](https://www.youtube.com/watch?v=aXwCrtAo4Wc) [video]
* [**Lua**: _BYTEPATH_](https://github.com/SSYGEN/blog/issues/30)
* [**Python**: _Developing Games With PyGame_](https://pythonprogramming.net/pygame-python-3-part-1-intro/)
* [**Python**: _Making Games with Python & Pygame_](https://inventwithpython.com/makinggames.pdf) [pdf]
* [**Ruby**: _Write Yourself a Roguelike_](https://github.com/thoughtbot/write-yourself-a-roguelike)
* [**Ruby**: _Developing Games With Ruby_](https://leanpub.com/developing-games-with-ruby/read)
<p>Enterprise low-code application platforms offer compelling productivity gains for professional and citizen development, as well as speed-of-delivery benefits. We evaluate 18 vendors to help you identify those with a balance of technology and business capabilities suited to your enterprise’s needs.</p>
<p><a name="dv_strategic_planning_assumptions"></a></p>
<h2>Strategic Planning Assumptions</h2>
<p>By 2024, three-quarters of large enterprises will be using at least four low-code development tools for both IT application development and citizen development initiatives.</p>
<p>By 2024, low-code application development will be responsible for more than 65% of application development activity.</p>
<p><a name="dv_market_definitiondescription"></a></p>
<h2>Market Definition/Description</h2>
<p><strong>Application platforms</strong> provide runtime environments for application logic. They manage the life cycle of an application or application component, and ensure the availability, reliability, scalability, security and monitoring of application logic.</p>
<p>A <strong>low-code application platform (LCAP)</strong> is an application platform that supports rapid application development, one-step deployment, execution and management using declarative, high-level programming abstractions, such as model-driven and metadata-based programming languages. They support the development of user interfaces, business logic and data services, and improve productivity at the expense of portability across vendors, as compared with conventional application platforms.</p>
<p>An <strong>enterprise LCAP</strong> supports enterprise-class applications. These require high performance, scalability, high availability, disaster recovery, security, SLAs, resource use tracking, technical support from the provider, and API access to and from local and cloud services.</p>
<p>Gartner views “<strong>no-code” application platforms </strong>as part of the LCAP market. “No-code” is a marketing and positioning statement, implying that the platform requires text entry only for formulas or simple expressions, all other aspects of application development being enabled by visual modeling or configuration. The LCAP market includes such no-code platforms.</p>
<p><strong>Citizen development</strong> is often associated with no-code application development. We consider it a niche within the LCAP market.</p>
<p><a name="dv_magic_quadrant"></a></p>
<h2>Magic Quadrant</h2>
<p><a name="dv_figure_1_magic"></a><a name="Magic_Quadrant_for_Enterprise_LowCode_Application_Platforms"></a>Figure 1. Magic Quadrant for Enterprise Low-Code Application Platforms</p>
<p>Source: Gartner (August 2019)</p>
<p><img alt="Magic Quadrant for Enterprise Low-Code Application Platforms" id="Magic-Quadrant-for-Enterprise-Low-Code-Application-Platforms-target" src="https://www.gartner.com/resources/361500/361584/361584_0001.png?reprintKey=1-1XQ92DO5" /></p>
<p><a name="dv_vendor_strengths_and"></a></p>
<h3>Vendor Strengths and Cautions</h3>
<p><a name="dv_agilepoint"></a></p>
<h4>AgilePoint</h4>
<p>AgilePoint is a Niche Player. It has a background in business process management (BPM) technology, but undertook an early transition into low-code development tools for automating business operations. It provides multitenancy using either on-premises deployment or the cloud. Gartner reviewed AgilePoint NX, version 7.</p>
<p><a name="dv_strengths"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Product: </strong>AgilePoint’s BPM background is reflected in its model-driven, Business Process Model and Notation (BPMN)-compliant AgilePoint NX environment for building extensible process-centric or data-centric applications, aimed at nontechnical developers. More complex extensions can be built in C# or Visual Basic using AgilePoint’s software development kit.</p></li>
<li>
<p><strong>Ecosystem: </strong>To assist developers, AgilePoint’s ecosystem store includes popular process patterns, 70 predefined integrations, 50 domain-specific data entity types and 700 process activities. AgilePoint also participates in other vendors’ ecosystems; it appears, for example, on the Salesforce AppExchange and Microsoft AppSource stores.</p></li>
<li>
<p><strong>Product vision: </strong>AgilePoint’s vision extends to low-code edge computing and the Internet of Things (IoT), as well as artificial intelligence (AI)-driven development and chatbots, to assist with digital business initiatives in larger enterprises.</p></li>
<li>
<p><strong>Sales execution: </strong>AgilePoint focuses on providing value for money and offers concurrent-user and transaction pricing options. Scores from reference customers for AgilePoint’s pricing and value for money were higher than those received by most other vendors. It expects its freemium Community Edition to be an enabler of new business.</p></li></ul>
<p><a name="dv_cautions"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Overall viability:</strong> Although AgilePoint is growing well and has an appropriate partnering strategy, including white-label resellers, it remains one of the smaller vendors, with a relatively low average revenue per customer. It has been self-funded to date, but might find it challenging to keep investing at the level needed to compete with other LCAP vendors.</p></li>
<li>
<p><strong>Market record: </strong>Responses from AgilePoint’s reference customers, supplemented by Gartner Peer Insights reviews, indicate that its customers have tended to focus on reduced skills requirements for operations automation, rather than on enterprise rapid application delivery, although some reported achieving the latter.</p></li>
<li>
<p><strong>Product strategy: </strong>AgilePoint’s participation in Microsoft and Salesforce ecosystems means it is potentially competing against these ecosystems’ hosts. Although AgilePoint competes successfully through its process-centric and value characteristics, these advantages could easily be negated, forcing the vendor into a more niche position.</p></li>
<li>
<p><strong>Customer satisfaction: </strong>AgilePoint’s reference customers expressed desire for enhancements to how mobile apps are deployed, together with improved developer assistance in the form of better examples and documentation. AgilePoint states it has made improvements recently with regard to the former desire.</p></li></ul>
<p><a name="dv_appian"></a></p>
<h4>Appian</h4>
<p>Appian is a Leader. It originated in the BPM market and focuses on complex business processes and other applications requiring sophisticated automation, rules and analytics capabilities. Its technological differentiators include prebuilt no-code integration with various AI services and support for DevOps with automated continuous integration/continuous delivery (CI/CD) for enterprise IT shops. Gartner reviewed Appian version 19.1.</p>
<p><a name="dv_strengths_1"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Product:</strong> Appian’s LCAP strengths derive from its background in the model-driven intelligent business process management suite (iBPMS) market. Gartner sees Appian’s support for business process automation and modernization of applications as the main reasons for customers to choose it. Appian’s ability to handle complex business rules, decisioning and workflow is also a key differentiator.</p></li>
<li>
<p><strong>Innovation:</strong> Appian continues to offer innovative low-code technology, with support for chatbots and progressive web apps (PWAs) among its multiexperience capabilities.</p></li>
<li>
<p><strong>Market responsiveness:</strong> Appian demonstrates enterprise-worthiness through the scale of its deployments, which typically span whole organizations and multiple projects. Appian also invests heavily in security certifications and audits, and has one of the most comprehensive sets of certifications for high-security government requirements.</p></li>
<li>
<p><strong>Overall viability:</strong> In a crowded market with many small, privately owned vendors, Appian stands out as a stable, publicly traded company with a focus on low-code technology. Although not as big as the largest enterprise software vendors, Appian has many enterprise customers and government agencies running its platform, which should ensure its long-term viability in this market.</p></li></ul>
<p><a name="dv_cautions_1"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Sales execution:</strong> One of the main challenges facing Appian and its customers is the company’s sales execution. Appian’s reference customers reported below-average satisfaction with its contract evaluation and negotiation, as well as its contract flexibility. Appian has recently changed its licensing model to help address this issue, but the effect of the change is not yet known. Overall, reference customers expressed a lower-than-average level of satisfaction with its sales process.</p></li>
<li>
<p><strong>Sales strategy: </strong>Appian focuses on larger deals and its pricing strategy means its rate of customer expansion is less than that of other Leaders. Appian’s reference customers reported below-average satisfaction with its pricing.</p></li>
<li>
<p><strong>Product strategy: </strong>Compared with some vendors in this Magic Quadrant, Appian’s low-code development product is more suitable for professional developers in terms of the ease of use of its proprietary expression and scripting language. Furthermore, reference customers’ overall score for Appian’s citizen developer support was lower than the average for vendors in this Magic Quadrant.</p></li>
<li>
<p><strong>Customer experience:</strong> Appian’s reference customers all recommended it to others, but not unreservedly. They gave lower-than-average scores for time to deployment, which could be the result of Appian customers choosing it for larger-than-average applications, and for the quality of Appian’s peer community.</p></li></ul>
<p><a name="dv_betty_blocks"></a></p>
<h4>Betty Blocks</h4>
<p>Betty Blocks is a Visionary. Its product, also called Betty Blocks, focuses on the no-code assembly of applications from components — hence the “Blocks” part of the company’s name. It does this while providing application oversight and governance and support for enterprise-scale usage. Technical differentiators include its cloud-native architecture and React-based UI. The Betty Blocks version reviewed was current as of the start of 2019.</p>
<p><a name="dv_strengths_2"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Market understanding:</strong> Betty Blocks differentiates itself as a provider of a citizen development platform for enterprise applications. This reflects a strong vision for a key aspect of the low-code market. Simple drag-and-drop development and an emphasis on a component reuse model with associated component repository encourage use of a compositional model for application development.</p></li>
<li>
<p><strong>Innovation:</strong> Betty Blocks’ technical innovation remains advanced, as it uses the Elixir language to underpin a cloud-native Kubernetes and container-based deployment model with serverless extensions. This enables customers to extend applications with customizable microapp blocks for scalable and flexible app delivery.</p></li>
<li>
<p><strong>Product: </strong>Betty Blocks has a record of delivering standard business applications rapidly. Some Gartner clients report that Betty Blocks delivered straightforward business process automation in a matter of days.</p></li>
<li>
<p><strong>Sales execution:</strong> Betty Blocks’ reference customers scored it higher than the average for pricing and contract flexibility. This is an important consideration, as one of the most common concerns about LCAPs is their pricing.</p></li></ul>
<p><a name="dv_cautions_2"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Overall viability:</strong> Although it has grown, Betty Blocks is still one of the smallest vendors in this Magic Quadrant. Prospective customers should also note the relative smallness of its community and be aware of the potential for it to be acquired. Additionally, the company’s sales coverage is limited primarily to Europe and the U.S.</p></li>
<li>
<p><strong>Customer experience:</strong> The nascent market for true citizen development tools is evolving. Reference customers gave Betty Blocks lower-than-average scores for its no-code development capabilities. Improvements to the end-user experience and further enhancements to the platform’s usability for citizen developers remain goals on Betty Blocks’ roadmap.</p></li>
<li>
<p><strong>Operations: </strong>The on-premises version of Betty Blocks’ platform is not the company’s standard offering. It comes with cloud-native overheads, such as a container infrastructure requirement, that may be incompatible with departmental or small-customer scenarios.</p></li>
<li>
<p><strong>Business model:</strong> Extending beyond the platform’s no-code capabilities will often require professional development, such as for complex extensions to blocks. This may prompt some users to revert to co-development with their professional services providers or Betty Blocks’ partners.</p></li></ul>
<p><a name="dv_bpmonline"></a></p>
<h4>bpm’online</h4>
<p>Bpm’online is a Niche Player. It is primarily a BPM and CRM SaaS vendor, its LCAP being provided as part of its BPM capability in the bpm’online platform. Its ethos that “everyone is a developer” prompts its focus on extensions to its prebuilt applications and ecosystem-supplied components. Gartner reviewed bpm’online version 7.13.3.</p>
<p><a name="dv_strengths_3"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Product: </strong>Bpm’online’s LCAP has a strong focus on BPM functionality. This enables the orchestration of processes across teams and applications, especially in customer-oriented domains related to its CRM offerings.</p></li>
<li>
<p><strong>Market understanding:</strong> Bpm’online aims to help business developers without deep technical skills rapidly build and modify model-driven applications. Its ideal user is a business analyst with a general understanding of web applications and knowledge of BPMN 2.0.</p></li>
<li>
<p><strong>Market responsiveness:</strong> In addition to supporting the application extension model of a SaaS-plus-PaaS (platform as a service) player, bpm’online allows developers to create their own custom machine learning (ML) models without coding or scripting. These models can predict values in different types of field, as well as calculate predictive scores (such as for the probability of specific events). The business logic for ML is defined using bpm’online’s citizen development environment.</p></li>
<li>
<p><strong>Marketing strategy:</strong> Bpm’online marketplace is an ecosystem of ready-to-use apps, industry solutions, templates and development accelerators designed to extend the functionality of bpm’online’s LCAP. Its community of developers and partners delivers custom applications, extensions, connectors and templates for the bpm’online platform and publishes them on bpm’online marketplace.</p></li></ul>
<p><a name="dv_cautions_3"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Overall viability:</strong> Bpm’online is a small vendor, compared with most of those in this Magic Quadrant, and its focus is CRM SaaS. Gartner rarely sees bpm’online on customers’ shortlists or vendors’ competitive lists outside Europe. As a result, standing out and scaling its sales and support strategies to compete head-to-head with larger LCAP providers focused on enterprise-class deployments is likely to prove challenging in the next couple of years.</p></li>
<li>
<p><strong>Product strategy:</strong> Although bpm’online supports AI-enabled application deployments, in comparison with some key competitors it has been slow to deliver AI-augmented development assistance, such as process autocomplete suggestions.</p></li>
<li>
<p><strong>Innovation:</strong> Bpm’online lags behind in terms of mobile and integration support, compared with the Leaders in this Magic Quadrant. Most of its 60 integration connectors are for relatively simple small and midsize business (SMB)-type services, which means that some enterprise projects require additional work.</p></li>
<li>
<p><strong>Customer experience:</strong> The productivity achievable with bpm’online’s LCAP may not be comparable to that of other vendors’ LCAPs for general application development, unless the customer customizes bpm’online’s predefined solutions. Increased developer productivity should be a key benefit of an LCAP, but bpm’online’s reference customers gave it productivity scores lower than those received by other vendors.</p></li></ul>
<p><a name="dv_k2"></a></p>
<h4>K2</h4>
<p>K2 is a Niche Player. It is better known as a long-term BPM provider for process-centric automation projects of moderate complexity and scale. It provides full application life cycle support for process-driven applications involving multiple developer personas and draws on an integration framework. It offers separate cloud and on-premises versions, with K2 Cloud Update 7 and K2 Five version 5.2, respectively, being reviewed for this Magic Quadrant.</p>
<p><a name="dv_strengths_4"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Product: </strong>K2 is a well-recognized, model-driven business process automation vendor with a background in BPM. Its product supports process orchestration, business rules and integration, and has software development life cycle features, such as its own test automation framework.</p></li>
<li>
<p><strong>Market understanding:</strong> Some citizen developer use cases suit K2, due to its App Wizards. These offer four simple steps to application definition, resulting in either deployed applications or templates that can be further customized during the conventional development process.</p></li>
<li>
<p><strong>Sales execution:</strong> K2 received above-average scores from reference customers for its pricing and costs. They also scored K2 above the average for contract and pricing negotiation.</p></li>
<li>
<p><strong>Market responsiveness:</strong> K2 has targeted its audience well for application development. Reference customers expressed above-average levels of satisfaction with K2’s functionality and integration features, as well as its developer experience.</p></li></ul>
<p><a name="dv_cautions_4"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Marketing strategy:</strong> K2 needs to invest more in its LCAP marketing and sales execution. At present, it risks losing out to LCAP competitors, due to a low level of awareness of its offering.</p></li>
<li>
<p><strong>Sales strategy:</strong> K2 declined to give Gartner insights into its LCAP sales figures, but evidence from Gartner’s client inquiry service indicates that it still sells primarily to customers interested in process-centric applications, rather than (for example) data-centric or user-experience-centric applications.</p></li>
<li>
<p><strong>Product strategy: </strong>K2’s SmartForms UI remains primarily form-based, although it is rendered in HTML5. Additionally, reference customers’ overall score for K2’s ability to deliver advanced architectures in applications was below those received by other vendors. Its UI limitation will impact certain application use cases.</p></li>
<li>
<p><strong>Customer experience:</strong> Reference customers’ overall score for K2’s cloud functionality was below those received by other vendors. Its reference customers also expressed a desire for more improvements to the end-user experience in terms of quality, reliability, availability and ease of deployment. A higher-than-average number of K2’s reference customers would give it only a qualified recommendation to prospective customers.</p></li></ul>
<p><a name="dv_kintone"></a></p>
<h4>Kintone</h4>
<p>Kintone is a Niche Player. This vendor, whose LCAP bears the same name, focuses on providing a low-code ecosystem for workgroups and lines of business, primarily in Japan and Asia. It differentiates itself in terms of how simple it is to use its LCAP to develop applications involving data, workflow and collaboration. Gartner reviewed Kintone’s January 2019 release.</p>
<p><a name="dv_strengths_5"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Overall viability:</strong> Kintone is growing rapidly as part of Cybozu, a Japanese IT business that provides SaaS applications. In addition to Japan, its LCAP is available in other parts of Asia and North America.</p></li>
<li>
<p><strong>Business model:</strong> Kintone’s thousands of partners and developers, as well as its very large installed base, amount to a primarily Japanese ecosystem success. Partners include some (such as SoftBank) that operate their own Kintone app stores, and several integration partners (such as Microsoft and Zapier).</p></li>
<li>
<p><strong>Market responsiveness: </strong>Citizen development for SMBs is a core capability of Kintone’s LCAP. This is shown, for example, by its support for self-service application building through the import of Microsoft Excel data. This citizen development style suits Kintone’s mainstream SMB and line-of-business audiences.</p></li>
<li>
<p><strong>Sales experience:</strong> Kintone’s reference customers scored it above the average for sales evaluation and contact negotiation. They also gave it a higher-than-average score for overall cost.</p></li></ul>
<p><a name="dv_cautions_5"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Product strategy:</strong> Kintone’s cloud strategy is evolving only slowly to encompass global infrastructure as a service (IaaS) providers like Amazon Web Services (AWS) — a process that has been ongoing for two years. As of mid-2019, Kintone has limited cloud presence outside Japan and no on-premises capability.</p></li>
<li>
<p><strong>Product: </strong>Kintone’s architecture is not cloud-native, being a monolithic application running on virtual machines. This limits its horizontal scalability and therefore its overall scalability. However, this has not hindered its success in Japan.</p></li>
<li>
<p><strong>Innovation:</strong> Kintone’s application development features are sparse when it comes to things like sophisticated business logic, AI and chatbots. The end-user experience is relatively limited, compared with other LCAPs. There is limited in-platform developer support for JavaScript extensions.</p></li>
<li>
<p><strong>Customer experience:</strong> Kintone’s reference customers consider its integration capabilities weak. They scored Kintone below the average for integration capabilities, and they want it to improve in this respect.</p></li></ul>
<p><a name="dv_kony"></a></p>
<h4>Kony</h4>
<p>Kony is a Challenger. The Kony Quantum platform has evolved from a mobile app development platform offering (now a multiexperience development platform), which means it can address rich web and mobile app use cases and is configurable through a low-code environment. It supports PWAs and API management capabilities. Gartner reviewed release V8SP3 of Kony’s product.</p>
<p><a name="dv_strengths_6"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Product:</strong> Kony Quantum is most suitable for professional developers who want a low-code approach to visually construct web, mobile and even conversational apps. The platform is highly extensible using JavaScript and can integrate with a wide range of popular enterprise systems via Kony’s connectors.</p></li>
<li>
<p><strong>Market responsiveness:</strong> Kony demonstrates a high degree of responsiveness to market trends and customer needs. It continues to innovate with the Kony IQ chatbot in order to provide AI-augmented development. It is one of the few LCAP vendors to support both PWAs and chatbots.</p></li>
<li>
<p><strong>Market understanding: </strong>The Kony Fabric back-end provides comprehensive services for enterprise application needs, including identity management, workflow, Object Services for back-end data model transformation, offline synchronization and app analytics. It also offers API management functionality and an API developer portal for extending the platform.</p></li>
<li>
<p><strong>Product strategy:</strong> Kony works well for advanced developer needs relating to the user experience and integration. Reference customers scored Kony above the average for developer productivity. While they tended to select it for its multiexperience capabilities, they also scored it higher than the average for its end-user experience and integration features.</p></li></ul>
<p><a name="dv_cautions_6"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Marketing strategy:</strong> Kony has only recently started to shift its marketing and positioning toward a low-code value proposition. However, we have not seen significant awareness of Kony as an LCAP provider among users of Gartner’s client inquiry service.</p></li>
<li>
<p><strong>Visual model development:</strong> Kony does not yet offer any visual process modeling for laying out complex back-end processes to support low-code development. Organizations requiring process-oriented development should look elsewhere.</p></li>
<li>
<p><strong>Sales execution:</strong> Although all of Kony’s reference customers would recommend it to others, some would do so only with qualifications. Some of Kony’s scores for value for money and the overall purchase experience were lower than those received by other vendors.</p></li>
<li>
<p><strong>Customer experience:</strong> Reference customers’ scores for Kony were lower than those given to other vendors for overall product capabilities. Reference customers’ main concerns were about Kony’s no-code capabilities for citizen developers and the amount of training required for developers. They also reported longer times to deploy their first app. Although Kony is strong when it comes to meeting requirements for sophisticated app user experiences, customers looking for a relatively simple no-code LCAP, particularly for citizen developers, should consider other vendors.</p></li></ul>
<p><a name="dv_mendix"></a></p>
<h4>Mendix</h4>
<p>Mendix is a Leader. Mendix, which was acquired by Siemens in 2018, focuses on improving business-IT collaboration and application life cycle management. Its LCAP, of the same name, is deployed on cloud-native technology. It is also being extended to integrate with Siemens’ MindSphere IoT and product life cycle management products. Gartner reviewed the Mendix 7.20 release.</p>
<p><a name="dv_strengths_7"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Overall viability:</strong> Ownership by Siemens gives Mendix an inflow of resources, which is essential for competing successfully in a market that is increasingly targeted by megavendors. In addition to accelerating research and development, ownership by Siemens implies a new level of viability for Mendix business; it opens new distribution channels and positions Mendix for future differentiation in the low-code IoT market.</p></li>
<li>
<p><strong>Product strategy:</strong> Mendix offers significant enterprise characteristics, which are especially attractive to large businesses. Its platform is well equipped for multicloud and hybrid computing, due to its support for on-premises, virtual private multicloud and multitenant public cloud deployment options. The platform’s autoscaling, high availability and very low latency for failover across multiple availability zones increase the quality of its service. Mendix’s partnerships with IBM, SAP and now Siemens will reassure large customers.</p></li>
<li>
<p><strong>Innovation:</strong> Mendix is one of the first vendors in this market to offer a multipersona developer experience in one integrated platform. The ability to support both business developers in Mendix Studio and professional IT developers in Mendix Studio Pro supports advanced forms of business-IT collaboration. Mendix’s AI-assisted development further promotes productivity and consistency of outcomes.</p></li>
<li>
<p><strong>Product:</strong> Mendix’s offering is suitable for sophisticated applications. Reference customers gave Mendix high scores for enterprise-worthiness, integration and advanced architecture support, as well as for productivity and ease of use by professional developers.</p></li></ul>
<p><a name="dv_cautions_7"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Industry strategy:</strong> Mendix’s acquisition by Siemens offers some promising opportunities, but also represents a risk. Given the scale of Siemens’ business (its revenue totaled €83 billion in 2018), its commitment to Mendix could shift. Siemen’s prioritizing of industrial IoT offerings and its other vertical commitments may become a stronger influence on Mendix, which could shift its focus away from the mainstream LCAP business.</p></li>
<li>
<p><strong>Market strategy:</strong> Mendix needs to increase its capabilities in integration, API management, event brokering and process orchestration if it is to lead future LCAP requirements for a composition platform, rather than just a development platform. Some of these increased capabilities are roadmap items for 2019.</p></li>
<li>
<p><strong>Market responsiveness:</strong> Growth in the LCAP market is much easier to achieve when a vendor offers its platform as an extension tool for prebuilt applications and services. Mendix may have to expand its business model to begin offering business applications that utilize its platform, as well as increase its efforts to attract partners to create applications on it.</p></li>
<li>
<p><strong>Customer experience:</strong> Mendix’s reference customers scored it below the average for satisfaction with its platform’s support for citizen developers. They also gave it some poor reviews for pricing and contract flexibility.</p></li></ul>
<p><a name="dv_microsoft"></a></p>
<h4>Microsoft</h4>
<p>Microsoft is a Leader. Its LCAP, consisting of PowerApps, Flow and Common Data Service, is applicable to many use cases but strongest for those that extend Microsoft Office 365 and Dynamics 365. This LCAP is part of the Microsoft Power Platform, along with PowerBI analytics, and is differentiated by the additional depth provided by additional and advanced Azure services. The Power Platform includes more than 240 third-party web service connectors and data source connectors. Gartner reviewed PowerApps version 3.19014, Flow version 20190121, and Common Data Service version 9.1 19013.</p>
<p><a name="dv_strengths_8"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Market understanding:</strong> In 2018, Microsoft brought its Dynamics 365 platform together with PowerApps, Flow and the Common Data Service to create a unified LCAP. In the process, Microsoft enhanced the Common Data Service with additional enterprise-grade capabilities, such as server-side logic, business processes, advanced security and professional developer support.</p></li>
<li>
<p><strong>Product (business-to-employee [B2E]):</strong> Of the vendors evaluated in this Magic Quadrant, Microsoft offers one of the simpler design-time tools in PowerApps, one that is used for designing canvas apps and that employs a drag-and-drop approach and Microsoft Excel-like expression language. This makes it well suited to citizen developers and business unit developers. Reference customers for Microsoft reported some of the fastest production deployment times for apps — nearly all said such deployment took less than two months, and many said less than one month.</p></li>
<li>
<p><strong>Product strategy:</strong> Microsoft has shown increased commitment to the LCAP market by introducing a low-code AI Builder, as well as deeper integration with Microsoft Azure services. Given Microsoft’s incumbent position in many enterprises with Office 365, Gartner expects Microsoft to appear on many enterprises’ LCAP vendor shortlists, and that it will have good long-term platform viability. Microsoft’s was the platform most considered by all the featured vendors’ reference customers, with nearly one-third of them assessing it.</p></li>
<li>
<p><strong>Customer experience:</strong> Reference customers for Microsoft reported above-average satisfaction with the overall experience, service and support, and overall product capabilities. Microsoft also had the highest proportion of reference customers exploiting an LCAP for prototyping.</p></li></ul>
<p><a name="dv_cautions_8"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Market responsiveness:</strong> Whereas PowerApps’ canvas apps provide citizen development capabilities, PowerApps’ model-driven app capability targets more complex applications and is often used by independent software vendors (ISVs) to extend the Dynamics platform. Gartner clients indicate that their needs often lie in between, being, for example, for enterprise application developers working on systems of differentiation and vision.</p></li>
<li>
<p><strong>Sales execution:</strong> PowerApps and Flow come in restricted-license versions when supplied with certain Office 365 and Dynamics 365 plans, so customers must purchase more licenses or upgrade their plans if they need to build more apps or satisfy more complex use cases. Reference customers for Microsoft reported below-average satisfaction with its pricing and contract flexibility, so prospective customers should check how licensing prices and other arrangements may change as platform usage grows.</p></li>
<li>
<p><strong>Product (B2C): </strong>Microsoft’s platform has not targeted the building and deploying of customer-facing apps, although PowerApps Portals has been announced to address this. PowerApps’ licensing does not yet support unnamed external users or less predictable usage patterns. Capabilities expected by customers aiming to offer a consumer-grade experience, such as higher-end UI customization, have only recently been released.</p></li>
<li>
<p><strong>Industry strategy:</strong> Microsoft is in the early stages of providing specific industry solutions or industry accelerators for its LCAP — it currently offers four Industry Solution Accelerators and has others in preview, most aimed at ISVs. Customers will likely need to look in addition to Microsoft’s community of partners, accessible via its AppSource marketplace.</p></li></ul>
<p><a name="dv_oracle"></a></p>
<h4>Oracle</h4>
<p>Oracle is a Challenger. It offers two distinct LCAP solutions. One is its long-standing Application Express (APEX), which is provided free to users of Oracle Database on-premises or of all Oracle Database Cloud services. The other is the service-oriented architecture (SOA)-based Visual Builder Cloud Service (VBCS). Oracle APEX is strongly tied to the Oracle Database platform and has tens of thousands of organizations using it. VBCS supports new applications, as well as customizations of Oracle SaaS; it offers HTML5 and an extensible low-code experience.</p>
<p><a name="dv_strengths_9"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Market responsiveness:</strong> Oracle is the only vendor in this Magic Quadrant to offer two distinct LCAP solutions. As a result, it can address use cases ranging from simple spreadsheet replacement and form processing (create, read, update, delete [CRUD]) applications in VBCS, to advanced professional developer environments in APEX (as preferred by many database teams).</p></li>
<li>
<p><strong>Product strategy:</strong> Oracle continues to extend its LCAP offerings with advanced application features. APEX now offers dynamic UI selection, including UI features such as a simplified reporting interface, a dashboard and a timeline report. VBCS includes access to all generated JavaScript and HTML5/Cascading Style Sheets (CSS) source code for services, while both VBCS and APEX exploit the Oracle JET UI technology stack.</p></li>
<li>
<p><strong>Innovation:</strong> Oracle offers advanced AI/ML-assisted conversational chatbot capabilities, including specialized mobile bots and interaction with popular consumer voice services such as Amazon Alexa and Apple Siri. In addition, VBCS supports access to the separately priced Oracle event hub, messaging, process and IoT cloud services, which enables the creation of advanced event-driven applications.</p></li>
<li>
<p><strong>Customer experience:</strong> VBCS enables low-code access to Oracle’s broad collection of cloud services. It does so by drawing on a network of IaaS data centers, a suite of PaaS capabilities and a portfolio of SaaS offerings. In addition, it supports hybrid cloud and on-premises deployments with Cloud at Customer. VBCS extends customers’ Oracle SaaS investments via APIs, while Oracle’s innovative consumption-based portfolio pricing should encourage wider usage. Reference customers for Oracle gave it higher-than-average scores for product capabilities, developer productivity and contract negotiations.</p></li></ul>
<p><a name="dv_cautions_9"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Market understanding:</strong> Having two LCAP offerings is a strength in one regard, but also poses a challenge, as there is no portability of applications between them. Oracle customers report some confusion about determining the most suitable low-code path to take for application modernization.</p></li>
<li>
<p><strong>Sales strategy:</strong> Most of the advanced capabilities in Oracle’s cloud service portfolio, such as advanced process and decision modeling, come at additional cost and are accessed via REST APIs. For some customers, the initially low-cost VBCS or no-cost APEX can lead to multiproduct complexity and expense, as further services are added for desired functionalities. Costs may, however, be mitigated by Oracle’s Universal Credit Pricing approach.</p></li>
<li>
<p><strong>Sales execution:</strong> Adoption of VBCS by Oracle’s SaaS ISV partners is still low and is not creating any significant Oracle ecosystem at this point in time. Other LCAP vendors maintain a more SaaS-independent position and forge stronger third-party partnerships.</p></li>
<li>
<p><strong>Marketing execution:</strong> VBCS appears far less often than most other vendors on the competitive lists drawn up by users of Gartner’s client inquiry service. The benefits of its LCAPs are mostly limited to Oracle’s own ecosystem. As a result, Oracle’s LCAPs mostly attract experienced Oracle customers.</p></li></ul>
<p><a name="dv_outsystems"></a></p>
<h4>OutSystems</h4>
<p>OutSystems is a Leader. It originated as vendor of a rapid application development environment based on .NET, but now offers an enterprise LCAP of the same name that supports cloud, on-premises and hybrid solutions. It focuses on enterprise application development for agile and continuous customer delivery by offering a combination of omnichannel support and scalability. Gartner reviewed OutSystems 11.</p>
<p><a name="dv_strengths_10"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Overall viability:</strong> OutSystems continues to grow strongly by providing an alternative to many older third-generation language (3GL) platforms, while enabling low-code productivity improvements with access to capabilities such as an advanced web and mobile user experience, B2C support and even batch processing. Reference customers stated that they selected OutSystems for its strong vision and innovation.</p></li>
<li>
<p><strong>Product strategy:</strong> OutSystems supports both AWS and Azure deployments, but is particularly interesting to Microsoft shops due to its underlying use of .NET. Both AWS and Azure versions support access to the underlying cloud services for the IoT, AI and analytics.</p></li>
<li>
<p><strong>Innovation:</strong> OutSystems’ multipersona developer experience encourages professional and line-of-business developers to participate in governed and AI-assisted application development using web-based and fat-client integrated development environments; deployment can be container-based. Over 2,500 components are available on OutSystems’ Forge app store, and reference customers’ usage of shared components in this ecosystem was among the highest.</p></li>
<li>
<p><strong>Customer experience:</strong> Reference customers scored OutSystems higher than the average for developer productivity and most critical LCAP capabilities. They also scored it above the average for modernizing the user experience of existing applications.</p></li></ul>
<p><a name="dv_cautions_10"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Product:</strong> OutSystems’ LCAP is often used for automation of business processes, but is not yet competitive in all aspects of process-centric application development, especially with regard to aspects such as complex business logic modeling.</p></li>
<li>
<p><strong>Market understanding:</strong> OutSystems tends to be favored by professional developers, rather than citizen developers. Reference customers were less satisfied with its LCAP’s ease of use for citizen development (though citizen development was not a goal of any of them).</p></li>
<li>
<p><strong>Sales strategy:</strong> OutSystems’ customers need to ensure its pricing remains acceptable as their usage increases. The vendor’s pricing model uses a blended metric (“application objects,” which measures user experience pages, data tables, and API or service operations) to gauge consumption and therefore price, which clients can find it difficult to predict. In addition, increasing B2C usage is forcing increasing adoption of an unlimited user-count pricing model.</p></li>
<li>
<p><strong>Cloud strategy:</strong> OutSystems’ reference customers scored it lower than the survey average for cloud functionality. Its application PaaS (aPaaS) credentials for larger deployments have also received some criticism from Gartner clients. Additionally, surveyed reference customers requested continued improvement in the area of quality, reliability and availability.</p></li></ul>
<p><a name="dv_pega"></a></p>
<h4>Pega</h4>
<p>Pega is a Visionary. Pega Infinity has evolved from a BPM suite into an application platform and provides an LCAP capability through its App Studio, formerly Pega Express. Pega Infinity adds an LCAP layer to the vendor’s CRM and other SaaS offerings. Pega provides capabilities for governing developers, as well as advanced integration services, such as robotic process automation (RPA) and event processing. In addition, it supports multipersona developer experiences for professional developers and data scientists. Gartner reviewed Pega Infinity 8.1.</p>
<p><a name="dv_strengths_11"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Product: </strong>Pega has a reputation for selling a mature, multifunctional offering capable of producing advanced application designs. It offers visionary support for accessible development of event processing, decision management, data science and integration. Pega’s Cosmos user experience design system is evidence of this strength.</p></li>
<li>
<p><strong>Market understanding:</strong> Pega is one of only a few vendors in the LCAP market to recognize the need for unified multipersona developer experiences, with Pega App Studio and Dev Studio. Pega supports continuous business-IT design cooperation, which can help with IT-enabled business innovation.</p></li>
<li>
<p><strong>Industry strategy:</strong> Pega’s evolution toward offering stand-alone business applications, including ones for CRM, financial, healthcare, government and other vertical markets, which also represent components for LCAP users to build on, reflects a strong vision. Its combined SaaS-and-PaaS strategy provides the platform with multichannel business opportunities and helps drive its technological innovation and maturity.</p></li>
<li>
<p><strong>Developer experience:</strong> Reference customers for Pega scored it above the average for developer productivity and integration capability. They also praised its support for improved business process agility.</p></li></ul>
<p><a name="dv_cautions_11"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Business model:</strong> Pega’s business model supports a large consulting business to help customers fully implement its major capabilities. In addition, Pega’s pricing involves add-on fees for some enterprise-significant capabilities, including RPA and other integration features, AI assistance for developers and disconnected-mobile support. That this can result in relatively high per-user pricing is confirmed by users of Gartner’s client inquiry service and one of the lowest scores from reference customers for satisfaction in terms of value for money.</p></li>
<li>
<p><strong>Marketing execution:</strong> Pega does not separate out its LCAP-only revenue, and Gartner’s assessment is that Pega’s LCAP capabilities account for only a small part of its overall business. Reference customers confirmed that Pega’s platform is still seen as being primarily BPM-centric. Pega’s marketing efforts have yet to succeed in redefining the Pega brand for the LCAP market.</p></li>
<li>
<p><strong>Sales execution:</strong> Pega’s reference customers gave a below-average score to its contract negotiation process, but generally had not evaluated many other LCAP vendors.</p></li>
<li>
<p><strong>Platform experience:</strong> Pega’s reference customer scores for end-user experience, deployment and integration, enterprise-worthiness and cloud functionality were lower than those received by other vendors in this Magic Quadrant. Pega, however, reports that it has recently made significant investments to improve its capabilities in these areas.</p></li></ul>
<p><a name="dv_prontoforms"></a></p>
<h4>ProntoForms</h4>
<p>ProntoForms is a Niche Player. Its LCAP of the same name is used primarily for field service use cases and apps for mobile frontline workers. It supports rapid form development with a simple drag-and-drop approach to building mobile apps, web apps and Microsoft Windows fat clients.</p>
<p><a name="dv_strengths_12"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Product (B2E): </strong>ProntoForms provides an intuitive no-code, web-based tool using a drag-and-drop, visual app-building approach ideally suited to citizen developers. Its platform is most suitable for replacing paper forms, prototyping new apps, and modernizing or mobilizing existing desktop-bound applications.</p></li>
<li>
<p><strong>Market responsiveness:</strong> ProntoForms recognizes the advantages that a comparatively small vendor can seize by exploiting the ecosystems of larger ones. Its platform is available via the Salesforce AppExchange and Box app store, for example.</p></li>
<li>
<p><strong>Product strategy:</strong> ProntoForms focuses on mobile app development and provides some of the more robust capabilities in this area, such as offline data synchronization, bar code scanning, push notifications and SMS. However, some reference customers for ProntoForms said they would like its UI capabilities to be more sophisticated.</p></li>
<li>
<p><strong>Operations:</strong> Reference customers for ProntoForms gave above-average satisfaction scores for overall experience and service and support. They specifically praised the company’s culture and integrity in addressing their needs and helping them succeed.</p></li></ul>
<p><a name="dv_cautions_12"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Marketing execution:</strong> ProntoForms is not widely known in the LCAP market. It has primarily marketed and sold to mobile field service organizations. As it competes more in the enterprise sector and sells to IT departments, it will need to raise greater awareness of its platform, particularly as other LCAP vendors enhance their mobile app capabilities.</p></li>
<li>
<p><strong>Business model:</strong> ProntoForms has a large base of customers, but these are mainly business departments or business units, rather than enterprise IT departments. Its core platform updates in 2018 enable it to serve the needs of IT departments and enterprises better, but prospective large-enterprise clients still need to evaluate it carefully.</p></li>
<li>
<p><strong>Product (B2C): </strong>Gartner does not recommend<strong> </strong>ProntoForms for B2C or consumer-facing applications. Very few of ProntoForms’ customers use its LCAP for such applications.</p></li>
<li>
<p><strong>Sales execution:</strong> Reference customers for ProntoForms reported below-average satisfaction with its product in terms of value for money, as well as with the company’s pricing and contract flexibility. A few said that ProntoForms’ licensing management tools and processes were cumbersome to deal with.</p></li></ul>
<p><a name="dv_quick_base"></a></p>
<h4>Quick Base</h4>
<p>Quick Base is a Niche Player. Its LCAP of the same name is focused on enabling citizen developers to create applications as a means of empowering knowledge workers. It provides governance and rapid application development capabilities, based on a custom in-memory database. Its LCAP is entirely cloud-based.</p>
<p><a name="dv_strengths_13"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Product: </strong>Quick Base focuses on ease of use for citizen developers, and has developed a large customer base. This base extends across industries and includes professional developers aiming for rapid delivery of data-oriented applications.</p></li>
<li>
<p><strong>Market responsiveness:</strong> Quick Base primarily delivers data-oriented applications, which some customers deploy at an enterprise level, encouraged by certifications for the U.S. Health Insurance Portability and Accountability Act (HIPAA) and Service Organization Control (SOC) 2, for example. The Quick Base Exchange provides hundreds of applications to accelerate application development, while for professional developers there is a site dedicated to API usage.</p></li>
<li>
<p><strong>Market understanding:</strong> Quick Base has a large feature set for citizen developers, including Kanban models for project use cases and multiple data reporting styles. Business logic is simplified through triggers or actions, but can be scripted for more complex use cases. Quick Base scored above the average in the reference customer survey for enabling no-code and citizen development.</p></li>
<li>
<p><strong>Customer experience:</strong> Reference customers gave Quick Base higher-than-average scores for value for money and business automation.</p></li></ul>
<p><a name="dv_cautions_13"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Corporate ownership:</strong> Quick Base has undergone two changes of corporate ownership in the past four years, and is now owned by Vista Equity Partners (which also owns TIBCO Software, another LCAP vendor). This may result in another change of ownership, judging by typical private-equity patterns.</p></li>
<li>
<p><strong>Marketing execution:</strong> Although it has built up a large base of SMB users over many years, Quick Base’s customer numbers have not grown as much as those of other LCAP vendors. It faces increasing competition from other providers of low-cost data-oriented cloud services.</p></li>
<li>
<p><strong>Product strategy:</strong> Quick Base targets internal B2E applications involving data recording and reporting, and the lack of visual process modeling makes more complex applications harder to build and maintain. Offline mobile support and visual process modeling are roadmap items. Quick Base is specializing in meeting the needs of the citizen developer subset of the LCAP market.</p></li>
<li>
<p><strong>Geographic strategy:</strong> Quick Base has customers beyond North America, but has yet to expand its data centers outside the U.S. or to offer technical support outside U.S. hours. This is likely to deter non-U.S. customers with data location concerns, although, for the EU, Quick Base does support General Data Protection Regulation (GDPR) data encryption controls and plans 24/7 customer support in future.</p></li></ul>
<p><a name="dv_salesforce"></a></p>
<h4>Salesforce</h4>
<p>Salesforce is a Leader. It is better known for its CRM application services, but in the LCAP market its Lightning Platform focuses on customer-related applications and extensions to SaaS, supported by over 5,000 third-party applications on the Salesforce AppExchange and the Trailhead education service. It also interfaces with high-control services through its Heroku offering. Salesforce operates largely on its own cloud data centers, but recently began to expand onto AWS infrastructure. Gartner reviewed the Winter ‘19 version of its LCAP.</p>
<p><a name="dv_strengths_14"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Overall viability:</strong> Salesforce can claim persistent LCAP revenue growth, widespread name recognition, aggressive innovation and acquisition activity, intimate compatibility of its LCAP with its market-leading CRM SaaS, and ecosystem partnerships with thousands of third parties whose offerings are hosted in AppExchange. It generates more LCAP revenue than any other provider.</p></li>
<li>
<p><strong>Innovation:</strong> Salesforce continues to innovate in the following areas: AI libraries for discovery, prediction and voice services (Einstein); integration with DevOps (Salesforce DX); and event-driven design (including IoT Explorer and platform events). The recent announcement of a future Salesforce Blockchain suggests that Salesforce will be the first major vendor with a low-code platform for blockchain-enabled application design.</p></li>
<li>
<p><strong>Marketing execution:</strong> Salesforce continuously invests in deepening its relationships with customers and partners. It supports ISVs through monetized AppExchange programs for partners, startups and incubators. Salesforce’s strategic investment in training and education (Trailhead) facilitates a growing community of developers and encourages further adoption.</p></li>
<li>
<p><strong>Market responsiveness:</strong> Salesforce’s reference customers use the platform for enterprise-class applications and gave high scores for the platform’s high availability and the quality of its peer community. Additionally, they expressed higher-than-average satisfaction with Salesforce’s vision and innovation.</p></li></ul>
<p><a name="dv_cautions_14"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Product strategy:</strong> The architecture of Salesforce’s Force.com platform core has sustained continuous growth for the past 20 years, and is evolving from a monolithic architecture. This makes integration with the newer and acquired parts of Salesforce’s portfolio more difficult and complicates some types of innovation. Developers have to use both Lightning no-code and Salesforce Apex language features to deliver complex functionality.</p></li>
<li>
<p><strong>Market understanding:</strong> Salesforce Lightning remains resolutely cloud-only, which threatens to undermine the completeness of Salesforce’s enterprise vision in some strategic areas, such as hybrid deployments and IoT edge computing.</p></li>
<li>
<p><strong>Business model:</strong> Salesforce’s recent business model has been to grow by making major acquisitions, but this can create challenges. Despite acquiring MuleSoft, an integration leader, in 2018, the integration features of the Lightning Platform remain limited, and Salesforce’s reference customers expressed dissatisfaction with its support for integration.</p></li>
<li>
<p><strong>Sales execution:</strong> Reference customers for Salesforce expressed below-average satisfaction with its costs. Also, their scores for Salesforce’s customer service and support were not as high as those received by other vendors in this market.</p></li></ul>
<p><a name="dv_servicenow"></a></p>
<h4>ServiceNow</h4>
<p>ServiceNow is a Challenger. It is better known as an IT service management (ITSM) SaaS provider, and its SaaS is built on its low-code LCAP called the Now Platform. It is used for low-code workflow automation relating to ITSM and other domains, thanks to its support for portal, web and mobile user experiences. Gartner reviewed the ServiceNow Madrid release.</p>
<p><a name="dv_strengths_15"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Overall viability: </strong>ServiceNow’s core business of providing SaaS for IT users provides a ready IT audience for centralized application development using the Now Platform. Developers can exploit all its SaaS-developed capabilities, such as support for portals and chatbots, for new applications across the business. As a result, the Now Platform’s customer growth is strong.</p></li>
<li>
<p><strong>Innovation:</strong> ServiceNow’s development environment includes natural language-assisted development and new mobile capabilities for 2019. Its integration features were already considered a strength.</p></li>
<li>
<p><strong>Product strategy:</strong> ServiceNow successfully offers its LCAP to its core IT audience for various application development tasks. It scored higher than the average for enterprise-worthiness in the reference customer survey.</p></li>
<li>
<p><strong>Market responsiveness:</strong> ServiceNow has responded to the demand from its customer base, and reference customers report they are deploying the Now Platform for large-scale deployments. ServiceNow was selected by its reference customers principally for its strategic relationships with clients and its performance.</p></li></ul>
<p><a name="dv_cautions_15"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Sales strategy:</strong> Business unit development usually drives growth in vendors’ LCAP revenue. ServiceNow, however, remains popular mostly with central IT teams. Although it claims lines of business or departmental application development teams as users, it had fewer reference customers reporting line-of-business or departmental usage than did other vendors in this Magic Quadrant.</p></li>
<li>
<p><strong>Product:</strong> ServiceNow’s popularity with IT users has led to less specific support for citizen development personas. This is an area that is partly addressed by features planned in the 2019 New York release; however, reference customers for ServiceNow claimed that development was 3GL-based, and a higher-than-average number described their developers as “specialist developers.” They also gave lower-than-average scores for ServiceNow’s application development capabilities and for their usage of its app store ecosystem, although ServiceNow reports steady growth in the latter.</p></li>
<li>
<p><strong>Market approach:</strong> ServiceNow’s interpretation of how best to deliver low-code workflow applications differs from that underlying traditional workflow tools, such as BPM systems. Prospective customers should review both approaches to identify which suits their use case.</p></li>
<li>
<p><strong>Sales execution:</strong> Reference customers for ServiceNow and users of Gartner’s client inquiry service indicate that ServiceNow’s pricing and contract negotiations are more complex than the average. However, ServiceNow’s pricing models have recently changed, which should improve the sales experience in 2019.</p></li></ul>
<p><a name="dv_trackvia"></a></p>
<h4>TrackVia</h4>
<p>TrackVia is a Niche Player. Its LCAP of the same name focuses on non-IT application developers that require low entry costs for digitizing business processes and procedures. Its proposition relates to no-code business process automation and easy definition of mobile and web applications.</p>
<p><a name="dv_strengths_16"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Product: </strong>TrackVia provides a low-cost, extensible, process-oriented platform with features like process modeling. It targets relatively small teams and SMBs that need to build departmental applications.</p></li>
<li>
<p><strong>Innovation:</strong> Applications developed with TrackVia’s LCAP can include some sophisticated features, such as Gantt charts. Its LCAP also provides extensibility using the Apache Groovy language. The platform offers some of the ease of use of a citizen development platform, but can also tackle complex process applications.</p></li>
<li>
<p><strong>Industry strategy:</strong> TrackVia supports multiple industry domains (it is HIPAA-compliant for healthcare applications, for example). It provides consulting services with experience in many types of workflows within those domains.</p></li>
<li>
<p><strong>Customer experience:</strong> Surveyed reference customers for TrackVia indicated above-average satisfaction with its LCAP’s capabilities and value for money.</p></li></ul>
<p><a name="dv_cautions_16"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Overall viability:</strong> TrackVia is one of the smaller vendors in this Magic Quadrant. Its recent sales performance lags behind its size and technical capabilities, which may increase the risk of it being acquired.</p></li>
<li>
<p><strong>Product strategy:</strong> Some aspects of TrackVia’s functionality are more limited than those of other LCAP vendors, such as when it comes to the integration of complex services. TrackVia has recently added an integration platform to address this particular limitation. TrackVia’s standard form-oriented user experience reduces its appeal to organizations with B2C use cases.</p></li>
<li>
<p><strong>Market understanding:</strong> Sophisticated enterprise IT users will find that TrackVia lacks any advanced capabilities for headless applications and types of event processing. This will restrict its usage for many digital business initiatives.</p></li>
<li>
<p><strong>Geographic strategy:</strong> Although TrackVia has customers outside North America, its AWS data centers are all in the U.S., which could be a problem for some organizations with data location requirements. In addition, there is a lack of support for text string internationalization.</p></li></ul>
<p><a name="dv_zoho"></a></p>
<h4>Zoho</h4>
<p>Zoho is a Challenger. Primarily a SaaS provider focused on SMBs, it provides an LCAP called Zoho Creator for building applications via both citizen and professional development. Application developers can also draw on its CRM and other applications. Zoho has a global presence and offers built-in integration PaaS (iPaaS) and access to SaaS capabilities such as analytics and chatbots. Gartner evaluated Zoho Creator 5.</p>
<p><a name="dv_strengths_17"></a></p>
<h5>Strengths</h5>
<ul>
<li>
<p><strong>Overall viability:</strong> Zoho offers the enterprise scale of a global SaaS-plus-PaaS provider, is internally funded and is mostly used by SMBs. It continues to record strong growth, driven by initiatives such as its Enterprise Business Solutions team’s provision of professional management assistance and partner resellers (of which there are many). Two different pricing models with different metrics are supported for SMBs and large enterprises.</p></li>
<li>
<p><strong>Innovation:</strong> Zoho Creator has strengths associated with Zoho’s nature as a SaaS provider: a predefined data schema, PWAs, conversational and headless voice applications, a dedicated cloud offering and Kanban reports. Zoho expects to offer Zoho Creator on-premises in 2019, albeit without modern deployment practices, such as the use of containers.</p></li>
<li>
<p><strong>Market understanding:</strong> Citizen development is supported, with features like code-free dashboards displaying data from composite data sources. Zoho also offers low-code support for Zia, its AI-driven natural language application.</p></li>
<li>
<p><strong>Customer experience: </strong>Zoho’s reference customers gave it above-average scores for its features and functionality, as well as its ease of deployment.</p></li></ul>
<p><a name="dv_cautions_17"></a></p>
<h5>Cautions</h5>
<ul>
<li>
<p><strong>Business model:</strong> Zoho has only a small professional services arm to assist with application delivery, and is still in the early stages of attracting large solution provider partners to help customers with more complex solutions. However, it does have a large ecosystem of smaller, specialist partners.</p></li>
<li>
<p><strong>Product:</strong> Reference customers for Zoho expressed a general desire for improvements in the area of quality, reliability and availability. They gave Zoho a lower-than-average score for the availability and usage of optional accelerators, such as prebuilt components and processes from the Zoho ecosystem.</p></li>
<li>
<p><strong>Product strategy:</strong> Zoho Creator uses Zoho’s Deluge script language for application business logic, but does not support external DevOps. Additionally, reference customers scored Zoho lower than the average for no-code development and end-user experience, and expressed a general desire for better productivity for developers.</p></li>
<li>
<p><strong>Operations:</strong> Zoho reference customers gave lower-than-average scores for its service and support. Technical support during working hours is included, but a premium subscription is required for 24/7 support.</p></li></ul>
Get reminded of important tasks depending on location or journeys. This is related to SendToCalendar project
[[Aika]]'s father, a renowned specialist engineer, known for his generosity in his community. He maintains good ties with everyone who attends the local church. But not many people visit him at his home because of his unpleasant wife.
It is sometimes wondered by some in the community why he continues to put up with such an unloving woman. Only he knows why.
Of all his five children, [[Aika]] is his favorite. Her eager bookishness and unquenchable curiosity makes her formidable even for him. But her inability to get along with her mother often gets in the way of him enjoying her company. Their many volatile interactions fill him with dread.
#### Build your own `Git`
* [**Haskell**: _Reimplementing “git clone” in Haskell from the bottom up_](http://stefan.saasen.me/articles/git-clone-in-haskell-from-the-bottom-up/)
* [**JavaScript**: _Gitlet_](http://gitlet.maryrosecook.com/docs/gitlet.html)
* [**JavaScript**: _Build GIT - Learn GIT_](https://kushagragour.in/blog/2014/01/build-git-learn-git/)
* [**Python**: _Just enough of a Git client to create a repo, commit, and push itself to GitHub_](https://benhoyt.com/writings/pygit/)
* [**Ruby**: _Rebuilding Git in Ruby_](https://robots.thoughtbot.com/rebuilding-git-in-ruby)
To add, commit and push to remote.
```bash
git init
git add -A
git commit -m "changes"
git remote add origin https://github.com/url
git push -u origin master
```
To create a github page:
```bash
git checkout -b gh-pages
git push origin gh-pages
```
To clone a remote branch:
```bash
#option one
git clone -b <branchname> <remote-repo-url>
#option two (if you don't want the other branches)
git clone -b <branchname> --single-branch <remote-repo-url>
```
To delete a remote branch
```bash
git push origin -d gh-pages
```
Apply patches from another branch
```bash
git checkout <another branch> --patch <url of working tree file>
```
[[Git tagging releases and commits]]
<div><a class="domain reader-domain" href="https://git-scm.com/book/en/v2/Git-Basics-Tagging">git-scm.com</a>
<div> </div>
<h1>Git - Tagging</h1>
<div> </div>
<div>
<div>8-10 minutes</div></div></div>
<div>
<hr />
<div>
<div>
<div>
<div>
<p>Like most VCSs, Git has the ability to tag specific points in a repository’s history as being important. Typically, people use this functionality to mark release points (<code>v1.0</code>, <code>v2.0</code> and so on). In this section, you’ll learn how to list existing tags, how to create and delete tags, and what the different types of tags are.</p>
<div>
<h3>Listing Your Tags</h3>
<p>Listing the existing tags in Git is straightforward. Just type <code>git tag</code> (with optional <code>-l</code> or <code>--list</code>):</p>
<p>This command lists the tags in alphabetical order; the order in which they are displayed has no real importance.</p>
<p>You can also search for tags that match a particular pattern. The Git source repo, for instance, contains more than 500 tags. If you’re interested only in looking at the 1.8.5 series, you can run this:</p>
<div>
<pre>$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5</pre></div>
<div>
<table>
<tbody>
<tr>
<td>
<p>Note</p></td>
<td>
<p>Listing tag wildcards requires <code>-l</code> or <code>--list</code> option</p>
<p>If you want just the entire list of tags, running the command <code>git tag</code> implicitly assumes you want a listing and provides one; the use of <code>-l</code> or <code>--list</code> in this case is optional.</p>
<p>If, however, you’re supplying a wildcard pattern to match tag names, the use of <code>-l</code> or <code>--list</code> is mandatory.</p></td>
</tr>
</tbody></table></div></div>
<div>
<h3>Creating Tags</h3>
<p>Git supports two types of tags: <em>lightweight</em> and <em>annotated</em>.</p>
<p>A lightweight tag is very much like a branch that doesn’t change — it’s just a pointer to a specific commit.</p>
<p>Annotated tags, however, are stored as full objects in the Git database. They’re checksummed; contain the tagger name, email, and date; have a tagging message; and can be signed and verified with GNU Privacy Guard (GPG). It’s generally recommended that you create annotated tags so you can have all this information; but if you want a temporary tag or for some reason don’t want to keep the other information, lightweight tags are available too.</p></div>
<div>
<h3>Annotated Tags</h3>
<p>Creating an annotated tag in Git is simple. The easiest way is to specify <code>-a</code> when you run the <code>tag</code> command:</p>
<div>
<pre>$ git tag -a v1.4 -m "my version 1.4"
$ git tag
v0.1
v1.3
v1.4</pre></div>
<p>The <code>-m</code> specifies a tagging message, which is stored with the tag. If you don’t specify a message for an annotated tag, Git launches your editor so you can type it in.</p>
<p>You can see the tag data along with the commit that was tagged by using the <code>git show</code> command:</p>
<div>
<pre>$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date: Sat May 3 20:19:12 2014 -0700
my version 1.4
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number</pre></div>
<p>That shows the tagger information, the date the commit was tagged, and the annotation message before showing the commit information.</p></div>
<div>
<h3>Lightweight Tags</h3>
<p>Another way to tag commits is with a lightweight tag. This is basically the commit checksum stored in a file — no other information is kept. To create a lightweight tag, don’t supply any of the <code>-a</code>, <code>-s</code>, or <code>-m</code> options, just provide a tag name:</p>
<div>
<pre>$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5</pre></div>
<p>This time, if you run <code>git show</code> on the tag, you don’t see the extra tag information. The command just shows the commit:</p>
<div>
<pre>$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
Change version number</pre></div></div>
<div>
<h3>Tagging Later</h3>
<p>You can also tag commits after you’ve moved past them. Suppose your commit history looks like this:</p>
<div>
<pre>$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 Create write support
0d52aaab4479697da7686c15f77a3d64d9165190 One more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc Add commit function
4682c3261057305bdd616e23b64b0857d832627b Add todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a Create write support
9fceb02d0ae598e95dc970b74767f19372d61af8 Update rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc Commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a Update readme</pre></div>
<p>Now, suppose you forgot to tag the project at v1.2, which was at the “Update rakefile” commit. You can add it after the fact. To tag that commit, you specify the commit checksum (or part of it) at the end of the command:</p>
<div>
<pre>$ git tag -a v1.2 9fceb02</pre></div>
<p>You can see that you’ve tagged the commit:</p>
<div>
<pre>$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5
$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gee-mail.com>
Date: Mon Feb 9 15:32:16 2009 -0800
version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <mchacon@gee-mail.com>
Date: Sun Apr 27 20:43:35 2008 -0700
Update rakefile
...</pre></div></div>
<div>
<h3>Sharing Tags</h3>
<p>By default, the <code>git push</code> command doesn’t transfer tags to remote servers. You will have to explicitly push tags to a shared server after you have created them. This process is just like sharing remote branches — you can run <code>git push origin <tagname></code>.</p>
<div>
<pre>$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
* [new tag] v1.5 -> v1.5</pre></div>
<p>If you have a lot of tags that you want to push up at once, you can also use the <code>--tags</code> option to the <code>git push</code> command. This will transfer all of your tags to the remote server that are not already there.</p>
<div>
<pre>$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
* [new tag] v1.4 -> v1.4
* [new tag] v1.4-lw -> v1.4-lw</pre></div>
<p>Now, when someone else clones or pulls from your repository, they will get all your tags as well.</p>
<div>
<table>
<tbody>
<tr>
<td>
<p>Note</p></td>
<td>
<p><code>git push</code>pushes both types of tags</p>
<p><code>git push <remote> --tags</code>will push both lightweight and annotated tags. There is currently no option to push only lightweight tags, but if you use <code>git push <remote> --follow-tags</code> only annotated tags will be pushed to the remote.</p></td>
</tr>
</tbody></table></div></div>
<div>
<h3>Deleting Tags</h3>
<p>To delete a tag on your local repository, you can use <code>git tag -d <tagname></code>. For example, we could remove our lightweight tag above as follows:</p>
<div>
<pre>$ git tag -d v1.4-lw
Deleted tag 'v1.4-lw' (was e7d5add)</pre></div>
<p>Note that this does not remove the tag from any remote servers. There are two common variations for deleting a tag from a remote server.</p>
<p>The first variation is <code>git push <remote> :refs/tags/<tagname></code>:</p>
<div>
<pre>$ git push origin :refs/tags/v1.4-lw
To /git@github.com:schacon/simplegit.git
- [deleted] v1.4-lw</pre></div>
<p>The way to interpret the above is to read it as the null value before the colon is being pushed to the remote tag name, effectively deleting it.</p>
<p>The second (and more intuitive) way to delete a remote tag is with:</p>
<div>
<pre>$ git push origin --delete <tagname></pre></div></div>
<div>
<h3>Checking out Tags</h3>
<p>If you want to view the versions of files a tag is pointing to, you can do a <code>git checkout</code> of that tag, although this puts your repository in “detached HEAD” state, which has some ill side effects:</p>
<div>
<pre>$ git checkout v2.0.0
Note: switching to 'v2.0.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final
$ git checkout v2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... Add atlas.json and cover image</pre></div>
<p>In “detached HEAD” state, if you make changes and then create a commit, the tag will stay the same, but your new commit won’t belong to any branch and will be unreachable, except by the exact commit hash. Thus, if you need to make changes — say you’re fixing a bug on an older version, for instance — you will generally want to create a branch:</p>
<div>
<pre>$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'</pre></div>
<p>If you do this and make a commit, your <code>version2</code> branch will be slightly different than your <code>v2.0.0</code> tag since it will move forward with your new changes, so do be careful.</p></div></div></div></div></div></div>
<p><a href="https://nvie.com/posts/a-successful-git-branching-model/" rel="bookmark">A successful Git branching model</a></p>
<blockquote>
<h3>Note of reflection (March 5, 2020)</h3>
<p>This model was conceived in 2010, now more than 10 years ago, and not very long after Git itself came into being. In those 10 years, git-flow (the branching model laid out in this article) has become hugely popular in many a software team to the point where people have started treating it like a standard of sorts — but unfortunately also as a dogma or panacea.</p>
<p>During those 10 years, Git itself has taken the world by a storm, and the most popular type of software that is being developed with Git is shifting more towards web apps — at least in my filter bubble. Web apps are typically continuously delivered, not rolled back, and you don't have to support multiple versions of the software running in the wild.</p>
<p>This is not the class of software that I had in mind when I wrote the blog post 10 years ago. If your team is doing continuous delivery of software, I would suggest to adopt a much simpler workflow (like <a href="https://guides.github.com/introduction/flow/">GitHub flow</a>) instead of trying to shoehorn git-flow into your team.</p>
<p>If, however, you are building software that is explicitly versioned, or if you need to support multiple versions of your software in the wild, then git-flow may still be as good of a fit to your team as it has been to people in the last 10 years. In that case, please read on.</p>
<p>To conclude, always remember that panaceas don't exist. Consider your own context. Don't be hating. Decide for yourself.</p></blockquote>
<p>In this post I present the development model that I’ve introduced for some of my projects (both at work and private) about a year ago, and which has turned out to be very successful. I’ve been meaning to write about it for a while now, but I’ve never really found the time to do so thoroughly, until now. I won’t talk about any of the projects’ details, merely about the branching strategy and release management.</p>
<p><img alt="" src="https://nvie.com/img/git-model@2x.png" /></p>
<h2>Why git? <a href="https://nvie.com/posts/a-successful-git-branching-model/#why-git" rel="bookmark">¶</a></h2>
<p>For a thorough discussion on the pros and cons of Git compared to centralized source code control systems, see the <a href="http://git.or.cz/gitwiki/GitSvnComparsion">web</a>. There are plenty of flame wars going on there. As a developer, I prefer Git above all other tools around today. Git really changed the way developers think of merging and branching. From the classic CVS/Subversion world I came from, merging/branching has always been considered a bit scary (“beware of merge conflicts, they bite you!”) and something you only do every once in a while.</p>
<p>But with Git, these actions are extremely cheap and simple, and they are considered one of the core parts of your <em>daily</em> workflow, really. For example, in CVS/Subversion <a href="http://svnbook.red-bean.com/">books</a>, branching and merging is first discussed in the later chapters (for advanced users), while in <a href="http://book.git-scm.com/">every</a> <a href="http://pragprog.com/titles/tsgit/pragmatic-version-control-using-git">Git</a> <a href="http://github.com/progit/progit">book</a>, it’s already covered in chapter 3 (basics).</p>
<p>As a consequence of its simplicity and repetitive nature, branching and merging are no longer something to be afraid of. Version control tools are supposed to assist in branching/merging more than anything else.</p>
<p>Enough about the tools, let’s head onto the development model. The model that I’m going to present here is essentially no more than a set of procedures that every team member has to follow in order to come to a managed software development process.</p>
<h2>Decentralized but centralized <a href="https://nvie.com/posts/a-successful-git-branching-model/#decentralized-but-centralized" rel="bookmark">¶</a></h2>
<p>The repository setup that we use and that works well with this branching model, is that with a central “truth” repo. Note that this repo is only <em>considered</em> to be the central one (since Git is a DVCS, there is no such thing as a central repo at a technical level). We will refer to this repo as <code>origin</code>, since this name is familiar to all Git users.</p>
<p><img alt="" src="https://nvie.com/img/centr-decentr@2x.png" /></p>
<p>Each developer pulls and pushes to origin. But besides the centralized push-pull relationships, each developer may also pull changes from other peers to form sub teams. For example, this might be useful to work together with two or more developers on a big new feature, before pushing the work in progress to <code>origin</code> prematurely. In the figure above, there are subteams of Alice and Bob, Alice and David, and Clair and David.</p>
<p>Technically, this means nothing more than that Alice has defined a Git remote, named <code>bob</code>, pointing to Bob’s repository, and vice versa.</p>
<h2>The main branches <a href="https://nvie.com/posts/a-successful-git-branching-model/#the-main-branches" rel="bookmark">¶</a></h2>
<p><img alt="" src="https://nvie.com/img/main-branches@2x.png" /></p>
<p>At the core, the development model is greatly inspired by existing models out there. The central repo holds two main branches with an infinite lifetime:</p>
<ul>
<li><code>master</code></li>
<li><code>develop</code></li></ul>
<p>The <code>master</code> branch at <code>origin</code> should be familiar to every Git user. Parallel to the <code>master</code> branch, another branch exists called <code>develop</code>.</p>
<p>We consider <code>origin/master</code> to be the main branch where the source code of <code>HEAD</code> always reflects a <em>production-ready</em> state.</p>
<p>We consider <code>origin/develop</code> to be the main branch where the source code of <code>HEAD</code> always reflects a state with the latest delivered development changes for the next release. Some would call this the “integration branch”. This is where any automatic nightly builds are built from.</p>
<p>When the source code in the <code>develop</code> branch reaches a stable point and is ready to be released, all of the changes should be merged back into <code>master</code> somehow and then tagged with a release number. How this is done in detail will be discussed further on.</p>
<p>Therefore, each time when changes are merged back into <code>master</code>, this is a new production release <em>by definition</em>. We tend to be very strict at this, so that theoretically, we could use a Git hook script to automatically build and roll-out our software to our production servers everytime there was a commit on <code>master</code>.</p>
<h2>Supporting branches <a href="https://nvie.com/posts/a-successful-git-branching-model/#supporting-branches" rel="bookmark">¶</a></h2>
<p>Next to the main branches <code>master</code> and <code>develop</code>, our development model uses a variety of supporting branches to aid parallel development between team members, ease tracking of features, prepare for production releases and to assist in quickly fixing live production problems. Unlike the main branches, these branches always have a limited life time, since they will be removed eventually.</p>
<p>The different types of branches we may use are:</p>
<ul>
<li>Feature branches</li>
<li>Release branches</li>
<li>Hotfix branches</li></ul>
<p>Each of these branches have a specific purpose and are bound to strict rules as to which branches may be their originating branch and which branches must be their merge targets. We will walk through them in a minute.</p>
<p>By no means are these branches “special” from a technical perspective. The branch types are categorized by how we <em>use</em> them. They are of course plain old Git branches.</p>
<h3>Feature branches <a href="https://nvie.com/posts/a-successful-git-branching-model/#feature-branches" rel="bookmark">¶</a></h3>
<p><img alt="" src="https://nvie.com/img/fb@2x.png" /></p>
<p>May branch off from:</p>
<p><code>develop</code></p>
<p>Must merge back into:</p>
<p><code>develop</code></p>
<p>Branch naming convention:</p>
<p>anything except <code>master</code>, <code>develop</code>, <code>release-*</code>, or <code>hotfix-*</code></p>
<p>Feature branches (or sometimes called topic branches) are used to develop new features for the upcoming or a distant future release. When starting development of a feature, the target release in which this feature will be incorporated may well be unknown at that point. The essence of a feature branch is that it exists as long as the feature is in development, but will eventually be merged back into <code>develop</code> (to definitely add the new feature to the upcoming release) or discarded (in case of a disappointing experiment).</p>
<p>Feature branches typically exist in developer repos only, not in <code>origin</code>.</p>
<h4>Creating a feature branch <a href="https://nvie.com/posts/a-successful-git-branching-model/#creating-a-feature-branch" rel="bookmark">¶</a></h4>
<p>When starting work on a new feature, branch off from the <code>develop</code> branch.</p>
<pre>$ git checkout -b myfeature develop
Switched to a new branch "myfeature"
</pre>
<h4>Incorporating a finished feature on develop <a href="https://nvie.com/posts/a-successful-git-branching-model/#incorporating-a-finished-feature-on-develop" rel="bookmark">¶</a></h4>
<p>Finished features may be merged into the <code>develop</code> branch to definitely add them to the upcoming release:</p>
<pre>$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).
$ git push origin develop
</pre>
<p>The <code>--no-ff</code> flag causes the merge to always create a new commit object, even if the merge could be performed with a fast-forward. This avoids losing information about the historical existence of a feature branch and groups together all commits that together added the feature. Compare:</p>
<p><img alt="" src="https://nvie.com/img/merge-without-ff@2x.png" /></p>
<p>In the latter case, it is impossible to see from the Git history which of the commit objects together have implemented a feature—you would have to manually read all the log messages. Reverting a whole feature (i.e. a group of commits), is a true headache in the latter situation, whereas it is easily done if the <code>--no-ff</code> flag was used.</p>
<p>Yes, it will create a few more (empty) commit objects, but the gain is much bigger than the cost.</p>
<h3>Release branches <a href="https://nvie.com/posts/a-successful-git-branching-model/#release-branches" rel="bookmark">¶</a></h3>
<p>May branch off from:</p>
<p><code>develop</code></p>
<p>Must merge back into:</p>
<p><code>develop</code> and <code>master</code></p>
<p>Branch naming convention:</p>
<p><code>release-*</code></p>
<p>Release branches support preparation of a new production release. They allow for last-minute dotting of i’s and crossing t’s. Furthermore, they allow for minor bug fixes and preparing meta-data for a release (version number, build dates, etc.). By doing all of this work on a release branch, the <code>develop</code> branch is cleared to receive features for the next big release.</p>
<p>The key moment to branch off a new release branch from <code>develop</code> is when develop (almost) reflects the desired state of the new release. At least all features that are targeted for the release-to-be-built must be merged in to <code>develop</code> at this point in time. All features targeted at future releases may not—they must wait until after the release branch is branched off.</p>
<p>It is exactly at the start of a release branch that the upcoming release gets assigned a version number—not any earlier. Up until that moment, the <code>develop</code> branch reflected changes for the “next release”, but it is unclear whether that “next release” will eventually become 0.3 or 1.0, until the release branch is started. That decision is made on the start of the release branch and is carried out by the project’s rules on version number bumping.</p>
<h4>Creating a release branch <a href="https://nvie.com/posts/a-successful-git-branching-model/#creating-a-release-branch" rel="bookmark">¶</a></h4>
<p>Release branches are created from the <code>develop</code> branch. For example, say version 1.1.5 is the current production release and we have a big release coming up. The state of <code>develop</code> is ready for the “next release” and we have decided that this will become version 1.2 (rather than 1.1.6 or 2.0). So we branch off and give the release branch a name reflecting the new version number:</p>
<pre>$ git checkout -b release-1.2 develop
Switched to a new branch "release-1.2"
$ ./bump-version.sh 1.2
Files modified successfully, version bumped to 1.2.
$ git commit -a -m "Bumped version number to 1.2"
[release-1.2 74d9424] Bumped version number to 1.2
1 files changed, 1 insertions(+), 1 deletions(-)
</pre>
<p>After creating a new branch and switching to it, we bump the version number. Here, <code>bump-version.sh</code> is a fictional shell script that changes some files in the working copy to reflect the new version. (This can of course be a manual change—the point being that <em>some</em> files change.) Then, the bumped version number is committed.</p>
<p>This new branch may exist there for a while, until the release may be rolled out definitely. During that time, bug fixes may be applied in this branch (rather than on the <code>develop</code> branch). Adding large new features here is strictly prohibited. They must be merged into <code>develop</code>, and therefore, wait for the next big release.</p>
<h4>Finishing a release branch <a href="https://nvie.com/posts/a-successful-git-branching-model/#finishing-a-release-branch" rel="bookmark">¶</a></h4>
<p>When the state of the release branch is ready to become a real release, some actions need to be carried out. First, the release branch is merged into <code>master</code> (since every commit on <code>master</code> is a new release <em>by definition</em>, remember). Next, that commit on <code>master</code> must be tagged for easy future reference to this historical version. Finally, the changes made on the release branch need to be merged back into <code>develop</code>, so that future releases also contain these bug fixes.</p>
<p>The first two steps in Git:</p>
<pre>$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2
</pre>
<p>The release is now done, and tagged for future reference.</p>
<blockquote>
<p><strong>Edit:</strong> You might as well want to use the <code>-s</code> or <code>-u <key></code> flags to sign your tag cryptographically.</p></blockquote>
<p>To keep the changes made in the release branch, we need to merge those back into <code>develop</code>, though. In Git:</p>
<pre>$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
</pre>
<p>This step may well lead to a merge conflict (probably even, since we have changed the version number). If so, fix it and commit.</p>
<p>Now we are really done and the release branch may be removed, since we don’t need it anymore:</p>
<pre>$ git branch -d release-1.2
Deleted branch release-1.2 (was ff452fe).
</pre>
<h3>Hotfix branches <a href="https://nvie.com/posts/a-successful-git-branching-model/#hotfix-branches" rel="bookmark">¶</a></h3>
<p><img alt="" src="https://nvie.com/img/hotfix-branches@2x.png" /></p>
<p>May branch off from:</p>
<p><code>master</code></p>
<p>Must merge back into:</p>
<p><code>develop</code> and <code>master</code></p>
<p>Branch naming convention:</p>
<p><code>hotfix-*</code></p>
<p>Hotfix branches are very much like release branches in that they are also meant to prepare for a new production release, albeit unplanned. They arise from the necessity to act immediately upon an undesired state of a live production version. When a critical bug in a production version must be resolved immediately, a hotfix branch may be branched off from the corresponding tag on the master branch that marks the production version.</p>
<p>The essence is that work of team members (on the <code>develop</code> branch) can continue, while another person is preparing a quick production fix.</p>
<h4>Creating the hotfix branch <a href="https://nvie.com/posts/a-successful-git-branching-model/#creating-the-hotfix-branch" rel="bookmark">¶</a></h4>
<p>Hotfix branches are created from the <code>master</code> branch. For example, say version 1.2 is the current production release running live and causing troubles due to a severe bug. But changes on <code>develop</code> are yet unstable. We may then branch off a hotfix branch and start fixing the problem:</p>
<pre>$ git checkout -b hotfix-1.2.1 master
Switched to a new branch "hotfix-1.2.1"
$ ./bump-version.sh 1.2.1
Files modified successfully, version bumped to 1.2.1.
$ git commit -a -m "Bumped version number to 1.2.1"
[hotfix-1.2.1 41e61bb] Bumped version number to 1.2.1
1 files changed, 1 insertions(+), 1 deletions(-)
</pre>
<p>Don’t forget to bump the version number after branching off!</p>
<p>Then, fix the bug and commit the fix in one or more separate commits.</p>
<pre>$ git commit -m "Fixed severe production problem"
[hotfix-1.2.1 abbe5d6] Fixed severe production problem
5 files changed, 32 insertions(+), 17 deletions(-)
</pre>
<h4>Finishing a hotfix branch <a href="https://nvie.com/posts/a-successful-git-branching-model/#finishing-a-hotfix-branch" rel="bookmark">¶</a></h4>
<p>When finished, the bugfix needs to be merged back into <code>master</code>, but also needs to be merged back into <code>develop</code>, in order to safeguard that the bugfix is included in the next release as well. This is completely similar to how release branches are finished.</p>
<p>First, update <code>master</code> and tag the release.</p>
<pre>$ git checkout master
Switched to branch 'master'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2.1
</pre>
<blockquote>
<p><strong>Edit:</strong> You might as well want to use the <code>-s</code> or <code>-u <key></code> flags to sign your tag cryptographically.</p></blockquote>
<p>Next, include the bugfix in <code>develop</code>, too:</p>
<pre>$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff hotfix-1.2.1
Merge made by recursive.
(Summary of changes)
</pre>
<p>The one exception to the rule here is that, <strong>when a release branch currently exists, the hotfix changes need to be merged into that release branch, instead of <code>develop</code></strong>. Back-merging the bugfix into the release branch will eventually result in the bugfix being merged into <code>develop</code> too, when the release branch is finished. (If work in <code>develop</code> immediately requires this bugfix and cannot wait for the release branch to be finished, you may safely merge the bugfix into <code>develop</code> now already as well.)</p>
<p>Finally, remove the temporary branch:</p>
<pre>$ git branch -d hotfix-1.2.1
Deleted branch hotfix-1.2.1 (was abbe5d6).
</pre>
<h2>Summary <a href="https://nvie.com/posts/a-successful-git-branching-model/#summary" rel="bookmark">¶</a></h2>
<p>While there is nothing really shocking new to this branching model, the “big picture” figure that this post began with has turned out to be tremendously useful in our projects. It forms an elegant mental model that is easy to comprehend and allows team members to develop a shared understanding of the branching and releasing processes.</p>
<p>A high-quality PDF version of the figure is provided here. Go ahead and hang it on the wall for quick reference at any time.</p>
<p><strong>Update:</strong> And for anyone who requested it: here’s the <a href="http://github.com/downloads/nvie/gitflow/Git-branching-model-src.key.zip">gitflow-model.src.key</a> of the main diagram image (Apple Keynote).</p>
A crowdfunding platform that uses quadratic funding to fund public goods and projects.
Why quadratic? This algorithm allows the funding direction to be weighted by the number of funders with matching funding per user rather than a single lump sum amount given by one individual skewing in their free-riding direction.
''This is excellent for public goods.'' Funding is usually done via rounds. Very interesting!
There are challenges, including:
* [[Sybil attacks]] (being dealt with a Proof of Personhood passport) and collusions
* Fraudsters
<$tmap view="OnePlaybook Goal explorer" editor="advanced" width="100%" height="500px" ></$tmap>
Google: this is more straightforward. Old search engines used to charge per search session. This was a barrier and a negative influence on their revenue. It created a ceiling of their own creation. Google focused instead on creating the best possible search engine, which attracted more searches to power their advertisement business, in particular Adsense (which set fee for keywords depending on their search popularity). This scaled their value. The pricing of adsense was key:
<<<
...flexible per unit pricing that varied from one keyword to the next, also enabled businesses of all sizes and shapes to try their hand at search advertising with minimal cost and risk
<<<
__OAuth client ID__
1083906439340-1uhaauqcv0ckfpkh0c1df37pp7uik44c.apps.googleusercontent.com
__Important Links__
* [[Verifying applications|https://support.google.com/cloud/answer/7454865]]. This isn't necessary if:
** Apps in development: if your app is experimental or a test build, you don't need to go through verification unless you decide to launch it to the public.
** OAuth-based plugins: if you're setting up an OAuth-based plugin for a popular platform, such as SMTP for WordPress, you don't need to go through the verification process.
** Internal apps: if your app is an internal web app for users in the same G Suite domain and the app is associated with a Cloud Organization that all of your users belong to, you don't need to go through verification. For more information, see [[public and internal applications|https://support.google.com/cloud/answer/6158849#public-and-internal]].
* [[Implicit flow instructions and example|https://developers.google.com/identity/protocols/oauth2/javascript-implicit-flow]]. Google's JavaScript client library doesn't seem to support PKCE yet. That's only available for desktop and mobile apps.
* [[How to secure api keys with Netlify|https://www.freecodecamp.org/news/how-to-access-secret-api-keys-using-netlify-functions-in-a-react-app/]]. Note, while api keys aren't needed by Gapi during authentication, it is considered best practice to add them. However, I think I won't include them to make OnePlaybook platform-agnostic.
__Important docs__
* [[Google API JavaScript client repo|https://github.com/google/google-api-javascript-client]]
* [[Google API JavaScript client docs|https://github.com/google/google-api-javascript-client/blob/master/docs/start.md]]
* [[Google API JavaScript client reference|https://developers.google.com/identity/sign-in/web/reference]]
* [[Instructions on getting credentials for accessing GAPI via client-side JavaScript|https://developers.google.com/workspace/guides/create-credentials#client]]
<video loop autoplay width="100%" src="https://video.twimg.com/tweet_video/FLEnT3nagAA-kxa.mp4"></video>
Start here: https://www.howtographql.com/
Then try to work on making a [[product recommender tool using Product Hunt's API|https://api.producthunt.com/v2/docs]]
From an [[article on grey markets|https://bretwaters.medium.com/looking-for-a-startup-idea-check-the-grey-markets-65bd37a86ae9]] by startup ceo coach [[Bret Waters|https://bretwaters.medium.com]]:
<<<
Probably one of the most famous examples is digital music. In the early 2000’s, college kids were busy sharing “illegal” music downloads, and the record labels were busy suing college kids and forcing Napster into bankruptcy. Steve Jobs saw this as opportunity, created iTunes, and successfully got all the major record labels to agree to signing on for $1/download, turning an underground market into a billion dollar business. iTunes begat Pandora, which begat Spotify. And now here we are.
Grey markets flourish where consumer demand gets ahead of the law. Lots of people rented out bedrooms against local laws; Airbnb came along and turned it into a $4 billion business. Lots of private car companies flouted the oppressive taxi regulations; Uber came along and normalized it to the tune of $12 billion.
<<<
Whoever formalizes a grey market can potentially create a profitable business. Those building a market platform or a network-effect fueled business can stand to gain a lot from this.
Sometimes the community may need a new tool to achieve an objective quickly. However, most groups are limited by the very platform that supports them. Sometimes, even the platform may come to kill their group off for many reasons. Other times they lack the experience or privileges required to build something for their own consumption.
<h2>Freemium Marketing</h2>
<p><img alt="" src="https://druriley.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-01-at-4.30.41-PM.png" /></p>
<h4>1. Free Plan</h4>
<p>Free plans lower friction in user adoption. The freemium model is common in SaaS. These plans also act as lead magnets. Companies can continue to test offers on free users. (<a href="https://www.notion.so/pricing">Pricing</a>)</p>
<h2>Flywheel Marketing</h2>
<p><img alt="" src="https://druriley.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-01-at-5.09.52-PM.png" /></p>
<h4>2. Multiple Platforms</h4>
<p>It’s important for Notion to be available on multiple platforms as a collaboration tool. This allows users to work together from mobile and desktop environments. Each platform also pulls in a new type of user. Notion became a viable note-taking alternative for Android users when they released an Android app. (<a href="https://www.notion.so/product">Product</a>)</p>
<p><img alt="" src="https://druriley.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-01-at-4.44.13-PM.png" /></p>
<h4>3. Web Clipper</h4>
<p>The web clipper helped Notion reach feature parity with Evernote. Perhaps this was an common objection to switching over before the browser extension existed. (<a href="https://www.notion.so/web-clipper">Web Clipper</a>)</p>
<p><img alt="" src="https://druriley.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-01-at-4.34.37-PM.png" /></p>
<h4>4. Notion Blocks</h4>
<p>Blocks help differentiate Notion from other note-taking tools. Versatility increases as new block types are released. Notion pulls in new users with new needs each time they create a new block type. (<a href="https://www.notion.so/product">Product</a>)</p>
<h2>Incentive Marketing</h2>
<h4>5. Action Credits</h4>
<p>Notion offers credits for different user actions. This unique practice borders on gamification. (<a href="https://www.notion.so/Referrals-credit-7f39e3701b3f482ba313e60461fabee8">Credits</a>)</p>
<p>User quests include:</p>
<ul>
<li>Referrals</li>
<li>Migrating from Evernote</li>
<li>Logging in from a web browser</li>
<li>Using the web clipper for chrome</li>
<li>Using the web clipper for mobile</li></ul>
<h2>Affiliate Marketing</h2>
<p><img alt="This image has an empty alt attribute; its file name is https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fe5f3154e-ad92-4264-8d8c-eb1f18d60f0a%2Fnotion-credits-invite_friend.jpg" src="https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fe5f3154e-ad92-4264-8d8c-eb1f18d60f0a%2Fnotion-credits-invite_friend.jpg?table=block&id=0f7e8f4e-f071-4f46-b403-bc471cf1e000&width=4290&cache=v2" /></p>
<h4>6. Referrals</h4>
<p>Notion offers a dual-reward system for referrals. They reward users with service credits instead of money. (<a href="https://www.notion.so/Referrals-credit-7f39e3701b3f482ba313e60461fabee8">Referrals</a>)</p>
<h2>Content Marketing</h2>
<p><img alt="" src="https://druriley.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-01-at-5.34.40-PM-1-1024x360.png" style="height:249px; width:707px" /></p>
<h4>7. Template Gallery</h4>
<p>Templates make it easier for users to imagine themselves using Notion. Templates also allow users to experience benefits sooner by bootstrapping off of other projects.</p>
<p>The template gallery is also an example of user-generated content. Users can submit their templates to the gallery. (<a href="https://www.notion.so/Notion-Template-Gallery-181e961aeb5c4ee6915307c0dfd5156d">Template Gallery</a>)</p>
<p><img alt="" src="https://druriley.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-01-at-5.35.51-PM-1.png" /></p>
<h4>8. Twitter</h4>
<p>Notion’s content coalesces on Twitter. It serves as a base for product updates, press, user praise and more. Notion has more than 40k followers. (<a href="https://twitter.com/NotionHQ">Twitter</a>)</p>
<p><img alt="" src="https://druriley.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-01-at-5.37.31-PM-1.png" /></p>
<h4>9. What’s New?</h4>
<p>Notion’s product timeline tells a story. It takes Notion users on a journey of the past and keeps them excited about upcoming features. (<a href="https://www.notion.so/What-s-New-157765353f2c4705bd45474e5ba8b46c">Product Timeline</a>)</p>
<p><img alt="" src="https://druriley.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-01-at-5.38.06-PM.png" /></p>
<h4>10. Tools & Craft</h4>
<p>The <em>Tools & Craft</em> series shares interesting stories without directly pushing Notion. The content team deftly repurposes the same content for video and podcasting formats.</p>
<p>The series showcases a bit of Ivan Zhao’s interests as a designer. This is similar to how Patrick Collison, CEO of <a href="https://druriley.com/stripe-marketing-playbook-7-strategies-33-examples/">Stripe</a>, manifests his love of books with Stripe Press. (<a href="https://www.notion.so/tools-and-craft">Tools & Craft</a>)</p>
<p><img alt="" src="https://druriley.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-01-at-5.39.43-PM.png" /></p>
<h4>11. Notion Forums</h4>
<p>Notion uses several 3rd-party platforms for user support. They have support channels on <a href="https://www.reddit.com/r/NotionSo/">Reddit</a>, <a href="https://www.facebook.com/groups/notioncommunity/">Facebook</a>, <a href="https://discordapp.com/invite/2RrqtF9">Discord</a> and <a href="https://www.notion.so/Notion-Hacks-27b92f71afcd4ae2ac9a4d14fef0ce47">Slack</a>. (<a href="https://www.notion.so/Notion-Community-04f306fbf59a413fae15f42e2a1ab029">Notion Community</a>)</p>
<p><img alt="" src="https://druriley.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-01-at-5.40.15-PM.png" /></p>
<h4>12. Events</h4>
<p>Notion moved into the physical word with events. These meetups and workshops are also a form of micro marketing. Notion has an ambassador program for individuals who want to help with grass roots efforts.</p>
<p>This practice is similar to <a href="https://druriley.com/webflow-marketing-playbook-10-strategies-35-examples/">Webflow</a> events and designer evangelists. (<a href="https://www.notion.so/Notion-Community-04f306fbf59a413fae15f42e2a1ab029">Notion Community</a>)</p>
<p><img alt="" src="https://druriley.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-01-at-5.41.17-PM-1-1024x242.png" /></p>
<h4>13. Documentation</h4>
<p>Notion produces lots of documentation. This is great for SEO and helping prospective users decide whether or not Notion is a good fit for them. (<a href="https://www.notion.so/Help-Support-e040febf70a94950b8620e6f00005004">Documentation</a>)</p>
<p><img alt="" src="https://druriley.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-01-at-5.42.15-PM-1-1024x488.png" /></p>
<h4>14. Interviews</h4>
<p>Notion CEO, Ivan Zhao, often shares the story of Notion while raising brand awareness. He’s been featured on <a href="https://www.invisionapp.com/inside-design/ivan-zhou-notion-interview/">Inside Design</a>, <a href="https://www.designernews.co/stories/73315-ama-ivan-zhao-cofounderdesigner-of-notion">Designer News</a> and <a href="https://www.figma.com/blog/design-on-a-deadline-how-notion-pulled-itself-back-from-the-brink-of-failure/">Figma</a>.</p>
<h2>Poacher Marketing</h2>
<p><img alt="" src="https://druriley.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-01-at-4.33.58-PM.png" /></p>
<h4>15. Targeting Evernote 🎯</h4>
<p>Being an Evernote user makes you a great target customer for Notion. The company dedicates an entire page to informing users why Notion is better than Evernote.</p>
<p><a href="https://druriley.com/webflow-marketing-playbook-10-strategies-35-examples/">Webflow</a> also dedicates pages to explaining why they’re a better option than WordPress and Shopify. <a href="https://druriley.com/uber-marketing-playbook-23-strategies-81-examples/">Uber</a> has also targeted Lyft drivers in marketing campaigns. (<a href="https://www.notion.so/evernote">Notion-Evernote Comparison</a>)</p>
<h2>Viral Feature Marketing</h2>
<h4>16. Sharing</h4>
<p>Collaboration tools lend themselves to virality. Notion takes full advantage of this by making it easy to share documents. They also cater to enterprise environments where usage is likely to spread throughout organizations. (<a href="https://www.notion.so/Sharing-permissions-524c32ac63dc424a842891ace7a99bf8">Sharing</a>)</p>
<h2>Social Proof Marketing</h2>
<p><img alt="" src="https://druriley.com/wp-content/uploads/2019/08/Screen-Shot-2019-08-01-at-4.28.42-PM.png" /></p>
<h4>17. Testimonials</h4>
<p>Notion uses tweets for testimonials. <a href="https://druriley.com/ahrefs-marketing-playbook-8-strategies-23-examples/">Ahrefs</a> does the same. This is often used by SaaS companies for social proof. (<a href="https://www.notion.so/product">Product</a>)</p>
We had a meeting with Aymee Reis from GrowthHackers about the possibility of partnership. She listed the criteria for partnership:
# Bringing a customer on the intermediary tier
# Bringing 2 customers on the starter tier
We've agreed to call her up whenever we need to do an awareness webinar for growth hacking methodologies. Since she's in Brazil, her timezone is UTC-3, so we'll schedule webinars with her at 2pm plus.
__Attendees__
# Aymee
# Bernard
# Abraham
__Agenda__
Plan for future meeting with Airtel to onboard them into the growth-hacking methodology and platform.
__Minutes__
* We need to understand whether they're running experiments or whether they're starting from scratch
* How many will be using it in the department
* Three main concerns at Airtel
** They have three new products
** They're not running any experiments
* Could we have something that will allow them to understand how they can benefit from it. Aymee will send some stuff to highlight key offerings, case studies in Africa and other things to help out with our presentation by the end of today (1/12/2020)
* Meanwhile, we'll schedule a presentation for Airtel for next week which is when Aymee will be available.
# Benjamin Fernandez, CEO of Nala
# [[@MakanzaPaul|https://mobile.twitter.com/MakanzaPaul]] is the Board Chairman for Tanzania Startup Association (TSA). With over 25 years of experience working in private sector, He has in-depth understanding of political, economic, social and regulatory environment on Sub-Sahara African
# Salum Awadh is the CEO of SSC Capital, a corporate advisory and investment management firm. The firm offers services in corporate advisory, M&A, Capital raising, Asset management, Funds management, Private Equity & Venture Capital, Corporate re-structuring, Research, Policy & Economic Advisory, and Project Management.
<<<
* To facilitate purposeful working environments involving diversity of people in multiple organizations, especially those tackling complex challenges and questions
* Facilitate concurrence, collaboration, and collective action at scale ("real work")
* Unified ways to capture, integrate, manage the emerging heterogeneous knowledge
* Enhance access, maneuverability, applicability, and (re)utilization of knowledge assets
* Evolvable, scalable, seamlessly interoperable across domains (dissolves silos)
<<<
<p>Hashtables are often coveted in algorithm optimization for their O(1) constant time lookup. While JavaScript doesn’t have a native Hashtable class, it does have native Objects and Hashmaps(Map) that offer similar functionality when it comes to organizing key/value pairs.</p>
<h2>Hashtable vs Hashmap:</h2>
<p>Hashtables and hashmaps are data structures that store data in an array-like format, using key/value pairs, where the (hashed) key corresponds to the index in the array. One of the primary benefits that a hashtable has over a hashmap is the native ability to handle synchronous updates. This means that a hashtable can be shared by multiple threads without introducing desynching errors.</p>
<p>Hashmaps offer the same key/value functionality and come native in JavaScript (ES6) in the form of the Map() object (not to be confused with Array.prototype.map()). While hashmaps are limited to single-threaded code, they do have some benefits, for instance the allowance of null values which allows for greater flexibility.</p>
<h2>JavaScript Objects: Similar but Different</h2>
<p>You might be thinking, “but JavaScript objects already keep track of key/value pairs.” While you can use JS objects to serve the same function of a hashmap, a hashmap does offer some benefits. For instance, hashmaps offer greater flexibility. The key in a hashmap can be any datatype, this includes arrays and objects. Meanwhile, objects can only use integers, strings, and symbols as their keys.</p>
<p>Hashmaps are organized as linked lists, so the order of its elements is maintained, which allows the hashmap to be iterable. Also, unlike key/value pairs stored in an Object, the number of items in a hashmap can be determined by the size property.</p>
<p><em>Note: One of the primary pitfalls to be aware of when it comes to hashmaps in JavaScript, is that they cannot be directly translated to JSON.</em></p>
<h2>Using the JavaScript Hashmap Object Map():</h2>
<p><strong><em>Declaration and Initialization:</em></strong></p>
<p><img alt="How to declare and initialize a new JS hashmap object." src="https://miro.medium.com/max/700/1*GLjtAmfB4uOCQGf9i00p-g.png" /></p>
<p>How to declare and initialize a new JS hashmap object.</p>
<p><strong><em>Useful Methods and Properties:</em></strong></p>
<ul>
<li><strong><em>hashmap.size</em></strong> returns the # of elements in the hashmap</li>
<li><strong><em>hashmap.get(<key>)</em></strong> returns the value of the element of the given key</li>
<li><strong><em>hashmap.has(<key>)</em></strong> checks to see if the hashmap contains the key that is passed as an argument</li>
<li><strong><em>hashmap.set(<key>, <value>)</em></strong> accepts 2 arguments and creates a new element to the hashmap</li>
<li><strong><em>hashmap.delete(<key>)</em></strong> deletes the key/value pair that matches the key that is passed in as an argument</li>
<li><strong><em>hashmap.clear()</em></strong> clears all elements from the hashmap</li></ul>
<p><img alt=".size() returns the number of elements in the hashmap" src="https://miro.medium.com/max/700/1*Dc37awhRHKdByysB1dYPnQ.png" /></p>
<p>The .size property for JS hashmap objects is similar to array.length and returns the number of elements in the hashmap.</p>
<p><img alt="" src="https://miro.medium.com/max/700/1*klD0AYkQl20cz35_5qk4OA.png" /></p>
<p>Hashmaps are a great way to manage key/value pairs and will work in most instances for JS applications. Just be aware that there are instances — in particular if you are integrating your key/value pairs with JSON — where you might want to rely on standard JavaScript objects.</p>
<p><strong>Sources:</strong></p>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map" rel="noopener">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map</a></p>
<p><a href="https://sunfishempire.wordpress.com/2014/08/19/5-ways-to-use-a-javascript-hashmap/" rel="noopener">https://sunfishempire.wordpress.com/2014/08/19/5-ways-to-use-a-javascript-hashmap/</a></p>
<p><a href="https://adrianmejia.com/data-structures-time-complexity-for-beginners-arrays-hashmaps-linked-lists-stacks-queues-tutorial/" rel="noopener">https://adrianmejia.com/data-structures-time-complexity-for-beginners-arrays-hashmaps-linked-lists-stacks-queues-tutorial/</a></p>
<p><a href="https://www.geeksforgeeks.org/map-vs-object-in-javascript/" rel="noopener">https://www.geeksforgeeks.org/map-vs-object-in-javascript/</a></p>
<div class="container content-width3" style="--font-size:20px;">
<div class="header reader-header reader-show-element">
<a class="domain reader-domain" href="https://dev.to/a_sandrina_p/learning-hash-tables-with-drawings-99o">dev.to</a>
<div class="domain-border"></div>
<h1 class="reader-title">Learning Hash Tables with drawings 🎨</h1>
<div class="credits reader-credits">Sandrina Pereira</div>
<div class="meta-data">
<div class="reader-estimated-time">4-5 minutes</div>
</div>
</div>
<hr>
<div class="content">
<div class="moz-reader-content line-height4 reader-show-element"><div id="readability-page-1" class="page"><div data-article-id="153777" id="article-body" itemprop="articleBody">
<p>I've been learning about Data Structures and it all seems
very rocket science. 🙃 To help me understand it better (learning to
learn) I've made a small Zine about one of them - Hash Tables ⚡️</p>
<p>At the bottom, you can check the full written version with resources, but for now, check out the illustrative version!</p>
<p>Feel free to <a href="https://github.com/sandrina-p/sketching/blob/master/zine_hash-tables/print.png">download the printable version</a>. Here's also the <a href="https://github.com/sandrina-p/sketching/blob/master/zine_hash-tables/original.jpg">original handmade version</a>.</p>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Br9vi3Ng--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/sandrina-p/sketching/raw/master/zine_hash-tables/0_cover.png"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Br9vi3Ng--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/sandrina-p/sketching/raw/master/zine_hash-tables/0_cover.png" alt="Zine Cover"></a></p>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SWF_E304--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/sandrina-p/sketching/raw/master/zine_hash-tables/1_intro.png"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SWF_E304--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/sandrina-p/sketching/raw/master/zine_hash-tables/1_intro.png" alt="Intro" moz-reader-center="true"></a></p>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9Hia6R2z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/sandrina-p/sketching/raw/master/zine_hash-tables/2_collisions.png"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9Hia6R2z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/sandrina-p/sketching/raw/master/zine_hash-tables/2_collisions.png" alt="How to Handle Collisions" moz-reader-center="true"></a></p>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ryzQd0Ml--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/sandrina-p/sketching/raw/master/zine_hash-tables/3_faq.png"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ryzQd0Ml--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/sandrina-p/sketching/raw/master/zine_hash-tables/3_faq.png" alt="FAQ" moz-reader-center="true"></a></p>
<p>... and now the written version...</p>
<h2>
<a name="what-it-is" href="#what-it-is">
</a>
What it is
</h2>
<p>The most efficient data structure to 🔍Search, ➕Insert and 🗑Delete.</p>
<p>Does all of it in <strong>O(1) complexity</strong> on average (i.e. Takes the same time to
do it, no matter the size of data available)</p>
<p>It's used for Caching, Database Searching, and Sets</p>
<h2>
<a name="how-it-works" href="#how-it-works">
</a>
How it works
</h2>
<p>An unordered collection of <strong>unique keys</strong> is mapped to <strong>values</strong> through the process of hashing.</p>
<p>Take a key --> Run it in a hash function --> that generates a hash</p>
<p>Portuguese --> ✨ --> 2<br>
French --------> ✨ --> 0<br>
English -------> ✨ --> 3</p>
<p>... and add it to the matched index on the table (also known as "bucket"):</p>
<div><table>
<thead>
<tr>
<th>hash</th>
<th>value</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>Salut</td>
</tr>
<tr>
<td>1</td>
<td>-</td>
</tr>
<tr>
<td>2</td>
<td>Olá</td>
</tr>
<tr>
<td>3</td>
<td>Hello</td>
</tr>
</tbody>
</table></div>
<h3>
<a name="hashing-is-oneway" href="#hashing-is-oneway">
</a>
Hashing is one-way!
</h3>
<p>A hash can’t be converted back to its original key.</p>
<p>ex: Hashing "English" returns 3, but with 3 you can't get "English"</p>
<h3>
<a name="a-hash-function-must" href="#a-hash-function-must">
</a>
A hash function must:
</h3>
<ul>
<li>🏎 Be fast to run.</li>
<li>🧩 Uniform distribution.</li>
<li>💥 Resolve hash collisions.</li>
</ul>
<h2>
<a name="how-to-handle-collisions" href="#how-to-handle-collisions">
</a>
How to handle Collisions?
</h2>
<p>A collision happens when a key corresponds to a hash (index) already taken by another key.</p>
<h3>
<a name="open-addressing" href="#open-addressing">
</a>
Open Addressing
</h3>
<p>When a bucket is already taken, other buckets are examined until an unused bucket is found.</p>
<ul>
<li>💚 Fast when the number of collisions is small.</li>
<li>🚨 Tables can’t be smaller than the number of keys.</li>
</ul>
<h3>
<a name="chaining" href="#chaining">
</a>
Chaining
</h3>
<p>A bucket can take multiple keys with the same index.</p>
<ul>
<li>💚 Good for a large number of collisions.</li>
<li>🚨 Wastage of space (some buckets are never used).</li>
</ul>
<h2>
<a name="faq" href="#faq">
</a>
💡FAQ
</h2>
<h3>
<a name="what-is-the-ideal-load-factor" href="#what-is-the-ideal-load-factor">
</a>
What is the ideal Load Factor?
</h3>
<p>Some say it’s around 0.7. This means a table with 70 items should
have around 100 buckets. But it’s a balance. The emptier the buckets,
the faster it is, you have fewer collisions but more memory is used.</p>
<h3>
<a name="what-is-dynamic-resize" href="#what-is-dynamic-resize">
</a>
What is Dynamic Resize?
</h3>
<p>It happens when a table is getting out of balance - it’s too full or too empty. It resizes the table and rehashes the keys.</p>
<h3>
<a name="whats-the-best-hash-function" href="#whats-the-best-hash-function">
</a>
What’s the best Hash Function?
</h3>
<p>There isn’t a one-fits-all solution. It’s a trade-off between speed and distribution.</p>
<p>A good hash function is the secret to an efficient hash table.</p>
<p><strong>TIP:</strong> When the keys are static use a Perfect Hash Function. * <em>No collisions</em> * <em>No empty buckets</em> *</p>
<h3>
<a name="when-should-i-avoid-hash-tables" href="#when-should-i-avoid-hash-tables">
</a>
When should I avoid Hash Tables?
</h3>
<ul>
<li>Search is not the main operation.</li>
<li>Need to iterate over the elements.</li>
<li>There are duplicated keys.</li>
</ul>
<h2>
<a name="bonus-applying-simple-hash-table-concept-in-javascript" href="#bonus-applying-simple-hash-table-concept-in-javascript">
</a>
🎁 Bonus: Applying Simple Hash Table Concept in Javascript!
</h2>
<h3>
<a name="when-using-if-statements" href="#when-using-if-statements">
</a>
😰 When using If statements...
</h3>
<p>You end in an if hell (or switch hell) when dealing with different scenarios to assign a variable.<br>
</p>
<div><pre><code><span>if</span><span>(</span><span>viewport</span> <span>===</span> <span>'</span><span>sm</span><span>'</span><span>)</span> <span>{</span>
<span>fontSize</span> <span>=</span> <span>1.0</span><span>;</span>
<span>}</span> <span>if</span> <span>else</span> <span>(</span><span>viewport</span> <span>===</span> <span>'</span><span>md</span><span>'</span><span>)</span> <span>{</span>
<span>fontSize</span> <span>=</span> <span>1.2</span><span>;</span>
<span>
</span><span>}</span> <span>// if else ... if else ...</span>
</code></pre></div>
<h3>
<a name="️-but-using-raw-keyvalue-endraw-mapping" href="#%EF%B8%8F-but-using-raw-keyvalue-endraw-mapping">
</a>
⚡️ But using <code>key:value</code> mapping...
</h3>
<p>You get a direct lockup - O(1) complexity - no matter the number of options, with a cleaner code. How cool is that?<br>
</p>
<div><pre><code><span>const</span> <span>sizes</span> <span>=</span> <span>{</span><span>
</span>
<span>sm</span><span>:</span> <span>1</span><span>,</span>
<span>md</span><span>:</span> <span>1.2</span><span>,</span>
<span>lg</span><span>:</span> <span>1.2</span><span>
</span>
<span>};</span>
<span>const</span> <span>fontSize</span> <span>=</span> <span>sizes</span><span>[</span><span>viewport</span><span>];</span>
</code></pre></div>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lkyztkQn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/sandrina-p/sketching/raw/master/zine_hash-tables/assets/4_js.png"><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lkyztkQn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/sandrina-p/sketching/raw/master/zine_hash-tables/assets/4_js.png" alt="JS"></a></p>
<hr>
<p>Resources to get started:</p>
<ul>
<li>📝<a href="https://en.wikipedia.org/wiki/Hash_table">Hash Tables - Wikipedia</a>
</li>
<li>🎥<a href="https://www.youtube.com/watch?v=KyUTuwz_b7Q&t=21s">Hash Tables and Hash Functions</a>
</li>
<li>🎥 <a href="https://www.youtube.com/watch?v=mFY0J5W8Udk">Hash Tables simplified</a>
</li>
</ul>
<hr>
<p>Thank you for reading!</p>
</div></div></div>
</div></div>
* Multiple best-of-breed services: Managing multiple systems can be challenging and a team’s knowledge base must cover them all. (this problem of multiple tooling [[feels similar to this|13th April 2019 State of SaaS]])
* No channel-specific support: Since pure headless CMSs don’t deal with the presentation layer, developers may have to create some functionality, such as website navigation, themselves.
* Content organization: As pure headless CMSs do not typically provide the concept of pages and web sitemaps, content editors need to adapt to the fact that content is organized in its pure form, independently on the website or other channel.
/help
Outline resources available with links to documentation, tiddlywiki resources and support channels
Hey is an email tool that [[Basecamp]] claims solves email's common pain points. Its core feature is a screening tool that allows you to screen first time emailers to your inbox.
Other features include:
* Anti-tracking technology. Email trackers come in many forms, including a single invisible pixel or special web fonts, and marketers frequently use them to detect when someone opens a message and even where that person is when the email is opened. Hey automatically detects emails containing trackers and alerts you when they have been blocked. That’s a step ahead of free services like Gmail, which offers minimal protections against tracking.
* A place for receipts. When you get a receipt from a business or a trip itinerary, you can click the Move button to send it to a Paper Trail, which is essentially a folder for important documents.
* Other email management tools:-
** When you receive an important email that you don’t want to forget about, you can pin it so that a preview of the message remains at the bottom of the app screen.
** You can also flag emails you want to reply to later by tapping the Later button.
Problems include:
* The screening tool does not scale for:
** Everchanging email addresses from corporations you may care about
** Sometimes important notices can be buried inside spammy marketing newsletters and it becomes difficult for users to screen them out. This I believe stems from a lack of fine grained filtering of not just the email address, but the subject line and the body.
* The privacy protection tooling maybe incomplete. Trackable links can still get through to track you
Hierarchical networks: A network consists of nodes and links interconnecting the nodes. A hierarchical network consists of disjoint sets of nodes denoted clusters. In addition, each cluster contains at least one hub node. The backbone consists of the hub nodes interconnected by backbone links. Similarly nodes in each cluster are interconnected by cluster links
Here's a visual example of such a network illustrating three clusters of nodes connected to purple hub nodes that are themselves connected via a 'backbone' network:
<$tmap view="Hierarchical Network" height="350px" design="plain"></$tmap>
So, from this visual illustration, we can derive the key features of hierarchical networks:-
1. Clustering of nodes
2. those clusters have hubs connected to other hubs in other clusters
3. the arrangement of many clustering nodes around a few connected hubs means that the network can be classified as a 'scale-free' network; i.e. the distribution of connections for a given node (its degree distribution) follows a power law distribution. A more mathematical treatment of these properties can be found [here](https://en.wikipedia.org/wiki/Hierarchical_network_model#Properties).
That last part is important because it is what gives the network its robustness to failure. Since a very large number of nodes are not hubs, if they are taken out of the network via failure, the network stays intact. Even if a hub is taken out, the network overall remains connected. Taking out all the nodes however leaves the network smashed into isolated clusters of connected nodes. The hubs therefore are both the key success of the network and a source of potential failure.
The topology also enables a more manageable network for telecom companies and IT professionals to build, manage and secure. Therefore it is no wonder we see the topology occur many times in that domain in the form of the web, the DNS, the Internet etc.
Hierarchical networks occur frequently in the natural world. The most commonly cited form are food webs in ecosystems as well as social and language networks.
Federated networks can be considered to have a hierarchical network topology. Federated networks though are built on a trust mechanism based on broadly accepted rules and systems governing that trust.
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
<span style="background-color: yellow;"></span>
Fed wiki's first commit was on June 25, 2011. Github
Ward Cunningham, the father of Wikis, and Fed Wiki, started the latter with a workshop project at Indi Web Camp (wiki ) called Smallest Federated Wiki.
!! How do they work?
Ward Cunningham:
Federated Wiki — Federated Wiki sites share pages circulating within a creative commons.
A single-page browser application reads from many sites at once and saves changes in that browser (see foto).
Users can host their own sites, where they edit and organize their knowledge. At the same time they can share back to the federation.
The tools for refactoring and sharing are "hard to learn but easy to use. "Drags 'n drops" and "forks" are omnipresent. The software, published as a Node.js package, runs on a variety of platforms. It can be used on a personal laptop or an industrial server.
~FedWiki invites everybody - called "visitors" in ~FedWiki language - to go around the wiki-pluriverse and take any point of view, without having to conform with the version presented through - say - a Wikipedia page.
The story of Intellipedia's origins is a story of necessity being the mother of invention, and the power of collective need & intelligence.
The US intelligence community was known for its siloed workflow. However, after the events of 9/11, investigations by the 9/11 commission determined that this culture of silos partly lead to the community's inability to spot suggestive signs of the attack. A subsequent [[essay|https://papers.ssrn.com/sol3/papers.cfm?abstract_id=755904]] written by a young intelligence worker (D. Calvin Andrus) circulated, advocating for a shared collaborative space for sharing intel across different agencies and departments.
Intellipedia was born as a direct result of a grass roots movement led by an increasingly younger workfoce at the time, with strategic champions like Major General Dale Meyerrose, the Associate Director of National Intelligence back in 2005 who helped authorize servers to try the idea out soon after the essay. The project had other champions too, like National Geospatial Intelligence-Agency analyst Chris Rasmussen, who was its early user. Intellipedia soon became the go-to tool for everyone in the community. According to [[this Wired magazine article from 2017|https://www.wired.com/2017/03/intellipedia-wikipedia-spies-much/]]:
<<<
Rasmussen and the other young analysts just kept writing articles and submitting them to the growing Intellipedia library. There was cachet in getting your contributions accepted. When people contested facts in the discussion section, things got hairy. "This is tribal warfare," Meyerrose says. By 2008, when he retired, he couldn't go into any field office and not see a shortcut to Intellipedia on every computer screen.
<<<
Intellipedia is indisputably a success story for [[Wikis]] in the US intelligence community, [[in more ways than one|https://en.wikipedia.org/wiki/Intellipedia#Successes]]. Rasmussen later noted however that he was disappointed that Intellipedia was not being used to create more collaborative official reports:
<<<
...two-part Wired series on Intellipedia and next steps reported that after 10 years of usage Intellipedia helped the IC get caught up to "Web 2.0" but never reformed how official reports were created like National Intelligence Estimates. A more official version of Intellipedia called the Living Intelligence System was created after the fact and focused on collaboratively writing official reports. It failed to catch on because each agency has a different process for writing official, classified reports.[18] Based on the lessons learned from Intellipedia and the Living Intelligence System, a pilot program within the National Geospatial-Intelligence Agency created the Tearline apps focused on writing official collaborative reports in the less bureaucratic space of unclassified content.
<<<
The landmark book in architecture, //A Pattern Language// by architect Christopher Alexander, published in 1977, outlined the [[foundation|Foundation of pattern languages]] of what was to become the basis of the more impactful idea of design patterns in software design and engineering, particularly with respect to object oriented programming. However, this book never went on to influence its original domain of Architecture. This is because of the limitations of the book as a media; it failed to be modifiable, customizable and falsifiable by and for a wide community of users. It may also have been due to the critical nature of the author towards his field.
This hook allows plugins to inspect tiddlers before they are deleted via the ''delete'' toolbar button. When the delete button is used from the edit toolbar there are actually two invocations of the `th-deleting-tiddler` hook function: one for the original tiddler and one for the draft.
Note that this hook is not invoked for tiddlers deleted by other means such as the ActionDeleteTiddlerWidget.
Hook function parameters:
* ''tiddler'': tiddler object about to be deleted
Return value:
* unmodified tiddler to be deleted
This hook allows plugins to inspect tiddlers before they are edited via the ''edit'' toolbar button.
Hook function parameters:
* ''event'': DOM event object that triggered the edit
Return value:
* ''editTiddler'': ''true'' to continue with editing the tiddler as usual, ''false'' to silently suppress editing
This hook allows plugins to inspect or modify the details of files imported via drag and drop or the "import" button. It is invoked as each [[File object|https://developer.mozilla.org/en-US/docs/Web/API/File]] provided by the browser in response to an import or drag and drop is being read. The hook function can choose to ignore the file, in which case TiddlyWiki's default processing proceeds to read and import the content of the file. Alternatively, the hook function can process the file to extract the tiddlers itself, and then pass them back to TiddlyWiki to be handled by the rest of the import process.
Use this hook if you want to control how tiddlers are extracted from files during an import. See [[Hook: th-importing-tiddler]] if you want to process each imported tiddler after they have been extracted from the files.
Hook function parameters:
* ''info'': an object with properties containing information relating to the current file:
** ''file'': reference to the browser's [[File object|https://developer.mozilla.org/en-US/docs/Web/API/File]]
** ''type'': the MIME type of the file. If not provided by the browser then TiddlyWiki attempts to infer the type from the file extension
** ''isBinary'': flag for whether the file contains binary data (which requires that the file type be recognised by TiddlyWiki)
** ''callback'': callback function to be called with an array of tiddler field objects extracted from the file object
Return value:
* ''true'' indicates that the hook handled the file, and passed any extracted tiddlers to the callback
* ''false'' indicates that the hook didn't process the file
This hook allows plugins to inspect or modify tiddlers as they are imported via the import mechanism. It is invoked when the final "Import" button is clicked, and the selected tiddlers are being imported into the store.
Use this hook if you want to process each imported tiddler after they have been extracted from the files. See [[Hook: th-importing-file]] if you want to control how tiddlers are extracted from files during an import.
Hook function parameters:
* ''tiddler'': tiddler object about to be imported
Return value:
* tiddler object to be imported
The original tiddler object can be returned unmodified by the hook. If the hook needs to modify the tiddler then it should return a new tiddler object, for example:
```
return new $tw.Tiddler(tiddler,{"my-field": value});
```
Hooks must not change the ''title'' field but can freely modify any other field of the tiddler.
This hook allows plugins to monitor and modify navigation events.
Hook function parameters:
* ''event'': object describing the navigation event:
** ''event.navigateTo'': title of target tiddler
** ''event.navigateFromTitle'': title of tiddler containing the
** ''event.navigateSuppressNavigation'': boolean; when true the target tiddler opens without the usual scrolling
** ''event.navigateFromClientRect'': rectange in client coordinates of the DOM node triggering the navigation
Return value:
* possibly modified event object
This hook allows plugins to add to or remove from the list of tiddlers that are opened when the wiki is first loaded or the home button is clicked.
Hook function parameters:
* ''list'': array of tiddler titles to be opened
Return value:
* modified array of tiddler titles to be opened
Note that this hook is invoked with the tiddler titles that are generated from the filter in [[$:/DefaultTiddlers]]. Any added entries must be tiddler titles, not filter expressions.
This hook allows plugins to inspect tiddlers before they are relinked ("relinking" is the optional operation of relinking references to a tiddler when it is renamed).
Hook function parameters:
* ''newTiddler'': tiddler object incorporating the relinking
* ''oldTiddler'': optional existing tiddler object that will be overwritten
Return value:
* ''newTiddler'': tiddler object to be used for the relinking operation.
The original tiddler object can be returned unmodified by the hook. If the hook needs to modify the tiddler then it should return a new tiddler object, for example:
```
return new $tw.Tiddler(tiddler,{"my-field": value});
```
Hooks must not change the ''title'' field but can freely modify any other field of the tiddler.
This hook allows plugins to inspect tiddlers before they are modified by the `tm-rename-tiddler` message.
Hook function parameters:
* ''newTiddler'': tiddler object incorporating the rename
* ''oldTiddler'': optional existing tiddler object that will be overwritten
Return value:
* newTiddler: tiddler object to be used for the renaming operation.
The original tiddler object can be returned unmodified by the hook. If the hook needs to modify the tiddler then it should return a new tiddler object, for example:
```
return new $tw.Tiddler(tiddler,{"my-field": value});
```
Hooks must not change the ''title'' field but can freely modify any other field of the tiddler.
This hook allows plugins to inspect or modify tiddlers before they are saved via the ''confirm'' toolbar button; the hook is not invoked for tiddlers that are saved through other means, such as state tiddlers created by the ActionSetFieldWidget.
Hook function parameters:
* ''tiddler'': tiddler object about to be saved
Return value:
* tiddler object to be saved
The original tiddler object can be returned unmodified by the hook. If the hook needs to modify the tiddler then it should return a new tiddler object, for example:
```
return new $tw.Tiddler(tiddler,{"my-field": value});
```
Hooks must not change the ''title'' field but can freely modify any other field of the tiddler.
The hook mechanism provides a way for plugins to intercept and modify default functionality. Hooks are added as follows:
```js
$tw.hooks.addHook(name,handler);
```
Multiple handlers can be assigned to the same name using repeated calls. When a hook is invoked by name all registered functions will be called sequentially in their order of addition.
Though not essential care should be taken to ensure that hooks are added before they are invoked. For example: [[Hook: tc-opening-default-tiddlers-list]] should ideally be added before the story startup module is invoked otherwise any hook specified additions to the default tiddlers will not be seen on the initial loading of the page, though will be visible if the user clicks the home button.
!! Example
A working example of a hook that adds "test" to the default tiddlers.
```js
$tw.hooks.addHook("th-opening-default-tiddlers-list",function(list) {
list.push("test");
return list;
});
```
While thinking about where to host [[OnePlaybookLab]]'s blog, I stumbled on a knowledge gap: how does hosting a blog on a subdomain impact searchability?
It turns out, [[maybe a lot|https://www.semrush.com/blog/subdomain-vs-subdirectory/]]: because subdomains are treated like a seperate folder/directory to your domain, Google may not associate the two strongly than if they were under the same domain. In other words, hosting under a directory would much be better.
<img src="https://i1.wp.com/www.ignitionframework.com/wp-content/uploads/2015/09/Process-of-business-model-innovation-updated.png?w=1316&ssl=1" />
https://mvogelgesang.github.io/teamKnow/
This is a fantastic resource that can really help inform how we sell OnePlaybook's value.
{{Importance of Knowledge management}}
{{Knowledge management culture}}
What are the characteristics of a good knowledge management system? One that offers:
{{Qualities of a good Knowledge management system}}
<p>This story was contributed to the Product Hunt Blog by Patrick Woods, co-founder and CEO of Orbit.</p>
<p>Companies are increasingly understanding the strategic value of community to grow their business. They realize that buyers have endless choices in today’s market, so relying on features or pricing to win business won’t lead to a sustainable advantage. That’s why a commonality across this year’s <a href="https://news.crunchbase.com/news/heres-whos-gone-public-in-2021-so-far/" rel="noopener" target="_blank">many public listings</a> has been companies who have made community an integral part of their business strategy. From <a href="https://www.cnbc.com/2021/03/10/roblox-rblx-starts-trading-at-64point50-after-direct-listing.html" rel="noopener" target="_blank">Roblox</a> and <a href="https://techcrunch.com/2021/07/31/5-lessons-from-duolingos-bellwether-edtech-ipo-of-the-year/" rel="noopener" target="_blank">Duolingo</a>, to <a href="https://markets.businessinsider.com/news/stocks/poshmark-stock-price-surges-post-ipo-first-day-of-trading-2021-1" rel="noopener" target="_blank">PoshMark</a>, <a href="https://techcrunch.com/2021/06/02/confluents-ipo-brings-a-high-growth-high-burn-saas-model-to-the-public-markets/" rel="noopener" target="_blank">Confluent</a>, and <a href="https://www.uipath.com/newsroom/uipath-community-grows-to-more-than-1.5-million-members-and-uipath-announces-three-new-features-to-increase-career-opportunities" rel="noopener" target="_blank">UIPath</a>—businesses across all sectors are becoming community-driven.</p>
<p>Yet, based on my hundreds of conversations with leaders from early-stage B2B companies to global consumer brands, one of the biggest challenges for many is how to get started. Community building may be as old as humanity itself, but community in a commercial context is an emerging competence. There are tactics and frameworks you can adopt to get you going on the right path.</p>
<h3>Before building community</h3>
<h3><strong>Why build a community?</strong></h3>
<p>The relationship between companies and customers is changing. Buyers no longer rely on sales pitches and marketing to learn about and choose new products. Their decisions are also based on what they know and love or the recommendations of friends, colleagues, social media peers, or even strangers online. They want to try before they buy, read reviews and guides, and get advice from others on avoiding pitfalls.</p>
<p>Community embraces this behavioral shift. It gives people a path to explore and learn about a new product or technology on their own terms. This empowers potentials customers, contributors and fans, and can lead to all sorts of positive outcomes for the company, including:</p>
<ul>
<li>Guest contributors who can write, give talks, provide quotes, etc.</li>
<li>An engaged, relevant audience to invite to events</li>
<li>Users who can share their success and knowledge with potential users</li>
<li>An engaged pool of people to gather feedback and ideas, or even hire from</li></ul>
<p>As a result, when done right, community can be a <a href="https://a16z.com/2016/03/07/network-effects_critical-mass/" rel="noopener" target="_blank">moat</a> from competition and can build <a href="https://corinneriley.medium.com/community-led-growth-the-product-led-growth-expansion-pack-b474ab9a7940" rel="noopener" target="_blank">brand advocacy</a>, increase <a href="https://openviewpartners.com/blog/your-guide-to-plg-and-community-its-way-more-than-launching-a-slack-group/#.Ygz8Ge7P3S4" rel="noopener" target="_blank">switching costs</a>, and provide <a href="https://orbit.love/blog/community-is-the-new-presales" rel="noopener" target="_blank">go-to-market efficiencies</a>, among many <a href="https://orbit.love/blog/community-strategy-is-growth-strategy-these-2021-ipos-prove-it" rel="noopener" target="_blank">other benefits</a>.</p>
<p><strong>How will you create, not just capture, value?</strong></p>
<p>The most successful community programs are focused on value creation for members, not solely on capturing value for the business. By value creation, I mean connecting, educating, equipping, and inspiring your audience, independent of the economic value of those individuals.</p>
<p>Practically, this means things like creating content, running events, writing tutorials and guides, or establishing ways for people to connect. As a business, you’re not building community for altruistic reasons, so of course, capturing value at some point is essential to the success and continued investment in any community program. But, for best outcomes, it should be viewed as a second-order effect of creating a compelling value creation machine that leads to a vibrant community and stronger relationships. To dive into this, the <a href="https://orbit.love/blog/the-community-discovery-framework" rel="noopener" target="_blank">Community Discovery framework</a> can help you explore ideas as you prepare to build community, while the <a href="https://cmxhub.com/the-spaces-model/" rel="noopener" target="_blank">SPACES model</a> enables you to consider the business value. Once you have a clear view of what you hope to achieve, then it’s time to get started building your community.</p>
<h3>Getting started with community</h3>
<h3> </h3>
<p><strong>Study your people</strong></p>
<p>Not unlike the first stages of product development, the early part of building community is highly collaborative, requiring iteration and manual, hands-on work. It starts by being genuinely interested in the people — the potential members of your community.</p>
<p>One way to do this tactically is to be the first to privately message a new person in the community. If they’re active online, then subscribe to their newsletter, jump into their Twitch stream, be their first follower, or the first to comment on their latest blog post. It pays to take the time and learn about your first members. Once you’ve engaged with 15-20 people, you’ll start to understand them, which is crucial for the next step of the process.</p>
<p><strong>Build real relationships</strong></p>
<p>If you want to build relationships, then try to build genuine relationships. Facilitating conversations is a big part of early-stage community building. If a user is asking a question about your product or making an observation, then reach out. Have a conversation. Then, close the loop — follow-up with community members when a bug impacting them is squashed or their feedback is implemented. Going the extra mile resonates with community members.</p>
<p><strong>Curate content</strong></p>
<p>Another successful tactic is curating content. On the one hand, it's a great way to get to know community members through the types of things they're writing about and consuming. But it also gives you the chance to make sure you're fully ramped on the subject matter yourself. <a href="https://www.lennysnewsletter.com/" rel="noopener" target="_blank">Lenny's Newsletter</a>, for example, is a community where people talk about product management and growth and share all sorts of wisdom about these topics. It started with curating content. Lenny asks for questions and returns actionable advice to the community. He also highlights helpful conversations from Slack channels in a weekly newsletter.</p>
<p>After you have tried these steps, decide what's working and what's not before leaning into your initial momentum.</p>
<h3>How to scale up your community</h3>
<h3><strong>Track activities across channels</strong></h3>
<p>To understand your momentum, you need to know the conversations that are resonating on which platforms. Most communities today are <a href="https://orbit.love/blog/the-future-of-community-is-distributed" rel="noopener" target="_blank">distributed across multiple platforms</a>, including social media like Twitter, forums like Discourse, chat platforms like Discord or Slack, events platforms, and first-party tools like mailing lists and in-app messaging. Start by figuring out how many community members are active on each platform, then ask yourself questions about which actions drive engagement, like: Does tweeting more drive engagement in the forum or elsewhere? Do meet-ups increase participation? This will enable you to identify the most significant opportunities to maximize your impact.</p>
<p><strong>Create value where it is needed most</strong></p>
<p>You will also maximize your impact by creating value where it's needed most. Start segmenting your community by engagement, and armed with that, build programs for each of them.</p>
<p>One of my favorite examples of this is the <a href="https://orbit.love/blog/customer-story-rasa" rel="noopener" target="_blank">community team</a> at Rasa. They realized that they lacked contributors at what they call “the hero level.” By speaking with their existing heroes, they figured out what heroes typically like to do and then created engagement initiatives around them.</p>
<p><strong>Build community flywheels</strong></p>
<p>Have an experimental mindset as you're testing approaches during this phase. Instead of focusing on big-bang tactics, the compounding effect of building community flywheels helps build momentum more consistently. An effective flywheel creates energy or traction, which then naturally leads to growth. For example, in your forum or chat, you might ask new members to introduce themselves. Then have a second step where you comment on something specific in their intro, ask a follow-up question, and add relevant emoji reactions. Though it may seem trivial, this type of interaction de-risks that initial touchpoint for folks as they're onboarding to the community. When they see other people having conversations and lots of emojis and comments flying around, it signals that this is a safe space, and they're encouraged to contribute more.</p>
<p>Another tactic to experiment with is writing about community members. When someone in your Slack community shares an observation or tip, follow up on that with a tweet thread mentioning them and what you learned. Then include that content in your newsletter. When you regularly share content created by members with your audience, other members are more likely to begin contributing their ideas too. <a href="https://glitch.com/create-project" rel="noopener" target="_blank">Glitch</a> does this well by curating member-created projects in a regular round-up. Taken further, <a href="https://www.figma.com/community" rel="noopener" target="_blank">Figma</a> and <a href="https://codesandbox.io/explore" rel="noopener" target="_blank">CodeSandbox</a> have built a community showcase into their core product.</p>
<h3>Is your company ready to build community?</h3>
<p>The last question: is your whole company ready? Community requires a long-term view and can take a few iterations to get right. Companies can struggle with this by beginning but then quickly shuttering community programs when they don’t see an immediate return. Your company will see the benefits, but only after you’ve nailed creating value for the community. So you’ll need buy-in from senior management to steer the course.</p>
<p>If your whole organization becomes community-driven, you increase your capacity to build relationships and connect to people in the community. You can make this happen by asking other teams to participate in the discussions, attend your events, and share their news. Get product team members involved in conversations about features and feedback, and connect your recruiting team with active community members. Along the way, share and socialize all community input, ideas, and concerns with the rest of the company.</p>
<p>Together, these steps create a virtuous cycle that can kickstart your community. Those that see community as merely an add-on to their go-to-market efforts will fail, but when adopted thoughtfully, it can be a unique competitive advantage that leverages the entire audience around a product.</p>
! Prerequisites
* [[TiddlyWiki on Node.js|https://tiddlywiki.com/#TiddlyWiki%20on%20Node.js]]
* A GitHub account to submit the translation to tiddlywiki.com
! Setting Up
# Fork the TiddlyWiki GitHub repository (https://github.com/Jermolene/TiddlyWiki5)
#* If your GitHub username is JoeBloggs, your fork will be https://github.com/JoeBloggs/TiddlyWiki5
# Create a branch with the name of the translation you intend to create (eg "cy-GB" for "Welsh (United Kingdom)")
#* IETF language codes: http://www.lingoes.net/en/translator/langcode.htm
# Clone your forked repository to your computer (eg, `/MyTranslation/TiddlyWiki5`)
# Create a sibling directory `/MyTranslation/jermolene.github.io`
# Create a new folder in `<repo>/languages` for your translation
# Copy the contents of `<repo>/core/language/en-GB` into your translation folder
# Create a `plugin.info` file (see below) in your translation folder
# Edit `<repo>/editions/tw5.com/tiddlywiki.info` to add your language to the list
# Run `../build.jermolene.github.io/quick-bld.sh` to build TiddlyWiki
# Open the TiddlyWiki file at `/MyTranslation/jermolene.github.io/index.html`
# You should see your translation listed in the control panel, but the text of the translation will still be in British English
# Edit the `.tid` and `.multids` files in your language folder to translate the English text
Content of `plugin.info` for Joe Bloggs' Welsh translation:
```js
{
"title": "$:/languages/cy-GB",
"name": "cy-GB",
"plugin-type": "language",
"description": "Welsh (British)",
"author": "JoeBloggs",
"core-version": ">=5.0.0"
}
```
[[MultiTiddlerFiles|https://tiddlywiki.com/#MultiTiddlerFiles]] make it possible to pack the text of several tiddlers in a single text file, simplifying some editing tasks.
! Handling Updates
Sometimes the master en-GB language tiddlers are updated with revised content or new items. The best way to keep track of language-related commits to ~TiddlyWiki5:master is to monitor this RSS/Atom feed:
https://github.com/Jermolene/TiddlyWiki5/commits/master/core/language.atom
The recommended technique for building TiddlyWiki plugins involves running [[TiddlyWiki on Node.js|http://tiddlywiki.com/#TiddlyWiki%20on%20Node.js]], but there is now an experimental technique for creating plugins directly in the browser.
! Overview
Loading a plugin in the browser has several consequences:
* The original plugin tiddler itself is unchanged
* The payload tiddlers are set up as individual [[ShadowTiddlers|http://tiddlywiki.com/#ShadowTiddlers]]
To make a modified copy of a plugin, one edits the constituent shadow tiddlers (doing this actually overrides the shadow tiddler with a new non-shadow tiddler containing the modified content). The repacking process retrieves the current value of all the shadow tiddlers included in the plugin, and then bundles the new values back into the original plugin tiddler.
! Step by step
!! 1. Setup your development environment
Start with a blank TiddlyWiki. It is useful to create a ''HelloThere'' tiddler that contains links to various tiddlers that you'll be opening frequently during plugin development:
* The plugin itself (eg `$:/plugins/yourname/pluginname`)
* The payload tiddlers that are to be packed into the plugin (eg `$:/plugins/yourname/pluginname/mywidget.js`)
!! 2. Create the plugin tiddler
Click the link to the plugin tiddler to open it. Assuming it doesn't currently exist, it will open with an italicised title, indicating that it is a missing tiddler. Then switch to edit mode and set the following fields on the tiddler:
|!Field |!Value |
|''dependents'' |Space separated list of dependent plugins (use square brackets for titles containing spaces) |
|''description'' |Plugin description |
|''name'' |Plugin name (only needed for themes) |
|''plugin-type'' |Either "plugin" for a regular plugin, "theme" for a theme, or "language" for a language pack |
|''type'' |Set to "application/json" |
|''version'' |Set to the version number of the plugin (eg "0.0.1") |
Then in the body of the tiddler, insert:
```js
{"tiddlers": {}}
```
Save the plugin tiddler
!! 3. Modify the payload tiddlers
Create the payload tiddlers by clicking on the links in the ''HelloThere'' tiddler from step 1.
!! 4. Pack the plugin
Open the browser developer console, and type the following JavaScript statement, but first change the first parameter to the name of your plugin. The second parameter is an optional array of tiddler titles to be added to the plugin:
```js
$tw.utils.repackPlugin("$:/plugins/yourname/pluginname",["$:/plugins/yourname/pluginname/mywidget.js"])
```
You should see a confirmation message, and then if you inspect the plugin tiddler you should see that it has been filled with the payload tiddlers.
Each time you save the plugin the last portion of the version number is automatically incremented. This will ensure that users with an older version of your plugin will be able to install the new version.
!! 5. Testing the plugin
To test the plugin, first make sure that it has been packed. Then save changes and refresh the page in order to load the new plugin.
!! 6. Repacking the plugin
Once you've built the plugin for the first time you can omit the second parameter to `repackPlugin()` unless you are adding a new tiddler:
```js
$tw.utils.repackPlugin("$:/plugins/yourname/pluginname")
```
!! 7. Removing tiddlers from the plugin
To remove tiddlers from the plugin specify their titles in the optional third parameter:
```jss
$tw.utils.repackPlugin("$:/plugins/yourname/pluginname",null,["$:/plugins/yourname/pluginname/mywidget.js"])
```
! Notes
!! Creating theme and language plugins
Before attempting to repack your plugin you should ensure that the plugin is selected as the current theme or language. Otherwise the shadow tiddlers will not be present.
You can customise the text and appearance of the password prompt that is displayed when encrypted TiddlyWiki files are first opened.
To do so, create a tiddler tagged {{$:/core/wiki/rawmarkup||$:/core/ui/TagTemplate}} containing:
# A JavaScript `<script>` tag containing code to override the configuration variable `$tw.boot.encryptionPrompts.decrypt`
# CSS `<style>` definitions targeting the `tc-password-wrapper` class to apply styles to the form
Raw markup tiddlers are spliced into the top of the standalone HTML file, and are executed before the boot prefix and boot kernel.
See $:/PatchEncryptionPrompt for an example.
According to [[Alexander|History of Pattern Languages]], a single pattern should be described in three parts:
# "context" - under what conditions will this solution address this problem?
# "system of forces" - in many ways it is natural to think of this as the "problem" or "goal"
# "solution" - a configuration that brings the forces into balance or solves the problems presented
Context -> System of forces -> Configuration
Therefore, a single entry in a pattern language should have a simple name, a concise description of the problem, a clear solution, and enough information to help the reader understand when this solution is the most appropriate one. It should also note which patterns must be considered beforehand, and which patterns it is natural to consider next.
__Example__
Name: ChocolateChipRatio
Context: You are baking chocolate chip cookies in small batches for family and friends
Consider these patterns first: SugarRatio, FlourRatio, EggRatio
Problem: Determine the optimum ratio of chocolate chips to cookie dough
Solution: Observe that most people consider chocolate to be the best part of the chocolate chip cookie. Also observe that too much chocolate may prevent the cookie from holding together, decreasing its appeal. Since you are cooking in small batches, cost is not a consideration. Therefore, use the maximum amount of chocolate chips that results in a sturdy cookie.
Consider next: NutRatio or CookingTime or FreezingMethod
```
title: $:/core/save/all
\define saveTiddlerFilter()
[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[[YOURTIDDLER]] +[sort[title]] $(publishFilter)$
\end
{{$:/core/templates/tiddlywiki5.html}}
```
<h2>1. Setting parent state for dynamic context</h2>
<p>Firstly, in order to have a dynamic context which can be passed to the consumers, I'll use the parent's state. This ensures that I've a single source of truth going forth. For example, my parent App will look like this:</p>
<pre><code>const App = () => {
const [language, setLanguage] = useState("en");
const value = { language, setLanguage };
return (
...
);
};
</code></pre>
<p>The <code>language</code> is stored in the state. We will pass both <code>language</code> and the setter function <code>setLanguage</code> via context later.</p>
<h2>2. Creating a context</h2>
<p>Next, I created a language context like this:</p>
<pre><code>// set the defaults
const LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
</code></pre>
<p>Here I'm setting the defaults for <code>language</code> ('en') and a <code>setLanguage</code> function which will be sent by the context provider to the consumer(s). These are only defaults and I'll provide their values when using the provider component in the parent <code>App</code>.</p>
<p>Note: the <code>LanguageContext</code> remains same whether you use hooks or class based components.</p>
<h2>3. Creating a context consumer</h2>
<p>In order to have the language switcher set the language, it should have the access to the language setter function via context. It can look something like this:</p>
<pre><code>const LanguageSwitcher = () => {
const { language, setLanguage } = useContext(LanguageContext);
return (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
);
};
</code></pre>
<p>Here I'm just setting the language to 'jp' but you may have your own logic to set languages for this.</p>
<h2>4. Wrapping the consumer in a provider</h2>
<p>Now I'll render my language switcher component in a <code>LanguageContext.Provider</code> and pass in the values which have to be sent via context to any level deeper. Here's how my parent <code>App</code> look like:</p>
<pre><code>const App = () => {
const [language, setLanguage] = useState("en");
const value = { language, setLanguage };
return (
<LanguageContext.Provider value={value}>
<h2>Current Language: {language}</h2>
<p>Click button to change to jp</p>
<div>
{/* Can be nested */}
<LanguageSwitcher />
</div>
</LanguageContext.Provider>
);
};
</code></pre>
<p>Now, whenever the language switcher is clicked it updates the context dynamically.</p>
<p><a href="https://codesandbox.io/s/react-context-4c174" rel="noreferrer">CodeSandbox Demo</a></p>
<h1>Using class components</h1>
<p>The latest <a href="https://reactjs.org/docs/context.html" rel="noreferrer">context API</a> was introduced in React 16.3 which provides a great way of having a dynamic context. The following code requires a minimum version of 16.3.0. <a href="https://codesandbox.io/s/x7xrmnr954" rel="noreferrer">CodeSandbox Demo</a></p>
<h2>1. Setting parent state for dynamic context</h2>
<p>Firstly, in order to have a dynamic context which can be passed to the consumers, I'll use the parent's state. This ensures that I've a single source of truth going forth. For example, my parent App will look like this:</p>
<pre><code>class App extends Component {
setLanguage = language => {
this.setState({ language });
};
state = {
language: "en",
setLanguage: this.setLanguage
};
...
}
</code></pre>
<p>The <code>language</code> is stored in the state along with a language setter method, which you may keep outside the state tree.</p>
<h2>2. Creating a context</h2>
<p>Next, I created a language context like this:</p>
<pre><code>// set the defaults
const LanguageContext = React.createContext({
language: "en",
setLanguage: () => {}
});
</code></pre>
<p>Here I'm setting the defaults for <code>language</code> ('en') and a <code>setLanguage</code> function which will be sent by the context provider to the consumer(s). These are only defaults and I'll provide their values when using the provider component in the parent <code>App</code>.</p>
<h2>3. Creating a context consumer</h2>
<p>In order to have the language switcher set the language, it should have the access to the language setter function via context. It can look something like this:</p>
<pre><code>class LanguageSwitcher extends Component {
render() {
return (
<LanguageContext.Consumer>
{({ language, setLanguage }) => (
<button onClick={() => setLanguage("jp")}>
Switch Language (Current: {language})
</button>
)}
</LanguageContext.Consumer>
);
}
}
</code></pre>
<p>Here I'm just setting the language to 'jp' but you may have your own logic to set languages for this.</p>
<h2>4. Wrapping the consumer in a provider</h2>
<p>Now I'll render my language switcher component in a <code>LanguageContext.Provider</code> and pass in the values which have to be sent via context to any level deeper. Here's how my parent <code>App</code> look like:</p>
<pre><code>class App extends Component {
setLanguage = language => {
this.setState({ language });
};
state = {
language: "en",
setLanguage: this.setLanguage
};
render() {
return (
<LanguageContext.Provider value={this.state}>
<h2>Current Language: {this.state.language}</h2>
<p>Click button to change to jp</p>
<div>
{/* Can be nested */}
<LanguageSwitcher />
</div>
</LanguageContext.Provider>
);
}
}
</code></pre>
<p>Now, whenever the language switcher is clicked it updates the context dynamically.</p>
<p><a href="https://codesandbox.io/s/x7xrmnr954" rel="noreferrer">CodeSandbox Demo</a></p>
<p>30 Seconds of Code is a brilliant collection of JavaScript snippets, digestible in ≤ 30 seconds. <strong>Anyone looking to master JavaScript should go through the entire thing.</strong></p>
<p>The list didn’t contain a function to rename multiple object keys, however, so I created a <a class="markup--anchor markup--p-anchor" href="https://github.com/Chalarangelo/30-seconds-of-code/pull/646" rel="noopener" target="_blank">pull request</a> that thankfully got merged!</p>
<p>Here’s the official entry: <a class="markup--anchor markup--p-anchor" href="https://30secondsofcode.org/object#renamekeys" rel="nofollow noopener" target="_blank">https://30secondsofcode.org/object#renamekeys</a></p>
<p>I’ve previously written on <a class="markup--anchor markup--p-anchor" href="https://medium.com/front-end-hacking/immutably-rename-object-keys-in-javascript-5f6353c7b6dd" target="_blank">renaming object keys</a>, but we only changed one key at a time.</p>
<p>Then <a class="markup--user markup--p-user" href="https://medium.com/@adaminsley" target="_blank">Adam Rowe</a> kindly commented, asking how we might rename <em>multiple</em> object keys. I replied with this code sample after some thought and research.</p>
<pre>renameKeys = (keysMap, obj) => Object
.keys(obj)
.reduce((acc, key) => ({
...acc,
...{ [keysMap[key] || key]: obj[key] }
}), {});</pre>
<p>This was inspired by <a class="markup--anchor markup--p-anchor" href="https://char0n.github.io/ramda-adjunct/2.6.0/RA.html#.renameKeys" rel="noopener" target="_blank">Ramda Adjunct</a>’s renameKeys function.</p>
<ul>
<li>keysMap contains key/value pairs of your old/new object keys.</li>
<li>obj is the object to be changed.</li></ul>
<p>You might use it like this:</p>
<pre>keysMap = {
name: 'firstName',
job: 'passion'
};</pre>
<pre>obj = {
name: 'Bobo',
job: 'Front-End Master'
};</pre>
<pre>renameKeys(keysMap, obj);
// { firstName: 'Bobo', passion: 'Front-End Master' }</pre>
<p>Let’s step through it! We can write an expanded, debugger-friendly version of this function:</p>
<pre>renameKeys = (keysMap, obj) => {
<strong> debugger;</strong></pre>
<pre> return Object
.keys(obj)
.reduce((acc, key) => {
<strong> debugger;</strong></pre>
<pre> const renamedObject = {
[keysMap[key] || key]: obj[key]
};</pre>
<pre><strong> debugger;</strong></pre>
<pre> return {
...acc,
...renamedObject
}
}, {});
};</pre>
<p>And we’ll use it like this:</p>
<pre>renameKeys({
name: 'firstName',
job: 'passion'
}, {
name: 'Bobo',
job: 'Front-End Master'
});</pre>
<div>
<div> </div></div>
<div>
<div><img class="js-progressiveMedia-image progressiveMedia-image" src="https://cdn-images-1.medium.com/max/800/1*C9BI6jfACst-UcchX6wyyA.png" /></div></div>
<p>Pausing on line 2, we see that keysMap and obj have been properly assigned.</p>
<p>Here’s where the fun begins. Move to the next debugger.</p>
<div>
<div><img class="js-progressiveMedia-image progressiveMedia-image" src="https://cdn-images-1.medium.com/max/800/1*3HKJjlIj8tChHNlre9WV9Q.png" /></div></div>
<p>Inspect our local variables on line 7:</p>
<ul>
<li>acc: {} because that’s Array.reduce()’s initial value (line 19).</li>
<li>key: “name” because it’s the first key from Object.keys(obj).</li>
<li>renamedObject: undefined</li></ul>
<p>Also notice that we can access keysMap and obj from the parent function’s scope.</p>
<p>Guess what renamedObject will be. Like in my <a class="markup--anchor markup--p-anchor" href="https://medium.com/front-end-hacking/immutably-rename-object-keys-in-javascript-5f6353c7b6dd" target="_blank">aforementioned post</a>, we’re using <a class="markup--anchor markup--p-anchor" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer" rel="noopener" target="_blank"><em>computed property names</em></a><em> </em>to dynamically assign renamedObject's key.</p>
<p>If keysMap[key] exists, use it. Otherwise, use the original object key. In this case, keysMap[key] is “firstName”.</p>
<div>
<div><img class="js-progressiveMedia-image progressiveMedia-image" src="https://cdn-images-1.medium.com/max/800/1*aYI7ss4IOWIipNsC40r9rg.png" /></div></div>
<p>That’s renamedObject's key, what about its corresponding value?</p>
<div>
<div><img class="js-progressiveMedia-image progressiveMedia-image" src="https://cdn-images-1.medium.com/max/800/1*GEBIVtNMWIuosMVq4FLMQw.png" /></div></div>
<p>It’s obj[key]: "Bobo". Hit the next debugger and check it out.</p>
<div>
<div> </div>
<div> </div></div>
<div>
<div><img class="js-progressiveMedia-image progressiveMedia-image" src="https://cdn-images-1.medium.com/max/800/1*XMGM2FxuNscmq_imZf8Nmw.png" /></div></div>
<p>renamedObject is now { firstName: “Bobo” }.</p>
<div>
<div> </div>
<div> </div></div>
<div>
<div><img class="js-progressiveMedia-image progressiveMedia-image" src="https://cdn-images-1.medium.com/max/800/1*z8HEVhgr8-e5HFrtAK5lzg.png" /></div></div>
<p>Now using the <em>spread</em> operator, we’ll merge acc and renamedObject. Remember that acc is currently .reduce's initial value: an empty object.</p>
<p>So merging acc and renamedObject just results in a clone of renamedObject.</p>
<div>
<div> </div>
<div> </div></div>
<div>
<div><img class="js-progressiveMedia-image progressiveMedia-image" src="https://cdn-images-1.medium.com/max/800/1*Fw0QyV7VsU2UH-GtD-74WQ.png" /></div></div>
<p>Since we’re returning this object, however, it becomes acc in .reduce’s next iteration. Move to the next debugger to see this.</p>
<div>
<div> </div></div>
<div>
<div><img class="js-progressiveMedia-image progressiveMedia-image" src="https://cdn-images-1.medium.com/max/800/1*h0Lxhtw1trErPruUBKamfA.png" /></div></div>
<p>We’re inside .reduce's again, because there’s one more key to process. We see that acc is now { firstName: "Bobo" }.</p>
<p>The same process runs again, and renamedObject is properly created.</p>
<div>
<div> </div>
<div> </div></div>
<div>
<div><img class="js-progressiveMedia-image progressiveMedia-image" src="https://cdn-images-1.medium.com/max/800/1*OfKamMrGJLBIvY2WgQrlaA.png" /></div></div>
<p>This time, merging acc and renamedObject actually makes a difference.</p>
<div>
<div><img class="js-progressiveMedia-image progressiveMedia-image" src="https://cdn-images-1.medium.com/max/800/1*uMdN7mSsIhgvzJCceftUOw.png" /></div></div>
<p>Run past this debugger to return that object, and you’re done!</p>
<p>Here’s the final output:</p>
<div>
<div><img class="js-progressiveMedia-image progressiveMedia-image" src="https://cdn-images-1.medium.com/max/800/1*TpcJHEG6MUxazCkNnCg6AQ.png" /></div></div>
<p>Have fun renaming <strong>all the keys</strong>, until next time!</p>
https://drive.google.com/file/d/1ye2rxFF_f23GUbFcaj5kvv2I4wcGoQ-g/view?usp=drivesdk
Meeting Gervas Mfubusa
He has suggested meeting physically with Naiman Moshi, +255754710795 who is the manager of resourcing and training
For reference sake, Berwin Sengo +255764444644 is the Agile methodology coach.
He's offered to take our emails to book us meeting with Naiman Moshi via calendar. The physical meeting will take place on Monday. Time to be determined.
<p>Engelbart's research was directed at large scale knowledge work; for example, in the aircraft industry, the interactions between a major manufacturer and its contractors, subcontractors, and so on. Research and experimentation led to the following requirements:</p>
<ol>
<li><a href="https://www.w3.org/Architecture/NOTE-ioh-arch#mixdoc">Mixed Object Documents</a></li>
<li><a href="https://www.w3.org/Architecture/NOTE-ioh-arch#structdoc">Explicitly Structured Documents</a></li>
<li><a href="https://www.w3.org/Architecture/NOTE-ioh-arch#viewcontrol">View Control of Object's Form, Sequence, and Content</a></li>
<li><a href="https://www.w3.org/Architecture/NOTE-ioh-arch#hyperdoc">The Basic "Hyperdocument"</a></li>
<li><a href="https://www.w3.org/Architecture/NOTE-ioh-arch#backlink">Hyperdocument "Back-Link" Capability</a></li>
<li><a href="https://www.w3.org/Architecture/NOTE-ioh-arch#library-system">The Hyperdocument "Library System"</a></li>
<li><a href="https://www.w3.org/Architecture/NOTE-ioh-arch#hypermail">Hyperdocument Mail</a></li>
<li><a href="https://www.w3.org/Architecture/NOTE-ioh-arch#digsig">Personal Signature Encryption</a></li>
<li><a href="https://www.w3.org/Architecture/NOTE-ioh-arch#access-control">Access Control</a></li>
<li><a href="https://www.w3.org/Architecture/NOTE-ioh-arch#human-addr">Link Addresses That Are Readable and Interpretable by Humans</a></li>
<li><a href="https://www.w3.org/Architecture/NOTE-ioh-arch#alladdr">Every Object Addressable</a></li>
<li><a href="https://www.w3.org/Architecture/NOTE-ioh-arch#printlink">Hard-Copy Print Options to Show Address of Objects and Address Specification of Links</a></li></ol>
<html>
<body>
<!--StartFragment--><p style="color: rgb(0, 0, 0); font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Put succinctly, the observation is this:</p><blockquote style="color: rgb(0, 0, 0); font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">With a sufficient number of users of an API,<br>it does not matter what you promise in the contract:<br>all observable behaviors of your system<br>will be depended on by somebody.</blockquote><p style="color: rgb(0, 0, 0); font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Over the past couple years of doing low-level infrastructure migrations in one of the most complex software systems on the planet, I’ve made some observations about the differences between an interface and its implementations. We typically think of the interface as an abstraction for interacting with a system (like the steering wheel and pedals in a car), and the implementation as the way the system does its work (wheels and an engine). This is useful for a number of reasons, foremost among them that most useful systems rapidly become too complex for a single individual or group to completely understand, and abstractions are essential to managing that complexity.</p><p style="color: rgb(0, 0, 0); font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Defining the correct level of abstraction is a completely separate discussion (see Mythical Man-Month), but we like to think that once an abstraction is defined, it is concrete. In other words, an interface should theoretically provide a clear separation between consumers of a system and its implementers. In practice, this theory breaks down as the use of a system grows and its users start to rely upon implementation details intentionally exposed through the interface, or which they divine through regular use. Spolsky’s “Law of Leaky Abstractions” embodies consumers’ reliance upon internal implementation details.</p><p style="color: rgb(0, 0, 0); font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Taken to its logical extreme, this leads to the following observation, colloquially referred to as “The Law of Implicit Interfaces”: Given enough use, there is no such thing as a private implementation. That is, if an interface has enough consumers, they will collectively depend on every aspect of the implementation, intentionally or not. This effect serves to constrain changes to the implementation, which must now conform to both the explicitly documented interface, as well as the implicit interface captured by usage. We often refer to this phenomenon as "bug-for-bug compatibility."</p><p style="color: rgb(0, 0, 0); font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">The creation of the implicit interface usually happens gradually, and interface consumers generally aren’t aware as it’s happening. For example, an interface may make no guarantees about performance, yet consumers often come to expect a certain level of performance from its implementation. Those expectations become part of the implicit interface to a system, and changes to the system must maintain these performance characteristics to continue functioning for its consumers.</p><p style="color: rgb(0, 0, 0); font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Not all consumers depend upon the same implicit interface, but given enough consumers, the implicit interface will eventually exactly match the implementation. At this point, the interface has evaporated: the implementation has become the interface, and any changes to it will violate consumer expectations. With a bit of luck, widespread, comprehensive, and automated testing can detect these new expectations but not ameliorate them.</p><p style="color: rgb(0, 0, 0); font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Implicit interfaces result from the organic growth of large systems, and while we may wish the problem did not exist, designers and engineers would be wise to consider it when building and maintaining complex systems. So be aware of how the implicit interface constrains your system design and evolution, and know that for any reasonably popular system, the interface reaches much deeper than you think.</p><!--EndFragment-->
</body>
</html>
We still need to collaborate. How can we do that without forcing each other into services that we do not like?
Inspired by a recent ad I watched for [[LeaksID|https://leaksid.com]].
<iframe src="" width="100%" height="350px" frameborder=0></iframe>
Babe has given me a problem I have never encountered before: turning 103 color photos into black and white photos. Batch processing is quite a problem when you encounter it. I've found an app called [[Befunky|https://befunky.com]] that can help me with that.
Also noticed that photoshop doesn't seem to have a solution for this kind of problem. Batch processing may be a computationally expensive problem that few bother to deal with as far as graphics is concerned.
.. Licensed under the Apache License, Version 2.0 (the "License"); you may not
.. use this file except in compliance with the License. You may obtain a copy of
.. the License at
..
.. http://www.apache.org/licenses/LICENSE-2.0
..
.. Unless required by applicable law or agreed to in writing, software
.. distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
.. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
.. License for the specific language governing permissions and limitations under
.. the License.
.. _api/db/changes:
================
``/db/_changes``
================
.. http:get:: /{db}/_changes
:synopsis: Returns changes for the given database
Returns a sorted list of changes made to documents in the database, in time
order of application, can be obtained from the database's ``_changes``
resource. Only the most recent change for a given document is guaranteed to
be provided, for example if a document has had fields added, and then
deleted, an API client checking for changes will not necessarily receive
the intermediate state of added documents.
This can be used to listen for update and modifications to the database for
post processing or synchronization, and for practical purposes,
a continuously connected ``_changes`` feed is a reasonable approach for
generating a real-time log for most applications.
:param db: Database name
:<header Accept: - :mimetype:`application/json`
- :mimetype:`text/event-stream`
- :mimetype:`text/plain`
:<header Last-Event-ID: ID of the last events received by the server on a
previous connection. Overrides `since` query parameter.
:query array doc_ids: List of document IDs to filter the changes feed as
valid JSON array. Used with :ref:`_doc_ids <changes/filter/doc_ids>`
filter. Since `length of URL is limited`_, it is better to use
:post:`/{db}/_changes` instead.
:query boolean conflicts: Includes `conflicts` information in response.
Ignored if `include_docs` isn't ``true``. Default is ``false``.
:query boolean descending: Return the change results in descending sequence
order (most recent change first). Default is ``false``.
:query string feed: - **normal** Specifies :ref:`Normal Polling Mode
<changes/normal>`. All past changes are returned
immediately. *Default.*
- **longpoll** Specifies :ref:`Long Polling Mode
<changes/longpoll>`. Waits until at least one change
has occurred, sends the change, then closes the
connection. Most commonly used in conjunction with
``since=now``, to wait for the next change.
- **continuous** Sets :ref:`Continuous Mode
<changes/continuous>`. Sends a line of JSON per
event. Keeps the socket open until ``timeout``.
- **eventsource** Sets :ref:`Event Source Mode
<changes/eventsource>`. Works the same as Continuous
Mode, but sends the events in `EventSource
<http://dev.w3.org/html5/eventsource/>`_ format.
:query string filter: Reference to a :ref:`filter function <filterfun>`
from a design document that will filter whole stream emitting only
filtered events. See the section `Change Notifications in the book
CouchDB The Definitive Guide`_ for more information.
:query number heartbeat: Period in *milliseconds* after which an empty
line is sent in the results. Only applicable for :ref:`longpoll
<changes/longpoll>`, :ref:`continuous <changes/continuous>`, and
:ref:`eventsource <changes/eventsource>` feeds. Overrides any timeout
to keep the feed alive indefinitely. Default is ``60000``. May be
``true`` to use default value.
:query boolean include_docs: Include the associated document with each
result. If there are conflicts, only the winning revision is returned.
Default is ``false``.
:query boolean attachments: Include the Base64-encoded content of
:ref:`attachments <api/doc/attachments>` in the documents that
are included if `include_docs` is ``true``. Ignored if `include_docs`
isn't ``true``. Default is ``false``.
:query boolean att_encoding_info: Include encoding information in attachment
stubs if `include_docs` is ``true`` and the particular attachment is
compressed. Ignored if `include_docs` isn't ``true``.
Default is ``false``.
:query number last-event-id: Alias of `Last-Event-ID` header.
:query number limit: Limit number of result rows to the specified value
(note that using ``0`` here has the same effect as ``1``).
:query since: Start the results from the change immediately after the given
update sequence. Can be valid update sequence or ``now`` value.
Default is ``0``.
:query string style: Specifies how many revisions are returned in
the changes array. The default, ``main_only``, will only return
the current "winning" revision; ``all_docs`` will return all leaf
revisions (including conflicts and deleted former conflicts).
:query number timeout: Maximum period in *milliseconds* to wait for a change
before the response is sent, even if there are no results.
Only applicable for :ref:`longpoll <changes/longpoll>` or
:ref:`continuous <changes/continuous>` feeds.
Default value is specified by :config:option:`httpd/changes_timeout`
configuration option. Note that ``60000`` value is also the default
maximum timeout to prevent undetected dead connections.
:query string view: Allows to use view functions as filters. Documents
counted as "passed" for view filter in case if map function emits
at least one record for them.
See :ref:`changes/filter/view` for more info.
:>header Cache-Control: ``no-cache`` if changes feed is
:ref:`eventsource <changes/eventsource>`
:>header Content-Type: - :mimetype:`application/json`
- :mimetype:`text/event-stream`
- :mimetype:`text/plain; charset=utf-8`
:>header ETag: Response hash is changes feed is `normal`
:>header Transfer-Encoding: ``chunked``
:>json json last_seq: Last change update sequence
:>json number pending: Count of remaining items in the feed
:>json array results: Changes made to a database
:code 200: Request completed successfully
:code 400: Bad request
The ``results`` field of database changes:
:json array changes: List of document's leaves with single field ``rev``.
:json string id: Document ID.
:json json seq: Update sequence.
:json bool deleted: ``true`` if the document is deleted.
**Request**:
.. code-block:: http
GET /db/_changes?style=all_docs HTTP/1.1
Accept: application/json
Host: localhost:5984
**Response**:
.. code-block:: http
HTTP/1.1 200 OK
Cache-Control: must-revalidate
Content-Type: application/json
Date: Mon, 12 Aug 2013 00:54:58 GMT
ETag: "6ASLEKEMSRABT0O5XY9UPO9Z"
Server: CouchDB (Erlang/OTP)
Transfer-Encoding: chunked
{
"last_seq": "5-g1AAAAIreJyVkEsKwjAURZ-toI5cgq5A0sQ0OrI70XyppcaRY92J7kR3ojupaSPUUgotgRd4yTlwbw4A0zRUMLdnpaMkwmyF3Ily9xBwEIuiKLI05KOTW0wkV4rruP29UyGWbordzwKVxWBNOGMKZhertDlarbr5pOT3DV4gudUC9-MPJX9tpEAYx4TQASns2E24ucuJ7rXJSL1BbEgf3vTwpmedCZkYa7Pulck7Xt7x_usFU2aIHOD4eEfVTVA5KMGUkqhNZV-8_o5i",
"pending": 0,
"results": [
{
"changes": [
{
"rev": "2-7051cbe5c8faecd085a3fa619e6e6337"
}
],
"id": "6478c2ae800dfc387396d14e1fc39626",
"seq": "3-g1AAAAG3eJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MSGXAqSVIAkkn2IFUZzIkMuUAee5pRqnGiuXkKA2dpXkpqWmZeagpu_Q4g_fGEbEkAqaqH2sIItsXAyMjM2NgUUwdOU_JYgCRDA5ACGjQfn30QlQsgKvcjfGaQZmaUmmZClM8gZhyAmHGfsG0PICrBPmQC22ZqbGRqamyIqSsLAAArcXo"
},
{
"changes": [
{
"rev": "3-7379b9e515b161226c6559d90c4dc49f"
}
],
"deleted": true,
"id": "5bbc9ca465f1b0fcd62362168a7c8831",
"seq": "4-g1AAAAHXeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBMZc4EC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HqQ_kQG3qgSQqnoUtxoYGZkZG5uS4NY8FiDJ0ACkgAbNx2cfROUCiMr9CJ8ZpJkZpaaZEOUziBkHIGbcJ2zbA4hKsA-ZwLaZGhuZmhobYurKAgCz33kh"
},
{
"changes": [
{
"rev": "6-460637e73a6288cb24d532bf91f32969"
},
{
"rev": "5-eeaa298781f60b7bcae0c91bdedd1b87"
}
],
"id": "729eb57437745e506b333068fff665ae",
"seq": "5-g1AAAAIReJyVkE0OgjAQRkcwUVceQU9g-mOpruQm2tI2SLCuXOtN9CZ6E70JFmpCCCFCmkyTdt6bfJMDwDQNFcztWWkcY8JXyB2cu49AgFwURZGloRid3MMkEUoJHbXbOxVy6arc_SxQWQzRVHCuYHaxSpuj1aqbj0t-3-AlSrZakn78oeSvjRSIkIhSNiCFHbsKN3c50b02mURvEB-yD296eNOzzoRMRLRZ98rkHS_veGcC_nR-fGe1gaCaxihhjOI2lX0BhniHaA"
}
]
}
.. _length of URL is limited: http://stackoverflow.com/a/417184/965635
.. versionchanged:: 0.11.0 added ``include_docs`` parameter
.. versionchanged:: 1.2.0 added ``view`` parameter and special value `_view`
for ``filter`` one
.. versionchanged:: 1.3.0 ``since`` parameter could take `now` value to start
listen changes since current seq number.
.. versionchanged:: 1.3.0 ``eventsource`` feed type added.
.. versionchanged:: 1.4.0 Support ``Last-Event-ID`` header.
.. versionchanged:: 1.6.0 added ``attachments`` and ``att_encoding_info``
parameters
.. versionchanged:: 2.0.0 update sequences can be any valid json object
.. note::
If the specified replicas of the shards in any given since value are
unavailable, alternative replicas are selected, and the last known
checkpoint between them is used. If this happens, you might see changes
again that you have previously seen. Therefore, an application making use
of the `_changes` feed should be ‘idempotent’, that is, able to receive the
same data multiple times, safely.
.. warning::
Using the ``attachments`` parameter to include attachments in the changes
feed is not recommended for large attachment sizes. Also note that the
Base64-encoding that is used leads to a 33% overhead (i.e. one third) in
transfer size for attachments.
.. warning::
The results returned by `_changes` are partially ordered. In other words,
the order is not guaranteed to be preserved for multiple calls.
.. http:post:: /{db}/_changes
:synopsis: Returns changes for the given database for certain document IDs
Requests the database changes feed in the same way as
:get:`/{db}/_changes` does, but is widely used with
``?filter=_doc_ids`` query parameter and allows one to pass a larger list of
document IDs to filter.
**Request**:
.. code-block:: http
POST /recipes/_changes?filter=_doc_ids HTTP/1.1
Accept: application/json
Content-Length: 40
Content-Type: application/json
Host: localhost:5984
{
"doc_ids": [
"SpaghettiWithMeatballs"
]
}
**Response**:
.. code-block:: http
HTTP/1.1 200 OK
Cache-Control: must-revalidate
Content-Type: application/json
Date: Sat, 28 Sep 2013 07:23:09 GMT
ETag: "ARIHFWL3I7PIS0SPVTFU6TLR2"
Server: CouchDB (Erlang OTP)
Transfer-Encoding: chunked
{
"last_seq": "5-g1AAAAIreJyVkEsKwjAURZ-toI5cgq5A0sQ0OrI70XyppcaRY92J7kR3ojupaSPUUgotgRd4yTlwbw4A0zRUMLdnpaMkwmyF3Ily9xBwEIuiKLI05KOTW0wkV4rruP29UyGWbordzwKVxWBNOGMKZhertDlarbr5pOT3DV4gudUC9-MPJX9tpEAYx4TQASns2E24ucuJ7rXJSL1BbEgf3vTwpmedCZkYa7Pulck7Xt7x_usFU2aIHOD4eEfVTVA5KMGUkqhNZV8_o5i",
"pending": 0,
"results": [
{
"changes": [
{
"rev": "13-bcb9d6388b60fd1e960d9ec4e8e3f29e"
}
],
"id": "SpaghettiWithMeatballs",
"seq": "5-g1AAAAIReJyVkE0OgjAQRkcwUVceQU9g-mOpruQm2tI2SLCuXOtN9CZ6E70JFmpCCCFCmkyTdt6bfJMDwDQNFcztWWkcY8JXyB2cu49AgFwURZGloRid3MMkEUoJHbXbOxVy6arc_SxQWQzRVHCuYHaxSpuj1aqbj0t-3-AlSrZakn78oeSvjRSIkIhSNiCFHbsKN3c50b02mURvEB-yD296eNOzzoRMRLRZ98rkHS_veGcC_nR-fGe1gaCaxihhjOI2lX0BhniHaA"
}
]
}
.. _changes:
Changes Feeds
=============
.. _changes/normal:
Polling
-------
By default all changes are immediately returned within the JSON body::
GET /somedatabase/_changes HTTP/1.1
.. code-block:: javascript
{"results":[
{"seq":"1-g1AAAAF9eJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P__7MSGXAqSVIAkkn2IFUZzIkMuUAee5pRqnGiuXkKA2dpXkpqWmZeagpu_Q4g_fGEbEkAqaqH2sIItsXAyMjM2NgUUwdOU_JYgCRDA5ACGjQfn30QlQsgKvcTVnkAovI-YZUPICpBvs0CAN1eY_c","id":"fresh","changes":[{"rev":"1-967a00dff5e02add41819138abb3284d"}]},
{"seq":"3-g1AAAAG3eJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MSGXAqSVIAkkn2IFUZzIkMuUAee5pRqnGiuXkKA2dpXkpqWmZeagpu_Q4g_fGEbEkAqaqH2sIItsXAyMjM2NgUUwdOU_JYgCRDA5ACGjQfn30QlQsgKvcjfGaQZmaUmmZClM8gZhyAmHGfsG0PICrBPmQC22ZqbGRqamyIqSsLAAArcXo","id":"updated","changes":[{"rev":"2-7051cbe5c8faecd085a3fa619e6e6337CFCmkyTdt6bfJMDwDQNFcztWWkcY8JXyB2cu49AgFwURZGloRid3MMkEUoJHbXbOxVy6arc_SxQWQzRVHCuYHaxSpuj1aqbj0t-3-AlSrZakn78oeSvjRSIkIhSNiCFHbsKN3c50b02mURvEB-yD296eNOzzoRMRLRZ98rkHS_veGcC_nR-fGe1gaCaxihhjOI2lX0BhniHaA","id":"deleted","changes":[{"rev":"2-eec205a9d413992850a6e32678485900"}],"deleted":true}
],
"last_seq":"5-g1AAAAIreJyVkEsKwjAURZ-toI5cgq5A0sQ0OrI70XyppcaRY92J7kR3ojupaSPUUgotgRd4yTlwbw4A0zRUMLdnpaMkwmyF3Ily9xBwEIuiKLI05KOTW0wkV4rruP29UyGWbordzwKVxWBNOGMKZhertDlarbr5pOT3DV4gudUC9-MPJX9tpEAYx4TQASns2E24ucuJ7rXJSL1BbEgf3vTwpmedCZkYa7Pulck7Xt7x_usFU2aIHOD4eEfVTVA5KMGUkqhNZV-8_o5i",
"pending": 0}
``results`` is the list of changes in sequential order. New and changed
documents only differ in the value of the rev; deleted documents include the
``"deleted": true`` attribute. (In the ``style=all_docs mode``, deleted applies
only to the current/winning revision. The other revisions listed might be
deleted even if there is no deleted property; you have to ``GET`` them
individually to make sure.)
``last_seq`` is the update sequence of the last update returned (Equivalent
to the last item in the results).
Sending a ``since`` param in the query string skips all changes up to and
including the given update sequence:
.. code-block:: http
GET /somedatabase/_changes?since=4-g1AAAAHXeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBMZc4EC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HqQ_kQG3qgSQqnoUtxoYGZkZG5uS4NY8FiDJ0ACkgAbNx2cfROUCiMr9CJ8ZpJkZpaaZEOUziBkHIGbcJ2zbA4hKsA-ZwLaZGhuZmhobYurKAgCz33kh HTTP/1.1
The return structure for ``normal`` and ``longpoll`` modes is a JSON
array of changes objects, and the last update sequence.
In the return format for ``continuous`` mode, the server sends a ``CRLF``
(carriage-return, linefeed) delimited line for each change. Each line
contains the `JSON object` described above.
You can also request the full contents of each document change (instead
of just the change notification) by using the ``include_docs`` parameter.
.. code-block:: javascript
{
"last_seq": "5-g1AAAAIreJyVkEsKwjAURZ-toI5cgq5A0sQ0OrI70XyppcaRY92J7kR3ojupaSPUUgotgRd4yTlwbw4A0zRUMLdnpaMkwmyF3Ily9xBwEIuiKLI05KOTW0wkV4rruP29UyGWbordzwKVxWBNOGMKZhertDlarbr5pOT3DV4gudUC9-MPJX9tpEAYx4TQASns2E24ucuJ7rXJSL1BbEgf3vTwpmedCZkYa7Pulck7Xt7x_usFU2aIHOD4eEfVTVA5KMGUkqhNZV-8_o5i",
"pending": 0,
"results": [
{
"changes": [
{
"rev": "2-eec205a9d413992850a6e32678485900"
}
],
"deleted": true,
"id": "deleted",
"seq": "5-g1AAAAIReJyVkE0OgjAQRkcwUVceQU9g-mOpruQm2tI2SLCuXOtN9CZ6E70JFmpCCCFCmkyTdt6bfJMDwDQNFcztWWkcY8JXyB2cu49AgFwURZGloRid3MMkEUoJHbXbOxVy6arc_SxQWQzRVHCuYHaxSpuj1aqbj0t-3-AlSrZakn78oeSvjRSIkIhSNiCFHbsKN3c50b02mURvEByD296eNOzzoRMRLRZ98rkHS_veGcC_nR-fGe1gaCaxihhjOI2lX0BhniHaA",
}
]
}
.. _changes/longpoll:
Long Polling
------------
The `longpoll` feed, probably most applicable for a browser, is a more
efficient form of polling that waits for a change to occur before the response
is sent. `longpoll` avoids the need to frequently poll CouchDB to discover
nothing has changed!
The request to the server will remain open until a change is made on the
database and is subsequently transferred, and then the connection will close.
This is low load for both server and client.
The response is basically the same JSON as is sent for the `normal` feed.
Because the wait for a change can be significant you can set a
timeout before the connection is automatically closed (the
``timeout`` argument). You can also set a heartbeat interval (using
the ``heartbeat`` query argument), which sends a newline to keep the
connection active.
.. _changes/continuous:
Continuous
----------
Continually polling the CouchDB server is not ideal - setting up new HTTP
connections just to tell the client that nothing happened puts unnecessary
strain on CouchDB.
A continuous feed stays open and connected to the database until explicitly
closed and changes are sent to the client as they happen, i.e. in near
real-time.
As with the `longpoll` feed type you can set both the timeout and heartbeat
intervals to ensure that the connection is kept open for new changes
and updates.
The continuous feed's response is a little different than the other feed types
to simplify the job of the client - each line of the response is either empty
or a JSON object representing a single change, as found in the normal feed's
results.
.. code-block:: http
GET /somedatabase/_changes?feed=continuous HTTP/1.1
.. code-block:: javascript
{"seq":"1-g1AAAAF9eJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MSGXAqSVIAkkn2IFUZzIkMuUAee5pRqnGiuXkKA2dpXkpqWmZeagpu_Q4g_fGEbEkAqaqH2sIItsXAyMjM2NgUUwdOU_JYgCRDA5ACGjQfn30QlQsgKvcTVnkAovI-YZUPICpBvs0CAN1eY_c","id":"fresh","changes":[{"rev":"5-g1AAAAHxeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBOZcoEC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HkV_kkGyZWqSEXH6E0D666H6GcH6DYyMzIyNTUnwRR4LkGRoAFJAg-YjwiMtOdXCwJyU8ICYtABi0n6EnwzSzIxS00yI8hPEjAMQM-5nJTIQUPkAovI_UGUWAA0SgOI","id":"updated","changes":[{"rev":"2-7051cbe5c8faecd085a3fa619e6e6337"}]}
{"seq":"3-g1AAAAHReJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBOZcoEC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HkV_kkGyZWqSEXH6E0D660H6ExlwqspjAZIMDUAKqHA-yCZGiEuTUy0MzEnxL8SkBRCT9iPcbJBmZpSaZkKUmyFmHICYcZ-wux9AVIJ8mAUABgp6XQ","id":"deleted","changes":[{"rev":"2-eec205a9d413992850a6e32678485900"}],"deleted":true}
... tum tee tum ...
{"seq":"6-g1AAAAIreJyVkEsKwjAURWMrqCOXoCuQ9MU0OrI70XyppcaRY92J7kR3ojupaVNopRQsgRd4yTlwb44QmqahQnN7VjpKImAr7E6Uu4eAI7EoiiJLQx6c3GIiuVJcx93vvQqxdFPsaguqLAY04YwpNLtYpc3RatXPJyW__-EFllst4D_-UPLXmh9VPAaICaEDUtixm-jmLie6N30YqTeYDenDmx7e9GwyYRODNuu_MnnHyzverV6AMkPkAMfHO1rdUAKUkqhLZV-_0o5j","id":"updated","changes":[{"rev":"3-825cb35de44c433bfb2df415563a19de"}]}
Obviously, `... tum tee tum ...` does not appear in the actual response, but
represents a long pause before the change with seq 6 occurred.
.. _Change Notifications in the book CouchDB The Definitive Guide: http://guide.couchdb.org/draft/notifications.html
.. _changes/eventsource:
Event Source
------------
The `eventsource` feed provides push notifications that can be consumed in
the form of DOM events in the browser. Refer to the `W3C eventsource
specification`_ for further details. CouchDB also honours the ``Last-Event-ID``
parameter.
.. code-block:: http
GET /somedatabase/_changes?feed=eventsource HTTP/1.1
.. code-block:: javascript
// define the event handling function
if (window.EventSource) {
var source = new EventSource("/somedatabase/_changes?feed=eventsource");
source.onerror = function(e) {
alert('EventSource failed.');
};
var results = [];
var sourceListener = function(e) {
var data = JSON.parse(e.data);
results.push(data);
};
// start listening for events
source.addEventListener('message', sourceListener, false);
// stop listening for events
source.removeEventListener('message', sourceListener, false);
}
If you set a heartbeat interval (using the ``heartbeat`` query argument),
CouchDB will send a ``hearbeat`` event that you can subscribe to with:
.. code-block:: javascript
source.addEventListener('heartbeat', function () {}, false);
This can be monitored by the client application to restart the EventSource
connection if needed (i.e. if the TCP connection gets stuck in a half-open
state).
.. note::
EventSource connections are subject to cross-origin resource sharing
restrictions. You might need to configure :ref:`CORS support
<cors>` to get the EventSource to work in your application.
.. _W3C eventsource specification: http://www.w3.org/TR/eventsource/
.. _changes/filter:
Filtering
=========
You can filter the contents of the changes feed in a number of ways. The
most basic way is to specify one or more document IDs to the query. This
causes the returned structure value to only contain changes for the
specified IDs. Note that the value of this query argument should be a
JSON formatted array.
You can also filter the ``_changes`` feed by defining a filter function
within a design document. The specification for the filter is the same
as for replication filters. You specify the name of the filter function
to the ``filter`` parameter, specifying the design document name and
:ref:`filter name <filterfun>`. For example:
.. code-block:: http
GET /db/_changes?filter=design_doc/filtername HTTP/1.1
Additionally, there are couple of builtin filters are available and described
below.
.. _changes/filter/doc_ids:
_doc_ids
--------
This filter accepts only changes for documents which ID in specified in
``doc_ids`` query parameter or payload's object array. See
:post:`/{db}/_changes` for an example.
.. _changes/filter/selector:
_selector
---------
.. versionadded:: 2.0
This filter accepts only changes for documents which match a specified
selector, defined using the same :ref:`selector
syntax <find/selectors>` used for :ref:`_find <api/db/_find>`.
This is significantly more efficient than using a JavaScript filter
function and is the recommended option if filtering on document attributes only.
Note that, unlike JavaScript filters, selectors do not have access to the
request object.
**Request**:
.. code-block:: http
POST /recipes/_changes?filter=_selector HTTP/1.1
Content-Type: application/json
Host: localhost:5984
{
"selector": { "_id": { "$regex": "^_design/" } }
}
**Response**:
.. code-block:: http
HTTP/1.1 200 OK
Cache-Control: must-revalidate
Content-Type: application/json
Date: Tue, 06 Sep 2016 20:03:23 GMT
Etag: "1H8RGBCK3ABY6ACDM7ZSC30QK"
Server: CouchDB (Erlang OTP/18)
Transfer-Encoding: chunked
{
"last_seq": "11-g1AAAAIreJyVkEEKwjAQRUOrqCuPoCeQZGIaXdmbaNIk1FLjyrXeRG-iN9Gb1LQRaimFlsAEJnkP_s8RQtM0VGhuz0qTmABfYXdI7h4CgeSiKIosDUVwcotJIpQSOmp_71TIpZty97OgymJAU8G5QrOLVdocrVbdfFzy-wYvcbLVEvrxh5K_NlJggIhSNiCFHbmJbu5yonttMoneYD6kD296eNOzzoRNBNqse2Xyjpd3vP96AcYNTQY4Pt5RdTOuHIwCY5S0qewLwY6OaA",
"pending": 0,
"results": [
{
"changes": [
{
"rev": "10-304cae84fd862832ea9814f02920d4b2"
}
],
"id": "_design/ingredients",
"seq": "8-g1AAAAHxeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBOZcoEC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HkV_kkGyZWqSEXH6E0D666H6GcH6DYyMzIyNTUnwRR4LkGRoAFJAg-ZnJTIQULkAonI_ws0GaWZGqWkmRLkZYsYBiBn3Cdv2AKIS7ENWsG2mxkampsaGmLqyAOYpgEo"
},
{
"changes": [
{
"rev": "123-6f7c1b7c97a9e4f0d22bdf130e8fd817"
}
],
"deleted": true,
"id": "_design/cookbook",
"seq": "9-g1AAAAHxeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBOZcoEC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HkV_kkGyZWqSEXH6E0D661F8YWBkZGZsbEqCL_JYgCRDA5ACGjQ_K5GBgMoFEJX7EW42SDMzSk0zIcrNEDMOQMy4T9i2BxCVYB-ygm0zNTYyNTU2xNSVBQDnK4BL"
},
{
"changes": [
{
"rev": "6-5b8a52c22580e922e792047cff3618f3"
}
],
"deleted": true,
"id": "_design/meta",
"seq": "11-g1AAAAIReJyVkE0OgjAQRiegUVceQU9g-mOpruQm2tI2SLCuXOtN9CZ6E70JFmpCCCFCmkyTdt6bfJMDwDQNFcztWWkcY8JXyB2cu49AgFwURZGloQhO7mGSCKWEjtrtnQq5dFXufhaoLIZoKjhXMLtYpc3RatXNxyW_b_ASJVstST_-UPLXRgpESEQpG5DCjlyFm7uc6F6bTKI3iA_Zhzc9vOlZZ0ImItqse2Xyjpd3vDMBfzo_vrPawLiaxihhjOI2lX0BirqHbg"
}
]
}
.. _changes/filter/selector/missing:
Missing selector
################
If the selector object is missing from the request body,
the error message is similar to the following example:
.. code-block:: json
{
"error": "bad request",
"reason": "Selector must be specified in POST payload"
}
.. _changes/filter/selector/invalidjson:
Not a valid JSON object
#######################
If the selector object is not a well-formed JSON object,
the error message is similar to the following example:
.. code-block:: json
{
"error": "bad request",
"reason": "Selector error: expected a JSON object"
}
.. _changes/filter/selector/invalidselector:
Not a valid selector
####################
If the selector object does not contain a valid selection expression,
the error message is similar to the following example:
.. code-block:: json
{
"error": "bad request",
"reason": "Selector error: expected a JSON object"
}
.. _changes/filter/design:
_design
-------
The ``_design`` filter accepts only changes for any design document within the
requested database.
**Request**:
.. code-block:: http
GET /recipes/_changes?filter=_design HTTP/1.1
Accept: application/json
Host: localhost:5984
**Response**:
.. code-block:: http
HTTP/1.1 200 OK
Cache-Control: must-revalidate
Content-Type: application/json
Date: Tue, 06 Sep 2016 12:55:12 GMT
ETag: "ARIHFWL3I7PIS0SPVTFU6TLR2"
Server: CouchDB (Erlang OTP)
Transfer-Encoding: chunked
{
"last_seq": "11-g1AAAAIreJyVkEEKwjAQRUOrqCuPoCeQZGIaXdmbaNIk1FLjyrXeRG-iN9Gb1LQRaimFlsAEJnkP_s8RQtM0VGhuz0qTmABfYXdI7h4CgeSiKIosDUVwcotJIpQSOmp_71TIpZty97OgymJAU8G5QrOLVdocrVbdfFzy-wYvcbLVEvrxh5K_NlJggIhSNiCFHbmJbu5yonttMoneYD6kD296eNOzzoRNBNqse2Xyjpd3vP96AcYNTQY4Pt5RdTOuHIwCY5S0qewLwY6OaA",
"pending": 0,
"results": [
{
"changes": [
{
"rev": "10-304cae84fd862832ea9814f02920d4b2"
}
],
"id": "_design/ingredients",
"seq": "8-g1AAAAHxeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBOZcoEC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HkV_kkGyZWqSEXH6E0D666H6GcH6DYyMzIyNTUnwRR4LkGRoAFJAg-ZnJTIQULkAonI_ws0GaWZGqWkmRLkZYsYBiBn3Cdv2AKIS7ENWsG2mxkampsaGmLqyAOYpgEo"
},
{
"changes": [
{
"rev": "123-6f7c1b7c97a9e4f0d22bdf130e8fd817"
}
],
"deleted": true,
"id": "_design/cookbook",
"seq": "9-g1AAAAHxeJzLYWBg4MhgTmHgz8tPSTV0MDQy1zMAQsMcoARTIkOS_P___7MymBOZcoEC7MmJKSmJqWaYynEakaQAJJPsoaYwgE1JM0o1TjQ3T2HgLM1LSU3LzEtNwa3fAaQ_HkV_kkGyZWqSEXH6E0D661F8YWBkZGZsbEqCL_JYgCRDA5ACGjQ_K5GBgMoFEJX7EW42SDMzSk0zIcrNEDMOQMy4T9i2BxCVYB-ygm0zNTYyNTU2xNSVBQDnK4BL"
},
{
"changes": [
{
"rev": "6-5b8a52c22580e922e792047cff3618f3"
}
],
"deleted": true,
"id": "_design/meta",
"seq": "11-g1AAAAIReJyVkE0OgjAQRiegUVceQU9g-mOpruQm2tI2SLCuXOtN9CZ6E70JFmpCCCFCmkyTdt6bfJMDwDQNFcztWWkcY8JXyB2cu49AgFwURZGloQhO7mGSCKWEjtrtnQq5dFXufhaoLIZoKjhXMLtYpc3RatXNxyW_b_ASJVstST_-UPLXRgpESEQpG5DCjlyFm7uc6F6bTKI3iA_Zhzc9vOlZZ0ImItqse2Xyjpd3vDMBfzo_vrPawLiaxihhjOI2lX0BirqHbg"
}
]
}
.. _changes/filter/view:
_view
-----
.. versionadded:: 1.2
The special filter ``_view`` allows to use existing
:ref:`map function <mapfun>` as the :ref:`filter <filterfun>`. If the map
function emits anything for the processed document it counts as accepted and
the changes event emits to the feed. For most use-practice cases `filter`
functions are very similar to `map` ones, so this feature helps to reduce
amount of duplicated code.
.. warning::
While :ref:`map functions <mapfun>` doesn't process the design documents,
using ``_view`` filter forces them to do this. You need to be sure, that
they are ready to handle documents with *alien* structure without panic
crush.
.. note::
Using ``_view`` filter doesn't queries the view index files, so you cannot
use common :ref:`view query parameters <api/ddoc/view>` to additionally
filter the changes feed by index key. Also, CouchDB doesn't returns
the result instantly as it does for views - it really uses the specified
map function as filter.
Moreover, you cannot make such filters dynamic e.g. process the request
query parameters or handle the :ref:`userctx_object` - the map function is
only operates with the document.
**Request**:
.. code-block:: http
GET /recipes/_changes?filter=_view&view=ingredients/by_recipe HTTP/1.1
Accept: application/json
Host: localhost:5984
**Response**:
.. code-block:: http
HTTP/1.1 200 OK
Cache-Control: must-revalidate
Content-Type: application/json
Date: Tue, 06 Sep 2016 12:57:56 GMT
ETag: "ARIHFWL3I7PIS0SPVTFU6TLR2"
Server: CouchDB (Erlang OTP)
Transfer-Encoding: chunked
{
"last_seq": "11-g1AAAAIreJyVkEEKwjAQRUOrqCuPoCeQZGIaXdmbaNIk1FLjyrXeRG-iN9Gb1LQRaimFlsAEJnkP_s8RQtM0VGhuz0qTmABfYXdI7h4CgeSiKIosDUVwcotJIpQSOmp_71TIpZty97OgymJAU8G5QrOLVdocrVbdfFzy-wYvcbLVEvrxh5K_NlJggIhSNiCFHbmJbu5yonttMoneYD6kD296eNOzzoRNBNqse2Xyjpd3vP96AcYNTQY4Pt5RdTOuHIwCY5S0qewLwY6OaA",
"results": [
{
"changes": [
{
"rev": "13-bcb9d6388b60fd1e960d9ec4e8e3f29e"
}
],
"id": "SpaghettiWithMeatballs",
"seq": "11-g1AAAAIReJyVkE0OgjAQRiegUVceQU9g-mOpruQm2tI2SLCuXOtN9CZ6E70JFmpCCCFCmkyTdt6bfJMDwDQNFcztWWkcY8JXyB2cu49AgFwURZGloQhO7mGSCKWEjtrtnQq5dFXufhaoLIZoKjhXMLtYpc3RatXNxyW_b_ASJVstST_-UPLXRgpESEQpG5DCjlyFm7uc6F6bTKI3iA_Zhzc9vOlZZ0ImItqse2Xyjpd3vDMBfzo_vrPawLiaxihhjOI2lX0BirqHbg"
}
]
}
Why is knowledge management important?
Challenge: Across organizations, the need to share and retain knowledge is vital to the consistent and timely operations. However, all too often, the knowledge held by employees, contractors, and systems is not widely shared, entrenching vendors and creating scenarios where employees are not continually improving processes.
This is especially relevant as a majority of the workforce is at an age where they are closer to retirement than to the start of their careers. ''There is the great potential for decades of knowledge to “walk out the door” in the coming decades.''
Conversely, in other places around the world (like in Sub Saharan Africa), there is the opposite problem: the rise in young and inexperienced workers who desperately need the practical knowledge possessed by a a relatively smaller pool of senior mentors to set themselves up for work.
"A successful startup without a strategic advantage is just a validated business model vulnerable to copycat companies looking for a market entry point."
Every early-stage startup must identify and evaluate a strategic advantage
https://techcrunch.com/2021/05/14/every-early-stage-startup-must-identify-and-evaluate-a-strategic-advantage/?utm_source=pocket-app&utm_medium=share
<<<
...in an age of explosive and potentially chaotic growth of
information on the web, [there is a need] for new strategies of “curation” of knowledge toward effective future problem-solving.
<<<
* [[NUTRIMAM|https://drive.google.com/drive/folders/1YgIywJWbfjJx3ZUJfY4PzJbwMiZSfJA8?usp=sharing]]
Truly domain knowledge is important. Found a person on the sideproject Reddit saying he's making $1,500 a month from his tool that imports API data into a spreadsheet for analysis.
Having an idea for a project is good. But most of the time, many good ideas don't materialize. Why?
I think this is the selling point we could use for small users: how to complete more projects by helping them manage themselves better.
<p><p><strong>Indirect Monetisation</strong></p></p><p><p>Indirect
monetisation takes an indirect approach to deliver value from APIs
instead of generating revenue from direct methods such as API access or
advertising. This model too has multiple sub-models: Content
Syndication, Content Acquisition, Internal-Consumer, Internal
Non-Consumer, B2B Partner, B2B Customer, and Business Expansion.</p></p><p><ul>
<li><strong>Content Syndication</strong> – Distribution of your content by a third-party through APIs is called content syndication. Examples of this model include Twitter and NY Times.</li>
<li><strong>Content Acquisition</strong> – In this model, a third-party submits content through APIs to attract customers to you. Examples of this model include <a class="tc-tiddlylink tc-tiddlylink-resolves" href="https://maarfapad.cloudno.de/wiki/home#YouTube">YouTube</a> and Twitter.</li>
<li><strong>Internal-Consumer</strong> – Your employees use APIs to
create a customer-facing capability for your business, such as
developing mobile apps or e-commerce web portals. Examples of this model
include Netflix and Citibank.</li>
<li><strong>Internal Non-Consumer</strong> – In this model, the internal use of APIs enables improved productivity, meeting regulatory requirements, and managing portals.</li>
<li><strong>B2B Partner</strong> – Your partners use APIs to integrate your enterprise. Examples of this model include government agencies sharing information.</li>
<li><strong>B2B Customer</strong> – Your customers use APIs to integrate your enterprise. An example of this model is Walmart.</li>
<li> <strong>Business Expansion</strong> – This model is used to expand
to new geographies, demographics; and offer new products or upsell new
capabilities. A relevant example of this business model is Facebook.</li></ul></p>
Facts, raw data, statistics
[[Source|https://medium.com/@congogenius/ingenious-city-une-plateforme-ambitieuse-510b50f13f17]]
After telling you about Kobo Hub, we are continuing our quest for organizations that support and accompany entrepreneurship made in Congo and this time talking to you about the incubation platform, Ingenious City.
Ingenious City is above all a group of entrepreneurs who want to give back to the community the contribution it has made in their lives. They have thus entrusted themselves with the mission of participating in the strengthening of the Congolese entrepreneurial ecosystem and making it shine at the pan-African and global level.
Ingenious City is the first incubator platform in the DRC. Its first goal is to bring together all the players in Congolese entrepreneurship in one place.
This entity thus represents THE solution for incubators and startups but also the ideal place to develop an innovative idea.
Ingenious City offers the following program:
On the one hand, the pre-incubation which includes 1 month to test the business idea and validate the business model, on the other hand the incubation which includes 6 months to build an MVP and generate the first pulls. Finally, the platform also offers acceleration, which itself includes 6 months to develop, finance and structure the business.
The Ingenious City community today represents:
Partners and sponsors; several incubators; around forty start-ups, VSEs and SMEs as well as around fifty mentors.
To submit a project to the organization, an "application" section is available on the entity's official website. In this context, a questionnaire is made available to project leaders, allowing the originality, viability and progress of their idea to be assessed.
The Innerwiki Plugin enables TiddlyWiki to embed a modified copy of itself (an "innerwiki"). The primary motivation is to be able to produce screenshot illustrations that are automatically up-to-date with the appearance of TiddlyWiki as it changes over time, or to produce the same screenshot in different languages.
In the browser, innerwikis are displayed as an embedded iframe. Under Node.js [[Google's Puppeteer|https://pptr.dev/]] is used to load the innerwikis as off-screen web pages and then snapshot them as a PNG image.
See the demo at [ext[https://tiddlywiki.com/plugins/tiddlywiki/innerwiki|plugins/tiddlywiki/innerwiki]]
<<<
Here’s the essence of why most companies – startups and big corporations alike – struggle with innovation: it’s because they measure their progress and success using SWAG (stupid wild ass guesses) over science.
[[Source|https://www.linkedin.com/pulse/lean-startups-new-tool-innovation-accounting-game-changing-kaplan/]]
<<<
Ries defines innovation accounting as “a way of evaluating progress when all the metrics typically used in an established company (revenue, customers, ROI, market share) are effectively zero.” Said another way, innovation accounting quantifies the market value of new business opportunities that are fundamentally ambiguous and uncertain – the breakthroughs and disruptors.
Most companies use traditional financial metrics like market share or return on investment (ROI) to value innovation opportunities and investments. According to Ries, this basic approach is the source of many failed innovation programs since teams are encouraged to “pad predictions” as they vie for funding. By creating “fantasy plans,” teams get more money up front, without a meaningful articulation of the underlying variables that will lead to success.
Ries argues that a new approach is needed, one that targets leading indicators (the things at predict market success) and that gives executives a way to link long-term growth to a system that follows a clear process for funding innovation. Ries describes three levels of innovation accounting, each increasingly more sophisticated as a new venture or startup evolves.
# ''Level 1: Customer Focused Dashboards''<div>
Most innovation teams start with market forecasts and work backwards from there. But as Ries demonstrated in The Lean Startup, a more effective approach to building a new business is to identify and test specific assumptions – a ground up approach.
Applied to Level 1 Accounting, Ries recommends that teams first create simple dashboards that include a few metrics that are both actionable and measurable to help them get going. Examples include:
<ul>
<li> Customer discussions (Number of customers talked to each week)</li>
<li> Customer feedback (Number of customers that provide product feedback each week)</li>
<li> Conversion rates (Number of customers that try the product)</li>
<li> Per Customer Revenue (Amount a customer is willing to pay)</li>
</ul>
The goal of Level 1 Innovation Accounting is to create a measurable cadence in which real live customers “flow through the experiment factory.” Rather than creating a product and unveiling it with a “ta da” at a big launch party, Level 1 dashboards ensure early focus on the things that really matter to validate the business opportunity by measuring customer input along the way.
</div>
# ''Level 2: Leap of Faith Assumptions Dashboards''<div>
Level 2 Innovation Accounting starts when a team identifies its “Leap of Faith Assumptions” (LOFAs). LOFAs are essentially the most fundamental assumptions that underlie the business opportunity. The goal is to test and validate (or invalidate) these LOFAs through rapid learning activities like A/B tests.
Level 2 Innovation Accounting involves creating dashboards to track and measure the LOFAs that drive the business case. Ries calls the metrics that go into this dashboard “input metrics” since, collectively, they represent the critical inputs that make-up a successful business plan. The dashboard should be simple yet detailed enough to be considered robust by anyone in the finance department.
Ries recommends focusing on two categories of metrics for these dashboards, Value Hypothesis and Growth Hypothesis Metrics. Value Hypothesis Metrics track and measure “the specific customer behavior that indicates delight with the product.” Examples include:
<ul>
<li>Repeat purchase rates</li>
<li>Retention rates</li>
<li>Willingness to pay a premium price</li>
<li>Referral rates</li>
</ul>
Growth Hypothesis Metrics track and measure the “specific customer behavior that will cause us to acquire more customers.” Growth metrics should ideally focus on what Ries calls the law of sustainable growth – that new customers come from the actions of past customers. Example include:
<ul>
<li>Word of mouth referrals</li>
<li>Ability to take revenue from one customer and invest it into a new customer acquisition</li>
<li>Ability to recruit new customers as a side effect of normal usage</li>
</ul>
The goal is to identify what needs to be done to achieve the measurable thresholds where each of these variables can grow sustainably on their own. When these thresholds are achieved, it indicates product-market fit has also been achieved and the business is ready to scale.
</div>
# ''Level 3: Net Present Value Dashboards''<div>
Level 3 Innovation Accounting is the holy grail of valuing new business opportunities since the approach focuses on quantifying future success. Most traditional NPV models rely on pro forma forecasts based upon broad based assumptions around market size, market share, cost of goods sold, etc. – arguably the SWAGs that are responsible for the fantasy plans that corrupt most innovation portfolios.
Level 3 NPV Dashboards, however, aggregate specific metrics that represent the most important drivers of the long-term business model itself. Metrics on NPV Dashboards can include the same ones as used in Level 2 Innovation Accounting focused on testing LOFAs. The difference in Level 3 accounting is that everything rolls up into a real-time view of the financials of the business.
The good news is that since most companies already use Net Present Value (NPV) in weighing innovation investment opportunities, they’re already familiar with how they work. Level 3 NPV Dashboards are structured the same way, but there’s a subtle yet significant difference between traditional NPV assessments and those involved in Innovation Accounting.
In Innovation Accounting, NPV dashboards focus on leading indicators of business success and real-time data that clearly outline the venture’s progress over time. For example, if a new venture is going to market using a Freemium business model like Dropbox, LinkedIn or Hulu, a set of customer-focused metrics can be applied to quantify progress and forecast success:
<ul>
<li>Number of visitors</li>
<li>Percent of visitors that sign-up for free accounts and become users</li>
<li>Percent of users that pay money</li>
<li>Amount of money paid by each user</li>
</ul>
Alternatively, if a new venture is creating a marketplace business model like eBay, Airbnb, or an App store that includes buyers and sellers, a different set of metrics may be needed:
<ul>
<li>Number of buyers and sellers</li>
<li>Number of product listings</li>
<li>Number of transactions</li>
<li>Revenue per transaction</li>
</ul>
Ries says that even “small improvements in a key conversion rate can take the business from x to 2x to 10x in dollar terms” and that “everything should be translated into future impact–and its attendant cash flow.”
Most corporate ventures and startup teams update their forecasts and business plans on a periodic basis (usually before a big presentation). They use their spreadsheets and PowerPoints to pitch their business, not run their business. NPV Dashboards allow teams to run and re-run a full business case in real-time on a continuous basis. Since every customer experiment and A/B test results in new data, NPV Dashboards provide teams with the ability to instantly see the implications on the business model – the “direct translation of learning into financial impact” according to Ries.
From an innovation portfolio management view, NPV Dashboards allow executives or investors to do an apples to apples comparison between two or more new ventures or startups, even those focused on different markets or in different industries. Progress, growth rates, and projections are equalized so that the financial value of opportunities can be compared regardless of the different ages or strategies of the business ventures.
In today’s data-driven world where 92% of companies measure their CEOs’ success based on strategy development and execution, there’s a disconnect when it comes to quantifying the value created from innovation. Perhaps the reason that 65% of companies say culture is innovation’s biggest success factor is because the innovation process feels much more like SWAG than science. Management guru Peter Drucker once said, “what’s measured improves.” The problem today is that most companies aren’t doing it in a systematic way.
</div>
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
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Innovation Peer Podcast notes'>>
</div>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'InnovationPeer'>>
</div>
! The Innovator's Weekly Digest
!!!! Issue #1 <<now "DDth MMM YYYY">>
!!! WFH till 2021. Now what? 🙆♂
Many workplaces around the world [[have decided to tell their employees to work from home|https://techcrunch.com/2020/08/07/facebook-extends-coronavirus-work-from-home-policy-until-july-2021/]] until at least 2021 when, according to public health experts, the [[coronavirus pandemic is expected to wind down|https://www.nature.com/articles/d41586-020-02278-5]], though there are still many uncertainties on that front. Some have gone a step ahead and decided to make the [[current norm permanent|https://www.cnbc.com/2020/08/07/atlassian-tells-employees-they-can-work-from-home-indefinitely.html]].
All this will put more demand on workers to exercise concise and sustainable time management techniques, as well as drive demand for [[software to support remote work and self-productivity|https://techcrunch.com/2020/03/07/startups-weekly-remote-first-saas-products-boom-as-workers-stay-home/]]. As innovators, we're all about disruption, and 2020 should be seen as the starting point for real change in many industries, one you should exploit as much (and humanely) as possible.
!!! Best Reads on the Web 🔗
# [[How to work during the pandemic|https://techcrunch.com/2020/03/01/how-to-work-during-a-pandemic/]]
# [[Don't make this Business to business sales mistake!|https://medium.com/swlh/dont-make-this-business-to-business-sales-mistake-17ea14177fff]]
# [[How to take smarter notes|https://nesslabs.com/how-to-take-smart-notes]]
# [[Founder Vision or Hallucination? Know the difference|https://nesslabs.com/how-to-take-smart-notes]]
# [[Remote working is making us more innovative. So don't dread the 'new norm'|https://thenextweb.com/growth-quarters/2020/06/29/remote-work-is-making-us-more-innovative-so-dont-dread-the-new-normal/]]
# [[4 Tools that help collaborating researchers see the big picture|https://www.nature.com/articles/d41586-020-01918-0]]
# [[How entrepreneurs who hate selling close sales|https://medium.com/@jproco/how-entrepreneurs-who-hate-selling-close-sales-7336bccf448]]
!!! Unusual finds🤔
Think you have what it takes to turn a startup into a billion dollar unicorn? Try your hand at it with this hilarious [[startup simulator|https://toggl.com/startup-simulator/]] by the team behind time tracking app Toggl
!!! Let's help you be more productive! ⚙️
Let's face it, meetings suck. Being a Zoomer sucks. We'd rather get our wisdom tooth pulled out than attend ten boring meetings in a week. That's why we're introducing more and more teams to Lean Decision Maker, a lean-based methodology that allows you to come up with an actionable roadmap for your team in one sitting instead of ten meetings. Sounds good enough to try? Hit us up for a demo by replying to this email!
!!! 🔥Motivational Quote of the Day🔥
We know being an innovator is hard. So here's small quote from arguably one of the greatest innovator of this century to give you a boost and get your week rolling:
{{Steve Jobs on Work and Passion}}
!!! That's a Wrap ✌️
Have some feedback or questions? Lay them on us at [[inovationpeer@gmail.com|mailto:inovationpeer@gmail.com]]
# How to install CouchDB on Raspbian Stretch / Raspberry PI #
> Also published on [hackster.io](https://www.hackster.io/mehealth-ch/installing-couchdb-on-raspbian-stretch-ccb2a7). The github version should be the most recent and accurate.

## Objective ##
This tutorial is a step by step explanation on how to install the [NOSQL database CouchDB](http://couchdb.apache.org/) on a Raspberry Pi with [Raspbian Stretch OS](https://www.raspberrypi.org/downloads/raspbian/).
## Plan ##
The plan for this tutorial is
1. [Short introduction on what is CouchDB?](#1-short-introduction-on-what-is-couchdb)
2. [Prerequisites for the Raspberry Pi](#2-prerequisite-for-the-raspberry-pi).
3. [CouchDB download, build and installation](#3-download-build-and-install-software).
4. [First run and check](#4-first-run-and-check).
5. [Script for running CouchDB on boot](#5-script-for-running-couchdb-on-boot).
6. [To Do](#6-to-do)
7. [Personal experiences with CouchDB](#7-personal-experiences-with-couchdb).
---
# 1. Short introduction on what is CouchDB? #
CouchDB is an awesome and very reliable NOSQL database server which stores JSON documents. CouchDB can be run from a Raspberry Pi to big servers. A version built for mobile and desktop web-browsers is named [PouchDB](http://pouchdb.com/) and [Couchbase Lite](https://developer.couchbase.com/documentation/mobile/current/guides/couchbase-lite/index.html) is built for native iOS & Android apps. It is very easy to store and query documents with CouchDB databases and data can be replicated seamlessly with each other.
The [Apache CouchDB website](http://couchdb.apache.org/) says :
> Data Where You Need It
>
> Apache CouchDB™ lets you access your data where you need it by defining the **Couch Replication Protocol** that is implemented by a variety of projects and products that span every imaginable computing environment **from globally distributed server-clusters**, over **mobile phones** to **web browsers**. Software that is compatible with the Couch Replication Protocol include: PouchDB, Cloudant, and Couchbase Lite.
>
> Store your data **safely**, on your own servers, or with any leading cloud provider. Your web- and native applications love CouchDB, because it speaks **JSON natively** and supports binary for all your data storage needs. **The Couch Replication Protocol** lets your data flow seamlessly between server clusters to mobile phones and web browsers, enabling a compelling, **offline-first** user-experience while maintaining high performance and strong reliability. CouchDB comes with a **developer-friendly query language**, and optionally MapReduce for simple, efficient, and comprehensive data retrieval.
---
# 2. Prerequisite for the Raspberry Pi. #
This step by step tutorial has been tested many time with the following configuration :
**Hardware** : Raspberry Pi 2B, 3B and 3B+.
**OS**: Raspbian Stretch.
**Network**: you should have an Internet access to download and install software.
**SSH** : you can install CouchDB with SSH or in a Terminal session on the Pixels interface directly on the Raspberry Pi.
**nano** : we use the nano editor but choose your favorite one.
First, check that you have the correct OS version by executing in a Terminal :
cat /etc/os-release
You should get something like :
# PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
# NAME="Raspbian GNU/Linux"
# VERSION_ID="9"
# VERSION="9 (stretch)"
# ID=raspbian
# ID_LIKE=debian
# HOME_URL="http://www.raspbian.org/"
# SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
# BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
Then, ensure your system is up to date with :
sudo apt-get update
sudo apt-get dist-upgrade
---
# 3. Download, build and install software. #
Now, we add the Erlang Solutions repository and public key with :
wget http://packages.erlang-solutions.com/debian/erlang_solutions.asc
sudo apt-key add erlang_solutions.asc
sudo apt-get update
and install all build dependencies with this three-lines command (copy and paste all 3 lines together in the terminal) :
sudo apt-get --no-install-recommends -y install build-essential \
pkg-config erlang libicu-dev \
libmozjs185-dev libcurl4-openssl-dev
Now, create a new user named `couchdb` and its home directory :
sudo useradd -d /home/couchdb couchdb
sudo mkdir /home/couchdb
sudo chown couchdb:couchdb /home/couchdb
Ensure you are on you home directory with :
cd
To download Apache CouchDB source code, first open the following link :
[http://couchdb.apache.org/#download](http://couchdb.apache.org/#download)
and click on the Source link as seen in the following picture :

The following page will be displayed :

Now, copy the suggested mirror site for your download (e.g. control-click on the link and choosing copy in popup menu), and paste the link after the `wget` in your terminal. You should execute something like :
wget http://mirror.ibcp.fr/pub/apache/couchdb/source/2.1.1/apache-couchdb-2.1.1.tar.gz
which download the source archive file. Extract the archive and enter the resulting source directory (maybe you have to adapt the name of the archive `.gz` file and its corresponding directory) :
tar zxvf apache-couchdb-2.1.1.tar.gz
cd apache-couchdb-2.1.1/
You can now build and make the CouchDB executable :
./configure
make release
Finally, copy the built release to the appropriate `couchdb` user directory :
cd ./rel/couchdb/
sudo cp -Rp * /home/couchdb
sudo chown -R couchdb:couchdb /home/couchdb
**Now, CouchDB is installed and ready for a first run !**
If you want you can now remove unnecessary files (adapt to the name of your previous download) with :
cd
rm -R apache-couchdb-2.1.1/
rm apache-couchdb-2.1.1.tar.gz
rm erlang_solutions.asc
---
# 4. First run and check. #
If you install CouchDB with SSH you are probably willing to connect to the CouchDB server from **external IP addresses** (i.e. remotely from the Pi). In this case, you have to edit the `/home/couchdb/etc/local.ini` file :
sudo nano /home/couchdb/etc/local.ini
and change the line from :
#bind_address = 127.0.0.1
to : *(dont miss to delete the 1st '#' character)*
bind_address = 0.0.0.0
> **IMPORTANT !** For security reason if you want to keep the access to CouchDB restricted to the Raspberry locally (localhost and not remotely) then you should not change the `bind_address` to `0.0.0.0`. You can also change the configuration later at any time.
Now, you are ready to run CouchDB as `couchdb` user with this command :
sudo -i -u couchdb /home/couchdb/bin/couchdb
it display its log in console. Dont worry if you see some warning or even error messages in this first run of CouchDB.
Open, your Browser in Raspberry and go to link : `http://<YOUR_IP_HERE>:5984/_utils/`. Use whatever IP your Raspberry PI has with port **5984**, like [http://192.168.1.177:5984/_utils/](http://192.168.1.177:5984/_utils/) or [http://localhost:5984/_utils/](http://localhost:5984/_utils/). To find your Raspberry PI IP address, those commands may help :
hostname -I
Ipconfig
Then, in the browser page click on the **Verify** menu item on left column :

then, click on the green `Verify Installation` button to start the verification. If everything is correct, you will get :

Look at the [CouchDB Documentation](http://docs.couchdb.org/en/latest/) for more information and especially to configure your CouchDB server (administrator, single or multi-cluster, enabling CORS, etc.).
---
# 5. Script for running CouchDB on boot. #
If, like me, CouchDB is the main database server for your projects, then you want CouchDB to start automatically on booting your Raspberry Pi. To achieve this we use `systemd` and create a configuration as described below.
First, create a directory owned by `couchdb` user for your CouchDB logs :
mkdir /var/log/couchdb/
sudo chown couchdb:couchdb /var/log/couchdb
Then, make sure that CouchDB is still running, then in your Browser go to CouchdDB `Configuration` page [http://127.0.0.1:5984/_utils/#/_config](http://127.0.0.1:5984/_utils/#/_config). If you previously defined an administrator you will be asked to log in as the administrator.

Click on the `+Add Option` and fill in the form like here :

*Empty form.*

*Values to set.*
values are :
- `log` for Section,
- `file` for Name and
- `/var/log/couchdb/couch.log` for Value.
Click on `Create`.
Now, scroll to Configuration Section **log** and change the value of the property named **writer** from `sterr` to `file` (double-click on word `stderr`) as in :

This tell CouchDB to write its log from now to file `/var/log/couchdb/couch.log`.
Now, create the systemd service by editing a new file :
sudo nano /lib/systemd/system/couchdb.service
and paste the following to the content of the editor :
[Unit]
Description=CouchDB Service
After=network.target
[Service]
Type=idle
User=couchdb
Restart=always
ExecStart=/home/couchdb/bin/couchdb
[Install]
WantedBy=default.target
Then, fix file permissions with :
sudo chmod 644 /lib/systemd/system/couchdb.service
and instruct `systemd` to start the service during the boot sequence :
sudo systemctl daemon-reload
sudo systemctl enable couchdb.service
When you reboot the Pi the couchdb service should run :
sudo reboot
and check service status using :
sudo systemctl status couchdb.service
Also, either browse to page [http://localhost:5984](http://localhost:5984/) to check that CouchDB server is up and running, or execute in the terminal of your Raspberry PI :
curl http://localhost:5984
which should reply something like :
{"couchdb":"Welcome","version":"2.1.1","features":["scheduler"],"vendor":{"name":"The Apache Software Foundation"}}
---
**Now, you are ready to enjoy all CouchDB server capabilities !**
Have a look to [CouchDB Documentation](http://docs.couchdb.org/en/latest/) and enjoy [PouchDB](http://pouchdb.com/) in your browser, mobile or [NodeJS](http://nodejs.org/) projects.
---
# 6. To Do #
My roadmap is to encapsulate CouchDB in a Docker container.
---
# 7. Personal Experiences with CouchDB #
We use CouchDB since 2009. Its stability, ease of use, reliability, data safety, performance and many features (like replication) fit our needs. We use [CouchDB](http://couchdb.apache.org) mainly with [PouchDB javascript library](http://pouchdb.com/) in the browser and in NodeJS. We have instances of CouchDB running on Raspbian efficiently and without issues.
An example of awesome feature is the [`_changes API`](http://docs.couchdb.org/en/2.1.1/api/database/changes.html) which allows us to listen to databases changes and update svg charts or other IoT data events in realtime both in the browser and in NodeJS servers. To implement it quickly, have a look to the example usage at [pouchdb.com/api.html#changes](https://pouchdb.com/api.html#changes). Actually, it is very simple to follow changes. In NodeJS just write something like (see [Setting up PouchDB](https://pouchdb.com/guides/setup-pouchdb.html) for more info) :
```
var PouchDB = require('pouchdb'); // in a web page just add a <script src="pouchdb-7.1.1.min.js"></script>
var db = new PouchDB('http://localhost:5984/dbname');
var changes = db.changes({
since: 'now',
live: true,
include_docs: true
}).on('change', function(change) {
// handle change
var doc = change.doc;
console.log(`💥 got a changes ${doc._deleted ? '(deleted)' : ''} =>`, doc._id, doc._rev, change);
}).on('complete', function(info) {
// changes() was canceled
console.log('‼️ listening to changes stopped', info);
}).on('error', function (err) {
console.log(err);
});
...
changes.cancel(); // whenever you want to cancel
```
## Hire us ! ##
If this was of help to you, please consider to buy me some cups of coffee on :
[](https://ko-fi.com/elojes)
If you have some projects using CouchDB and would like us to help, please get in touch with us !
Some of our NodeJS modules are [here](https://www.npmjs.com/~jguillod).
---
Your Feedback and suggestions for improvements would be welcome !
Joël
<div class="tc-table-of-contents">
<$macrocall $name="toc-selective-expandable" tag=<<currentTiddler>> />
</div>
Notebooks are used to write programs in the manner similar to how humans would write prose or manuscript, with the code being run instantly in a literate manner,
This paradigm is used a lot in scientific computing and analytics where the aim is to allow for rapid prototyping, sharing and replication of work. However, a problem arises when notebook users need to transfer their work to production, which is staffed mostly by software engineers who don't usually use notebooks and have very different expectations in terms of running production-ready code. The end result is a disconnection that has to be filled in with different specialities, which can be expensive.
An emerging trend to fix this problem is the notion of a "full stack data scientist" who could ostensibly wear all these hats without breaking a sweat. Such a position may require a hybrid notebook environment with tooling to handle the software development lifecycle all rolled up into a nice little notebook...
* No anonymity. Every contributor is known
* And therefore reputation could be established
* and reputation was recognized: "During 2006–2007, Intellipedia editors awarded symbolic shovels to users to distinguish exemplary Wiki gardening and to encourage others in the community to contribute." The practice was inspired by [[barnstars|https://en.wikipedia.org/wiki/Wikipedia:Barnstars]]from Wikipedia.
* other agencies experimented with other kinds of incentives for good contributions like free dinners
These are links to interesting [[TiddlyWiki|https://tiddlywiki.com]] material around the web. You can find more at [[TiddyWiki links|https://links.tiddlywiki.com/]].
<$button>
<$action-sendmessage $message="tm-new-tiddler" tags="$:/tags/Link" title="New link" url="Add link here" />
Add a new link
</$button>
<<list-links "[tag[$:/tags/Link]!sort[title]]">>
Interfaces as applied to OOP are a description of the actions that an object can do, or in the case of TypeScript, they are a means of expressing and enforcing object types. Example:
```typescript
interface Box<Type> {
contents: Type;
color?: Type; // this is an optional property
}
let box: Box<string> = { contents: "hello world" };
box.contents; // hello world
```
So while the flyers page ranks for more general keywords like "flyers" [Volume - 250k]
The marketing flyers page ranks for niche keywords like "marketing flyer templates" [Volume = 250]
This strategy forms a network of parent-child pages, all linked together.
But what's the benefit of this?
Well, internal linking is a key, yet very underrated SEO strategy. It helps because:
# Backlinks increase your page's authority.
# With internal linking, you can flow the authority of high authority pages on your website to other pages.
This wiki page intersects nicely on the limitations of hierarchical knowledge taxonomies and intertwingling. Should be good to check it out to further improve this article's framing.
https://wiki.c2.com/?InterTwingled
Setting up Intranets for enterprises can be expensive. Especially when money is tight and folks can't afford the huge upfront costs and lifetime costs for upgrading stuff. What if we could create a TiddlyWiki based Intranet-as-a-service to solve this problem?
''But do people really want another Intranet service?'' Or do they want to bring their own service? How do admin and IT manage this? An ad hoc intranet that is employee oriented is better than imposing another software. This requires a taking a federalized approach where perhaps an employee registers their software for an access token that allows their software to take in content from the company Intranet.
According to [[Smarp|https://blog.smarp.com/intranet-definition-disadvantages-and-more-efficient-alternatives]]:
There are 10 reasons why intranets fail within organizations:
* Unclear governance
* Unclear purpose
* Unengaged executives
* Poor user experience (Unengaged users means no one will care about the platform. The software should engage the user!)
* Stale and outdated content
* Lack of personalization
* ''Many sources of truth'' this is something that's definitely a problem.
* Technical resource dependency
* Search doesn't work and [[it can waste time|How much time we lose when searching]] (they advocate for no-search/searchless personalization)
* Failed deployment
There are three main ways of introducing villains in an impactful manner:
# through heroes: heroes usually have attributes that represent their core personality. You can introduce villains that, on the surface may look inferior to the hero and reveal in a sudden and dramatic fashion that they're in fact an equal or even superior to the hero, making the hero look vulnerable.
# through the aftermath: we can introduce the villain based on what they leave behind; a crime scene. The grotesque nature of the aftermatch, or its devastation must match what the reader sees in the villain when he/she is revealed at a later stage. There should not be a mismatch.
# through hatred: make the villain do something extremely distasteful and terrible to the hero of the story. Simple enough.
If there is one word that could be regarded as the most abused, overused cliché buzzword of our times, it would be the word "innovation". You hear it all the time, everywhere you look and everywhere you go. It has been repeated //ad nauseum// that sometimes, one could easily forget what it stands for. However, if you're an executive at an established company, or a budding founder of a promising startup, forgetting what innovation is and getting it wrong as a consequence could be the difference between a good quarter and a financial disaster. Let's remind ourselves what real innovation actually is.
If you peep into a dictionary (which is fine, no one will judge you!), you'll see that innovation is defined as the act of creating something new. It may be a new product, a new way of doing certain things and so on. Most people would stop there and forget about the most important part of the innovation process, one that distinguishes a good idea from a //valuable// idea. And that is the question is ''why''? Why do we innovate? Do we innovate because everyone else in the market claims to be doing it, like teenagers in high school doing //the thing// because they think everyone is doing it?
If you think really hard about it, that's what most companies are doing now. And we have a term for this type of innovation: ''innovation theatre''. It is useless show and tell innovation, the kind that is designed to wow and nothing more. It is the kind of bland innovation that consumes valuable time, resources and talent without producing even a hint of value to customers, but done instead for the sake of good PR and perhaps boosting stock prices. 'Real' innovation must always be aligned with the goal of bringing value to your company's key foundation: your customers. That is to say, innovation must solve painful customer problems, and produce outcomes that customers would value.
Sounds easy enough, but believe me when I say, it is much easier to look like you're doing innovation (we're doing AI!) than to prove that your innovation is having an impact on your customer satisfaction. Innovation is hard. Innovation accounting is even harder. That's why services are popping up all over the world that help companies guide themselves towards utilizing innovative thinking correctly and methodically, using a number of battle hardened techniques perfected at actually innovative corporations like Google and Toyota.
Innovationpeer dot com is one such service, created by our team of experts to bring actual innovation to your business. In one week, you'll be on your way to practicing innovation theatre and designing new products and services with design sprints, creating sustainable enterprises with business model innovation, and accelerating growth with ethical growth hacking techniques that bring actual value to your customers. All services are offered remotely in order to protect you and your team during the COVID-19 pandemic. Check us out [[here|https://innovationpeer.com]] to begin innovating with us today!
* <<fixme "Scrolling can be janky">>
* ~~<<bug "Using window.onscroll brings an object cannot be extended error. Let's remove this for now.">>~~
* ~~<<fixme "Change the link pointing to twitter account in the footer from One_Playbook to ~OnePlaybookHQ">>~~
* <<fixme "Can't scroll using keys in the library view">>
* <<low "Reset url permalinks to / when back to homepage">>
on mobile:
* ~~<<high "The below the fold message feels weird and overwhelming. Let's shorten it for mobile view">>~~
* ~~<<bug "Selecting one wiki selects them all!!">>~~
* ~~<<fixme "Some wikis are out of reach (appear beneath the bottom menu). Let's add a gutter below to ensure that we can always see them above the action button">>~~
* <<bug "While wiki is loading, the app bar controls are inoperable!">>
When projects overlap, it becomes more difficult to track and give feedback.
1. ~~QR codes for Randomization~~
2. Electronic Tangerine Database up and running
3. Insurance for participants
4. Consent (final version)forms signed and stamped
5. Fridge and CRP kits accountability log book for each site.
6. Make sure the regulatory binder is into date with all IRBs
7. SOP revised after experience from Pilot
8. Write a report of the Pilot study
9. ~~Job Aids to be made solid and table easle ( like ABCD/ZTDT) study~~
10. Make a forecast of finance needed weekly based on estimates of jumpers per week.
11. A timetable of training and retraining on regular basis.
12. Weekly report tables and recruitment target graphs for RCT1 and RCT2. Use the WHO PPT template for tables, so it's easy to fill in.
<ul>
<li>Using `for..in` loops to iterate over objects is discouraged because the loop needs to check if all properties are iterable before it begins, impacting performance, especially when the object is very large.</li>
<li>Moreover, the `for...in` loop loops over properties arbitrarily. Ordering is lost</li>
<li>Furthermore, it can loop over an object's prototypes and a modified object is not returned until the loop is done iterating.</li></ul>
<p>Use `Object.keys`, `Object.entries` or `Object.values` instead. Check out how to iterate over [[Symbol keys|??]].</p>
<h2>Reflect.ownKeys</h2>
<p>None of the Object methods for iterating over objects support Symbols (looping over them naively returns nothing). To loop through objects with `Symbol` keys, we can use the `Reflect.ownKeys` method. Like `Object.keys` , it gets the keys of an object’s own properties, but `Symbol` keys are also supported. And it also returns an array of keys. String keys are also supported like `Object.keys`.</p>
<p>For example, given that we have the following object:</p>
<pre>const foo = {
[Symbol('foo')]: 'Joe'
};</pre>
<p>We can use `Reflect.ownKeys`:</p>
<pre>for (let prop of Reflect.ownKeys(foo)) {
console.log(prop);
}</pre>
<p>Then we get back `Symbol(foo)` .</p>
<p>Getting values from `Symbol` keys also work if we write the following loop:</p>
<pre>for (let prop of Reflect.ownKeys(foo)) {
console.log(foo[prop]);
}</pre>
<p>Then we get back 'Joe’ .</p>
<p>This method is new with ES6.</p>
<div class="header reader-header reader-show-element"><h1 class="reader-title">How to Turn Your Website into a Mobile App with 7 Lines of JSON</h1>
<div class="credits reader-credits">Aditya Dehal</div>
<div class="meta-data">
<div class="reader-estimated-time">20-25 minutes</div>
</div>
</div>
<hr>
<div class="content">
<div class="moz-reader-content line-height4 reader-show-element"><div id="readability-page-1" class="page"><section>
<div>
<p>by Ethan</p><h4 id="a-new-approach-for-blending-web-engine-into-native-apps">A New Approach for Blending Web Engine into Native Apps</h4><figure><img src="https://cdn-media-1.freecodecamp.org/images/eSvoA17aMWXS0lfNTxKDBeAvNLJIws2MEcSR" moz-reader-center="true"></figure><p>What if I told you <strong>the 7 lines of JSON above, colored in orange </strong>is
all you need to turn a website into a mobile app? No need to rewrite
your website using some framework API just to make it behave like a
mobile app. Just bring your existing website as is, and blend it into a
native app with a simple URL reference.</p><p>And what if, just by
tweaking the JSON markup a bit, you can access all the native APIs,
native UI components, as well as native view transitions out of the box?</p><p>Here’s what a minimal example looks like in action:</p><figure><img src="https://cdn-media-1.freecodecamp.org/images/1kjzo4uXso3Yk08RYYUUYGK6HXrlCs42aXqG"></figure><p>Notice how I’ve embedded a <a href="https://github.com/Jasonette" rel="noopener">github.com web page</a> but the rest of the layout is all native UI components, such as <a href="https://docs.jasonette.com/document/#bodyheader" rel="noopener">the navigation header</a> and the <a href="https://docs.jasonette.com/document/#tabs" rel="noopener">bottom tab bar</a>. And the transition is automatically native without you having to rewrite the website using any APIs.</p><p>Before
I explain how, you may ask: “That’s cool, but can you do anything
meaningful other than just displaying the web page in a native app
frame?”</p><p>Great question, because that’s the main topic of this post. All you need to do is create a seamless <strong>2-way communication channel between the web view and the app</strong>,
so the parent app can trigger any JavaScript functions inside the web
view and the web view can reach outside to call native APIs.</p><p>Here’s one such example:</p><figure><img src="https://cdn-media-1.freecodecamp.org/images/8AvgutqafADVJW2WYgH3o0kBVDZvVuUIoU6C"></figure><p>Note that this view contains:</p><ol><li>Native navigation header, complete with built-in transition functionality</li><li>A Web view, which embeds a QR code generator web app</li><li>A native chat input component at the bottom</li></ol><p>All this can be described by just tweaking some of the JSON markup attributes we saw above.</p><p>Finally,
note that the QR code changes as you enter something from the chat
input. The chat input triggers a JavaScript function inside the QR code
web app that re-generates the image.</p><p>No app development framework has tried to fundamentally solve this problem of <strong>“seamless integration of web view into native apps”</strong> because they’re all focused on picking either 100% native or 100% HTML5 side.</p><p>Whenever you hear someone talk about the future of mobile apps, you would probably hear them talk about <strong>“Will it be the HTML5 approach that wins out? Or will it be native?”</strong></p><p>None of them see <code>native</code> and <code>html</code> as something that could co-exist and furthermore, create synergy and achieve things that are not easily possible otherwise.</p><p>In this article I’m going to explain:</p><ul><li>Why blending web engine and native components is often a good idea.</li><li>Why a seamless integration of HTML and Native is not easy, and how I implemented one.</li><li>Most importantly, how YOU can use it to build your own app instantly.</li></ul><h3 id="why-would-you-use-html-in-a-native-app">Why would you use HTML in a native app?</h3><p>Before
we go further, let’s first discuss whether this is even a good idea,
and when you may want to take this approach. Here are some potential use
cases:</p><h4 id="1-use-web-native-features">1. Use Web Native Features</h4><p>Some parts of your app may be better implemented using the web engine. For example, <a href="https://en.wikipedia.org/wiki/WebSocket" rel="noopener">Websocket</a> is a web-native feature that’s designed for the web environment. In this case it makes sense to use the built-in web engine (<strong>WKWebView for iOS </strong>and<strong> WebView for Android</strong>) instead of installing a 3rd party library that essentially <strong>“emulates”</strong> Websocket.</p><p>No need to install additional code just to do something that you can do for free, which brings us to the next point.</p><h4 id="2-avoid-large-binary-size">2. Avoid Large Binary Size</h4><p>You may want to quickly incorporate features that will otherwise require a huge 3rd party library.</p><p>For
example, to incorporate a QR code image generator natively, you will
need to install some 3rd party library which will increase the binary
size. But if you use the web view engine and a JavaScript library
through a simple <code><script s</code>rc>, you get all that for free, and you don’t need to install any 3rd party native libraries.</p><h4 id="3-no-reliable-mobile-library-exists">3. No Reliable Mobile Library Exists</h4><p>For some cutting edge technologies, there is no reliable and stable mobile implementation yet.</p><p>Fortunately
most of these technologies have web implementations, so the most
efficient way to integrate them is to use their JavaScript library.</p><h4 id="4-build-part-native-part-web-based-apps">4. Build part-native, part-web-based apps</h4><p>Many
new developers looking to port their website into a mobile app get
discouraged or overwhelmed when they find out some of their existing
website features are too complex to quickly rewrite from scratch for
each mobile platform.</p><p>For example, you may have a single web page
that’s too complex to immediately convert to a mobile app, but the rest
of your website may be easily converted.</p><p>In this case, it would be
nice if there was a way to build most of the app natively, but for that
particular complex web page, somehow seamlessly integrate it into the
app as HTML.</p><h3 id="how-does-it-work">How does it work?</h3><h4 id="a-jasonette">A. Jasonette</h4><p>Jasonette is an open source, markup-based approach to building cross-platform native apps.</p><p>It’s
like a web browser, but instead of interpreting HTML markup into web
pages, it interprets JSON markup into native apps on iOS and Android.</p><p>Just
like how all web browsers have exactly the same code but can deliver
you all kinds of different web apps by interpreting various HTML markup
on demand, all Jasonette apps have exactly the same binary, and it
interprets various JSON markup on demand to create your app. The
developers never need to touch the code. Instead, you build apps by
writing a markup that translates to native app in real-time.</p><p>You can learn more about Jasonette <a href="https://medium.freecodecamp.org/how-to-build-cross-platform-mobile-apps-using-nothing-more-than-a-json-markup-f493abec1873" rel="noopener">here</a>.</p><p>While
Jasonette at its core is all about building native apps, this
particular article is about integrating HTML into the core native
engine, so let’s talk about that.</p><h4 id="b-jasonette-web-container">B. Jasonette Web Container</h4><p>Native apps are great but sometimes we need to make use of web features.</p><p>But integrating web views into a native app is a tricky business. A seamless integration requires:</p><ol><li><strong>Web view should be integrated as a part of native layout:</strong>
The web view should blend into the app as a part of the native layout
and is treated just like any other native UI components. Otherwise it
will feel clunky, and it will feel exactly like what it is — a website.</li><li><strong>Parent app can control child web container: </strong>The parent app should be able to freely control the child web view.</li><li><strong>Child web container can trigger native events on the parent app: </strong>The child app should be able to trigger the parent app’s events to run native APIs.</li></ol><p>These are a lot of work, so I first worked on only the first piece of the puzzle — <strong>simply embedding a web container into native layout</strong> — and released it as version 1:</p><p><a href="http://jasonette.com/webcontainer/" rel="noopener"><strong>JSON Web Container</strong></a><br><a href="http://jasonette.com/webcontainer/" rel="noopener"><em>HTML inside JSON Turns into Native App Components</em>jasonette.com</a></p><p>This was already pretty useful, but it still had the limitation of being non-interactive<strong>.</strong></p><p>The parent app couldn’t control the child web container, and the child couldn’t notify the parent of any event<strong>, keeping the web container completely isolated from the outside world.</strong></p><h4 id="c-jasonette-web-container-2-0-make-it-interactive">C. Jasonette Web Container 2.0: Make it Interactive</h4><p>After releasing version 1, I experimented with the second piece of the puzzle — <strong>adding interactivity to the web container.</strong></p><p>The
next section explains the solutions that were added to make the
previously-static web containers interactive, making them significantly
more powerful.</p><h3 id="implementation-interactive-web-container">Implementation: Interactive Web Container</h3><h4 id="1-load-by-url"><strong>1. Load by URL</strong></h4><h4 id="problem">Problem</h4><p>Previously in version 1, to use web container as a background view component, you had to first <a href="https://jasonette.com/webcontainer/" rel="noopener">set the <code>$jason.body.background.type</code> to <code>"html"</code> and then hard-code the HTML text under <code>$jason.body.background.text</code> attribute</a> like this:</p><pre><code>{ "$jason": { "head": { ... }, "body": { "background": { "type": "html", "text": "<html><body><h1>Hello World</h1></body></html>" } } }}</code></pre><p>Naturally
people wanted to be able to instantiate the container using simply a
web URL instead of having to hardcode the entire HTML text in a single
line.</p><h4 id="solution">Solution</h4><p>Web container 2.0 has added the <code>url</code> attribute. You can embed a local <code>file://</code> HTML like this (it loads from the local HTML file you ship with the app):</p><pre><code>{ "$jason": { "head": { ... }, "body": { "background": { "type": "html", "url": "file://index.html" } } }}</code></pre><p>Or embed a remote <code>http[s]://</code> URL like this (it loads from a remote HTML):</p><pre><code>{ "$jason": { "head": { ... }, "body": { "background": { "type": "html", "url": "https://news.ycombinator.com" } } }}</code></pre><h4 id="2-parent-app-web-container-communication"><strong>2. Parent App <=> Web Container Communi</strong>cation</h4><h4 id="problem-1">Problem</h4><p>Previously, web containers were only for displaying content, and not interactive. This meant <strong>NONE of the following was possible:</strong></p><ol><li><strong>Jasonette => Web Contain</strong>er: Call JavaScript functions inside the web container from Jasonette.</li><li><strong>Web Container => Jasonet</strong>te: Call native API from web container code.</li></ol><p>All
you could do was display the web container. This was similar to how you
would embed an iframe in a web page, but the main web page had no
access to what was inside the iframe.</p><h4 id="solution-1">Solution</h4><p>The
whole point of Jasonette is to design a standard markup language to
describe cross platform mobile apps. In this case, we needed a markup
language that could comprehensively describe communications between the
parent app and the child web container.</p><p>To achieve this, I came up with a <code><a href="http://www.jsonrpc.org/specification" rel="noopener">JSON-RPC</a></code>
based communication channel between the parent app and the child web
container. Since everything on Jasonette is expressed in JSON objects,
it made perfect sense to use the JSON-RPC standard format as the
communication protocol.</p><figure><img src="https://cdn-media-1.freecodecamp.org/images/dISqZspArHgei6hasHQ89nw7g1GrWSsyPG8s" moz-reader-center="true"></figure><p>To make a JavaScript function call into the web container, we declare an action called <code>$agent.request</code>:</p><pre><code>{ "type": "$agent.request", "options": { "id": "$webcontainer", "method": "login", "params": ["username", "password"] }}</code></pre><p><code><a href="https://docs.jasonette.com/agents/#1-agentrequest" rel="noopener">$agent.request</a></code> is the native API that triggers a JSON-RPC request into the web container. To use it, we must pass an <code>options</code> object as its parameter.</p><p>The <code>options</code> object is the actual <a href="http://www.jsonrpc.org/specification#conventions" rel="noopener">JSON-RPC request</a> that will be sent to the web container. Let’s look at what each attribute means:</p><ul><li><code>id</code>: Web container is built on top of a lower level architecture called <a href="https://jasonette.com/agent/" rel="noopener">agent</a>. Normally you can have multiple agents for a single view, and each agent can have its unique ID. But <a href="https://docs.jasonette.com/web/#1-background-web-container-is-an-agent" rel="noopener">Web container is a special type of agent which can only have the id of <code>$webcontainer</code></a>, which is why we use that ID here.</li><li><code>method</code>: The JavaScript function name to call</li><li><code>params</code>: The array of parameters to pass to the JavaScript function.</li></ul><p>The full markup would look something like this:</p><pre><code>{ "$jason": { "head": { "actions": { "$load": { "type": "$agent.request", "options": { "id": "$webcontainer", "method": "login", "params": ["alice", "1234"] } } } }, "body": { "header": { "title": "Web Container 2.0" }, "background": { "type": "html", "url": "file://index.html" } } }}</code></pre><p>This markup is saying:</p><p>When the view loads (<code><a href="https://docs.jasonette.com/actions/#1-load" rel="noopener">$jason.head.actions.$load</a></code>), make a JSON-RPC request into the web container agent (<code><a href="https://docs.jasonette.com/agents/#1-agentrequest" rel="noopener">$agent.request</a></code>) where the request is specified under <code>options</code>.</p><p>The web container is defined under <code><a href="https://docs.jasonette.com/web/#in-depth-on-background-web-container" rel="noopener">$jason.body.background</a></code>, which in this case loads a local file called <code>file://index.html</code>.</p><p>It will look for a JavaScript function called <code>login</code> and pass the two arguments under <code>params</code> ( <code>"alice"</code> and <code>"1234"</code>)</p><pre><code>login("alice", "1234")</code></pre><p>I’ve
only explained how the parent app can trigger the child web container’s
JavaScript function calls, but you can also do the opposite and <a href="https://docs.jasonette.com/agents/#3-agenttrigger" rel="noopener">let the web container trigger the parent app’s native API</a>.</p><p>To learn more, check out the <a href="https://docs.jasonette.com/agents/" rel="noopener">agent documentation</a>.</p><h4 id="example">Example</h4><p>Let’s come back to the QR code example I briefly shared above:</p><figure><img src="https://cdn-media-1.freecodecamp.org/images/q5-enhI0kpKTs6F33sgyI0mS9sLqOXnHFeHI"></figure><ol><li>The <a href="https://docs.jasonette.com/document/#input" rel="noopener">footer input component is 100% native</a>.</li><li>The QR code is generated by the web container <a href="https://github.com/Jasonette/Jasonpedia/blob/gh-pages/webcontainer/agent/fn/agent.html" rel="noopener">as a web app</a>.</li><li>When a user enters something and presses “Generate,” it calls <code>$agent.request</code> action into the web container agent, calling the <a href="https://github.com/Jasonette/Jasonpedia/blob/gh-pages/webcontainer/agent/fn/agent.html#L22" rel="noopener">JavaScript function “qr”</a></li></ol><p>You can check out the example <a href="https://github.com/Jasonette/Jasonpedia/blob/gh-pages/webcontainer/agent/fn/index.json" rel="noopener">here</a>.</p><h4 id="3-script-injection"><strong>3. Script Injection</strong></h4><h4 id="problem-2">Problem</h4><p>Sometimes
you may want to dynamically inject JavaScript code into the web
container AFTER it’s finished loading the initial HTML.</p><p>Imagine
you want to build a custom web browser app. You may want to inject your
own custom JavaScript into every web view to customize the web view’s
behavior, kind of like how web browser extensions work.</p><p>Even if
you’re not building a web browser, you may want to use the script
injection method whenever you want a custom behavior for a URL whose
content you have no control over. The only way to communicate between
the native app and the web container is through the <code>$agent</code> API. But if you can’t change the HTML content, the only way to add the <code>$agent</code> interface into the web container is through dynamic injection.</p><h4 id="solution-2">Solution</h4><p>As mentioned in the previous section, the <code>$jason.body.background</code> web container is just another <code>agent</code>. This means you can use the same <code><a href="https://docs.jasonette.com/agents/#7-agentinject" rel="noopener">$agent.inject</a></code> method available to regular agents.</p><figure><img src="https://cdn-media-1.freecodecamp.org/images/kt6qG0I8AgcTy270pNSHCE2QfZpdRRMg8SZU" moz-reader-center="true"></figure><h4 id="4-url-click-handling"><strong>4. URL Click Handling</strong></h4><p>In the past, there were only two ways a web container could handle link clicks:</p><ol><li><strong>Readonly:</strong>
Treat the web container as readonly and ignore all events such as touch
or scroll. All web containers are readonly unless you tell them to
behave like a regular browser, as described below.</li><li><strong>Regular Browser Behavior:</strong> Let users interact with the page by behaving like a normal browser. You declare it by setting <code>"type": "$default"</code> as its <code>action</code> attribute.</li></ol><h4 id="problem-3">Problem</h4><p>Both are <strong>“all or nothing” solutions</strong>.</p><ul><li>In the “Readonly” case, all your interactions are completely ignored by the web container.</li><li>In
the “Regular Browser Behavior” case, the web container functions
literally as a browser. When you click a link, it would just send you to
that link by refreshing the page just like a web page. There was no way
to hijack the click and call some native API.</li></ul><h4 id="solution-3">Solution</h4><p>With the new web container, you can now attach any <code>action</code> on the <code>$jason.body.background</code> web container to handle link click events.</p><figure><img src="https://cdn-media-1.freecodecamp.org/images/FhoDSEv8qQ4ZISs6syta2eU80WYBeQmFRAAS" moz-reader-center="true"></figure><p>Let’s look at an example:</p><pre><code>{ "$jason": { "head": { "actions": { "displayBanner": { "type": "$util.banner", "options": { "title": "Clicked", "description": "Link {{$jason.url}} clicked!" } } } }, "body": { "background": { "type": "html", "url": "file://index.html", "action": { "trigger": "displayBanner" } } } }}</code></pre><p>Here we have attached <code>"trigger": "displayBanner"</code> to the web container. This means that when a user clicks any link in the web container, it will trigger <code>displayBanner</code> action instead of letting the web view handle it.</p><p>Also, if you look at the <code>displayBanner</code> action, you’ll notice the <code>$jason</code> variable. In this case, the clicked link will be passed through the <code>$jason</code> variable. For example, if you clicked a URL named <code>"https://google.com"</code>, the <code>$jason</code> will have the following value:</p><pre><code>{ "url": "https://google.com"}</code></pre><p>This means you can selectively trigger different actions by <a href="https://docs.jasonette.com/web/#b-intercept-url-visits" rel="noopener">checking the <code>$jason.url</code> value.</a></p><p>Let’s take another example where we implement a custom web browser:</p><pre><code>{ "$jason": { "head": { "actions": { "handleLink": [{ "{{#if $jason.url.indexOf('signin') !== -1 }}": { "type": "$href", "options": { "url": "file://key.html" } } }, { "{{#else}}": { "type": "$default" } }] } }, "body": { "background": { "type": "html", "url": "file://index.html", "action": { "trigger": "handleLink" } } } }}</code></pre><p>We test if the URL contains the string <code>signin</code> and then run two different actions depending on the result.</p><ol><li>If it contains <code>signin</code>, it opens a new view to take care of signing in natively.</li><li>If it doesn’t contain <code>signin</code>, just run the <code>"type": "$default"</code> action so that it behaves like a regular browser.</li></ol><h3 id="example-usage">Example Usage</h3><h4 id="building-a-custom-web-browser">Building a custom web browser</h4><p>We can now take advantage of the fact that the new web container can:</p><ol><li>Take a <code>url</code> attribute to load itself, functioning as a full-fledged browser</li><li>Selectively handle link clicks depending on the URL</li></ol><p>We
can even build a custom web browser app with just a dozen lines of
JSON. Since we can now hijack every link click, we can take a look at <code>$jason.url</code> and run whatever actions we want depending on the URL.</p><p>For example, take a look at the example below:</p><figure><img src="https://cdn-media-1.freecodecamp.org/images/iNRAFCyHHrGptiuenltF7rK902otq27ZMmTq"></figure><figure><img src="https://cdn-media-1.freecodecamp.org/images/8vFiQuuuBm-KTt8LaNS-UEldKrWOCvJlI-0k"></figure><p>On the left side we see that clicking a link behaves like a regular browser (<code>"type": "$default"</code>)</p><p>On the right side we see that clicking a link does a native transition to another JASON view.</p><p>All this can be achieved by selectively triggering different actions based on <code>$jason.url</code>.</p><p><strong>Step 1. Attach an action named <code>visit</code> to the web container like this:</strong></p><pre><code>{ ... "body": { "background": { "type": "html", "url": "https://news.ycombinator.com", "action": { "trigger": "visit" } } }}</code></pre><p><strong>Step 2. Run relevant actions inside <code>visit,</code> based on <code>$jason.url</code></strong></p><p>In the following code, we’re checking if <code>$jason.url</code> matches <code>newest</code>, <code>show</code>, <code>ask</code>, and so on (they’re the top menu item links). If they do, we let the web container behave like a regular browser by setting <code>"type": "$default"</code></p><p>If they don’t match the pattern, we make a native <code>$href</code> transition to a new view and pass the clicked link as a parameter.</p><pre><code>..."actions": { "visit": [ { "{{#if /\\/(newest|show|ask)$/.test($jason.url) }}": { "type": "$default" } }, { "{{#else}}": { "type": "$href", "options": { "url": "https://jasonette.github.io/Jasonpedia/webcontainer/agent/hijack.json", "preload": { "background": "#ffffff" }, "options": { "url": "{{$jason.url}}" } } } } ]},</code></pre><p>Check out the full JSON markup for the web browser <a href="https://github.com/Jasonette/Jasonpedia/blob/gh-pages/webcontainer/agent/hijack.json" rel="noopener">here</a> (it’s only 48 lines!).</p><h4 id="instant-hybrid-app">Instant “Hybrid” App</h4><p>When people normally talk about “hybrid” apps, they mostly mean HTML web apps wrapped inside a native app frame.</p><p>But
that’s not what I mean here. When I say “Hybrid,” I mean a truly hybrid
app, where one app can have multiple native views and multiple
web-based views simultaneously. Also where one view can have multiple
native UI components and a web container rendered in the same native
layout.</p><p><strong>The cross-over between web-based view and native view should be so seamless that it’s hard to tell where one starts and ends.</strong></p><figure><img src="https://cdn-media-1.freecodecamp.org/images/KVknGIXFeBzMxUsY1pBCddiWdEub8Jl26i0g"></figure><p>In this example, I’ve created an app that displays <a href="https://www.jasonbase.com/" rel="noopener">jasonbase.com</a> in a web container as the home view.</p><p>Jasonbase is a free JSON hosting service I built to easily host JSON markup for Jasonette apps.</p><p>Naturally,
it’s just a website, but I have embedded it in Jasonette so that when
you click the link, instead of opening a web page, it makes a native <code>$href</code> transition to a native JASON view.</p><p><strong>I didn’t have to touch any of Jasonbase.com’s code to build this app.</strong></p><p><strong>I
simply embedded the website into Jasonette as a web container, and
hijacked the link clicks to handle them natively, so it can do all the
native stuff like triggering native APIs and making native transitions.</strong></p><p>You can check out the code <a href="https://github.com/Jasonette/Jasonpedia/blob/gh-pages/webcontainer/agent/hybrid.json" rel="noopener">here</a>.</p><h3 id="conclusion">Conclusion</h3><p>In my opinion, what makes all this work fabulously is that <strong>everything is taken care of on the framework level</strong>. All the hard work is taken care of behind the scenes.</p><p>Instead of putting the burden on the app developers to implement all of the following from scratch:</p><ul><li>Embed a webview into native layout</li><li>Create a JavaScript bridge so the app can make function calls into the web view</li><li>Creating a native event handling architecture so the web view can trigger native events on the parent app</li></ul><p>The solution was to create an abstraction made up of:</p><ol><li><strong>Declarative Markup Language:</strong> for describing how to embed a web view into a native app</li><li><strong>Communication Protocol (JSON-RPC):</strong> to allow dead-simple interactions between the app and its child web views.</li></ol><p>I
don’t claim this approach to be the ultimate solution to solve
everything, but I’m happy to say that this has been a great solution for
my own use case.</p><p>I was trying to build an app that builds on a
super edge technology which has no stable and reliable mobile
implementations (and it’s not clear if there ever will be a mobile
implementation due to the protocol’s nature). Thankfully it had
JavaScript implementations so I could easily integrate it into the app
without hassle.</p><p>Overall, it’s been great and I’m satisfied with how it turned out. <a href="https://docs.jasonette.com/web/" rel="noopener">The documentation is up to date</a> to reflect all the new features, so feel free to dig in and play around.</p><blockquote>Disclaimer: With great power comes great responsibility</blockquote><p>I
would like to end with a disclaimer: as great as this newly found power
is, I think you need to keep a balance to build an app with a great
user experience.</p><p>Some may take this and build an entire app using
web views only, but then you will end up with an app that’s basically
just a website, which defeats the purpose of building a dedicated app.</p><p>I
emphasize that I’m not saying you should always build apps with both
HTML and native. I am saying this can be very useful for many people in
different situations. Just don’t go overboard with it.</p><blockquote>Follow Along to Learn More</blockquote><p>There
are many different configurations in which the Jasonette native core
and its child web container can communicate to get things done in
creative and powerful ways, and this post is just scratching the
surface.</p><p>Going forward I’m planning to share more of these use cases and tutorials, so if you’re interested, please follow along on <a href="https://medium.com/@gliechtenstein" rel="noopener">medium</a> or <a href="https://twitter.com/jasonclient" rel="noopener">twitter</a>.</p>
</div>
</section></div></div>
</div>
<<list-links "[tag<currentTiddler>sort[title]]">>
Macros can be implemented as JavaScript modules as well as via the [[wikitext syntax|http://tiddlywiki.com/#Macros%20in%20WikiText]].
! Overview
JavaScript macros are modules with their ''module-type'' field set to ''macro''. They must export these three properties:
* ''name'': A string giving the name used to invoke the macro
* ''params'': An array of objects with the following properties:
** //name//: name of the parameter
** //default//: (optional) default value for the parameter
* ''run'': Function called when the macro requires evaluation. The parameters are pulled from the macro call and arranged according to the ''params'' array. The ''run'' function should return the string value of the macro. When invoked, `this` points to the widget node invoking the macro.
Note that if the ''params'' array is missing or blank, then all the supplied parameters are passed to the `run()` method.
! Writing JavaScript macros
There are several JavaScript macros built into the core which can serve as a jumping off point for your own macros:
https://github.com/Jermolene/TiddlyWiki5/tree/master/core/modules/macros
Note that JavaScript macros work on both the client and the server, and so do not have access to the browser DOM.
!! Macro Behaviour
Macros are just used to return a chunk of wikitext for further processing. They should not make modifications to tiddlers in the wiki store. The reason is that you cannott control when the macro is called; it may be called repeatedly as part of refresh processing. So it is important that macros do not have any other side effects beyond generating their text.
* Strings
* Numbers
* Undefined
* Symbols
* BigInt
* Boolean
* Null (but a special object)
All primitves are immutable
* In JS, there are two types of values that are stored in memory
** Primitive values. These are stored in the stack.
** Reference values. These are objects stored in the heap (so called because it is unsorted) memory of JS. They can refer to primitve values stored in the stack
* In JS, primitve values include all the primitives of JS:
{{Javascript primitives}}
* In JS, all arguments ''are passed by value''. This means that whatever modifications take place in the function, the a new value is allocated to memory, leaving values initialized outside the function unaffected.
* Given all of the above, this explains why this happens when we pass `Objects` to functions:
```js
var computer = { state: false };
function turnOn(machine) {
machine.state = true;
return machine.state;
};
turnOn(computer); // true
console.log(computer.state) // true
```
* `machine.state` and `computer.state` both reference the same primitive value in memory. They're added to the heap while referencing the same primitve value that we changed in the function.
* THIS DOES NOT MEAN THE FUNCTION ARGUMENT IS PASSED BY REFERENCE.
* It is actually quite the opposite; it is proof that the argument was passed by value, not reference
* What if we mutate `machine` like so?
```js
var computer = { state: false };
function turnOn(machine) {
/* now assigned an object with new primitive value referenced
* in another memory address
*/
machine = { state: true };
return machine.state;
};
turnOn(computer); // true
console.log(computer.state) //false;
```
* Here we confirm that the function passes by value, and not by reference by virtue of `computer.state` remaining unaffected.
<iframe src="https://addyosmani.com/resources/essentialjsdesignpatterns/book/" style="position:relative;width:100%;height:80vh;" frameborder=0></iframe>
<p>Clayton Christensen’s [[Jobs to be Done|https://hbr.org/2016/09/know-your-customers-jobs-to-be-done#]] framework proposes that focusing solely on customer data leads founders on a wild goose chase. Founders should understand <em>what the customer hopes to accomplish</em>, or what their <em>job to be done</em> is<strong>.</strong></p>
<p>Break down your mission statement into different “jobs”; this itemization will likely narrow your product scope considerably, while still allowing you to create something of significant value.</p>
<p>When consumers have a job to be done, they’ll look around at their choices and select the best tool for the job. <strong>Your goal is to build the best tool for meaningful, reoccurring jobs that people face.</strong> Map out the jobs that you believe exist for the customer archetypes identified in step 2.</p>
<p><img alt="" src="https://miro.medium.com/max/936/1*PnfVxFzwNilfBrkUQ0w2iA.png" style="border-style:none; box-sizing:border-box; max-width:100%" /></p>
<p>The more common jobs may apply to several of the archetypes, while the more esoteric jobs may apply to just one. There will be plenty of overlap, which is why jobs have their own branch of the MVP tree rather than attaching directly to the archetype branches.</p>
```sql
SELECT customers.ID, customers.Name, orders.Name, orders.Amount
FROM customers, orders
WHERE customers.ID=orders.Customer_ID
ORDER BY customers.ID;
```
Here we are creating a temporary table from joining two tables using the `WHERE` statement.
Remember to use fully qualified names when handling ✌️ tables with similar columns.
<div>
<div><a class="domain reader-domain" href="https://towardsdatascience.com/ace-the-sql-data-science-interview-in-less-than-10-minutes-fba42d826d4b">towardsdatascience.com</a>
<div> </div>
<h1>Ace the SQL Data Science Interview in less than 10 minutes</h1>
<div>Ilias Miraoui</div>
<div>
<div>6-8 minutes</div></div></div>
<hr />
<div>
<div>
<div>
<div>
<div>
<p>When data is stored in different tables, it can be tricky to join it back together in the way that is most appropriate. The most common SQL question attempts to gage your understanding of the difference between left/right/inner/outer joins. The graph below summarizes the difference between each type of join:</p>
<div>
<div>
<div>
<div>
<p><img src="https://miro.medium.com/max/1600/0*FnunZamkPHFUk9Yq.png" /></p></div></div></div></div>
<p>Typical Graph Highlighting Left/Right/Inner/Outer Join from Arbeck on <a href="https://commons.wikimedia.org/wiki/File:SQL_Joins.svg" rel="noopener nofollow" target="_blank">Wikimedia</a></p>
<p>Additional joins exist and can be extremely useful. Of crucial importance are:</p>
<ol>
<li><strong>Cross Join: </strong>This would allow you to do the cross-product of each table (i.e. may be helpful to generate a table of all the possible outcomes). No join conditions are required for such a join. One can simply have multiple relations mentioned in the FROM statement.</li>
<li><strong>Self Join: </strong>Sometimes it might be helpful to join a table on itself, especially when there is a relationship between rows within a table. For instance, to calculate a rolling average or if we have multiple instances of a specific event, we could find all the events that happened after the first one (using an additional clause on the WHERE statement). To do so, we can perform a join as per usual but give different aliases to both tables (using AS).</li></ol>
<p>In your select clauses, it may be helpful to use “filter” or rather if statements to determine some values.</p>
<p>To do so, we declare a CASE statement. Every clause needs to be separated by a WHEN this happen (using any conditional operator) THEN this value and may contain an ELSE clause to give a default/fallback value. At the end, we close the CASE statement with an END statement.</p>
<p>This may allow you to avoid many unnecessary subqueries and may be especially helpful to create custom groups for your aggregation functions (see below).</p>
<p>Often times, you might have to aggregate some data in groups/summary statistics. To calculate the summary statistics, you may use any of the aggregation functions such as:<br />
- COUNT<br />
- SUM<br />
- AVG<br />
- MAX<br />
- MIN</p>
<p>GROUP BY allows to separate data into groups and aggregate those individually. It is highly likely that interviewers will ask about these functions so make sure to have a firm grasp on how to use them.</p>
<p>When using a GROUP BY functions, all the elements of the SELECT clause must either be an aggregating function or one of the clause of the GROUP BY.</p>
<p>In addition, as it is also often asked during interviews: WHERE clauses can be used concurrently and help to filter the data <strong>prior </strong>the aggregation. Conversely, HAVING clauses help filter the data <strong>after </strong>the aggregation. They can thus be used at the same time and have different purposes.</p>
<p>To trick you, interviewers might give you data types that cannot be manipulated directly. For instance, they might give you a table with dates in string format and ask from you to filter for the past week. In order to do so, you will first need to transform the data types into “dates”.</p>
<p>To do so, you have two ways:</p>
<ol>
<li>You could use the CAST function to (i.e. CAST(column_name AS integer))</li>
<li>Using the :: syntax (i.e.column_name::integer))</li></ol>
<p>The most common data types are:</p>
<p>- VARCHAR<br />
- TEXT<br />
- TIMESTAMP<br />
- INTEGER<br />
- FLOAT<br />
- DOUBLE<br />
- BOOLEAN</p>
<p>Rolling windows are often considered an advanced SQL topics but will really help showcase the depth of SQL mastery. They help simplify queries a lot and allow to perform calculations among a specified set of rows (qualified of PARTITION). To use rolling windows, one can instantiate the window with the OVER command. The rolling window can be segmented into different groups using the PARTITION clause and can be ran with a specific order using parentheses and an ORDER BY clause.</p>
<p>Using clauses such as BETWEEN … AND …ROW and ROWS … PRECEDING, it is possible to further customize the window functions and adapt them to any usecases.</p>
<p>Hence, for instance using the ROW_NUMBER() function that counts the number of the row and a combination of PARTITION and ORDER BY, it becomes possible to calculate very easily what could become a very complicated number of subqueries (i.e. <a href="https://www.essentialsql.com/sql-puzzle-calculate-moving-averages/" rel="noopener nofollow" target="_blank">calculating moving averages</a>).</p>
<p><strong><em>Window functions can be tricky so here are two practice questions to make sure of mastery:</em></strong></p>
<p>- How do you calculate a cumulative sum with AND without window functions<br />
- Calculate a 7 day rolling average with AND without window functions</p>
<p><em>For a more in-depth look, make sure to check Mode Analytics’ </em><a href="https://mode.com/sql-tutorial/sql-window-functions/" rel="noopener nofollow" target="_blank"><em>guide on window functions</em></a><em>.</em></p>
<p><strong><em>String functions</em></strong></p>
<ul>
<li>TRIM: removes trailing (RTRIM) and leading (LTRIM) whitespaces from a string</li>
<li>SUBSTR: Selects a substring among a longer string</li>
<li>LOWER/UPPER: Converts the entire string to lowercase or uppercase.</li>
<li>CONCAT: Allows to concatenate multiple strings into one</li>
<li>COALESCE: Returns the first non null value in a colulmn (often used to “merge” columns with various null values into one column filled with values)</li>
<li>LIKE: Allows to look for string that respect a certain pattern (one can use the “%” operator for matching any number of characters, or “_” for a single character). Please not that it is case-sensitive and some Database Management Systems may allow ILIKE as a case-insensitive alternative (otherwise use LOWER/UPPER)</li>
<li>CONTAINS: Allows to look for strings that contain a specific substring</li></ul>
<p><strong><em>Date functions</em></strong></p>
<ul>
<li>NOW(): Returns the current date/time</li>
<li>CURRENT_DATE(): Returns the current date</li>
<li>DATE_ADD/DATE_SUB: Allows to calculate a date/time from a specified interval (similar to python’s time delta)</li>
<li>MONTH/YEAR/DAY/WEEKDAY: Returns the month/year/day/weekday from a date</li></ul>
<p><strong><em>Mathematical operations</em></strong></p>
<ul>
<li>ROUND: Round a number with the requested number of decimals</li>
<li>ABS: Returns the absolute value of a float/integer</li>
<li>MOD: Returns the remainder for a division</li>
<li>SIGN: Returns 1 if the parameter is positive, 0 if its 0 and -1 otherwiseR</li>
<li>SQRT: Returns the square root of a value</li>
<li>FLOOR/CEIL: Returns the closest integer down/up from a parameter</li>
<li>POWER: Returns the first parameter raised to the power of the second one</li></ul>
<p><strong><em>Others</em></strong></p>
<ul>
<li>NULLIF: Returns NULL if the two parameters evaluate to equal</li>
<li>IFNULL: Returns a specific expression if the first parameter is null</li>
<li>EXISTS: Checks for the presence of a non-null value.</li>
<li>IN: Checks for the presence of a given value among a list of values.</li>
<li>RANK: Window function giving a rank to each row in the partition of a result set (often using ROW_NUMBER is easier</li></ul>
<p>- If you do any mathematical operation with NULL, you still have NULL.<br />
- To get unique values in a query, use the DISTINCT keyword in your SELECT clause (also know that it will slow down your query meaningfully).<br />
- By default and unless specified otherwise, ORDER BY does so in ASC order.</p></div></div></div></div></div></div>
<<list-links "[tag[Journal]!sort[created]]">>
* Blank notebooks journals
* Dream journal
* Artist's journal
* Food journal
* Gratitude journal
* Reading journal
* Travel journal
* Plant journal
* Project journal
* Fitness journal
* Project journal
[[Reference|https://www.intelligentchange.com/blogs/read/20-types-of-journals-to-keep]]
```
JavaScript array methods that are impure mutators of their instance:
splice(..)
pop(..)
push(..)
shift(..)
unshift(..)
reverse(..)
sort(..)
fill(..)
```
//Special acknowledgment to [[@jestrux|https://twitter.com/jestrux]] on twitter for pointing this seemingly weird behavior. Check him out!//
//Edited on November 4th, 2019 to make it clarify the role of pass-by-reference versus pass-by-value.//
Immutability is hard to maintain with vanilla javascript. To illustrate this, consider the following arrays:
```javascript
const array1 = [{ num: 1 },{ num: 2 }, { num: 3 }];
const array2 = [1,2,3];
```
Ideally, when we apply methods on arrays, we'd like to maintain the original arrays upon which we call these methods on. That is, we'd like our methods to not mutate the arrays, but merely return a new array, and treat the original one as immutable.
One commonly method used on arrays in JS is `Array.prototype.map()`, which takes a callback as it's argument. This callback is mapped to each element in the array and returns a new array with the processed elements. The original array should remain unchanged.
But, this behaviour seemingly breaks in the case of `array1`, but not `array2` above:
```javascript
const array1 = [{ num: 1 },{ num: 2 }, { num: 3 }];
const array2 = [1,2,3];
function double (element) { // double the number by 2
if (element.num) {
element.num = element.num * 2
return element;
}
element = element * 2;
return element
};
const array1Copy = array1.map(double)
const array2Copy = array2.map(double)
console.log('array1', array1) // [{ num: 2 },{ num: 4 },{ num 6 }] 😨
console.log('array2', array2) // [1,2,3]
console.log('array1Copy', array1Copy) // [{ num: 2 },{ num: 4 },{ num 6 }]
console.log('array2Copy', array2Copy) // [2,4,6]
```
So, what just happened? Our `array1` seems to have been mutated beyond recognition, but `array2` has been left intact? How come?
The key thing is in the callback `double`. A keen eye would point out that this callback is in fact mutating the objects in `array1`. But how? Well, in JS when you pass objects like this to a callback (`double` in this case) they're passed as 'reference types' or 'passed by reference'. What this means is if we attempt to mutate these objects naively, this change is reflected back to the original array. This is because we are accessing a reference or 'address' to a piece of data in memory that is also used by `array1`, so obviously any change you make via that address will be reflected back to `array1`. This isn't a bug in the implementation of `Array.prototype.map()`.
To mitigate this, we need to access the objects 'value type' instead, i.e. we need to access the actual value contained by these objects. There are two ways of doing this.
First, we could use `Object.assign()` to copy the referenced object into a new object that we can access by value type. Folks who use the Redux library will realize the relevance of this method in maintaining immutability, though it makes for verbose code. But it's worth it!
```javascript
function double (element) { // double the number by 2
if (element.num) {
let o = {}; //empty object literal
Object.assign(o, element, { num: element.num*2 }); // copy "element" object, then new object into empty object,
return o;
}
element = element * 2;
return element
};
```
`Object.assign(target, source1, source2)` copies `source1` and `source2` to the `target` object. This allows for immutability by leaving the original objects intact and allowing us to return a new object instead. Now our original `array1` is maintained.
```javascript
const array1 = [{ num: 1 },{ num: 2 }, { num: 3 }];
const array2 = [1,2,3];
function double (element) { // double the number by 2
if (element.num) {
let o = {}; // empty object literal
Object.assign(o, element, { num: element.num*2 });
return o;
}
element = element * 2;
return element
};
const array1Copy = array1.map(double)
const array2Copy = array2.map(double)
console.log('array1', array1) // [{ num: 1 },{ num: 2 },{ num 3 }]
console.log('array2', array2) // [1,2,3]
console.log('array1Copy', array1Copy) // [{ num: 2 },{ num: 4 },{ num 6 }]
console.log('array2Copy', array2Copy) // [2,4,6]
```
Another, less immutable way of achieving the same thing would be to reassign the value of `element` with an entirely new object literal. This treats `element` in the exact same way as we treat it when processing the integer elements in the case of `array2`:
```javascript
const array1 = [{ num: 1 },{ num: 2 }, { num: 3 }];
const array2 = [1,2,3];
function double (element) { // double the number by 2
if (element.num) {
element = { num: element.num*2 }; // mutation that preserves array1
return element;
}
element = element * 2;
return element
};
const array1Copy = array1.map(double)
const array2Copy = array2.map(double)
console.log('array1', array1) // [{ num: 1 },{ num: 2 },{ num 3 }]
console.log('array2', array2) // [1,2,3]
console.log('array1Copy', array1Copy) // [{ num: 2 },{ num: 4 },{ num 6 }]
console.log('array2Copy', array2Copy) // [2,4,6]
```
Bottomline: treat your elements carefully inside your callback. Do not treat them as if they are simple objects whose property values, if any, can be mutated at a moment's notice. It is safer to take a hint from immutability and return a new object, or mutate the entire object literal when you want to preserve the original array.
As we can now see, immutability is easy to destroy with vanilla javascript. This isn't necessarily a problem in certain contexts, but mutable state makes for difficult debugging. Immutability brings back some sanity in an otherwise (apparently) insane language.
What: A web app that turns Google Drive into a wiki or help center
Why: In 2019, our B2B SaaS product was growing and we needed a help center. We quickly put together a Google Doc that we published to the web. It was ugly and hacky, but it worked! This started falling apart as our product grew, so we bit the bullet and started using an off-the-shelf help center tool.
We quickly started running into limitations. The biggest issue was the lack of collaboration. As a remote team, we love using Google Docs to work together to make content. We found ourselves creating content in Drive and then manually moving it over to our help center. Neither of us looked forward to doing this, and always tried to pawn it off 😉
We built Kbee to cut out the middle man and publish a full Google Drive folder as our help center. We give our customers a beautiful and fast experience while using all the Google Docs features we love.
Some key features:
* 🤝 Collaborate and create content directly in Google Drive
* 🔎 Full-text search powered by Algolia
* ⚡ Lightning fast load times (99 Performance Score on Lighthouse) (''this is important!!!!'')
* 🔒 Uses Google Drive's native authentication
* 🎨 Change themes and colors to fit your brand (including Dark Mode 🕶)
* 📷 Embed videos, codeblocks, iFrames, images, and more
* 📈 Native analytics, comments, and reactions (and no 3rd party trackers!)
* 🔗Link to 3rd party sites
* 📄 Publish Docs, Sheets, Slides, Forms, PDFs, Videos, GIFs and more!
Limitations:
* Limited to Google drive
* Price points prices out personal use (focuses on companies and businesses who need a wiki and help center for users and employees)
!!!This plugin adds the possibility of defining your own keyboard shortcuts for ~TiddlyWiki5 which are available //globally// - not only within the Editor
!!!It also adds an enhancement to Tiddlers in Edit-Mode that enables input-field navigation unsing <kbd>TAB</kbd> and <kbd>Shift-TAB</kbd>
!!!A quick How-To:
* create a tiddler with the title beginning with "$:/config/ShortcutInfo/" and ending with a descriptive suffix for your shortcut, like "new-tiddler": $:/config/ShortcutInfo/new-tiddler . This suffix is important, it will be used in the next tiddler's `key` field like `((your-suffix))`. It connects the keyboard shortcut with your action. You can put a description in this tiddler's text field, it will be shown in the ~ControlPanel
* create a tiddler with the Tag {{$:/tags/KeyboardShortcut||$:/core/ui/TagTemplate}} and put the desired actions in its text-field. In the new-tiddler case:<br>
<<copy-to-clipboard """<$navigator story="$:/StoryList" history="$:/HistoryList">
<$action-sendmessage $message="tm-new-tiddler"/>
</$navigator>""">>
```
<$navigator story="$:/StoryList" history="$:/HistoryList">
<$action-sendmessage $message="tm-new-tiddler"/>
</$navigator>
```
* add the field "key" to this Tiddler with its value: `((new-tiddler))`
* open the $:/ControlPanel and choose a keyboard shortcut for "new-tiddler". The shortcut should work immediately.
\define keymetrics-tag()
[[$(currentTiddler)$ Key Metrics]] [[$(currentTiddler)$]]
\end
\define keymetrics-filtertagparam()
$(currentTiddler)$ Key Metrics
\end
''Key Metrics''
<$button style="border: none; font-size: 10px">
➕
<$action-sendmessage $message="tm-new-tiddler" tags=<<keymetrics-tag>> title="Key Metric" />
Add item
</$button>
<ol>
<$list filter="[!has[draft.of]tag<keymetrics-filtertagparam>sort[created]]">
<li style="font-size: 12px">
<$link to={{!!title}}><$view field="title"/></$link>
<$button message="tm-delete-tiddler" param={{!!title}} style="border:none;">❎</$button>
</li>
</$list>
</ol>
An interesting, (albeit imho, messy) mind mapping tool from a dev associated with [[Glitch|https://glitch.com]].
[[Check it out 🔗|https://help.kinopio.club/about/]]
Information that is //experienced//, or presented in a way that makes it useful.
Could be described as information that is "learnable".
There's a lot of tacit knowledge on best practices and how to work that extend beyond simple information in Dropbox accounts and exist in hard to reach places like in other people's heads which can't be easily tracked.
__Problem__
In many organizations and for many workers, the production of knowledge products and deliverables is tedious enough on its own. What compounds the problem further, especially for organizations, is the task of creating derivative products from the primary products like powerpoints, reports, etc. These usually require tedious planning, editing and creativity, and the results most are often lackluster due to lack of time and skills.
__Solution__
Automated knowledge ETL workflow and pipelines to support fast creation of knowledge products. We could probably do this with OnePlaybook.
The direction OnePlaybook will probably take is towards being an open knowledge exchange service (with a special focus on [[actionable knowledge|ActionableKnowledge]]), complete with a means of aggregating and discovering information, and users assembling them into useful "problem-solution playbooks" for resharing. See [[notes from Wikimania 2021 discussing wikis original purpose as design patterns playbook|https://abesamma.github.io/wikimania2021]].
<iframe src="//www.slideshare.net/slideshow/embed_code/key/MqXWSl8YhOQooJ" width="100%" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/jackpark/knowledge-garden-overview" title="Knowledge Garden Overview" target="_blank">Knowledge Garden Overview</a> </strong> from <strong><a href="//www.slideshare.net/jackpark" target="_blank">Jack Park</a></strong> </div>
<<list-links "[tag<currentTiddler>sort[title]]">>
__Reading list__
* [[Use cases (stanford)|https://web.stanford.edu/class/cs520/2020/notes/What_Are_Some_High_Value_Use_Cases_Of_Knowledge_Graphs.html]]
* [[Intro|https://medium.com/analytics-vidhya/introduction-to-knowledge-graphs-and-their-applications-fb5b12da2a8b]]
* [[Personal knowledge graphs|https://www.strategicstructures.com/?p=2246]]
<<list-links "[tag[Knowledge management]!sort[modified]]">>
What about the required culture to support this?
# Support lightweight tools
# Start within your team and start small. Start by discussing the current challenges faced by team members and assign content to members of the team who have knowledge in a given area. If a lot of knowledge is concentrated with one or a small handful of individuals, have members of the team shadow and document processes. Doing so reduces the burden on the knowledge holders and cross-trains staff. Once documented, another team member should follow the guide and identify any stumbling blocks. When one is defined, the content should be updated by the team member performing the operation. As members of the team become familiar with the knowledge management system, opportunities for collaboration with other teams will arise. This is a great way to share your current system with the other team and encourage them to utilize the tool as well. When starting to engage the new team, grant editing privileges from the get go- doing so ensures that both groups have a sense of shared ownership.
# Integrate Knowledge Management into Orientation on day one
# Refer to it constantly: Knowledge content that goes unused becomes stale. As such, the team should refer to the content constantly. Within the team, it should not be perceived as a slight or rude to point someone to the documentation when asked “how do I do X?” If the documentation is incomplete and the team member is stuck, that is a good time to collaborate and fix the issue at hand. Referring to the documentation on a regular basis also shapes the way folks think about the challenges they face at work. ''Dependencies on knowledge hogs go down and team members feel empowered to complete a broader variety of tasks- thus becoming a cross functional team.''
# Validate your process: use what you see from day one
# Host periodic knowledge sharing sessions whenever possible and however you want. It should be periodic and hands-on.
<h2>Introduction</h2>
<p>Knowledge management is an activity practised by enterprises all over the world. In the process of knowledge management, these enterprises comprehensively gather information using many methods and tools.</p>
<p>Then, gathered information is organized, stored, shared, and analyzed using defined techniques.</p>
<p>The analysis of such information will be based on resources, documents, people and their skills.</p>
<p>Properly analyzed information will then be stored as 'knowledge' of the enterprise. This knowledge is later used for activities such as organizational decision making and training new staff members.</p>
<p>There have been many approaches to knowledge management from early days. Most of early approaches have been manual storing and analysis of information. With the introduction of computers, most organizational knowledge and management processes have been automated.</p>
<p>Therefore, information storing, retrieval and sharing have become convenient. Nowadays, most enterprises have their own knowledge management framework in place.</p>
<p>The framework defines the knowledge gathering points, gathering techniques, tools used, data storing tools and techniques and analyzing mechanism.</p>
<h2>The Knowledge Management Process</h2>
<p>The process of knowledge management is universal for any enterprise. Sometimes, the resources used, such as tools and techniques, can be unique to the organizational environment.</p>
<p>The Knowledge Management process has six basic steps assisted by different tools and techniques. When these steps are followed sequentially, the data transforms into knowledge.</p>
<p><img alt="Knowledge Management Process" src="https://www.tutorialspoint.com/management_concepts/images/knowledge_management_process.jpg" /></p>
<h3>Step 1: Collecting</h3>
<p>This is the most important step of the knowledge management process. If you collect the incorrect or irrelevant data, the resulting knowledge may not be the most accurate. Therefore, the decisions made based on such knowledge could be inaccurate as well.</p>
<p>There are many methods and tools used for data collection. First of all, data collection should be a procedure in knowledge management process. These procedures should be properly documented and followed by people involved in data collection process.</p>
<p>The data collection procedure defines certain data collection points. Some points may be the summary of certain routine reports. As an example, monthly sales report and daily attendance reports may be two good resources for data collection.</p>
<p>With data collection points, the data extraction techniques and tools are also defined. As an example, the sales report may be a paper-based report where a data entry operator needs to feed the data manually to a database whereas, the daily attendance report may be an online report where it is directly stored in the database.</p>
<p>In addition to data collecting points and extraction mechanism, data storage is also defined in this step. Most of the organizations now use a software database application for this purpose.</p>
<h3>Step 2: Organizing</h3>
<p>The data collected need to be organized. This organization usually happens based on certain rules. These rules are defined by the organization.</p>
<p>As an example, all sales-related data can be filed together and all staff-related data could be stored in the same database table. This type of organization helps to maintain data accurately within a database.</p>
<p>If there is much data in the database, techniques such as 'normalization' can be used for organizing and reducing the duplication.</p>
<p>This way, data is logically arranged and related to one another for easy retrieval. When data passes step 2, it becomes information.</p>
<h3>Step 3: Summarizing</h3>
<p>In this step, the information is summarized in order to take the essence of it. The lengthy information is presented in tabular or graphical format and stored appropriately.</p>
<p>For summarizing, there are many tools that can be used such as software packages, charts (Pareto, cause-and-effect), and different techniques.</p>
<h3>Step 4: Analyzing</h3>
<p>At this stage, the information is analyzed in order to find the relationships, redundancies and patterns.</p>
<p>An expert or an expert team should be assigned for this purpose as the experience of the person/team plays a vital role. Usually, there are reports created after analysis of information.</p>
<h3>Step 5: Synthesizing</h3>
<p>At this point, information becomes knowledge. The results of analysis (usually the reports) are combined together to derive various concepts and artefacts.</p>
<p>A pattern or behavior of one entity can be applied to explain another, and collectively, the organization will have a set of knowledge elements that can be used across the organization.</p>
<p>This knowledge is then stored in the organizational <em>knowledge base</em> for further use.</p>
<p>Usually, the knowledge base is a software implementation that can be accessed from anywhere through the Internet.</p>
<p>You can also buy such knowledge base software or download an open-source implementation of the same for free.</p>
<h3>Step 6: Decision Making</h3>
<p>At this stage, the knowledge is used for decision making. As an example, when estimating a specific type of a project or a task, the knowledge related to previous estimates can be used.</p>
<p>This accelerates the estimation process and adds high accuracy. This is how the organizational knowledge management adds value and saves money in the long run.</p>
<h2>Conclusion</h2>
<p>Knowledge management is an essential practice for enterprise organizations. Organizational knowledge adds long-term benefits to the organization in terms of finances, culture and people.</p>
<p>Therefore, all mature organizations should take necessary steps for knowledge management in order to enhance the business operations and organization's overall capability.</p>
We're in the end game for this version of OnePlaybook. Now we must plan the UI that best reflects what people do in the real world with respect to knowledge management.
First off, with Maarfapad, we've understood two main realities:
# Most people create and use one wiki for personal use
# If they have to create more wikis, it is usually for another purpose other than personal use, usually for the ''purpose of sharing something with others online <mark>without giving them access to other tiddlers</mark>''
There is also the question of shared tiddlers. I think shared tiddlers are important because they allow for selective sharing without the added burden of creating new wikis for sharing. This is great for teams who each might have personal wikis and do not desire to create a new wiki or wikis for the purpose of collaboration.
So, we can have two levels of creation and sharing:
# At the wiki level
# At the tiddler level
All of the above will require a simple means of authentication and authorization. Preferably one way. Over time, we could gather more usage information to see which way is preferred over the other and remove the underused method of sharing, if any.
Ever since new tools in the productivity domain like Roam Research and Notion burst into the scene, there has been a wave of renewed interest in solving the problem of personal knowledge management (PKM) and knowledge organization in general for individuals and teams, and in the process, people have rediscovered certain well established design philosophies and principles that had already been in existence for a considerable period of time in this space.
[There already exists many ways of organizing knowledge]((https://fibery.io/blog/the-knowledge-organization/)), each architecture having its own merits and demerits, supporters and detractors (which helps shatter the illusion that there is an optimum way to organize one's knowledge because it all probably depends on a lot of contextual factors). Besides the vertical hierarchy of the evergreen file directory system that we're all familiar with, there is also the linking of pieces of information using hypertext pioneered by the likes of heavyweights in computing such as Douglas Engelbart, Ted Nelson and many others. However, most of the principles behind many successful PKM software can be traced back to the first wiki software and design philosophy by Ward Cunningham (who borrowed the word from the Hawaiian word 'wiki' meaning 'quick', emphasizing its ability to allow users to quickly edit pages on the web). The most impactful and successful wiki project, Wikipedia, which can trace its first edit all the way to 15th January, 2001 and is itself built and run on another successful PKM software called ~MediaWiki, has yet to be outdone as a repository for humanity's collective knowledge.
<p><a href="https://commons.wikimedia.org/wiki/File:Earliest_known_Wikipedia_edit.png#/media/File:Earliest_known_Wikipedia_edit.png"><img src="https://upload.wikimedia.org/wikipedia/commons/2/2b/Earliest_known_Wikipedia_edit.png" alt="Earliest known Wikipedia edit.png"></a>
<br>Earliest edits in Wikipedia. By <a href="//commons.wikimedia.org/wiki/User:Bri" title="User:Bri">Bri</a> - <span class="int-own-work" lang="en">Own work</span>,
<a href="https://creativecommons.org/licenses/by-sa/4.0" title="Creative Commons Attribution-Share Alike 4.0">CC BY-SA 4.0</a>,
<a href="https://commons.wikimedia.org/w/index.php?curid=81727279">Source</a>
Ward Cunningham, and the wider wiki community's vision however did not end with the original vision for wikis, or Wikipedia for that matter. Their attempts to create the next generation of knowledge organization took the form of [Federated Wikis](#Federated%20Wikis). There are a number of still working examples of such wikis out there on the web. The most famous being the [Smallest Federated Wiki](https://en.wikipedia.org/wiki/Smallest_Federated_Wiki), which allows users to add their voice to what Cunningham calls the 'chorus of voices', maintaining their own individual views on the matter while contributing to a wider network of individually owned, connected copies of the wiki in contrast to forcing everyone into a consensus like in Wikipedia (which sometimes causes periodic, often edit wars between human contributors).
One reason this type of wikis has not yet gone mainstream may be because they require a new way of thinking; Federated wikis are closer to how software developers build software with Git. Instead of a single centralized wiki to contribute to, participants instead pull entries from copies of individual wikis owned and run by other individuals into their own wiki, add on or remove things and push out the resulting changes to the resulting networked 'chorus', or keep it private. It is therefore decentralized (partly at least), not unlike other federated spaces like [Diaspora](https://en.wikipedia.org/wiki/Diaspora_(social_network)) and [Mastodon](https://en.wikipedia.org/wiki/Mastodon_(software)).
I consider this model of organization better, and perhaps even more robust, at capturing knowledge across non-trivial, mission-driven human teams and organizations, and some of the reasons are fairly obvious. For starters, as a federation, we gain the benefits of network thinking like in Roam Research (though Roam and its philosophy embraces mostly flat network model, a feature that, though cool at the surface, tends to be [less than useful in the long-term](https://reallifemag.com/rank-and-file/) among [other issues](https://fibery.io/blog/the-knowledge-organization/)), but with less exposure to the inherent risks of centralization while retaining some of the benefits of structure usually present in centralization. Federations are open [hierarchical networks](#Hierarchical%20networks) with trust mechanisms in place to mitigate these networked interactions of thought, and they [open some opportunities](#Philosophy) that are far reaching though non-obvious to most.
Why should we care about open hierarchical networks of knowledge? Because [reasoning may have evolved with an important social aspect](https://youtu.be/_ArVh3Cj9rw); no one group's reasoning and knowledge can be considered true or at the very least complete if it hasn't incorporated inputs and perspectives beyond itself. Perhaps that is why open projects and open networks seem to be better at coming up with more robust solutions to problems, or why peer review happens to work at all in the pursuit of scientific inquiries. **The crowd is the ultimate team**. And the crowd is very much a hierarchical network, not a flat network.
Consider how the crowd structures itself online today in a world dominated by platforms. Certain groups of people tend to cluster around a few tools they find to be useful for their needs, but they still need to collaborate and cross-reference beyond these platforms. An attempt to federate the crowd's thoughts therefore seems necessary, because no one platform or standard app can begin to accommodate all of the nuanced requirements of every persons' style of thinking. Many tools already allow users to federate through integrations to varying degrees, spawning hierarchical networks out of necessity (sometimes as part of an effective growth strategy). More can be done by service providers of course to make the experience more seamless, but these attempts are already helping to enrich the wider web experience, and the productiveness of people online.
Thus we see that individuals' knowledge organization behavior and social networks tend to follow a hierarchical networked model, and that their tools must accommodate this reality. The 'chorus' is no flat network; the voices of users tend to cluster around certain hubs, which grow long roots to link up with other domains and ideas. This is how humanity (and arguably even the human mind) truly links up knowledge. It is non-linear, but there is still structure because humans need structure. If there is none, we tend to invariably make one up as we go. We build around axioms, cornerstone ideas, theories, philosophies and codes, then link these 'hub ideas' with other ideas in a federated network. Hub ideas are sometimes proven to be useful and/or true and persist to allow more clustering and linking, or they are disproven and removed from the network. Paradigm shifts can be thought of as the removal of a great number of these hubs that cause networks to be remodeled into a new global topology or even even broken up into smaller, isolated graphs (not unlike schisms).
So, with all this talk about hierarchical networks, let's each pose a thought experiment to ourselves: how many central idea/knowledge hubs can we suffer removal, change or add on to the mind while actively engaging in the chorus before we reshape our hierarchical networked thoughts into new, exhilarating or maybe terrifying insights? Therein lies perhaps the ultimate goal that such tools of thought should strive for: to challenge our thinking and extend our horizons, and not merely to help consolidate our preconceived ideas into an ossified meshwork of confirmation biases locked up behind a paywall-ed ~SaaS service.
References
---------
1. {{Slime molds network dynamics}}
Further Reading
----------
* [Knowledge organization](https://fibery.io/blog/the-knowledge-organization/)
* [Hierarchical networks](https://en.wikipedia.org/wiki/Hierarchical_network_model)
* [Computer Lib/Dream Machines](https://en.wikipedia.org/wiki/Computer_Lib/Dream_Machines)
* [Intertwingling](https://en.wikipedia.org/wiki/Intertwingularity)
* [Vsauce video about social theory of reasoning](https://youtu.be/_ArVh3Cj9rw)
* [A thesis with a great definition of hierarchical networks](https://core.ac.uk/download/pdf/13738027.pdf)
* {{Building a second brain!!source}}
Discovered this interesting [[website|https://www.francismiller.com/]] run by a [[Francis Miller|https://twitter.com/francis_miller]], who is into information and learning design.
What I found particularly interesting is his paper on [[knowledge organization using something called multi-level content|https://www.francismiller.com/organising-knowledge/]], where he attempts to communicate ways of making knowledge easier to understand, remember and communicate.
He recognizes that dealers of knowledge have to deal with 2 problems:
# structure (arrangement of knowledge)
# multiple knowledge levels (hierarchical levels of differing sophistication and abstraction, from the simple summary to the detailed core)
He asserts that when it comes to structure:
<<<
Making sense of any knowledge requires understanding the structure of the explanation. However neither spoken or written words on their own are very effective at communicating structure
Without visual representations of knowledge structures, more cognitive energy is required to decipher what has been described in speech or text.
<<<
These visual representations are his solution to the problem of structure; maps, diagrams, tables and graphics are listed as examples
Likewise, when it comes to multiple levels of knowledge, he explains that it is important that people should be shown all these levels clearly and in a differentiated manner:
<<<
Learners can struggle if descriptions of the big picture or the core information are not marked out clearly but are instead hidden in a mass of detail – or are missing.
<<<
Different needs of people means that some may only require the 'big picture' summary while others require the details. These needs are better served by clearly delineating these levels.
This is important in creating non-fiction books, to businesses and organizations looking to educate, train and offer information services.
[[Here is the paper for a detailed explanation|https://www.francismiller.com/organising_knowledge_paper.pdf]]
Many students can't test their knowledge in many domains. I wish we had a consolidated repo that was open and constantly updated, or at least aggregates from different sources, along with a rating system to determine level of difficulty.
__Problem__
Many users, in an effort to secure their files, choose some unusual [[cloud storage practices|Security practices among cloud storage users]] to share their files while protecting their main primary storage accounts.
__Solution__
Extract this manual task (2 or more steps) into a quick SaaS solution (1 step ideally) with OnePlaybook. Need more details...
# What knowledge to create?
# What knowledge to collect?
# Where to store the knowledge?
# How do you retrieve it?
# How do you search and filter it?
# How do you connect it with other knowledge?
# How do you make decisions with it?
# How do you improve it?
<<todolist-ui caption:"!! My Todo List" base:"Simple" width:60%>>
<<list-links "[tag[Kotlin]]">>
<iframe width="100%" height="500px" frameborder=0 src="https://kotlinlang.org/docs/reference/basic-syntax.html">
</iframe>
<iframe src="https://kotlinlang.org/docs/kotlin-docs.pdf" width="100%" height="500px" frameborder=0>
</iframe>
* I need to clarify the range of room temperature in the SOP
* Need to reconcile the BD dosage frequency in the neonatal units for Ampicillin/Ampiclox in the protocol and the SOP
* Need to update the administration section of the Pharmacy SOP. Use the slides provided
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
sodipodi:docname="Lab_logo_descriptive.svg"
id="svg8"
version="1.1"
viewBox="0 0 771.60394 247.71634"
height="auto"
width="250px">
<defs
id="defs2">
<linearGradient
id="linearGradient34">
<stop
style="stop-color:#fd047b;stop-opacity:1"
offset="0"
id="stop956" />
<stop
id="stop958"
offset="0.66373509"
style="stop-color:#fd4e64;stop-opacity:1;" />
<stop
style="stop-color:#fe984e;stop-opacity:1"
offset="1"
id="stop960" />
</linearGradient>
<linearGradient
id="linearGradient34-6">
<stop
id="stop30"
offset="0"
style="stop-color:#fd047b;stop-opacity:1" />
<stop
style="stop-color:#fd4e64;stop-opacity:1;"
offset="0.50583661"
id="stop1529" />
<stop
id="stop32"
offset="1"
style="stop-color:#fe984e;stop-opacity:1" />
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
y2="257.6427"
x2="184.79944"
y1="86.113167"
x1="6.7698488"
id="linearGradient36"
xlink:href="#linearGradient34-6" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath113">
<g
id="g117"
style="fill:#000000;stroke:none"
transform="matrix(0.03439583,0,0,-0.03439583,-5.864863,297.31878)">
<path
d="m 4655.0465,2463.15 c -5.27,-5.03 -13.02,-9.23 -20.1,-10.99 -7.55,-1.88 -16.88,-1.72 -24.43,0.16 -8.4,2.09 -17.51,6.92 -24.2001,12.42 -7.59,6.26 -14.72,15.45 -19.24,24.18 -5.15,9.96 -8.72,22.66 -9.9,33.81 -1.35,12.65 -0.12,27.52 2.92,39.87 3.43,13.92 10.24,29.23 17.98,41.3 8.65,13.47 21.2301,27.27 33.6301,37.39 13.74,11.2 31.64,21.51 48.12,28.06 18.1,7.19 40.22,12.17 59.64,13.73 21.2,1.7 45.86,-0.11 66.64,-4.59 22.55,-4.87 47.61,-14.37 67.85,-25.43 21.82,-11.94 44.87,-29.38 62.48,-46.96 18.89,-18.87 37.43,-43.73 50.35,-67.1 13.81,-24.98 25.52,-55.98 31.92,-83.8 6.82,-29.62 9.76,-64.77 8.23,-95.12 -1.63,-32.2001 -8.78,-68.9301 -19.09,-99.4701 -10.92,-32.31 -28.7,-67.65 -47.94,-95.81 -20.29,-29.69 -48.4,-60.53 -75.93,-83.66 -28.96,-24.3399 -66.15,-47.6499 -100.58,-63.3299 -36.13,-16.45 -80.27,-29.58 -119.48,-35.78 -41.07,-6.49 -89.2801,-7.4 -130.5901,-2.71 -43.17,4.9 -91.99,17.38 -132.31,33.59 -42.06,16.9 -87.7,42.98 -123.77,70.4399 -37.56,28.6 -76.2,67.38 -104.85,104.9 -29.7899,39.03 -57.8699,88.54 -76.2899,134.05 -19.12,47.2601 -33.67,104.5401 -39.64,155.1701 -6.19,52.5 -5.07,113.78 2.79,166.06 8.15,54.14 25.98,115.06 48.09,165.15 22.88,51.81 57.2499,107.76 92.9499,151.73 36.89,45.44 86.35,91.88 133.88,126.0399 49.06,35.2501 110.92,68.1101 167.52,89.2501 58.37,21.8 128.8101,37.77 190.8501,43.5 63.93,5.91 138.29,2.76 201.53,-8.3 65.11,-11.38 138.13,-34.55 197.98,-62.59 61.57,-28.84 127.8299,-71.5001 179.6999,-115.45 53.32,-45.17 107.58,-105.31 147.2301,-162.85 40.72,-59.11 78.36,-133.3 102.22,-200.99 24.48,-69.49 41.87,-153.08 47.35,-226.55 5.63,-75.35 0.45,-162.7801 -13.8,-236.9901 -14.61,-76.07 -43.13,-161.1999 -77.09,-230.8199 -34.79,-71.33 -85.76,-147.89 -137.9601,-207.66 -53.44,-61.21 -124.27,-123.27 -191.8299,-168.42 -69.14,-46.1901 -155.67,-88.6101 -234.46,-115.1801 -80.59,-27.18 -177.34,-45.99 -262.23,-51.22 -86.7801,-5.35 -187.2901,1.86 -272.4601,19.31 -87.04,17.84 -184.27,51.7 -263.6599,91.59 -81.08,40.7501 -167.95,100.0101 -235.62,160.4601 L 2482.2664,2913.52 c -57.14,49.45 -130.27,97.65 -198.34,130.46 -66.36,31.9799 -147.46,58.7199 -219.87,72.26 -70.56,13.18 -153.63,17.68 -225.17,11.97 -69.66,-5.57 -148.87,-22.4801 -214.65,-46.0801 -64,-22.9499 -134.08,-58.9899 -189.84,-97.8899 -54.2,-37.82 -110.78,-89.47 -153.19,-140.17 -41.2,-49.24 -81.1,-112.06 -107.95,-170.37 -26.06,-56.6 -47.45,-125.59 -57.76,-187.04 -9.99,-59.59 -12.46,-129.58 -6.46,-189.7001 5.81,-58.24 21.3,-124.3 42.21,-178.97 20.23,-52.8999 51.5,-110.6399 84.93,-156.3599 32.32,-44.19 76.16,-90.09 118.98,-124.22 41.34,-32.95 93.85,-64.55 142.41,-85.44 46.83,-20.15 103.72,-36.19 154.2,-43.26 48.63,-6.81 105.55,-7.25 154.24,-0.96 46.82,6.05 99.72,20.12 143.27,38.36 41.82,17.5 87.22,43.99 122.89,71.96 34.19,26.82 69.42,62.85 95.25,97.79 24.72,33.43 48.03,75.64 62.94,114.45 14.24,37.06 24.94,81.8499 28.76,121.3699 3.63,37.65 2.04,81.51 -4.56,118.76 -6.27,35.41 -18.92,75.1701 -34.49,107.5901 -14.76,30.74 -36.48,63.82 -59,89.42 -21.29,24.21 -49.53,48.76 -76.6,66.27 -25.52,16.51 -57.43,31.53 -86.49,40.44 -27.29,8.36 -59.99,13.72 -88.53,14.25 -26.7,0.5 -57.5,-3.12 -83.29,-10.06 -24.03,-6.46 -50.65,-17.69 -71.9,-30.63 -19.7,-11.99 -40.47,-28.94 -55.95,-46.03 -14.28,-15.76 -28.17,-36.22 -37.3,-55.42 -8.36,-17.6 -15.11,-39.25 -17.93,-58.52 -2.57,-17.54 -2.59,-38.2 0.24,-55.7 2.56,-15.8001 8.23,-33.5901 15.57,-47.8201 6.57,-12.74 16.43,-26.29 26.77,-36.22 9.18,-8.81 21.44,-17.31 33.07,-22.47 10.25,-4.55 23.03,-7.81 34.23,-8.32 9.83,-0.46 21.35,1.12 30.56,4.57 8.11,3.04 16.85,8.51 22.86,14.74 5.4,5.6 10.21,13.6 12.35,21.08 2.01,7.01 2.26,15.82 0.53,22.91 -1.72,7.08 -1.48,15.9 0.53,22.91 2.15,7.47 6.96,15.48 12.36,21.07 6.01,6.2301 14.75,11.7101 22.86,14.7401 9.21,3.45 20.73,5.03 30.56,4.58 11.2,-0.52 23.98,-3.77 34.23,-8.32 11.63,-5.1701 23.89,-13.6601 33.07,-22.4801 10.34,-9.93 20.19,-23.48 26.77,-36.22 7.34,-14.22 13.01,-32.02 15.57,-47.82 2.83,-17.5 2.81,-38.15 0.24,-55.69 -2.82,-19.28 -9.57,-40.93 -17.93,-58.52 -9.13,-19.21 -23.02,-39.66 -37.3,-55.4199 -15.48,-17.09 -36.25,-34.05 -55.95,-46.04 -21.25,-12.93 -47.87,-24.17 -71.9,-30.63 -25.79,-6.93 -56.59,-10.56 -83.29,-10.06 -28.54,0.53 -61.24,5.89 -88.53,14.26 -29.06,8.9 -60.97,23.93 -86.49,40.43 -27.07,17.52 -55.31,42.07 -76.6,66.2799 -22.52,25.6 -44.24,58.67 -59,89.41 -15.57,32.42 -28.22,72.18 -34.5,107.59 -6.59,37.25 -8.18,81.1101 -4.55,118.7701 3.82,39.51 14.52,84.3 28.76,121.36 14.91,38.81 38.22,81.02 62.94,114.45 25.83,34.94 61.05,70.98 95.25,97.79 35.67,27.97 81.07,54.46 122.89,71.97 43.55,18.23 96.45,32.3 143.27,38.35 48.69,6.29 105.61,5.85 154.23,-0.96 50.49,-7.06 107.38,-23.11 154.21,-43.25 48.56,-20.89 101.07,-52.5 142.41,-85.45 42.81,-34.12 86.66,-80.02 118.98,-124.22 33.43,-45.72 64.69,-103.46 84.93,-156.36 20.91,-54.67 36.4,-120.7201 42.21,-178.9601 6,-60.12 3.53,-130.12 -6.46,-189.6999 -10.31,-61.46 -31.7,-130.44 -57.76,-187.04 -26.85,-58.32 -66.75,-121.14 -107.95,-170.38 -42.41,-50.69 -98.99,-102.34 -153.2,-140.16 -55.75,-38.9001 -125.83,-74.9501 -189.83,-97.9001 -65.78,-23.59 -144.99,-40.51 -214.65,-46.07 -71.54,-5.72 -154.61,-1.22 -225.17,11.97 -72.42,13.53 -153.51,40.27 -219.87,72.26 -68.07,32.8 -141.2,81.0001 -198.34,130.4501 -58.58,50.69 -118.04,117.95 -161.34995,182.17 -44.37,65.79 -85.198,148.21 -110.86499,223.3 -26.279,76.8899 -44.618,169.2599 -49.933,250.3399 -5.438,82.9701 1.093,179.1201 17.478,260.6401 16.759,83.38 48.84299,176.58 86.75999,252.71 38.76,77.83 95.24995,161.27 152.95995,226.31 58.96,66.45 136.9,133.73 211.14,182.53 75.83,49.85 170.59,95.45 256.78,123.83 l 1736.46,587.68 c 71.39,24.76 149.69,63.99 212.14,106.54 60.89,41.48 124.59,98.34 172.52,154.28 46.69,54.51 92.13,124.2 122.95,189.02 30.0101,63.11 54.9701,140.17 67.4201,208.93 12.12,66.9 15.95,145.61 10.14,213.35 -5.65,65.85 -22.09,140.6801 -44.79,202.75 -22.05,60.3 -56.5001,126.27 -93.5701,178.68 -35.99,50.87 -85.04,103.89 -133.11,143.54 -46.6,38.44 -105.99,75.58 -161.05,100.45 -53.34,24.08 -118.3,43.69 -176.09,52.92 -55.93,8.93 -121.57,10.72 -177.8799,4.63 -54.44,-5.89 -116.1101,-20.91 -167.0701,-40.93 -49.2,-19.32 -102.83,-49 -145.2,-80.61 -40.86,-30.48 -83.2,-71.72 -114.57,-111.91 -30.2,-38.71 -59.04,-87.78 -77.94,-133.1 -18.17,-43.57 -32.44,-96.42 -38.42,-143.2499 -5.75,-44.97 -5.51,-97.5301 0.88,-142.4101 6.12,-43.02 19.72,-91.54 37.06,-131.38 16.6,-38.12 41.49,-79.42 67.65,-111.73 24.97,-30.87 58.41,-62.53 90.73,-85.59 30.79,-21.98 69.56,-42.53 105.12,-55.44 33.81,-12.28 74.56,-21.2 110.42,-23.93 34.01,-2.58 73.51,-0.31 106.9401,6.39 31.62,6.34 66.9999,18.52 95.6999,33.21 27.05,13.84 56.02,33.97 78.26,54.68 20.89,19.45 41.88,45.09 56.61,69.54 13.78,22.87 26.05,51.36 32.94,77.16 6.41,24.04 10,52.72 9.42,77.59 -0.54,23.05 -4.84,49.51 -11.9,71.47 -6.5,20.24 -17.27,42.5 -29.34,60.01 -11.06,16.0401 -26.43,32.7001 -41.71,44.7901 -13.91,10.99 -31.79,21.34 -48.36,27.63 -14.96,5.69 -33.21,9.68 -49.2,10.43 -14.32,0.68 -30.9799,-1.08 -44.7499,-5.07 -12.22,-3.54 -25.71,-9.92 -36,-17.41 -9.07,-6.6 -18.27,-16.04 -24.32,-25.48 -5.31,-8.28 -9.7,-19.05 -11.32,-28.7501 -1.42,-8.54 -1.05,-18.85 1.34,-27.17 2.15,-7.47 6.67,-15.64 12.07,-21.23 5.07,-5.25 12.58,-9.87 19.58,-11.92 7,-2.05 14.51,-6.67 19.57,-11.91 5.41,-5.6 9.93,-13.77 12.08,-21.24 2.39,-8.32 2.76,-18.63 1.34,-27.17 -1.62,-9.7 -6.02,-20.47 -11.32,-28.75 -6.05,-9.44 -15.26,-18.88 -24.32,-25.48 -10.29,-7.49 -23.78,-13.86 -36,-17.4 -13.7701,-3.99 -30.4301,-5.76 -44.7501,-5.08 -15.99,0.76 -34.24,4.74 -49.2,10.43 -16.58,6.3 -34.45,16.64 -48.36,27.64 -15.28,12.08 -30.65,28.75 -41.71,44.79 -12.07,17.5 -22.84,39.76 -29.35,60.01 -7.06,21.95 -11.36,48.41 -11.89,71.4601 -0.58,24.88 3,53.55 9.42,77.59 6.89,25.7999 19.16,54.2899 32.94,77.1599 14.73,24.45 35.72,50.09 56.61,69.55 22.24,20.71 51.21,40.83 78.26,54.68 28.7,14.68 64.0801,26.86 95.6901,33.2 33.44,6.7 72.9399,8.97 106.9399,6.39 35.86,-2.73 76.62,-11.65 110.42,-23.93 35.56,-12.91 74.34,-33.46 105.13,-55.43 32.32,-23.07 65.75,-54.73 90.73,-85.59 26.15,-32.32 51.05,-73.6099 67.65,-111.7299 17.34,-39.85 30.94,-88.3701 37.06,-131.3901 6.39,-44.87 6.63,-97.44 0.88,-142.4 -5.98,-46.84 -20.25,-99.69 -38.42,-143.26 -18.9,-45.31 -47.74,-94.39 -77.95,-133.09 -31.36,-40.19 -73.7,-81.43 -114.56,-111.92 -42.37,-31.61 -96,-61.28 -145.2,-80.61 -50.96,-20.01 -112.6399,-35.03 -167.0699,-40.92 -56.3101,-6.1 -121.9501,-4.31 -177.8801,4.62 -57.8,9.23 -122.75,28.84 -176.09,52.93 -55.07,24.86 -114.45,62 -161.06,100.45 -48.06,39.65 -97.11,92.67 -133.1,143.53 -37.08,52.42 -71.53,118.38 -93.57,178.68 -22.7,62.07 -39.14,136.9 -44.79,202.75 -5.81,67.7401 -1.99,146.4501 10.13,213.35 12.46,68.76 37.42,145.82 67.43,208.93 30.82,64.82 76.26,134.51 122.95,189.02 47.93,55.95 111.63,112.8 172.52,154.29 62.44,42.54 140.75,81.77 212.14,106.54 73.19,25.38 161.17,43.24 238.4401,48.64 79.1699,5.53 170.9499,-0.32 248.8199,-15.64 79.73,-15.68 168.89,-45.99 241.76,-81.92 74.58,-36.78 154.58,-90.51 216.99,-145.46 63.8301,-56.2 128.5001,-130.59 175.4701,-201.49 48.02,-72.48 92.03,-163.13 119.51,-245.62 28.07,-84.2899 47.3599,-185.43 52.4999,-274.12 5.26,-90.59 -2.63,-195.46 -21.1499,-284.29 L 3775.3464,2720.83 c -14.25,-74.21 -19.43,-161.64 -13.81,-236.99 5.49,-73.47 22.88,-157.0701 47.36,-226.5501 23.8601,-67.69 61.5001,-141.88 102.2201,-200.9899 39.65,-57.54 93.91,-117.68 147.23,-162.85 51.87,-43.95 118.1299,-86.62 179.6999,-115.45 59.85,-28.04 132.87,-51.21 197.98,-62.59 63.24,-11.06 137.59,-14.21 201.5201,-8.3 62.05,5.73 132.49,21.69 190.86,43.5 56.6,21.14 118.45,53.99 167.52,89.25 47.53,34.15 96.99,80.6 133.88,126.04 35.6999,43.97 70.0699,99.92 92.9499,151.7299 22.11,50.09 39.94,111.01 48.09,165.15 7.86,52.2801 8.98,113.5501 2.79,166.0601 -5.97,50.62 -20.52,107.91 -39.64,155.17 -18.42,45.51 -46.5,95.02 -76.29,134.04 -28.6499,37.53 -67.2899,76.31 -104.8499,104.91 -36.07,27.46 -81.71,53.53 -123.77,70.44 -40.32,16.2 -89.14,28.69 -132.31,33.59 -41.31,4.69 -89.52,3.78 -130.59,-2.72 -39.21,-6.19 -83.3501,-19.32 -119.4801,-35.77 -34.43,-15.68 -71.62,-38.99 -100.58,-63.33 -27.53,-23.13 -55.64,-53.97 -75.93,-83.66 -19.24,-28.16 -37.02,-63.5 -47.94,-95.81 -10.31,-30.55 -17.46,-67.27 -19.09,-99.48 -1.53,-30.35 1.41,-65.5 8.23,-95.11 6.4,-27.82 18.11,-58.82 31.91,-83.8 12.93,-23.37 31.46,-48.24 50.36,-67.1001 17.61,-17.58 40.65,-35.02 62.48,-46.96 20.24,-11.06 45.3,-20.57 67.84,-25.43 20.79,-4.49 45.45,-6.29 66.65,-4.59 19.4201,1.55 41.5401,6.53 59.6401,13.73 16.48,6.55 34.37,16.85 48.11,28.06 12.41,10.11 24.99,23.92 33.64,37.39 7.74,12.0601 14.55,27.3701 17.98,41.2901 3.04,12.36 4.27,27.22 2.92,39.88 -1.18,11.15 -4.75,23.85 -9.91,33.81 -4.51,8.73 -11.64,17.92 -19.23,24.17 -6.69,5.51 -15.8,10.34 -24.2,12.43 -7.55,1.87 -16.88,2.04 -24.43,0.16 -7.08,-1.77 -14.83,-5.96 -20.11,-11 z m -1216.3701,-23.88 269.18,1346.96 -1301.09,-440.36 z"
id="path115"
style="fill:#000000;stroke:none;stroke-width:1" />
</g>
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient34-6"
id="linearGradient954"
x1="109.55528"
y1="183.79472"
x2="100.43088"
y2="191.01703"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.99759084,0,0,0.9706289,-67.284375,-393.19426)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient34-6"
id="linearGradient977"
x1="22.760374"
y1="173.50294"
x2="185.05908"
y2="173.50294"
gradientUnits="userSpaceOnUse" />
<linearGradient
xlink:href="#linearGradient6062"
id="linearGradient6064"
x1="52.160706"
y1="235.0119"
x2="140.00238"
y2="148.83606"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-204.73314,3.146116)" />
<linearGradient
id="linearGradient6062">
<stop
style="stop-color:#800080;stop-opacity:1"
offset="0"
id="stop6058" />
<stop
style="stop-color:#fd047b;stop-opacity:1"
offset="1"
id="stop6060" />
</linearGradient>
<linearGradient
xlink:href="#linearGradient6062"
id="linearGradient6064-6"
x1="52.160706"
y1="235.0119"
x2="140.00238"
y2="148.83606"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.81432454,0,0,0.81432454,-191.98756,28.97854)" />
<linearGradient
xlink:href="#linearGradient34"
id="linearGradient6064-66"
x1="57.502525"
y1="235.59583"
x2="182.93651"
y2="68.206467"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.08567879,1.2051396,-1.2051396,-0.08567879,308.26868,76.634087)" />
<linearGradient
xlink:href="#linearGradient6062"
id="linearGradient6064-9"
x1="52.160706"
y1="235.0119"
x2="140.00238"
y2="148.83606"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-223.82822,113.3411)" />
<linearGradient
xlink:href="#linearGradient6062"
id="linearGradient6064-8"
x1="52.160706"
y1="235.0119"
x2="140.00238"
y2="148.83606"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1063991,0,0,1.1063991,-13.319488,13.248297)" />
<linearGradient
xlink:href="#linearGradient6062"
id="linearGradient6064-3"
x1="52.160706"
y1="235.0119"
x2="140.00238"
y2="148.83606"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-248.3405,72.006668)" />
<linearGradient
xlink:href="#linearGradient6062"
id="linearGradient6064-4"
x1="52.160706"
y1="235.0119"
x2="140.00238"
y2="148.83606"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.7795275,0,0,3.7795275,-1122.651,-313.96529)" />
<linearGradient
xlink:href="#linearGradient6062"
id="linearGradient6064-38"
x1="52.160706"
y1="235.0119"
x2="140.00238"
y2="148.83606"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-271.47946,41.670413)" />
<linearGradient
id="linearGradient6995">
<stop
style="stop-color:#fd047b;stop-opacity:1"
offset="0"
id="stop6989" />
<stop
id="stop6991"
offset="0.55447292"
style="stop-color:#fd4e64;stop-opacity:1;" />
<stop
style="stop-color:#fe984e;stop-opacity:1"
offset="1"
id="stop6993" />
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
y2="272.80951"
x2="200.32738"
y1="78.529755"
x1="6.0476193"
id="linearGradient36-8"
xlink:href="#linearGradient34-6" />
<radialGradient
xlink:href="#linearGradient6995"
id="radialGradient6444"
cx="341.24771"
cy="54.662258"
fx="341.24771"
fy="54.662258"
r="427.12299"
gradientTransform="matrix(1.8210681,0.10037414,-0.00921546,0.16719434,-219.52089,122.82857)"
gradientUnits="userSpaceOnUse" />
<linearGradient
y2="99.545067"
x2="208.80719"
y1="188.33929"
x1="42.358635"
gradientTransform="matrix(3.3238064,1.9159908,-1.9159908,3.3238064,247.98035,-272.55718)"
gradientUnits="userSpaceOnUse"
id="linearGradient2197"
xlink:href="#linearGradient2175" />
<linearGradient
id="linearGradient2175">
<stop
style="stop-color:#fd047b;stop-opacity:1"
offset="0"
id="stop2169" />
<stop
id="stop2171"
offset="0.38674414"
style="stop-color:#fd4e64;stop-opacity:1;" />
<stop
style="stop-color:#fe984e;stop-opacity:1"
offset="1"
id="stop2173" />
</linearGradient>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath113-8">
<g
id="g117-8"
style="fill:#000000;stroke:none"
transform="matrix(0.03439583,0,0,-0.03439583,-5.864863,297.31878)">
<path
d="m 4655.0465,2463.15 c -5.27,-5.03 -13.02,-9.23 -20.1,-10.99 -7.55,-1.88 -16.88,-1.72 -24.43,0.16 -8.4,2.09 -17.51,6.92 -24.2001,12.42 -7.59,6.26 -14.72,15.45 -19.24,24.18 -5.15,9.96 -8.72,22.66 -9.9,33.81 -1.35,12.65 -0.12,27.52 2.92,39.87 3.43,13.92 10.24,29.23 17.98,41.3 8.65,13.47 21.2301,27.27 33.6301,37.39 13.74,11.2 31.64,21.51 48.12,28.06 18.1,7.19 40.22,12.17 59.64,13.73 21.2,1.7 45.86,-0.11 66.64,-4.59 22.55,-4.87 47.61,-14.37 67.85,-25.43 21.82,-11.94 44.87,-29.38 62.48,-46.96 18.89,-18.87 37.43,-43.73 50.35,-67.1 13.81,-24.98 25.52,-55.98 31.92,-83.8 6.82,-29.62 9.76,-64.77 8.23,-95.12 -1.63,-32.2001 -8.78,-68.9301 -19.09,-99.4701 -10.92,-32.31 -28.7,-67.65 -47.94,-95.81 -20.29,-29.69 -48.4,-60.53 -75.93,-83.66 -28.96,-24.3399 -66.15,-47.6499 -100.58,-63.3299 -36.13,-16.45 -80.27,-29.58 -119.48,-35.78 -41.07,-6.49 -89.2801,-7.4 -130.5901,-2.71 -43.17,4.9 -91.99,17.38 -132.31,33.59 -42.06,16.9 -87.7,42.98 -123.77,70.4399 -37.56,28.6 -76.2,67.38 -104.85,104.9 -29.7899,39.03 -57.8699,88.54 -76.2899,134.05 -19.12,47.2601 -33.67,104.5401 -39.64,155.1701 -6.19,52.5 -5.07,113.78 2.79,166.06 8.15,54.14 25.98,115.06 48.09,165.15 22.88,51.81 57.2499,107.76 92.9499,151.73 36.89,45.44 86.35,91.88 133.88,126.0399 49.06,35.2501 110.92,68.1101 167.52,89.2501 58.37,21.8 128.8101,37.77 190.8501,43.5 63.93,5.91 138.29,2.76 201.53,-8.3 65.11,-11.38 138.13,-34.55 197.98,-62.59 61.57,-28.84 127.8299,-71.5001 179.6999,-115.45 53.32,-45.17 107.58,-105.31 147.2301,-162.85 40.72,-59.11 78.36,-133.3 102.22,-200.99 24.48,-69.49 41.87,-153.08 47.35,-226.55 5.63,-75.35 0.45,-162.7801 -13.8,-236.9901 -14.61,-76.07 -43.13,-161.1999 -77.09,-230.8199 -34.79,-71.33 -85.76,-147.89 -137.9601,-207.66 -53.44,-61.21 -124.27,-123.27 -191.8299,-168.42 -69.14,-46.1901 -155.67,-88.6101 -234.46,-115.1801 -80.59,-27.18 -177.34,-45.99 -262.23,-51.22 -86.7801,-5.35 -187.2901,1.86 -272.4601,19.31 -87.04,17.84 -184.27,51.7 -263.6599,91.59 -81.08,40.7501 -167.95,100.0101 -235.62,160.4601 L 2482.2664,2913.52 c -57.14,49.45 -130.27,97.65 -198.34,130.46 -66.36,31.9799 -147.46,58.7199 -219.87,72.26 -70.56,13.18 -153.63,17.68 -225.17,11.97 -69.66,-5.57 -148.87,-22.4801 -214.65,-46.0801 -64,-22.9499 -134.08,-58.9899 -189.84,-97.8899 -54.2,-37.82 -110.78,-89.47 -153.19,-140.17 -41.2,-49.24 -81.1,-112.06 -107.95,-170.37 -26.06,-56.6 -47.45,-125.59 -57.76,-187.04 -9.99,-59.59 -12.46,-129.58 -6.46,-189.7001 5.81,-58.24 21.3,-124.3 42.21,-178.97 20.23,-52.8999 51.5,-110.6399 84.93,-156.3599 32.32,-44.19 76.16,-90.09 118.98,-124.22 41.34,-32.95 93.85,-64.55 142.41,-85.44 46.83,-20.15 103.72,-36.19 154.2,-43.26 48.63,-6.81 105.55,-7.25 154.24,-0.96 46.82,6.05 99.72,20.12 143.27,38.36 41.82,17.5 87.22,43.99 122.89,71.96 34.19,26.82 69.42,62.85 95.25,97.79 24.72,33.43 48.03,75.64 62.94,114.45 14.24,37.06 24.94,81.8499 28.76,121.3699 3.63,37.65 2.04,81.51 -4.56,118.76 -6.27,35.41 -18.92,75.1701 -34.49,107.5901 -14.76,30.74 -36.48,63.82 -59,89.42 -21.29,24.21 -49.53,48.76 -76.6,66.27 -25.52,16.51 -57.43,31.53 -86.49,40.44 -27.29,8.36 -59.99,13.72 -88.53,14.25 -26.7,0.5 -57.5,-3.12 -83.29,-10.06 -24.03,-6.46 -50.65,-17.69 -71.9,-30.63 -19.7,-11.99 -40.47,-28.94 -55.95,-46.03 -14.28,-15.76 -28.17,-36.22 -37.3,-55.42 -8.36,-17.6 -15.11,-39.25 -17.93,-58.52 -2.57,-17.54 -2.59,-38.2 0.24,-55.7 2.56,-15.8001 8.23,-33.5901 15.57,-47.8201 6.57,-12.74 16.43,-26.29 26.77,-36.22 9.18,-8.81 21.44,-17.31 33.07,-22.47 10.25,-4.55 23.03,-7.81 34.23,-8.32 9.83,-0.46 21.35,1.12 30.56,4.57 8.11,3.04 16.85,8.51 22.86,14.74 5.4,5.6 10.21,13.6 12.35,21.08 2.01,7.01 2.26,15.82 0.53,22.91 -1.72,7.08 -1.48,15.9 0.53,22.91 2.15,7.47 6.96,15.48 12.36,21.07 6.01,6.2301 14.75,11.7101 22.86,14.7401 9.21,3.45 20.73,5.03 30.56,4.58 11.2,-0.52 23.98,-3.77 34.23,-8.32 11.63,-5.1701 23.89,-13.6601 33.07,-22.4801 10.34,-9.93 20.19,-23.48 26.77,-36.22 7.34,-14.22 13.01,-32.02 15.57,-47.82 2.83,-17.5 2.81,-38.15 0.24,-55.69 -2.82,-19.28 -9.57,-40.93 -17.93,-58.52 -9.13,-19.21 -23.02,-39.66 -37.3,-55.4199 -15.48,-17.09 -36.25,-34.05 -55.95,-46.04 -21.25,-12.93 -47.87,-24.17 -71.9,-30.63 -25.79,-6.93 -56.59,-10.56 -83.29,-10.06 -28.54,0.53 -61.24,5.89 -88.53,14.26 -29.06,8.9 -60.97,23.93 -86.49,40.43 -27.07,17.52 -55.31,42.07 -76.6,66.2799 -22.52,25.6 -44.24,58.67 -59,89.41 -15.57,32.42 -28.22,72.18 -34.5,107.59 -6.59,37.25 -8.18,81.1101 -4.55,118.7701 3.82,39.51 14.52,84.3 28.76,121.36 14.91,38.81 38.22,81.02 62.94,114.45 25.83,34.94 61.05,70.98 95.25,97.79 35.67,27.97 81.07,54.46 122.89,71.97 43.55,18.23 96.45,32.3 143.27,38.35 48.69,6.29 105.61,5.85 154.23,-0.96 50.49,-7.06 107.38,-23.11 154.21,-43.25 48.56,-20.89 101.07,-52.5 142.41,-85.45 42.81,-34.12 86.66,-80.02 118.98,-124.22 33.43,-45.72 64.69,-103.46 84.93,-156.36 20.91,-54.67 36.4,-120.7201 42.21,-178.9601 6,-60.12 3.53,-130.12 -6.46,-189.6999 -10.31,-61.46 -31.7,-130.44 -57.76,-187.04 -26.85,-58.32 -66.75,-121.14 -107.95,-170.38 -42.41,-50.69 -98.99,-102.34 -153.2,-140.16 -55.75,-38.9001 -125.83,-74.9501 -189.83,-97.9001 -65.78,-23.59 -144.99,-40.51 -214.65,-46.07 -71.54,-5.72 -154.61,-1.22 -225.17,11.97 -72.42,13.53 -153.51,40.27 -219.87,72.26 -68.07,32.8 -141.2,81.0001 -198.34,130.4501 -58.58,50.69 -118.04,117.95 -161.34995,182.17 -44.37,65.79 -85.198,148.21 -110.86499,223.3 -26.279,76.8899 -44.618,169.2599 -49.933,250.3399 -5.438,82.9701 1.093,179.1201 17.478,260.6401 16.759,83.38 48.84299,176.58 86.75999,252.71 38.76,77.83 95.24995,161.27 152.95995,226.31 58.96,66.45 136.9,133.73 211.14,182.53 75.83,49.85 170.59,95.45 256.78,123.83 l 1736.46,587.68 c 71.39,24.76 149.69,63.99 212.14,106.54 60.89,41.48 124.59,98.34 172.52,154.28 46.69,54.51 92.13,124.2 122.95,189.02 30.0101,63.11 54.9701,140.17 67.4201,208.93 12.12,66.9 15.95,145.61 10.14,213.35 -5.65,65.85 -22.09,140.6801 -44.79,202.75 -22.05,60.3 -56.5001,126.27 -93.5701,178.68 -35.99,50.87 -85.04,103.89 -133.11,143.54 -46.6,38.44 -105.99,75.58 -161.05,100.45 -53.34,24.08 -118.3,43.69 -176.09,52.92 -55.93,8.93 -121.57,10.72 -177.8799,4.63 -54.44,-5.89 -116.1101,-20.91 -167.0701,-40.93 -49.2,-19.32 -102.83,-49 -145.2,-80.61 -40.86,-30.48 -83.2,-71.72 -114.57,-111.91 -30.2,-38.71 -59.04,-87.78 -77.94,-133.1 -18.17,-43.57 -32.44,-96.42 -38.42,-143.2499 -5.75,-44.97 -5.51,-97.5301 0.88,-142.4101 6.12,-43.02 19.72,-91.54 37.06,-131.38 16.6,-38.12 41.49,-79.42 67.65,-111.73 24.97,-30.87 58.41,-62.53 90.73,-85.59 30.79,-21.98 69.56,-42.53 105.12,-55.44 33.81,-12.28 74.56,-21.2 110.42,-23.93 34.01,-2.58 73.51,-0.31 106.9401,6.39 31.62,6.34 66.9999,18.52 95.6999,33.21 27.05,13.84 56.02,33.97 78.26,54.68 20.89,19.45 41.88,45.09 56.61,69.54 13.78,22.87 26.05,51.36 32.94,77.16 6.41,24.04 10,52.72 9.42,77.59 -0.54,23.05 -4.84,49.51 -11.9,71.47 -6.5,20.24 -17.27,42.5 -29.34,60.01 -11.06,16.0401 -26.43,32.7001 -41.71,44.7901 -13.91,10.99 -31.79,21.34 -48.36,27.63 -14.96,5.69 -33.21,9.68 -49.2,10.43 -14.32,0.68 -30.9799,-1.08 -44.7499,-5.07 -12.22,-3.54 -25.71,-9.92 -36,-17.41 -9.07,-6.6 -18.27,-16.04 -24.32,-25.48 -5.31,-8.28 -9.7,-19.05 -11.32,-28.7501 -1.42,-8.54 -1.05,-18.85 1.34,-27.17 2.15,-7.47 6.67,-15.64 12.07,-21.23 5.07,-5.25 12.58,-9.87 19.58,-11.92 7,-2.05 14.51,-6.67 19.57,-11.91 5.41,-5.6 9.93,-13.77 12.08,-21.24 2.39,-8.32 2.76,-18.63 1.34,-27.17 -1.62,-9.7 -6.02,-20.47 -11.32,-28.75 -6.05,-9.44 -15.26,-18.88 -24.32,-25.48 -10.29,-7.49 -23.78,-13.86 -36,-17.4 -13.7701,-3.99 -30.4301,-5.76 -44.7501,-5.08 -15.99,0.76 -34.24,4.74 -49.2,10.43 -16.58,6.3 -34.45,16.64 -48.36,27.64 -15.28,12.08 -30.65,28.75 -41.71,44.79 -12.07,17.5 -22.84,39.76 -29.35,60.01 -7.06,21.95 -11.36,48.41 -11.89,71.4601 -0.58,24.88 3,53.55 9.42,77.59 6.89,25.7999 19.16,54.2899 32.94,77.1599 14.73,24.45 35.72,50.09 56.61,69.55 22.24,20.71 51.21,40.83 78.26,54.68 28.7,14.68 64.0801,26.86 95.6901,33.2 33.44,6.7 72.9399,8.97 106.9399,6.39 35.86,-2.73 76.62,-11.65 110.42,-23.93 35.56,-12.91 74.34,-33.46 105.13,-55.43 32.32,-23.07 65.75,-54.73 90.73,-85.59 26.15,-32.32 51.05,-73.6099 67.65,-111.7299 17.34,-39.85 30.94,-88.3701 37.06,-131.3901 6.39,-44.87 6.63,-97.44 0.88,-142.4 -5.98,-46.84 -20.25,-99.69 -38.42,-143.26 -18.9,-45.31 -47.74,-94.39 -77.95,-133.09 -31.36,-40.19 -73.7,-81.43 -114.56,-111.92 -42.37,-31.61 -96,-61.28 -145.2,-80.61 -50.96,-20.01 -112.6399,-35.03 -167.0699,-40.92 -56.3101,-6.1 -121.9501,-4.31 -177.8801,4.62 -57.8,9.23 -122.75,28.84 -176.09,52.93 -55.07,24.86 -114.45,62 -161.06,100.45 -48.06,39.65 -97.11,92.67 -133.1,143.53 -37.08,52.42 -71.53,118.38 -93.57,178.68 -22.7,62.07 -39.14,136.9 -44.79,202.75 -5.81,67.7401 -1.99,146.4501 10.13,213.35 12.46,68.76 37.42,145.82 67.43,208.93 30.82,64.82 76.26,134.51 122.95,189.02 47.93,55.95 111.63,112.8 172.52,154.29 62.44,42.54 140.75,81.77 212.14,106.54 73.19,25.38 161.17,43.24 238.4401,48.64 79.1699,5.53 170.9499,-0.32 248.8199,-15.64 79.73,-15.68 168.89,-45.99 241.76,-81.92 74.58,-36.78 154.58,-90.51 216.99,-145.46 63.8301,-56.2 128.5001,-130.59 175.4701,-201.49 48.02,-72.48 92.03,-163.13 119.51,-245.62 28.07,-84.2899 47.3599,-185.43 52.4999,-274.12 5.26,-90.59 -2.63,-195.46 -21.1499,-284.29 L 3775.3464,2720.83 c -14.25,-74.21 -19.43,-161.64 -13.81,-236.99 5.49,-73.47 22.88,-157.0701 47.36,-226.5501 23.8601,-67.69 61.5001,-141.88 102.2201,-200.9899 39.65,-57.54 93.91,-117.68 147.23,-162.85 51.87,-43.95 118.1299,-86.62 179.6999,-115.45 59.85,-28.04 132.87,-51.21 197.98,-62.59 63.24,-11.06 137.59,-14.21 201.5201,-8.3 62.05,5.73 132.49,21.69 190.86,43.5 56.6,21.14 118.45,53.99 167.52,89.25 47.53,34.15 96.99,80.6 133.88,126.04 35.6999,43.97 70.0699,99.92 92.9499,151.7299 22.11,50.09 39.94,111.01 48.09,165.15 7.86,52.2801 8.98,113.5501 2.79,166.0601 -5.97,50.62 -20.52,107.91 -39.64,155.17 -18.42,45.51 -46.5,95.02 -76.29,134.04 -28.6499,37.53 -67.2899,76.31 -104.8499,104.91 -36.07,27.46 -81.71,53.53 -123.77,70.44 -40.32,16.2 -89.14,28.69 -132.31,33.59 -41.31,4.69 -89.52,3.78 -130.59,-2.72 -39.21,-6.19 -83.3501,-19.32 -119.4801,-35.77 -34.43,-15.68 -71.62,-38.99 -100.58,-63.33 -27.53,-23.13 -55.64,-53.97 -75.93,-83.66 -19.24,-28.16 -37.02,-63.5 -47.94,-95.81 -10.31,-30.55 -17.46,-67.27 -19.09,-99.48 -1.53,-30.35 1.41,-65.5 8.23,-95.11 6.4,-27.82 18.11,-58.82 31.91,-83.8 12.93,-23.37 31.46,-48.24 50.36,-67.1001 17.61,-17.58 40.65,-35.02 62.48,-46.96 20.24,-11.06 45.3,-20.57 67.84,-25.43 20.79,-4.49 45.45,-6.29 66.65,-4.59 19.4201,1.55 41.5401,6.53 59.6401,13.73 16.48,6.55 34.37,16.85 48.11,28.06 12.41,10.11 24.99,23.92 33.64,37.39 7.74,12.0601 14.55,27.3701 17.98,41.2901 3.04,12.36 4.27,27.22 2.92,39.88 -1.18,11.15 -4.75,23.85 -9.91,33.81 -4.51,8.73 -11.64,17.92 -19.23,24.17 -6.69,5.51 -15.8,10.34 -24.2,12.43 -7.55,1.87 -16.88,2.04 -24.43,0.16 -7.08,-1.77 -14.83,-5.96 -20.11,-11 z m -1216.3701,-23.88 269.18,1346.96 -1301.09,-440.36 z"
id="path115-3"
style="fill:#000000;stroke:none;stroke-width:1" />
</g>
</clipPath>
<clipPath
id="clipPath113-5"
clipPathUnits="userSpaceOnUse">
<g
transform="matrix(0.03439583,0,0,-0.03439583,-5.864863,297.31878)"
style="fill:#000000;stroke:none"
id="g117-0">
<path
style="fill:#000000;stroke:none;stroke-width:1"
id="path115-1"
d="m 4655.0465,2463.15 c -5.27,-5.03 -13.02,-9.23 -20.1,-10.99 -7.55,-1.88 -16.88,-1.72 -24.43,0.16 -8.4,2.09 -17.51,6.92 -24.2001,12.42 -7.59,6.26 -14.72,15.45 -19.24,24.18 -5.15,9.96 -8.72,22.66 -9.9,33.81 -1.35,12.65 -0.12,27.52 2.92,39.87 3.43,13.92 10.24,29.23 17.98,41.3 8.65,13.47 21.2301,27.27 33.6301,37.39 13.74,11.2 31.64,21.51 48.12,28.06 18.1,7.19 40.22,12.17 59.64,13.73 21.2,1.7 45.86,-0.11 66.64,-4.59 22.55,-4.87 47.61,-14.37 67.85,-25.43 21.82,-11.94 44.87,-29.38 62.48,-46.96 18.89,-18.87 37.43,-43.73 50.35,-67.1 13.81,-24.98 25.52,-55.98 31.92,-83.8 6.82,-29.62 9.76,-64.77 8.23,-95.12 -1.63,-32.2001 -8.78,-68.9301 -19.09,-99.4701 -10.92,-32.31 -28.7,-67.65 -47.94,-95.81 -20.29,-29.69 -48.4,-60.53 -75.93,-83.66 -28.96,-24.3399 -66.15,-47.6499 -100.58,-63.3299 -36.13,-16.45 -80.27,-29.58 -119.48,-35.78 -41.07,-6.49 -89.2801,-7.4 -130.5901,-2.71 -43.17,4.9 -91.99,17.38 -132.31,33.59 -42.06,16.9 -87.7,42.98 -123.77,70.4399 -37.56,28.6 -76.2,67.38 -104.85,104.9 -29.7899,39.03 -57.8699,88.54 -76.2899,134.05 -19.12,47.2601 -33.67,104.5401 -39.64,155.1701 -6.19,52.5 -5.07,113.78 2.79,166.06 8.15,54.14 25.98,115.06 48.09,165.15 22.88,51.81 57.2499,107.76 92.9499,151.73 36.89,45.44 86.35,91.88 133.88,126.0399 49.06,35.2501 110.92,68.1101 167.52,89.2501 58.37,21.8 128.8101,37.77 190.8501,43.5 63.93,5.91 138.29,2.76 201.53,-8.3 65.11,-11.38 138.13,-34.55 197.98,-62.59 61.57,-28.84 127.8299,-71.5001 179.6999,-115.45 53.32,-45.17 107.58,-105.31 147.2301,-162.85 40.72,-59.11 78.36,-133.3 102.22,-200.99 24.48,-69.49 41.87,-153.08 47.35,-226.55 5.63,-75.35 0.45,-162.7801 -13.8,-236.9901 -14.61,-76.07 -43.13,-161.1999 -77.09,-230.8199 -34.79,-71.33 -85.76,-147.89 -137.9601,-207.66 -53.44,-61.21 -124.27,-123.27 -191.8299,-168.42 -69.14,-46.1901 -155.67,-88.6101 -234.46,-115.1801 -80.59,-27.18 -177.34,-45.99 -262.23,-51.22 -86.7801,-5.35 -187.2901,1.86 -272.4601,19.31 -87.04,17.84 -184.27,51.7 -263.6599,91.59 -81.08,40.7501 -167.95,100.0101 -235.62,160.4601 L 2482.2664,2913.52 c -57.14,49.45 -130.27,97.65 -198.34,130.46 -66.36,31.9799 -147.46,58.7199 -219.87,72.26 -70.56,13.18 -153.63,17.68 -225.17,11.97 -69.66,-5.57 -148.87,-22.4801 -214.65,-46.0801 -64,-22.9499 -134.08,-58.9899 -189.84,-97.8899 -54.2,-37.82 -110.78,-89.47 -153.19,-140.17 -41.2,-49.24 -81.1,-112.06 -107.95,-170.37 -26.06,-56.6 -47.45,-125.59 -57.76,-187.04 -9.99,-59.59 -12.46,-129.58 -6.46,-189.7001 5.81,-58.24 21.3,-124.3 42.21,-178.97 20.23,-52.8999 51.5,-110.6399 84.93,-156.3599 32.32,-44.19 76.16,-90.09 118.98,-124.22 41.34,-32.95 93.85,-64.55 142.41,-85.44 46.83,-20.15 103.72,-36.19 154.2,-43.26 48.63,-6.81 105.55,-7.25 154.24,-0.96 46.82,6.05 99.72,20.12 143.27,38.36 41.82,17.5 87.22,43.99 122.89,71.96 34.19,26.82 69.42,62.85 95.25,97.79 24.72,33.43 48.03,75.64 62.94,114.45 14.24,37.06 24.94,81.8499 28.76,121.3699 3.63,37.65 2.04,81.51 -4.56,118.76 -6.27,35.41 -18.92,75.1701 -34.49,107.5901 -14.76,30.74 -36.48,63.82 -59,89.42 -21.29,24.21 -49.53,48.76 -76.6,66.27 -25.52,16.51 -57.43,31.53 -86.49,40.44 -27.29,8.36 -59.99,13.72 -88.53,14.25 -26.7,0.5 -57.5,-3.12 -83.29,-10.06 -24.03,-6.46 -50.65,-17.69 -71.9,-30.63 -19.7,-11.99 -40.47,-28.94 -55.95,-46.03 -14.28,-15.76 -28.17,-36.22 -37.3,-55.42 -8.36,-17.6 -15.11,-39.25 -17.93,-58.52 -2.57,-17.54 -2.59,-38.2 0.24,-55.7 2.56,-15.8001 8.23,-33.5901 15.57,-47.8201 6.57,-12.74 16.43,-26.29 26.77,-36.22 9.18,-8.81 21.44,-17.31 33.07,-22.47 10.25,-4.55 23.03,-7.81 34.23,-8.32 9.83,-0.46 21.35,1.12 30.56,4.57 8.11,3.04 16.85,8.51 22.86,14.74 5.4,5.6 10.21,13.6 12.35,21.08 2.01,7.01 2.26,15.82 0.53,22.91 -1.72,7.08 -1.48,15.9 0.53,22.91 2.15,7.47 6.96,15.48 12.36,21.07 6.01,6.2301 14.75,11.7101 22.86,14.7401 9.21,3.45 20.73,5.03 30.56,4.58 11.2,-0.52 23.98,-3.77 34.23,-8.32 11.63,-5.1701 23.89,-13.6601 33.07,-22.4801 10.34,-9.93 20.19,-23.48 26.77,-36.22 7.34,-14.22 13.01,-32.02 15.57,-47.82 2.83,-17.5 2.81,-38.15 0.24,-55.69 -2.82,-19.28 -9.57,-40.93 -17.93,-58.52 -9.13,-19.21 -23.02,-39.66 -37.3,-55.4199 -15.48,-17.09 -36.25,-34.05 -55.95,-46.04 -21.25,-12.93 -47.87,-24.17 -71.9,-30.63 -25.79,-6.93 -56.59,-10.56 -83.29,-10.06 -28.54,0.53 -61.24,5.89 -88.53,14.26 -29.06,8.9 -60.97,23.93 -86.49,40.43 -27.07,17.52 -55.31,42.07 -76.6,66.2799 -22.52,25.6 -44.24,58.67 -59,89.41 -15.57,32.42 -28.22,72.18 -34.5,107.59 -6.59,37.25 -8.18,81.1101 -4.55,118.7701 3.82,39.51 14.52,84.3 28.76,121.36 14.91,38.81 38.22,81.02 62.94,114.45 25.83,34.94 61.05,70.98 95.25,97.79 35.67,27.97 81.07,54.46 122.89,71.97 43.55,18.23 96.45,32.3 143.27,38.35 48.69,6.29 105.61,5.85 154.23,-0.96 50.49,-7.06 107.38,-23.11 154.21,-43.25 48.56,-20.89 101.07,-52.5 142.41,-85.45 42.81,-34.12 86.66,-80.02 118.98,-124.22 33.43,-45.72 64.69,-103.46 84.93,-156.36 20.91,-54.67 36.4,-120.7201 42.21,-178.9601 6,-60.12 3.53,-130.12 -6.46,-189.6999 -10.31,-61.46 -31.7,-130.44 -57.76,-187.04 -26.85,-58.32 -66.75,-121.14 -107.95,-170.38 -42.41,-50.69 -98.99,-102.34 -153.2,-140.16 -55.75,-38.9001 -125.83,-74.9501 -189.83,-97.9001 -65.78,-23.59 -144.99,-40.51 -214.65,-46.07 -71.54,-5.72 -154.61,-1.22 -225.17,11.97 -72.42,13.53 -153.51,40.27 -219.87,72.26 -68.07,32.8 -141.2,81.0001 -198.34,130.4501 -58.58,50.69 -118.04,117.95 -161.34995,182.17 -44.37,65.79 -85.198,148.21 -110.86499,223.3 -26.279,76.8899 -44.618,169.2599 -49.933,250.3399 -5.438,82.9701 1.093,179.1201 17.478,260.6401 16.759,83.38 48.84299,176.58 86.75999,252.71 38.76,77.83 95.24995,161.27 152.95995,226.31 58.96,66.45 136.9,133.73 211.14,182.53 75.83,49.85 170.59,95.45 256.78,123.83 l 1736.46,587.68 c 71.39,24.76 149.69,63.99 212.14,106.54 60.89,41.48 124.59,98.34 172.52,154.28 46.69,54.51 92.13,124.2 122.95,189.02 30.0101,63.11 54.9701,140.17 67.4201,208.93 12.12,66.9 15.95,145.61 10.14,213.35 -5.65,65.85 -22.09,140.6801 -44.79,202.75 -22.05,60.3 -56.5001,126.27 -93.5701,178.68 -35.99,50.87 -85.04,103.89 -133.11,143.54 -46.6,38.44 -105.99,75.58 -161.05,100.45 -53.34,24.08 -118.3,43.69 -176.09,52.92 -55.93,8.93 -121.57,10.72 -177.8799,4.63 -54.44,-5.89 -116.1101,-20.91 -167.0701,-40.93 -49.2,-19.32 -102.83,-49 -145.2,-80.61 -40.86,-30.48 -83.2,-71.72 -114.57,-111.91 -30.2,-38.71 -59.04,-87.78 -77.94,-133.1 -18.17,-43.57 -32.44,-96.42 -38.42,-143.2499 -5.75,-44.97 -5.51,-97.5301 0.88,-142.4101 6.12,-43.02 19.72,-91.54 37.06,-131.38 16.6,-38.12 41.49,-79.42 67.65,-111.73 24.97,-30.87 58.41,-62.53 90.73,-85.59 30.79,-21.98 69.56,-42.53 105.12,-55.44 33.81,-12.28 74.56,-21.2 110.42,-23.93 34.01,-2.58 73.51,-0.31 106.9401,6.39 31.62,6.34 66.9999,18.52 95.6999,33.21 27.05,13.84 56.02,33.97 78.26,54.68 20.89,19.45 41.88,45.09 56.61,69.54 13.78,22.87 26.05,51.36 32.94,77.16 6.41,24.04 10,52.72 9.42,77.59 -0.54,23.05 -4.84,49.51 -11.9,71.47 -6.5,20.24 -17.27,42.5 -29.34,60.01 -11.06,16.0401 -26.43,32.7001 -41.71,44.7901 -13.91,10.99 -31.79,21.34 -48.36,27.63 -14.96,5.69 -33.21,9.68 -49.2,10.43 -14.32,0.68 -30.9799,-1.08 -44.7499,-5.07 -12.22,-3.54 -25.71,-9.92 -36,-17.41 -9.07,-6.6 -18.27,-16.04 -24.32,-25.48 -5.31,-8.28 -9.7,-19.05 -11.32,-28.7501 -1.42,-8.54 -1.05,-18.85 1.34,-27.17 2.15,-7.47 6.67,-15.64 12.07,-21.23 5.07,-5.25 12.58,-9.87 19.58,-11.92 7,-2.05 14.51,-6.67 19.57,-11.91 5.41,-5.6 9.93,-13.77 12.08,-21.24 2.39,-8.32 2.76,-18.63 1.34,-27.17 -1.62,-9.7 -6.02,-20.47 -11.32,-28.75 -6.05,-9.44 -15.26,-18.88 -24.32,-25.48 -10.29,-7.49 -23.78,-13.86 -36,-17.4 -13.7701,-3.99 -30.4301,-5.76 -44.7501,-5.08 -15.99,0.76 -34.24,4.74 -49.2,10.43 -16.58,6.3 -34.45,16.64 -48.36,27.64 -15.28,12.08 -30.65,28.75 -41.71,44.79 -12.07,17.5 -22.84,39.76 -29.35,60.01 -7.06,21.95 -11.36,48.41 -11.89,71.4601 -0.58,24.88 3,53.55 9.42,77.59 6.89,25.7999 19.16,54.2899 32.94,77.1599 14.73,24.45 35.72,50.09 56.61,69.55 22.24,20.71 51.21,40.83 78.26,54.68 28.7,14.68 64.0801,26.86 95.6901,33.2 33.44,6.7 72.9399,8.97 106.9399,6.39 35.86,-2.73 76.62,-11.65 110.42,-23.93 35.56,-12.91 74.34,-33.46 105.13,-55.43 32.32,-23.07 65.75,-54.73 90.73,-85.59 26.15,-32.32 51.05,-73.6099 67.65,-111.7299 17.34,-39.85 30.94,-88.3701 37.06,-131.3901 6.39,-44.87 6.63,-97.44 0.88,-142.4 -5.98,-46.84 -20.25,-99.69 -38.42,-143.26 -18.9,-45.31 -47.74,-94.39 -77.95,-133.09 -31.36,-40.19 -73.7,-81.43 -114.56,-111.92 -42.37,-31.61 -96,-61.28 -145.2,-80.61 -50.96,-20.01 -112.6399,-35.03 -167.0699,-40.92 -56.3101,-6.1 -121.9501,-4.31 -177.8801,4.62 -57.8,9.23 -122.75,28.84 -176.09,52.93 -55.07,24.86 -114.45,62 -161.06,100.45 -48.06,39.65 -97.11,92.67 -133.1,143.53 -37.08,52.42 -71.53,118.38 -93.57,178.68 -22.7,62.07 -39.14,136.9 -44.79,202.75 -5.81,67.7401 -1.99,146.4501 10.13,213.35 12.46,68.76 37.42,145.82 67.43,208.93 30.82,64.82 76.26,134.51 122.95,189.02 47.93,55.95 111.63,112.8 172.52,154.29 62.44,42.54 140.75,81.77 212.14,106.54 73.19,25.38 161.17,43.24 238.4401,48.64 79.1699,5.53 170.9499,-0.32 248.8199,-15.64 79.73,-15.68 168.89,-45.99 241.76,-81.92 74.58,-36.78 154.58,-90.51 216.99,-145.46 63.8301,-56.2 128.5001,-130.59 175.4701,-201.49 48.02,-72.48 92.03,-163.13 119.51,-245.62 28.07,-84.2899 47.3599,-185.43 52.4999,-274.12 5.26,-90.59 -2.63,-195.46 -21.1499,-284.29 L 3775.3464,2720.83 c -14.25,-74.21 -19.43,-161.64 -13.81,-236.99 5.49,-73.47 22.88,-157.0701 47.36,-226.5501 23.8601,-67.69 61.5001,-141.88 102.2201,-200.9899 39.65,-57.54 93.91,-117.68 147.23,-162.85 51.87,-43.95 118.1299,-86.62 179.6999,-115.45 59.85,-28.04 132.87,-51.21 197.98,-62.59 63.24,-11.06 137.59,-14.21 201.5201,-8.3 62.05,5.73 132.49,21.69 190.86,43.5 56.6,21.14 118.45,53.99 167.52,89.25 47.53,34.15 96.99,80.6 133.88,126.04 35.6999,43.97 70.0699,99.92 92.9499,151.7299 22.11,50.09 39.94,111.01 48.09,165.15 7.86,52.2801 8.98,113.5501 2.79,166.0601 -5.97,50.62 -20.52,107.91 -39.64,155.17 -18.42,45.51 -46.5,95.02 -76.29,134.04 -28.6499,37.53 -67.2899,76.31 -104.8499,104.91 -36.07,27.46 -81.71,53.53 -123.77,70.44 -40.32,16.2 -89.14,28.69 -132.31,33.59 -41.31,4.69 -89.52,3.78 -130.59,-2.72 -39.21,-6.19 -83.3501,-19.32 -119.4801,-35.77 -34.43,-15.68 -71.62,-38.99 -100.58,-63.33 -27.53,-23.13 -55.64,-53.97 -75.93,-83.66 -19.24,-28.16 -37.02,-63.5 -47.94,-95.81 -10.31,-30.55 -17.46,-67.27 -19.09,-99.48 -1.53,-30.35 1.41,-65.5 8.23,-95.11 6.4,-27.82 18.11,-58.82 31.91,-83.8 12.93,-23.37 31.46,-48.24 50.36,-67.1001 17.61,-17.58 40.65,-35.02 62.48,-46.96 20.24,-11.06 45.3,-20.57 67.84,-25.43 20.79,-4.49 45.45,-6.29 66.65,-4.59 19.4201,1.55 41.5401,6.53 59.6401,13.73 16.48,6.55 34.37,16.85 48.11,28.06 12.41,10.11 24.99,23.92 33.64,37.39 7.74,12.0601 14.55,27.3701 17.98,41.2901 3.04,12.36 4.27,27.22 2.92,39.88 -1.18,11.15 -4.75,23.85 -9.91,33.81 -4.51,8.73 -11.64,17.92 -19.23,24.17 -6.69,5.51 -15.8,10.34 -24.2,12.43 -7.55,1.87 -16.88,2.04 -24.43,0.16 -7.08,-1.77 -14.83,-5.96 -20.11,-11 z m -1216.3701,-23.88 269.18,1346.96 -1301.09,-440.36 z" />
</g>
</clipPath>
<radialGradient
xlink:href="#linearGradient6995"
id="radialGradient6444-3"
cx="341.24771"
cy="54.662258"
fx="341.24771"
fy="54.662258"
r="427.12299"
gradientTransform="matrix(1.8210681,0.10037414,-0.00921546,0.16719434,-219.52089,122.82857)"
gradientUnits="userSpaceOnUse" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath113-85">
<g
id="g117-1"
style="fill:#000000;stroke:none"
transform="matrix(0.03439583,0,0,-0.03439583,-5.864863,297.31878)">
<path
d="m 4655.0465,2463.15 c -5.27,-5.03 -13.02,-9.23 -20.1,-10.99 -7.55,-1.88 -16.88,-1.72 -24.43,0.16 -8.4,2.09 -17.51,6.92 -24.2001,12.42 -7.59,6.26 -14.72,15.45 -19.24,24.18 -5.15,9.96 -8.72,22.66 -9.9,33.81 -1.35,12.65 -0.12,27.52 2.92,39.87 3.43,13.92 10.24,29.23 17.98,41.3 8.65,13.47 21.2301,27.27 33.6301,37.39 13.74,11.2 31.64,21.51 48.12,28.06 18.1,7.19 40.22,12.17 59.64,13.73 21.2,1.7 45.86,-0.11 66.64,-4.59 22.55,-4.87 47.61,-14.37 67.85,-25.43 21.82,-11.94 44.87,-29.38 62.48,-46.96 18.89,-18.87 37.43,-43.73 50.35,-67.1 13.81,-24.98 25.52,-55.98 31.92,-83.8 6.82,-29.62 9.76,-64.77 8.23,-95.12 -1.63,-32.2001 -8.78,-68.9301 -19.09,-99.4701 -10.92,-32.31 -28.7,-67.65 -47.94,-95.81 -20.29,-29.69 -48.4,-60.53 -75.93,-83.66 -28.96,-24.3399 -66.15,-47.6499 -100.58,-63.3299 -36.13,-16.45 -80.27,-29.58 -119.48,-35.78 -41.07,-6.49 -89.2801,-7.4 -130.5901,-2.71 -43.17,4.9 -91.99,17.38 -132.31,33.59 -42.06,16.9 -87.7,42.98 -123.77,70.4399 -37.56,28.6 -76.2,67.38 -104.85,104.9 -29.7899,39.03 -57.8699,88.54 -76.2899,134.05 -19.12,47.2601 -33.67,104.5401 -39.64,155.1701 -6.19,52.5 -5.07,113.78 2.79,166.06 8.15,54.14 25.98,115.06 48.09,165.15 22.88,51.81 57.2499,107.76 92.9499,151.73 36.89,45.44 86.35,91.88 133.88,126.0399 49.06,35.2501 110.92,68.1101 167.52,89.2501 58.37,21.8 128.8101,37.77 190.8501,43.5 63.93,5.91 138.29,2.76 201.53,-8.3 65.11,-11.38 138.13,-34.55 197.98,-62.59 61.57,-28.84 127.8299,-71.5001 179.6999,-115.45 53.32,-45.17 107.58,-105.31 147.2301,-162.85 40.72,-59.11 78.36,-133.3 102.22,-200.99 24.48,-69.49 41.87,-153.08 47.35,-226.55 5.63,-75.35 0.45,-162.7801 -13.8,-236.9901 -14.61,-76.07 -43.13,-161.1999 -77.09,-230.8199 -34.79,-71.33 -85.76,-147.89 -137.9601,-207.66 -53.44,-61.21 -124.27,-123.27 -191.8299,-168.42 -69.14,-46.1901 -155.67,-88.6101 -234.46,-115.1801 -80.59,-27.18 -177.34,-45.99 -262.23,-51.22 -86.7801,-5.35 -187.2901,1.86 -272.4601,19.31 -87.04,17.84 -184.27,51.7 -263.6599,91.59 -81.08,40.7501 -167.95,100.0101 -235.62,160.4601 L 2482.2664,2913.52 c -57.14,49.45 -130.27,97.65 -198.34,130.46 -66.36,31.9799 -147.46,58.7199 -219.87,72.26 -70.56,13.18 -153.63,17.68 -225.17,11.97 -69.66,-5.57 -148.87,-22.4801 -214.65,-46.0801 -64,-22.9499 -134.08,-58.9899 -189.84,-97.8899 -54.2,-37.82 -110.78,-89.47 -153.19,-140.17 -41.2,-49.24 -81.1,-112.06 -107.95,-170.37 -26.06,-56.6 -47.45,-125.59 -57.76,-187.04 -9.99,-59.59 -12.46,-129.58 -6.46,-189.7001 5.81,-58.24 21.3,-124.3 42.21,-178.97 20.23,-52.8999 51.5,-110.6399 84.93,-156.3599 32.32,-44.19 76.16,-90.09 118.98,-124.22 41.34,-32.95 93.85,-64.55 142.41,-85.44 46.83,-20.15 103.72,-36.19 154.2,-43.26 48.63,-6.81 105.55,-7.25 154.24,-0.96 46.82,6.05 99.72,20.12 143.27,38.36 41.82,17.5 87.22,43.99 122.89,71.96 34.19,26.82 69.42,62.85 95.25,97.79 24.72,33.43 48.03,75.64 62.94,114.45 14.24,37.06 24.94,81.8499 28.76,121.3699 3.63,37.65 2.04,81.51 -4.56,118.76 -6.27,35.41 -18.92,75.1701 -34.49,107.5901 -14.76,30.74 -36.48,63.82 -59,89.42 -21.29,24.21 -49.53,48.76 -76.6,66.27 -25.52,16.51 -57.43,31.53 -86.49,40.44 -27.29,8.36 -59.99,13.72 -88.53,14.25 -26.7,0.5 -57.5,-3.12 -83.29,-10.06 -24.03,-6.46 -50.65,-17.69 -71.9,-30.63 -19.7,-11.99 -40.47,-28.94 -55.95,-46.03 -14.28,-15.76 -28.17,-36.22 -37.3,-55.42 -8.36,-17.6 -15.11,-39.25 -17.93,-58.52 -2.57,-17.54 -2.59,-38.2 0.24,-55.7 2.56,-15.8001 8.23,-33.5901 15.57,-47.8201 6.57,-12.74 16.43,-26.29 26.77,-36.22 9.18,-8.81 21.44,-17.31 33.07,-22.47 10.25,-4.55 23.03,-7.81 34.23,-8.32 9.83,-0.46 21.35,1.12 30.56,4.57 8.11,3.04 16.85,8.51 22.86,14.74 5.4,5.6 10.21,13.6 12.35,21.08 2.01,7.01 2.26,15.82 0.53,22.91 -1.72,7.08 -1.48,15.9 0.53,22.91 2.15,7.47 6.96,15.48 12.36,21.07 6.01,6.2301 14.75,11.7101 22.86,14.7401 9.21,3.45 20.73,5.03 30.56,4.58 11.2,-0.52 23.98,-3.77 34.23,-8.32 11.63,-5.1701 23.89,-13.6601 33.07,-22.4801 10.34,-9.93 20.19,-23.48 26.77,-36.22 7.34,-14.22 13.01,-32.02 15.57,-47.82 2.83,-17.5 2.81,-38.15 0.24,-55.69 -2.82,-19.28 -9.57,-40.93 -17.93,-58.52 -9.13,-19.21 -23.02,-39.66 -37.3,-55.4199 -15.48,-17.09 -36.25,-34.05 -55.95,-46.04 -21.25,-12.93 -47.87,-24.17 -71.9,-30.63 -25.79,-6.93 -56.59,-10.56 -83.29,-10.06 -28.54,0.53 -61.24,5.89 -88.53,14.26 -29.06,8.9 -60.97,23.93 -86.49,40.43 -27.07,17.52 -55.31,42.07 -76.6,66.2799 -22.52,25.6 -44.24,58.67 -59,89.41 -15.57,32.42 -28.22,72.18 -34.5,107.59 -6.59,37.25 -8.18,81.1101 -4.55,118.7701 3.82,39.51 14.52,84.3 28.76,121.36 14.91,38.81 38.22,81.02 62.94,114.45 25.83,34.94 61.05,70.98 95.25,97.79 35.67,27.97 81.07,54.46 122.89,71.97 43.55,18.23 96.45,32.3 143.27,38.35 48.69,6.29 105.61,5.85 154.23,-0.96 50.49,-7.06 107.38,-23.11 154.21,-43.25 48.56,-20.89 101.07,-52.5 142.41,-85.45 42.81,-34.12 86.66,-80.02 118.98,-124.22 33.43,-45.72 64.69,-103.46 84.93,-156.36 20.91,-54.67 36.4,-120.7201 42.21,-178.9601 6,-60.12 3.53,-130.12 -6.46,-189.6999 -10.31,-61.46 -31.7,-130.44 -57.76,-187.04 -26.85,-58.32 -66.75,-121.14 -107.95,-170.38 -42.41,-50.69 -98.99,-102.34 -153.2,-140.16 -55.75,-38.9001 -125.83,-74.9501 -189.83,-97.9001 -65.78,-23.59 -144.99,-40.51 -214.65,-46.07 -71.54,-5.72 -154.61,-1.22 -225.17,11.97 -72.42,13.53 -153.51,40.27 -219.87,72.26 -68.07,32.8 -141.2,81.0001 -198.34,130.4501 -58.58,50.69 -118.04,117.95 -161.34995,182.17 -44.37,65.79 -85.198,148.21 -110.86499,223.3 -26.279,76.8899 -44.618,169.2599 -49.933,250.3399 -5.438,82.9701 1.093,179.1201 17.478,260.6401 16.759,83.38 48.84299,176.58 86.75999,252.71 38.76,77.83 95.24995,161.27 152.95995,226.31 58.96,66.45 136.9,133.73 211.14,182.53 75.83,49.85 170.59,95.45 256.78,123.83 l 1736.46,587.68 c 71.39,24.76 149.69,63.99 212.14,106.54 60.89,41.48 124.59,98.34 172.52,154.28 46.69,54.51 92.13,124.2 122.95,189.02 30.0101,63.11 54.9701,140.17 67.4201,208.93 12.12,66.9 15.95,145.61 10.14,213.35 -5.65,65.85 -22.09,140.6801 -44.79,202.75 -22.05,60.3 -56.5001,126.27 -93.5701,178.68 -35.99,50.87 -85.04,103.89 -133.11,143.54 -46.6,38.44 -105.99,75.58 -161.05,100.45 -53.34,24.08 -118.3,43.69 -176.09,52.92 -55.93,8.93 -121.57,10.72 -177.8799,4.63 -54.44,-5.89 -116.1101,-20.91 -167.0701,-40.93 -49.2,-19.32 -102.83,-49 -145.2,-80.61 -40.86,-30.48 -83.2,-71.72 -114.57,-111.91 -30.2,-38.71 -59.04,-87.78 -77.94,-133.1 -18.17,-43.57 -32.44,-96.42 -38.42,-143.2499 -5.75,-44.97 -5.51,-97.5301 0.88,-142.4101 6.12,-43.02 19.72,-91.54 37.06,-131.38 16.6,-38.12 41.49,-79.42 67.65,-111.73 24.97,-30.87 58.41,-62.53 90.73,-85.59 30.79,-21.98 69.56,-42.53 105.12,-55.44 33.81,-12.28 74.56,-21.2 110.42,-23.93 34.01,-2.58 73.51,-0.31 106.9401,6.39 31.62,6.34 66.9999,18.52 95.6999,33.21 27.05,13.84 56.02,33.97 78.26,54.68 20.89,19.45 41.88,45.09 56.61,69.54 13.78,22.87 26.05,51.36 32.94,77.16 6.41,24.04 10,52.72 9.42,77.59 -0.54,23.05 -4.84,49.51 -11.9,71.47 -6.5,20.24 -17.27,42.5 -29.34,60.01 -11.06,16.0401 -26.43,32.7001 -41.71,44.7901 -13.91,10.99 -31.79,21.34 -48.36,27.63 -14.96,5.69 -33.21,9.68 -49.2,10.43 -14.32,0.68 -30.9799,-1.08 -44.7499,-5.07 -12.22,-3.54 -25.71,-9.92 -36,-17.41 -9.07,-6.6 -18.27,-16.04 -24.32,-25.48 -5.31,-8.28 -9.7,-19.05 -11.32,-28.7501 -1.42,-8.54 -1.05,-18.85 1.34,-27.17 2.15,-7.47 6.67,-15.64 12.07,-21.23 5.07,-5.25 12.58,-9.87 19.58,-11.92 7,-2.05 14.51,-6.67 19.57,-11.91 5.41,-5.6 9.93,-13.77 12.08,-21.24 2.39,-8.32 2.76,-18.63 1.34,-27.17 -1.62,-9.7 -6.02,-20.47 -11.32,-28.75 -6.05,-9.44 -15.26,-18.88 -24.32,-25.48 -10.29,-7.49 -23.78,-13.86 -36,-17.4 -13.7701,-3.99 -30.4301,-5.76 -44.7501,-5.08 -15.99,0.76 -34.24,4.74 -49.2,10.43 -16.58,6.3 -34.45,16.64 -48.36,27.64 -15.28,12.08 -30.65,28.75 -41.71,44.79 -12.07,17.5 -22.84,39.76 -29.35,60.01 -7.06,21.95 -11.36,48.41 -11.89,71.4601 -0.58,24.88 3,53.55 9.42,77.59 6.89,25.7999 19.16,54.2899 32.94,77.1599 14.73,24.45 35.72,50.09 56.61,69.55 22.24,20.71 51.21,40.83 78.26,54.68 28.7,14.68 64.0801,26.86 95.6901,33.2 33.44,6.7 72.9399,8.97 106.9399,6.39 35.86,-2.73 76.62,-11.65 110.42,-23.93 35.56,-12.91 74.34,-33.46 105.13,-55.43 32.32,-23.07 65.75,-54.73 90.73,-85.59 26.15,-32.32 51.05,-73.6099 67.65,-111.7299 17.34,-39.85 30.94,-88.3701 37.06,-131.3901 6.39,-44.87 6.63,-97.44 0.88,-142.4 -5.98,-46.84 -20.25,-99.69 -38.42,-143.26 -18.9,-45.31 -47.74,-94.39 -77.95,-133.09 -31.36,-40.19 -73.7,-81.43 -114.56,-111.92 -42.37,-31.61 -96,-61.28 -145.2,-80.61 -50.96,-20.01 -112.6399,-35.03 -167.0699,-40.92 -56.3101,-6.1 -121.9501,-4.31 -177.8801,4.62 -57.8,9.23 -122.75,28.84 -176.09,52.93 -55.07,24.86 -114.45,62 -161.06,100.45 -48.06,39.65 -97.11,92.67 -133.1,143.53 -37.08,52.42 -71.53,118.38 -93.57,178.68 -22.7,62.07 -39.14,136.9 -44.79,202.75 -5.81,67.7401 -1.99,146.4501 10.13,213.35 12.46,68.76 37.42,145.82 67.43,208.93 30.82,64.82 76.26,134.51 122.95,189.02 47.93,55.95 111.63,112.8 172.52,154.29 62.44,42.54 140.75,81.77 212.14,106.54 73.19,25.38 161.17,43.24 238.4401,48.64 79.1699,5.53 170.9499,-0.32 248.8199,-15.64 79.73,-15.68 168.89,-45.99 241.76,-81.92 74.58,-36.78 154.58,-90.51 216.99,-145.46 63.8301,-56.2 128.5001,-130.59 175.4701,-201.49 48.02,-72.48 92.03,-163.13 119.51,-245.62 28.07,-84.2899 47.3599,-185.43 52.4999,-274.12 5.26,-90.59 -2.63,-195.46 -21.1499,-284.29 L 3775.3464,2720.83 c -14.25,-74.21 -19.43,-161.64 -13.81,-236.99 5.49,-73.47 22.88,-157.0701 47.36,-226.5501 23.8601,-67.69 61.5001,-141.88 102.2201,-200.9899 39.65,-57.54 93.91,-117.68 147.23,-162.85 51.87,-43.95 118.1299,-86.62 179.6999,-115.45 59.85,-28.04 132.87,-51.21 197.98,-62.59 63.24,-11.06 137.59,-14.21 201.5201,-8.3 62.05,5.73 132.49,21.69 190.86,43.5 56.6,21.14 118.45,53.99 167.52,89.25 47.53,34.15 96.99,80.6 133.88,126.04 35.6999,43.97 70.0699,99.92 92.9499,151.7299 22.11,50.09 39.94,111.01 48.09,165.15 7.86,52.2801 8.98,113.5501 2.79,166.0601 -5.97,50.62 -20.52,107.91 -39.64,155.17 -18.42,45.51 -46.5,95.02 -76.29,134.04 -28.6499,37.53 -67.2899,76.31 -104.8499,104.91 -36.07,27.46 -81.71,53.53 -123.77,70.44 -40.32,16.2 -89.14,28.69 -132.31,33.59 -41.31,4.69 -89.52,3.78 -130.59,-2.72 -39.21,-6.19 -83.3501,-19.32 -119.4801,-35.77 -34.43,-15.68 -71.62,-38.99 -100.58,-63.33 -27.53,-23.13 -55.64,-53.97 -75.93,-83.66 -19.24,-28.16 -37.02,-63.5 -47.94,-95.81 -10.31,-30.55 -17.46,-67.27 -19.09,-99.48 -1.53,-30.35 1.41,-65.5 8.23,-95.11 6.4,-27.82 18.11,-58.82 31.91,-83.8 12.93,-23.37 31.46,-48.24 50.36,-67.1001 17.61,-17.58 40.65,-35.02 62.48,-46.96 20.24,-11.06 45.3,-20.57 67.84,-25.43 20.79,-4.49 45.45,-6.29 66.65,-4.59 19.4201,1.55 41.5401,6.53 59.6401,13.73 16.48,6.55 34.37,16.85 48.11,28.06 12.41,10.11 24.99,23.92 33.64,37.39 7.74,12.0601 14.55,27.3701 17.98,41.2901 3.04,12.36 4.27,27.22 2.92,39.88 -1.18,11.15 -4.75,23.85 -9.91,33.81 -4.51,8.73 -11.64,17.92 -19.23,24.17 -6.69,5.51 -15.8,10.34 -24.2,12.43 -7.55,1.87 -16.88,2.04 -24.43,0.16 -7.08,-1.77 -14.83,-5.96 -20.11,-11 z m -1216.3701,-23.88 269.18,1346.96 -1301.09,-440.36 z"
id="path115-0"
style="fill:#000000;stroke:none;stroke-width:1" />
</g>
</clipPath>
<clipPath
id="clipPath113-5-9"
clipPathUnits="userSpaceOnUse">
<g
transform="matrix(0.03439583,0,0,-0.03439583,-5.864863,297.31878)"
style="fill:#000000;stroke:none"
id="g117-0-5">
<path
style="fill:#000000;stroke:none;stroke-width:1"
id="path115-1-5"
d="m 4655.0465,2463.15 c -5.27,-5.03 -13.02,-9.23 -20.1,-10.99 -7.55,-1.88 -16.88,-1.72 -24.43,0.16 -8.4,2.09 -17.51,6.92 -24.2001,12.42 -7.59,6.26 -14.72,15.45 -19.24,24.18 -5.15,9.96 -8.72,22.66 -9.9,33.81 -1.35,12.65 -0.12,27.52 2.92,39.87 3.43,13.92 10.24,29.23 17.98,41.3 8.65,13.47 21.2301,27.27 33.6301,37.39 13.74,11.2 31.64,21.51 48.12,28.06 18.1,7.19 40.22,12.17 59.64,13.73 21.2,1.7 45.86,-0.11 66.64,-4.59 22.55,-4.87 47.61,-14.37 67.85,-25.43 21.82,-11.94 44.87,-29.38 62.48,-46.96 18.89,-18.87 37.43,-43.73 50.35,-67.1 13.81,-24.98 25.52,-55.98 31.92,-83.8 6.82,-29.62 9.76,-64.77 8.23,-95.12 -1.63,-32.2001 -8.78,-68.9301 -19.09,-99.4701 -10.92,-32.31 -28.7,-67.65 -47.94,-95.81 -20.29,-29.69 -48.4,-60.53 -75.93,-83.66 -28.96,-24.3399 -66.15,-47.6499 -100.58,-63.3299 -36.13,-16.45 -80.27,-29.58 -119.48,-35.78 -41.07,-6.49 -89.2801,-7.4 -130.5901,-2.71 -43.17,4.9 -91.99,17.38 -132.31,33.59 -42.06,16.9 -87.7,42.98 -123.77,70.4399 -37.56,28.6 -76.2,67.38 -104.85,104.9 -29.7899,39.03 -57.8699,88.54 -76.2899,134.05 -19.12,47.2601 -33.67,104.5401 -39.64,155.1701 -6.19,52.5 -5.07,113.78 2.79,166.06 8.15,54.14 25.98,115.06 48.09,165.15 22.88,51.81 57.2499,107.76 92.9499,151.73 36.89,45.44 86.35,91.88 133.88,126.0399 49.06,35.2501 110.92,68.1101 167.52,89.2501 58.37,21.8 128.8101,37.77 190.8501,43.5 63.93,5.91 138.29,2.76 201.53,-8.3 65.11,-11.38 138.13,-34.55 197.98,-62.59 61.57,-28.84 127.8299,-71.5001 179.6999,-115.45 53.32,-45.17 107.58,-105.31 147.2301,-162.85 40.72,-59.11 78.36,-133.3 102.22,-200.99 24.48,-69.49 41.87,-153.08 47.35,-226.55 5.63,-75.35 0.45,-162.7801 -13.8,-236.9901 -14.61,-76.07 -43.13,-161.1999 -77.09,-230.8199 -34.79,-71.33 -85.76,-147.89 -137.9601,-207.66 -53.44,-61.21 -124.27,-123.27 -191.8299,-168.42 -69.14,-46.1901 -155.67,-88.6101 -234.46,-115.1801 -80.59,-27.18 -177.34,-45.99 -262.23,-51.22 -86.7801,-5.35 -187.2901,1.86 -272.4601,19.31 -87.04,17.84 -184.27,51.7 -263.6599,91.59 -81.08,40.7501 -167.95,100.0101 -235.62,160.4601 L 2482.2664,2913.52 c -57.14,49.45 -130.27,97.65 -198.34,130.46 -66.36,31.9799 -147.46,58.7199 -219.87,72.26 -70.56,13.18 -153.63,17.68 -225.17,11.97 -69.66,-5.57 -148.87,-22.4801 -214.65,-46.0801 -64,-22.9499 -134.08,-58.9899 -189.84,-97.8899 -54.2,-37.82 -110.78,-89.47 -153.19,-140.17 -41.2,-49.24 -81.1,-112.06 -107.95,-170.37 -26.06,-56.6 -47.45,-125.59 -57.76,-187.04 -9.99,-59.59 -12.46,-129.58 -6.46,-189.7001 5.81,-58.24 21.3,-124.3 42.21,-178.97 20.23,-52.8999 51.5,-110.6399 84.93,-156.3599 32.32,-44.19 76.16,-90.09 118.98,-124.22 41.34,-32.95 93.85,-64.55 142.41,-85.44 46.83,-20.15 103.72,-36.19 154.2,-43.26 48.63,-6.81 105.55,-7.25 154.24,-0.96 46.82,6.05 99.72,20.12 143.27,38.36 41.82,17.5 87.22,43.99 122.89,71.96 34.19,26.82 69.42,62.85 95.25,97.79 24.72,33.43 48.03,75.64 62.94,114.45 14.24,37.06 24.94,81.8499 28.76,121.3699 3.63,37.65 2.04,81.51 -4.56,118.76 -6.27,35.41 -18.92,75.1701 -34.49,107.5901 -14.76,30.74 -36.48,63.82 -59,89.42 -21.29,24.21 -49.53,48.76 -76.6,66.27 -25.52,16.51 -57.43,31.53 -86.49,40.44 -27.29,8.36 -59.99,13.72 -88.53,14.25 -26.7,0.5 -57.5,-3.12 -83.29,-10.06 -24.03,-6.46 -50.65,-17.69 -71.9,-30.63 -19.7,-11.99 -40.47,-28.94 -55.95,-46.03 -14.28,-15.76 -28.17,-36.22 -37.3,-55.42 -8.36,-17.6 -15.11,-39.25 -17.93,-58.52 -2.57,-17.54 -2.59,-38.2 0.24,-55.7 2.56,-15.8001 8.23,-33.5901 15.57,-47.8201 6.57,-12.74 16.43,-26.29 26.77,-36.22 9.18,-8.81 21.44,-17.31 33.07,-22.47 10.25,-4.55 23.03,-7.81 34.23,-8.32 9.83,-0.46 21.35,1.12 30.56,4.57 8.11,3.04 16.85,8.51 22.86,14.74 5.4,5.6 10.21,13.6 12.35,21.08 2.01,7.01 2.26,15.82 0.53,22.91 -1.72,7.08 -1.48,15.9 0.53,22.91 2.15,7.47 6.96,15.48 12.36,21.07 6.01,6.2301 14.75,11.7101 22.86,14.7401 9.21,3.45 20.73,5.03 30.56,4.58 11.2,-0.52 23.98,-3.77 34.23,-8.32 11.63,-5.1701 23.89,-13.6601 33.07,-22.4801 10.34,-9.93 20.19,-23.48 26.77,-36.22 7.34,-14.22 13.01,-32.02 15.57,-47.82 2.83,-17.5 2.81,-38.15 0.24,-55.69 -2.82,-19.28 -9.57,-40.93 -17.93,-58.52 -9.13,-19.21 -23.02,-39.66 -37.3,-55.4199 -15.48,-17.09 -36.25,-34.05 -55.95,-46.04 -21.25,-12.93 -47.87,-24.17 -71.9,-30.63 -25.79,-6.93 -56.59,-10.56 -83.29,-10.06 -28.54,0.53 -61.24,5.89 -88.53,14.26 -29.06,8.9 -60.97,23.93 -86.49,40.43 -27.07,17.52 -55.31,42.07 -76.6,66.2799 -22.52,25.6 -44.24,58.67 -59,89.41 -15.57,32.42 -28.22,72.18 -34.5,107.59 -6.59,37.25 -8.18,81.1101 -4.55,118.7701 3.82,39.51 14.52,84.3 28.76,121.36 14.91,38.81 38.22,81.02 62.94,114.45 25.83,34.94 61.05,70.98 95.25,97.79 35.67,27.97 81.07,54.46 122.89,71.97 43.55,18.23 96.45,32.3 143.27,38.35 48.69,6.29 105.61,5.85 154.23,-0.96 50.49,-7.06 107.38,-23.11 154.21,-43.25 48.56,-20.89 101.07,-52.5 142.41,-85.45 42.81,-34.12 86.66,-80.02 118.98,-124.22 33.43,-45.72 64.69,-103.46 84.93,-156.36 20.91,-54.67 36.4,-120.7201 42.21,-178.9601 6,-60.12 3.53,-130.12 -6.46,-189.6999 -10.31,-61.46 -31.7,-130.44 -57.76,-187.04 -26.85,-58.32 -66.75,-121.14 -107.95,-170.38 -42.41,-50.69 -98.99,-102.34 -153.2,-140.16 -55.75,-38.9001 -125.83,-74.9501 -189.83,-97.9001 -65.78,-23.59 -144.99,-40.51 -214.65,-46.07 -71.54,-5.72 -154.61,-1.22 -225.17,11.97 -72.42,13.53 -153.51,40.27 -219.87,72.26 -68.07,32.8 -141.2,81.0001 -198.34,130.4501 -58.58,50.69 -118.04,117.95 -161.34995,182.17 -44.37,65.79 -85.198,148.21 -110.86499,223.3 -26.279,76.8899 -44.618,169.2599 -49.933,250.3399 -5.438,82.9701 1.093,179.1201 17.478,260.6401 16.759,83.38 48.84299,176.58 86.75999,252.71 38.76,77.83 95.24995,161.27 152.95995,226.31 58.96,66.45 136.9,133.73 211.14,182.53 75.83,49.85 170.59,95.45 256.78,123.83 l 1736.46,587.68 c 71.39,24.76 149.69,63.99 212.14,106.54 60.89,41.48 124.59,98.34 172.52,154.28 46.69,54.51 92.13,124.2 122.95,189.02 30.0101,63.11 54.9701,140.17 67.4201,208.93 12.12,66.9 15.95,145.61 10.14,213.35 -5.65,65.85 -22.09,140.6801 -44.79,202.75 -22.05,60.3 -56.5001,126.27 -93.5701,178.68 -35.99,50.87 -85.04,103.89 -133.11,143.54 -46.6,38.44 -105.99,75.58 -161.05,100.45 -53.34,24.08 -118.3,43.69 -176.09,52.92 -55.93,8.93 -121.57,10.72 -177.8799,4.63 -54.44,-5.89 -116.1101,-20.91 -167.0701,-40.93 -49.2,-19.32 -102.83,-49 -145.2,-80.61 -40.86,-30.48 -83.2,-71.72 -114.57,-111.91 -30.2,-38.71 -59.04,-87.78 -77.94,-133.1 -18.17,-43.57 -32.44,-96.42 -38.42,-143.2499 -5.75,-44.97 -5.51,-97.5301 0.88,-142.4101 6.12,-43.02 19.72,-91.54 37.06,-131.38 16.6,-38.12 41.49,-79.42 67.65,-111.73 24.97,-30.87 58.41,-62.53 90.73,-85.59 30.79,-21.98 69.56,-42.53 105.12,-55.44 33.81,-12.28 74.56,-21.2 110.42,-23.93 34.01,-2.58 73.51,-0.31 106.9401,6.39 31.62,6.34 66.9999,18.52 95.6999,33.21 27.05,13.84 56.02,33.97 78.26,54.68 20.89,19.45 41.88,45.09 56.61,69.54 13.78,22.87 26.05,51.36 32.94,77.16 6.41,24.04 10,52.72 9.42,77.59 -0.54,23.05 -4.84,49.51 -11.9,71.47 -6.5,20.24 -17.27,42.5 -29.34,60.01 -11.06,16.0401 -26.43,32.7001 -41.71,44.7901 -13.91,10.99 -31.79,21.34 -48.36,27.63 -14.96,5.69 -33.21,9.68 -49.2,10.43 -14.32,0.68 -30.9799,-1.08 -44.7499,-5.07 -12.22,-3.54 -25.71,-9.92 -36,-17.41 -9.07,-6.6 -18.27,-16.04 -24.32,-25.48 -5.31,-8.28 -9.7,-19.05 -11.32,-28.7501 -1.42,-8.54 -1.05,-18.85 1.34,-27.17 2.15,-7.47 6.67,-15.64 12.07,-21.23 5.07,-5.25 12.58,-9.87 19.58,-11.92 7,-2.05 14.51,-6.67 19.57,-11.91 5.41,-5.6 9.93,-13.77 12.08,-21.24 2.39,-8.32 2.76,-18.63 1.34,-27.17 -1.62,-9.7 -6.02,-20.47 -11.32,-28.75 -6.05,-9.44 -15.26,-18.88 -24.32,-25.48 -10.29,-7.49 -23.78,-13.86 -36,-17.4 -13.7701,-3.99 -30.4301,-5.76 -44.7501,-5.08 -15.99,0.76 -34.24,4.74 -49.2,10.43 -16.58,6.3 -34.45,16.64 -48.36,27.64 -15.28,12.08 -30.65,28.75 -41.71,44.79 -12.07,17.5 -22.84,39.76 -29.35,60.01 -7.06,21.95 -11.36,48.41 -11.89,71.4601 -0.58,24.88 3,53.55 9.42,77.59 6.89,25.7999 19.16,54.2899 32.94,77.1599 14.73,24.45 35.72,50.09 56.61,69.55 22.24,20.71 51.21,40.83 78.26,54.68 28.7,14.68 64.0801,26.86 95.6901,33.2 33.44,6.7 72.9399,8.97 106.9399,6.39 35.86,-2.73 76.62,-11.65 110.42,-23.93 35.56,-12.91 74.34,-33.46 105.13,-55.43 32.32,-23.07 65.75,-54.73 90.73,-85.59 26.15,-32.32 51.05,-73.6099 67.65,-111.7299 17.34,-39.85 30.94,-88.3701 37.06,-131.3901 6.39,-44.87 6.63,-97.44 0.88,-142.4 -5.98,-46.84 -20.25,-99.69 -38.42,-143.26 -18.9,-45.31 -47.74,-94.39 -77.95,-133.09 -31.36,-40.19 -73.7,-81.43 -114.56,-111.92 -42.37,-31.61 -96,-61.28 -145.2,-80.61 -50.96,-20.01 -112.6399,-35.03 -167.0699,-40.92 -56.3101,-6.1 -121.9501,-4.31 -177.8801,4.62 -57.8,9.23 -122.75,28.84 -176.09,52.93 -55.07,24.86 -114.45,62 -161.06,100.45 -48.06,39.65 -97.11,92.67 -133.1,143.53 -37.08,52.42 -71.53,118.38 -93.57,178.68 -22.7,62.07 -39.14,136.9 -44.79,202.75 -5.81,67.7401 -1.99,146.4501 10.13,213.35 12.46,68.76 37.42,145.82 67.43,208.93 30.82,64.82 76.26,134.51 122.95,189.02 47.93,55.95 111.63,112.8 172.52,154.29 62.44,42.54 140.75,81.77 212.14,106.54 73.19,25.38 161.17,43.24 238.4401,48.64 79.1699,5.53 170.9499,-0.32 248.8199,-15.64 79.73,-15.68 168.89,-45.99 241.76,-81.92 74.58,-36.78 154.58,-90.51 216.99,-145.46 63.8301,-56.2 128.5001,-130.59 175.4701,-201.49 48.02,-72.48 92.03,-163.13 119.51,-245.62 28.07,-84.2899 47.3599,-185.43 52.4999,-274.12 5.26,-90.59 -2.63,-195.46 -21.1499,-284.29 L 3775.3464,2720.83 c -14.25,-74.21 -19.43,-161.64 -13.81,-236.99 5.49,-73.47 22.88,-157.0701 47.36,-226.5501 23.8601,-67.69 61.5001,-141.88 102.2201,-200.9899 39.65,-57.54 93.91,-117.68 147.23,-162.85 51.87,-43.95 118.1299,-86.62 179.6999,-115.45 59.85,-28.04 132.87,-51.21 197.98,-62.59 63.24,-11.06 137.59,-14.21 201.5201,-8.3 62.05,5.73 132.49,21.69 190.86,43.5 56.6,21.14 118.45,53.99 167.52,89.25 47.53,34.15 96.99,80.6 133.88,126.04 35.6999,43.97 70.0699,99.92 92.9499,151.7299 22.11,50.09 39.94,111.01 48.09,165.15 7.86,52.2801 8.98,113.5501 2.79,166.0601 -5.97,50.62 -20.52,107.91 -39.64,155.17 -18.42,45.51 -46.5,95.02 -76.29,134.04 -28.6499,37.53 -67.2899,76.31 -104.8499,104.91 -36.07,27.46 -81.71,53.53 -123.77,70.44 -40.32,16.2 -89.14,28.69 -132.31,33.59 -41.31,4.69 -89.52,3.78 -130.59,-2.72 -39.21,-6.19 -83.3501,-19.32 -119.4801,-35.77 -34.43,-15.68 -71.62,-38.99 -100.58,-63.33 -27.53,-23.13 -55.64,-53.97 -75.93,-83.66 -19.24,-28.16 -37.02,-63.5 -47.94,-95.81 -10.31,-30.55 -17.46,-67.27 -19.09,-99.48 -1.53,-30.35 1.41,-65.5 8.23,-95.11 6.4,-27.82 18.11,-58.82 31.91,-83.8 12.93,-23.37 31.46,-48.24 50.36,-67.1001 17.61,-17.58 40.65,-35.02 62.48,-46.96 20.24,-11.06 45.3,-20.57 67.84,-25.43 20.79,-4.49 45.45,-6.29 66.65,-4.59 19.4201,1.55 41.5401,6.53 59.6401,13.73 16.48,6.55 34.37,16.85 48.11,28.06 12.41,10.11 24.99,23.92 33.64,37.39 7.74,12.0601 14.55,27.3701 17.98,41.2901 3.04,12.36 4.27,27.22 2.92,39.88 -1.18,11.15 -4.75,23.85 -9.91,33.81 -4.51,8.73 -11.64,17.92 -19.23,24.17 -6.69,5.51 -15.8,10.34 -24.2,12.43 -7.55,1.87 -16.88,2.04 -24.43,0.16 -7.08,-1.77 -14.83,-5.96 -20.11,-11 z m -1216.3701,-23.88 269.18,1346.96 -1301.09,-440.36 z" />
</g>
</clipPath>
</defs>
<sodipodi:namedview
fit-margin-bottom="0"
fit-margin-right="0"
fit-margin-left="0"
fit-margin-top="0"
inkscape:window-maximized="1"
inkscape:window-y="-8"
inkscape:window-x="-8"
inkscape:window-height="705"
inkscape:window-width="1366"
showgrid="false"
inkscape:document-rotation="0"
inkscape:current-layer="g1647"
inkscape:document-units="mm"
inkscape:cy="413.21665"
inkscape:cx="1554.9206"
inkscape:zoom="0.15004828"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(88.373869,-24.918861)"
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Layer 1">
<g
id="g1647">
<g
transform="matrix(0.58419217,-0.00881677,0.0086386,0.59624164,-59.673748,29.653418)"
id="g2688"
style="fill:#000000">
<ellipse
transform="rotate(-28.581924)"
ry="6.8249979"
rx="6.8249974"
cy="219.03833"
cx="2.5351706"
id="path123"
style="mix-blend-mode:normal;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.27403px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
d="M 232.24145,197.31643 A 125.46352,125.46352 0 0 0 114.54389,64.899434 125.46352,125.46352 0 0 0 -18.251958,182.57485 125.46352,125.46352 0 0 0 99.423454,315.37073 125.46352,125.46352 0 0 0 232.21858,197.69526 a 125.46352,125.46352 0 0 0 0.0229,-0.37883 z m -13.43191,-0.0771 A 117.34539,117.34539 0 0 1 94.606298,307.30055 117.34539,117.34539 0 0 1 -15.454894,183.0973 117.34539,117.34539 0 0 1 108.74833,73.036099 117.34539,117.34539 0 0 1 218.80954,197.23935 Z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke-width:0.388604"
id="path27" />
<g
id="g59"
style="fill:#000000;stroke:none"
transform="matrix(-0.03530297,-0.00801987,0.00801987,-0.03530297,193.47952,337.1264)">
<path
id="path55"
d="m 756.223,2572.81 c 0,76.61 7.394,155.44 22.082,228.52 85.061,423.2 392.555,751.97 799.895,889.84 l 1648.77,558 c -53.06,-11.73 -108.09,-18.47 -170.1,-18.47 -459.72,0 -858.43,386.42 -858.43,890.64 0,593.78 505.24,996.71 1026.14,996.71 72.08,0 145.98,-6.76 214.79,-20.29 546.62,-107.52 920,-601.23 920,-1141.96 0,-85.55 -9.24,-173.47 -25.56,-255.14 L 3992.68,2993.8 c 112.81,357.17 451.97,577.31 809.44,577.31 521.86,0 950.66,-437.89 950.66,-980.9 0,-67.52 -6.14,-136.48 -18.52,-200.96 -104.14,-542.25 -593.25,-887.82 -1098.31,-887.82 -359.52,0 -626.91,150.98 -805.68,308.05 L 2522.68,2958.32 c 148.7,-162.48 212.03,-365.84 212.03,-552.38 0,-483.79 -405.3,-904.57 -935.72,-904.57 -268.28,0 -499.31,102.7 -670.7,251.01 -247.481,214.17 -372.067,522.94 -372.067,820.43 z m 1986.147,928.56 670.18,-588.79 174.81,874.78 z"
style="fill:#ffffff" />
<path
id="path57"
d="m 4718.04,2673.13 c -5.27,-5.03 -13.02,-9.23 -20.1,-10.99 -7.55,-1.88 -16.88,-1.72 -24.43,0.16 -8.4,2.09 -17.51,6.92 -24.2,12.42 -7.59,6.26 -14.72,15.45 -19.24,24.18 -5.15,9.96 -8.72,22.66 -9.9,33.81 -1.35,12.65 -0.12,27.52 2.92,39.87 3.43,13.92 10.24,29.23 17.98,41.3 8.65,13.47 21.23,27.27 33.63,37.39 13.74,11.2 31.64,21.51 48.12,28.06 18.1,7.19 40.22,12.17 59.64,13.73 21.2,1.7 45.86,-0.11 66.64,-4.59 22.55,-4.87 47.61,-14.37 67.85,-25.43 21.82,-11.94 44.87,-29.38 62.48,-46.96 18.89,-18.87 37.43,-43.73 50.35,-67.1 13.81,-24.98 25.52,-55.98 31.92,-83.8 6.82,-29.62 9.76,-64.77 8.23,-95.12 -1.63,-32.2 -8.78,-68.93 -19.09,-99.47 -10.92,-32.31 -28.7,-67.65 -47.94,-95.81 -20.29,-29.69 -48.4,-60.53 -75.93,-83.66 -28.96,-24.34 -66.15,-47.65 -100.58,-63.33 -36.13,-16.45 -80.27,-29.58 -119.48,-35.78 -41.07,-6.49 -89.28,-7.4 -130.59,-2.71 -43.17,4.9 -91.99,17.38 -132.31,33.59 -42.06,16.9 -87.7,42.98 -123.77,70.44 -37.56,28.6 -76.2,67.38 -104.85,104.9 -29.79,39.03 -57.87,88.54 -76.29,134.05 -19.12,47.26 -33.67,104.54 -39.64,155.17 -6.19,52.5 -5.07,113.78 2.79,166.06 8.15,54.14 25.98,115.06 48.09,165.15 22.88,51.81 57.25,107.76 92.95,151.73 36.89,45.44 86.35,91.88 133.88,126.04 49.06,35.25 110.92,68.11 167.52,89.25 58.37,21.8 128.81,37.77 190.85,43.5 63.93,5.91 138.29,2.76 201.53,-8.3 65.11,-11.38 138.13,-34.55 197.98,-62.59 61.57,-28.84 127.83,-71.5 179.7,-115.45 53.32,-45.17 107.58,-105.31 147.23,-162.85 40.72,-59.11 78.36,-133.3 102.22,-200.99 24.48,-69.49 41.87,-153.08 47.35,-226.55 5.63,-75.35 0.45,-162.78 -13.8,-236.99 -14.61,-76.07 -43.13,-161.2 -77.09,-230.82 -34.79,-71.33 -85.76,-147.89 -137.96,-207.66 -53.44,-61.21 -124.27,-123.27 -191.83,-168.42 -69.14,-46.19 -155.67,-88.61 -234.46,-115.18 -80.59,-27.18 -177.34,-45.99 -262.23,-51.22 -86.78,-5.35 -187.29,1.86 -272.46,19.31 -87.04,17.84 -184.27,51.7 -263.66,91.59 -81.08,40.75 -167.95,100.01 -235.62,160.46 L 2545.26,3123.5 c -57.14,49.45 -130.27,97.65 -198.34,130.46 -66.36,31.98 -147.46,58.72 -219.87,72.26 -70.56,13.18 -153.63,17.68 -225.17,11.97 -69.66,-5.57 -148.87,-22.48 -214.65,-46.08 -64,-22.95 -134.08,-58.99 -189.84,-97.89 -54.2,-37.82 -110.78,-89.47 -153.19,-140.17 -41.2,-49.24 -81.1,-112.06 -107.95,-170.37 -26.06,-56.6 -47.45,-125.59 -57.76,-187.04 -9.99,-59.59 -12.46,-129.58 -6.46,-189.7 5.81,-58.24 21.3,-124.3 42.21,-178.97 20.23,-52.9 51.5,-110.64 84.93,-156.36 32.32,-44.19 76.16,-90.09 118.98,-124.22 41.34,-32.95 93.85,-64.55 142.41,-85.44 46.83,-20.15 103.72,-36.19 154.2,-43.26 48.63,-6.81 105.55,-7.25 154.24,-0.96 46.82,6.05 99.72,20.12 143.27,38.36 41.82,17.5 87.22,43.99 122.89,71.96 34.19,26.82 69.42,62.85 95.25,97.79 24.72,33.43 48.03,75.64 62.94,114.45 14.24,37.06 24.94,81.85 28.76,121.37 3.63,37.65 2.04,81.51 -4.56,118.76 -6.27,35.41 -18.92,75.17 -34.49,107.59 -14.76,30.74 -36.48,63.82 -59,89.42 -21.29,24.21 -49.53,48.76 -76.6,66.27 -25.52,16.51 -57.43,31.53 -86.49,40.44 -27.29,8.36 -59.99,13.72 -88.53,14.25 -26.7,0.5 -57.5,-3.12 -83.29,-10.06 -24.03,-6.46 -50.65,-17.69 -71.9,-30.63 -19.7,-11.99 -40.47,-28.94 -55.95,-46.03 -14.28,-15.76 -28.17,-36.22 -37.3,-55.42 -8.36,-17.6 -15.11,-39.25 -17.93,-58.52 -2.57,-17.54 -2.59,-38.2 0.24,-55.7 2.56,-15.8 8.23,-33.59 15.57,-47.82 6.57,-12.74 16.43,-26.29 26.77,-36.22 9.18,-8.81 21.44,-17.31 33.07,-22.47 10.25,-4.55 23.03,-7.81 34.23,-8.32 9.83,-0.46 21.35,1.12 30.56,4.57 8.11,3.04 16.85,8.51 22.86,14.74 5.4,5.6 10.21,13.6 12.35,21.08 2.01,7.01 2.26,15.82 0.53,22.91 -1.72,7.08 -1.48,15.9 0.53,22.91 2.15,7.47 6.96,15.48 12.36,21.07 6.01,6.23 14.75,11.71 22.86,14.74 9.21,3.45 20.73,5.03 30.56,4.58 11.2,-0.52 23.98,-3.77 34.23,-8.32 11.63,-5.17 23.89,-13.66 33.07,-22.48 10.34,-9.93 20.19,-23.48 26.77,-36.22 7.34,-14.22 13.01,-32.02 15.57,-47.82 2.83,-17.5 2.81,-38.15 0.24,-55.69 -2.82,-19.28 -9.57,-40.93 -17.93,-58.52 -9.13,-19.21 -23.02,-39.66 -37.3,-55.42 -15.48,-17.09 -36.25,-34.05 -55.95,-46.04 -21.25,-12.93 -47.87,-24.17 -71.9,-30.63 -25.79,-6.93 -56.59,-10.56 -83.29,-10.06 -28.54,0.53 -61.24,5.89 -88.53,14.26 -29.06,8.9 -60.97,23.93 -86.49,40.43 -27.07,17.52 -55.31,42.07 -76.6,66.28 -22.52,25.6 -44.24,58.67 -59,89.41 -15.57,32.42 -28.22,72.18 -34.5,107.59 -6.59,37.25 -8.18,81.11 -4.55,118.77 3.82,39.51 14.52,84.3 28.76,121.36 14.91,38.81 38.22,81.02 62.94,114.45 25.83,34.94 61.05,70.98 95.25,97.79 35.67,27.97 81.07,54.46 122.89,71.97 43.55,18.23 96.45,32.3 143.27,38.35 48.69,6.29 105.61,5.85 154.23,-0.96 50.49,-7.06 107.38,-23.11 154.21,-43.25 48.56,-20.89 101.07,-52.5 142.41,-85.45 42.81,-34.12 86.66,-80.02 118.98,-124.22 33.43,-45.72 64.69,-103.46 84.93,-156.36 20.91,-54.67 36.4,-120.72 42.21,-178.96 6,-60.12 3.53,-130.12 -6.46,-189.7 -10.31,-61.46 -31.7,-130.44 -57.76,-187.04 -26.85,-58.32 -66.75,-121.14 -107.95,-170.38 -42.41,-50.69 -98.99,-102.34 -153.2,-140.16 -55.75,-38.9 -125.83,-74.95 -189.83,-97.9 -65.78,-23.59 -144.99,-40.51 -214.65,-46.07 -71.54,-5.72 -154.61,-1.22 -225.17,11.97 -72.42,13.53 -153.51,40.27 -219.87,72.26 -68.07,32.8 -141.2,81 -198.34,130.45 -58.58,50.69 -118.04,117.95 -161.35,182.17 -44.37,65.79 -85.198,148.21 -110.865,223.3 -26.279,76.89 -44.618,169.26 -49.933,250.34 -5.438,82.97 1.093,179.12 17.478,260.64 16.759,83.38 48.843,176.58 86.76,252.71 38.76,77.83 95.25,161.27 152.96,226.31 58.96,66.45 136.9,133.73 211.14,182.53 75.83,49.85 170.59,95.45 256.78,123.83 L 3358.68,4147 c 71.39,24.76 149.69,63.99 212.14,106.54 60.89,41.48 124.59,98.34 172.52,154.28 46.69,54.51 92.13,124.2 122.95,189.02 30.01,63.11 54.97,140.17 67.42,208.93 12.12,66.9 15.95,145.61 10.14,213.35 -5.65,65.85 -22.09,140.68 -44.79,202.75 -22.05,60.3 -56.5,126.27 -93.57,178.68 -35.99,50.87 -85.04,103.89 -133.11,143.54 -46.6,38.44 -105.99,75.58 -161.05,100.45 -53.34,24.08 -118.3,43.69 -176.09,52.92 -55.93,8.93 -121.57,10.72 -177.88,4.63 -54.44,-5.89 -116.11,-20.91 -167.07,-40.93 -49.2,-19.32 -102.83,-49 -145.2,-80.61 -40.86,-30.48 -83.2,-71.72 -114.57,-111.91 -30.2,-38.71 -59.04,-87.78 -77.94,-133.1 -18.17,-43.57 -32.44,-96.42 -38.42,-143.25 -5.75,-44.97 -5.51,-97.53 0.88,-142.41 6.12,-43.02 19.72,-91.54 37.06,-131.38 16.6,-38.12 41.49,-79.42 67.65,-111.73 24.97,-30.87 58.41,-62.53 90.73,-85.59 30.79,-21.98 69.56,-42.53 105.12,-55.44 33.81,-12.28 74.56,-21.2 110.42,-23.93 34.01,-2.58 73.51,-0.31 106.94,6.39 31.62,6.34 67,18.52 95.7,33.21 27.05,13.84 56.02,33.97 78.26,54.68 20.89,19.45 41.88,45.09 56.61,69.54 13.78,22.87 26.05,51.36 32.94,77.16 6.41,24.04 10,52.72 9.42,77.59 -0.54,23.05 -4.84,49.51 -11.9,71.47 -6.5,20.24 -17.27,42.5 -29.34,60.01 -11.06,16.04 -26.43,32.7 -41.71,44.79 -13.91,10.99 -31.79,21.34 -48.36,27.63 -14.96,5.69 -33.21,9.68 -49.2,10.43 -14.32,0.68 -30.98,-1.08 -44.75,-5.07 -12.22,-3.54 -25.71,-9.92 -36,-17.41 -9.07,-6.6 -18.27,-16.04 -24.32,-25.48 -5.31,-8.28 -9.7,-19.05 -11.32,-28.75 -1.42,-8.54 -1.05,-18.85 1.34,-27.17 2.15,-7.47 6.67,-15.64 12.07,-21.23 5.07,-5.25 12.58,-9.87 19.58,-11.92 7,-2.05 14.51,-6.67 19.57,-11.91 5.41,-5.6 9.93,-13.77 12.08,-21.24 2.39,-8.32 2.76,-18.63 1.34,-27.17 -1.62,-9.7 -6.02,-20.47 -11.32,-28.75 -6.05,-9.44 -15.26,-18.88 -24.32,-25.48 -10.29,-7.49 -23.78,-13.86 -36,-17.4 -13.77,-3.99 -30.43,-5.76 -44.75,-5.08 -15.99,0.76 -34.24,4.74 -49.2,10.43 -16.58,6.3 -34.45,16.64 -48.36,27.64 -15.28,12.08 -30.65,28.75 -41.71,44.79 -12.07,17.5 -22.84,39.76 -29.35,60.01 -7.06,21.95 -11.36,48.41 -11.89,71.46 -0.58,24.88 3,53.55 9.42,77.59 6.89,25.8 19.16,54.29 32.94,77.16 14.73,24.45 35.72,50.09 56.61,69.55 22.24,20.71 51.21,40.83 78.26,54.68 28.7,14.68 64.08,26.86 95.69,33.2 33.44,6.7 72.94,8.97 106.94,6.39 35.86,-2.73 76.62,-11.65 110.42,-23.93 35.56,-12.91 74.34,-33.46 105.13,-55.43 32.32,-23.07 65.75,-54.73 90.73,-85.59 26.15,-32.32 51.05,-73.61 67.65,-111.73 17.34,-39.85 30.94,-88.37 37.06,-131.39 6.39,-44.87 6.63,-97.44 0.88,-142.4 -5.98,-46.84 -20.25,-99.69 -38.42,-143.26 -18.9,-45.31 -47.74,-94.39 -77.95,-133.09 -31.36,-40.19 -73.7,-81.43 -114.56,-111.92 -42.37,-31.61 -96,-61.28 -145.2,-80.61 -50.96,-20.01 -112.64,-35.03 -167.07,-40.92 -56.31,-6.1 -121.95,-4.31 -177.88,4.62 -57.8,9.23 -122.75,28.84 -176.09,52.93 -55.07,24.86 -114.45,62 -161.06,100.45 -48.06,39.65 -97.11,92.67 -133.1,143.53 -37.08,52.42 -71.53,118.38 -93.57,178.68 -22.7,62.07 -39.14,136.9 -44.79,202.75 -5.81,67.74 -1.99,146.45 10.13,213.35 12.46,68.76 37.42,145.82 67.43,208.93 30.82,64.82 76.26,134.51 122.95,189.02 47.93,55.95 111.63,112.8 172.52,154.29 62.44,42.54 140.75,81.77 212.14,106.54 73.19,25.38 161.17,43.24 238.44,48.64 79.17,5.53 170.95,-0.32 248.82,-15.64 79.73,-15.68 168.89,-45.99 241.76,-81.92 74.58,-36.78 154.58,-90.51 216.99,-145.46 63.83,-56.2 128.5,-130.59 175.47,-201.49 48.02,-72.48 92.03,-163.13 119.51,-245.62 28.07,-84.29 47.36,-185.43 52.5,-274.12 5.26,-90.59 -2.63,-195.46 -21.15,-284.29 L 3838.34,2930.81 c -14.25,-74.21 -19.43,-161.64 -13.81,-236.99 5.49,-73.47 22.88,-157.07 47.36,-226.55 23.86,-67.69 61.5,-141.88 102.22,-200.99 39.65,-57.54 93.91,-117.68 147.23,-162.85 51.87,-43.95 118.13,-86.62 179.7,-115.45 59.85,-28.04 132.87,-51.21 197.98,-62.59 63.24,-11.06 137.59,-14.21 201.52,-8.3 62.05,5.73 132.49,21.69 190.86,43.5 56.6,21.14 118.45,53.99 167.52,89.25 47.53,34.15 96.99,80.6 133.88,126.04 35.7,43.97 70.07,99.92 92.95,151.73 22.11,50.09 39.94,111.01 48.09,165.15 7.86,52.28 8.98,113.55 2.79,166.06 -5.97,50.62 -20.52,107.91 -39.64,155.17 -18.42,45.51 -46.5,95.02 -76.29,134.04 -28.65,37.53 -67.29,76.31 -104.85,104.91 -36.07,27.46 -81.71,53.53 -123.77,70.44 -40.32,16.2 -89.14,28.69 -132.31,33.59 -41.31,4.69 -89.52,3.78 -130.59,-2.72 -39.21,-6.19 -83.35,-19.32 -119.48,-35.77 -34.43,-15.68 -71.62,-38.99 -100.58,-63.33 -27.53,-23.13 -55.64,-53.97 -75.93,-83.66 -19.24,-28.16 -37.02,-63.5 -47.94,-95.81 -10.31,-30.55 -17.46,-67.27 -19.09,-99.48 -1.53,-30.35 1.41,-65.5 8.23,-95.11 6.4,-27.82 18.11,-58.82 31.91,-83.8 12.93,-23.37 31.46,-48.24 50.36,-67.1 17.61,-17.58 40.65,-35.02 62.48,-46.96 20.24,-11.06 45.3,-20.57 67.84,-25.43 20.79,-4.49 45.45,-6.29 66.65,-4.59 19.42,1.55 41.54,6.53 59.64,13.73 16.48,6.55 34.37,16.85 48.11,28.06 12.41,10.11 24.99,23.92 33.64,37.39 7.74,12.06 14.55,27.37 17.98,41.29 3.04,12.36 4.27,27.22 2.92,39.88 -1.18,11.15 -4.75,23.85 -9.91,33.81 -4.51,8.73 -11.64,17.92 -19.23,24.17 -6.69,5.51 -15.8,10.34 -24.2,12.43 -7.55,1.87 -16.88,2.04 -24.43,0.16 -7.08,-1.77 -14.83,-5.96 -20.11,-11 z m -1216.37,-23.88 269.18,1346.96 -1301.09,-440.36 z" />
</g>
<path
id="path27-2"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke-width:0.33921"
d="M -7.8888249,192.8117 A 109.5166,109.5166 0 0 1 98.221633,80.313758 109.5166,109.5166 0 0 1 211.05086,186.41465 109.5166,109.5166 0 0 1 104.94994,299.24376 109.5166,109.5166 0 0 1 -7.8786392,193.14282 109.5166,109.5166 0 0 1 -7.8887412,192.8117 Z m 11.7215346,0.27932 A 102.43031,102.43031 0 0 0 109.36127,292.32671 102.43031,102.43031 0 0 0 208.5969,186.79826 102.43031,102.43031 0 0 0 103.06846,87.562647 102.43031,102.43031 0 0 0 3.832709,193.09107 Z" />
</g>
<path
d="m -77.246547,26.456686 a 148.42331,25.012587 56.012548 0 0 -8.648838,-0.694935 148.42331,25.012587 56.012548 0 0 24.361923,74.996569 77.280947,80.489055 24.697293 0 1 7.254802,-9.971326 134.40524,17.925729 55.999361 0 1 -20.487466,-56.735503 134.40524,17.925729 55.999361 0 1 43.248132,38.039017 77.280947,80.489055 24.697293 0 1 1.800392,-0.966716 148.42331,25.012587 56.012548 0 0 -47.528945,-44.667106 z M 56.949394,198.85617 a 77.280947,80.489055 24.697293 0 1 -1.627278,1.57027 134.40524,17.925729 55.999361 0 1 20.314255,56.42039 134.40524,17.925729 55.999361 0 1 -45.207585,-40.42932 77.280947,80.489055 24.697293 0 1 -0.168626,0.0677 77.280947,80.489055 24.697293 0 1 -11.476512,3.63303 148.42331,25.012587 56.012548 0 0 61.409642,51.6744 148.42331,25.012587 56.012548 0 0 -23.243896,-72.93643 z"
style="fill:#000000;fill-rule:evenodd;stroke-width:0.0397576;stroke-linecap:round;stroke-linejoin:round;paint-order:markers stroke fill"
id="path12" />
<g
id="g1453"
transform="matrix(0.85797236,0,0,0.85797236,-125.35397,-31.549083)">
<path
d="m 286.64841,127.00347 q -5.61357,0 -10.27644,1.94664 -4.6176,1.94664 -8.55615,5.88518 -3.93854,3.93855 -5.88518,8.55616 -1.90137,4.6176 -1.90137,10.23116 0,11.04603 7.78655,18.83258 7.78655,7.78656 18.83259,7.78656 11.04603,0 18.83258,-7.78656 7.78655,-7.78655 7.78655,-18.83258 0,-11.00077 -7.78655,-18.78732 -7.83182,-7.83182 -18.83258,-7.83182 z m 36.21651,26.61914 q 0,14.98458 -10.63861,25.62318 -10.59333,10.59333 -25.5779,10.59333 -15.02986,0 -25.62319,-10.59333 -10.59332,-10.59333 -10.59332,-25.62318 0,-14.98458 10.59332,-25.57791 10.6386,-10.6386 25.62319,-10.6386 14.9393,0 25.5779,10.6386 5.34194,5.34193 7.96764,11.67982 2.67097,6.33789 2.67097,13.89809 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:130.528px;line-height:125%;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.187934px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path60" />
<path
d="m 339.52451,143.79888 q 6.02099,-4.66288 14.16971,-4.66288 4.75342,0 9.00886,1.8561 4.3007,1.85609 7.56019,5.07031 3.25948,3.16895 5.16086,7.51493 1.90136,4.30071 1.90136,9.18994 v 22.31842 q 0,1.99191 -1.40339,3.3953 -1.35812,1.35812 -3.30476,1.35812 -1.99191,0 -3.39529,-1.35812 -1.35812,-1.40339 -1.35812,-3.3953 v -22.31842 q 0,-2.89732 -1.13177,-5.47775 -1.13176,-2.58043 -3.0784,-4.48179 -1.90137,-1.94664 -4.48179,-3.07841 -2.58043,-1.13176 -5.47775,-1.13176 -2.9426,0 -5.52302,1.13176 -2.53515,1.0865 -4.48179,3.03314 -1.94664,1.94663 -3.07841,4.52706 -1.08649,2.58043 -1.08649,5.47775 v 22.31842 q 0,1.99191 -1.40339,3.3953 -1.35812,1.35812 -3.30476,1.35812 -1.99191,0 -3.3953,-1.35812 -1.35812,-1.40339 -1.35812,-3.3953 v -41.19628 q 0,-1.94663 1.35812,-3.35003 1.40339,-1.40339 3.3953,-1.40339 1.94664,0 3.30476,1.40339 1.40339,1.4034 1.40339,3.25949 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:130.528px;line-height:125%;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.187934px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path62" />
<path
d="m 425.04074,159.77942 q -0.7696,-2.48989 -2.30881,-4.52707 -1.49392,-2.08245 -3.53111,-3.53111 -1.9919,-1.49393 -4.43652,-2.3088 -2.39934,-0.81487 -4.97977,-0.81487 -2.58042,0 -5.02503,0.81487 -2.44462,0.81487 -4.4818,2.3088 -2.03718,1.44866 -3.53111,3.53111 -1.49393,2.03718 -2.21826,4.52707 z m -2.03718,15.79945 q 2.03718,0 3.35002,1.35812 1.35813,1.31284 1.35813,3.35002 0,1.99191 -1.35813,3.3953 -7.01694,6.15681 -16.56905,6.15681 -10.50278,0 -17.92717,-7.42438 -7.42438,-7.42439 -7.42438,-17.92718 0,-10.50279 7.42438,-17.92717 7.42439,-7.42439 17.92717,-7.42439 10.41225,0 17.92718,7.42439 3.71219,3.66692 5.56828,8.19398 1.8561,4.4818 1.8561,9.73319 0,2.03718 -1.40339,3.3953 -1.35811,1.31285 -3.35003,1.31285 h -35.85434 q 0.7696,2.48988 2.26353,4.57233 1.49393,2.03718 3.48584,3.53111 2.03718,1.44866 4.43652,2.26353 2.44462,0.81488 5.07031,0.81488 2.98787,0 5.47775,-0.90542 2.48988,-0.90541 4.61761,-2.71624 1.35812,-1.13176 3.12367,-1.17703 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:130.528px;line-height:125%;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.187934px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path64" />
<path
d="m 451.84097,164.48756 q 0,3.25949 1.2223,6.15681 1.26759,2.89732 3.3953,5.07031 2.12773,2.12772 5.02505,3.3953 2.89732,1.26758 6.24734,1.26758 3.30476,0 6.20208,-1.26758 2.89732,-1.26758 5.02504,-3.44057 2.17299,-2.173 3.3953,-5.02504 1.26758,-2.89732 1.26758,-6.15681 0,-3.25948 -1.26758,-6.11154 -1.22231,-2.89732 -3.3953,-5.07031 -2.12772,-2.17299 -5.02504,-3.44057 -2.89732,-1.26757 -6.20208,-1.26757 -3.35002,0 -6.24734,1.26757 -2.89732,1.26758 -5.02505,3.44057 -2.12771,2.12772 -3.3953,5.02505 -1.2223,2.89732 -1.2223,6.1568 z m 15.88999,25.35156 q -9.0994,0 -15.88999,-5.56829 v 22.59005 q 0,2.03718 -1.40339,3.35002 -1.35812,1.35812 -3.35002,1.35812 -2.03719,0 -3.3953,-1.35812 -1.31285,-1.31284 -1.31285,-3.35002 v -42.37332 q 0,-10.50279 7.42438,-17.92717 7.42439,-7.42439 17.92717,-7.42439 10.41225,0 17.92717,7.42439 3.7122,3.66692 5.56829,8.19398 1.8561,4.4818 1.8561,9.73319 0,10.59333 -7.42439,17.92718 -3.80273,3.75746 -8.28452,5.61355 -4.43653,1.81083 -9.64265,1.81083 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:130.528px;line-height:125%;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.187934px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path66" />
<path
d="m 499.8731,185.13097 v -62.97146 q 0,-1.9919 1.31285,-3.35002 1.35812,-1.40339 3.3953,-1.40339 2.03718,0 3.35003,1.40339 1.35812,1.35812 1.35812,3.35002 v 58.21805 h 2.17299 q 1.94664,0 3.30475,1.40339 1.4034,1.35812 1.4034,3.35002 0,1.94664 -1.4034,3.35003 -1.35811,1.35812 -3.30475,1.35812 h -6.92641 q -1.94663,0 -3.30476,-1.35812 -1.35812,-1.40339 -1.35812,-3.35003 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:130.528px;line-height:125%;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.187934px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path68" />
<path
d="m 547.40728,148.59757 q -3.35003,0 -6.24736,1.26757 -2.89732,1.26758 -5.02503,3.44057 -2.12773,2.12772 -3.3953,5.02505 -1.22231,2.89732 -1.22231,6.1568 0,3.25949 1.22231,6.15681 1.26757,2.89732 3.3953,5.07031 2.12771,2.12772 5.02503,3.3953 2.89733,1.26758 6.24736,1.26758 3.30475,0 6.20207,-1.26758 2.89733,-1.26758 5.02504,-3.44057 2.17299,-2.173 3.3953,-5.02504 1.26758,-2.89732 1.26758,-6.15681 0,-3.25948 -1.26758,-6.11154 -1.22231,-2.89732 -3.3953,-5.07031 -2.12771,-2.17299 -5.02504,-3.44057 -2.89732,-1.26757 -6.20207,-1.26757 z m 15.88999,36.5334 v -0.90541 q -3.3953,2.71623 -7.37911,4.16489 -3.98382,1.44867 -8.51088,1.44867 -10.50279,0 -17.92718,-7.42438 -7.42438,-7.42439 -7.42438,-17.92718 0,-10.50279 7.42438,-17.92717 7.42439,-7.42439 17.92718,-7.42439 10.41224,0 17.92717,7.42439 7.42438,7.42438 7.42438,17.92717 v 20.64341 q 0,1.94664 -1.40339,3.35003 -1.35812,1.35812 -3.30476,1.35812 -1.9919,0 -3.39529,-1.35812 -1.35812,-1.40339 -1.35812,-3.35003 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:130.528px;line-height:125%;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.187934px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path70" />
<path
d="m 596.66174,185.13097 -16.29743,-39.1591 q -0.45271,-1.04123 -0.45271,-2.12772 0,-0.95068 0.36217,-1.81083 0.36216,-0.86014 0.99596,-1.49393 0.63378,-0.67906 1.49392,-1.04122 0.86014,-0.36217 1.8561,-0.36217 1.40339,0 2.6257,0.81487 1.2223,0.76961 1.85609,2.30881 l 12.72105,30.37659 12.72105,-30.46713 q 0.54325,-1.35812 1.5392,-2.17299 1.04123,-0.86015 2.89732,-0.86015 0.99596,0 1.8561,0.36217 0.86014,0.36216 1.49393,1.04122 0.63379,0.63379 0.99596,1.49393 0.40743,0.86015 0.40743,1.81083 0,0.99596 -0.49798,2.12772 l -26.03061,62.42821 q -0.58852,1.40339 -1.81083,2.26353 -1.22231,0.90541 -2.67097,0.90541 -2.03717,0 -3.3953,-1.35812 -1.31284,-1.35812 -1.31284,-3.3953 0,-1.08649 0.4527,-2.08244 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:130.528px;line-height:125%;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.187934px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path72" />
<path
d="m 656.05682,180.37756 q 3.30476,0 6.20208,-1.26758 2.89732,-1.26758 5.02504,-3.44057 2.17299,-2.173 3.39529,-5.02504 1.26759,-2.89732 1.26759,-6.15681 0,-3.25948 -1.26759,-6.11154 -1.2223,-2.89732 -3.39529,-5.07031 -2.12772,-2.17299 -5.02504,-3.44057 -2.89732,-1.26757 -6.20208,-1.26757 -3.35002,0 -6.24734,1.26757 -2.89732,1.26758 -5.02505,3.44057 -2.12771,2.12772 -3.3953,5.02505 -1.22231,2.89732 -1.22231,6.1568 0,3.25949 1.22231,6.15681 1.26759,2.89732 3.3953,5.07031 2.12773,2.12772 5.02505,3.3953 2.89732,1.26758 6.24734,1.26758 z m -15.89,-35.62799 q 6.74534,-5.61357 15.89,-5.61357 10.41225,0 17.92717,7.42439 3.7122,3.66692 5.56829,8.19398 1.8561,4.4818 1.8561,9.73319 0,10.59333 -7.42439,17.92718 -7.51492,7.42438 -17.92717,7.42438 -10.50278,0 -17.92717,-7.42438 -7.42439,-7.42439 -7.42439,-17.92718 v -42.37331 q 0,-2.03719 1.31286,-3.35003 1.35811,-1.35812 3.39529,-1.35812 1.99191,0 3.35003,1.35812 1.40338,1.31284 1.40338,3.35003 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:130.528px;line-height:125%;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.187934px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path74" />
<path
d="m 739.35477,164.48756 q 0,10.59333 -7.42439,17.92718 -7.51493,7.42438 -17.92717,7.42438 -10.50279,0 -17.92718,-7.42438 -7.42438,-7.42439 -7.42438,-17.92718 0,-10.50279 7.42438,-17.92717 7.42439,-7.42439 17.92718,-7.42439 10.41224,0 17.92717,7.42439 3.71219,3.71219 5.52301,8.19398 1.8561,4.4818 1.90138,9.73319 z m -25.35156,-15.88999 q -3.35003,0 -6.24735,1.26757 -2.89732,1.26758 -5.02504,3.44057 -2.12772,2.12772 -3.3953,5.02505 -1.22231,2.89732 -1.22231,6.1568 0,3.25949 1.22231,6.15681 1.26758,2.89732 3.3953,5.07031 2.12772,2.12772 5.02504,3.3953 2.89732,1.26758 6.24735,1.26758 3.30476,0 6.20208,-1.26758 2.89732,-1.26758 5.02503,-3.44057 2.17299,-2.173 3.3953,-5.02504 1.26758,-2.89732 1.26758,-6.15681 0,-3.25948 -1.26758,-6.11154 -1.22231,-2.89732 -3.3953,-5.07031 -2.12771,-2.17299 -5.02503,-3.44057 -2.89732,-1.26757 -6.20208,-1.26757 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:130.528px;line-height:125%;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.187934px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path76" />
<path
d="m 797.30119,164.48756 q 0,10.59333 -7.42438,17.92718 -7.51493,7.42438 -17.92718,7.42438 -10.50278,0 -17.92717,-7.42438 -7.42439,-7.42439 -7.42439,-17.92718 0,-10.50279 7.42439,-17.92717 7.42439,-7.42439 17.92717,-7.42439 10.41225,0 17.92718,7.42439 3.71219,3.71219 5.52301,8.19398 1.8561,4.4818 1.90137,9.73319 z m -25.35156,-15.88999 q -3.35002,0 -6.24734,1.26757 -2.89732,1.26758 -5.02505,3.44057 -2.12771,2.12772 -3.39529,5.02505 -1.22231,2.89732 -1.22231,6.1568 0,3.25949 1.22231,6.15681 1.26758,2.89732 3.39529,5.07031 2.12773,2.12772 5.02505,3.3953 2.89732,1.26758 6.24734,1.26758 3.30476,0 6.20208,-1.26758 2.89732,-1.26758 5.02504,-3.44057 2.17299,-2.173 3.3953,-5.02504 1.26758,-2.89732 1.26758,-6.15681 0,-3.25948 -1.26758,-6.11154 -1.22231,-2.89732 -3.3953,-5.07031 -2.12772,-2.17299 -5.02504,-3.44057 -2.89732,-1.26757 -6.20208,-1.26757 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:130.528px;line-height:125%;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.187934px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path78" />
<path
d="m 804.45396,185.0857 v -62.92619 q 0,-1.9919 1.35812,-3.35002 1.40339,-1.40339 3.3953,-1.40339 1.94667,0 3.30476,1.40339 1.40342,1.35812 1.40342,3.35002 v 35.31111 l 27.0718,-17.61029 q 1.13179,-0.72433 2.53514,-0.72433 0.99598,0 1.85609,0.36217 0.86017,0.36216 1.49397,1.04122 0.63381,0.63379 0.99592,1.49393 0.40743,0.86015 0.40743,1.81083 0,2.53515 -1.81077,3.75746 l -18.9684,12.31362 19.46632,21.91099 q 1.31285,1.44866 1.31285,3.30475 0,0.95068 -0.40743,1.81082 -0.36211,0.86015 -0.99592,1.53921 -0.6338,0.63379 -1.49397,0.99595 -0.86011,0.36217 -1.85609,0.36217 -1.90134,0 -3.16894,-1.22231 l -20.91505,-23.49546 -5.52295,3.62165 v 16.3427 q 0,1.94664 -1.40342,3.35003 -1.35809,1.40339 -3.30476,1.40339 -1.99191,0 -3.3953,-1.40339 -1.35812,-1.40339 -1.35812,-3.35003 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:130.528px;line-height:125%;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.187934px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="path80" />
</g>
<g
aria-label="Laboratory"
id="text1457"
style="font-size:88.1944px;line-height:125%;font-family:Comfortaa;-inkscape-font-specification:Comfortaa;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="matrix(0.85797236,0,0,0.85797236,14.184653,10.6703)">
<path
d="m 96.642187,169.19391 q 0,-1.8948 1.334974,-3.22977 1.334973,-1.33498 3.229779,-1.33498 1.8948,0 3.22977,1.33498 1.33498,1.33497 1.33498,3.22977 v 55.20763 h 31.95324 q 1.8948,0 3.22978,1.33497 1.33497,1.33498 1.33497,3.22978 0,1.8948 -1.33497,3.22977 -1.33498,1.33498 -3.22978,1.33498 h -36.51799 q -0.99047,0 -1.808678,-0.34451 -0.81821,-0.34451 -1.464165,-0.9474 -0.602891,-0.64596 -0.947401,-1.46417 -0.344509,-0.81821 -0.344509,-1.80867 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:88.1944px;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';fill:#000000;stroke-width:0.264583px"
id="path1467" />
<path
d="m 169.20447,194.30003 q -3.18671,0 -5.94278,1.20579 -2.75608,1.20578 -4.78007,3.27284 -2.02399,2.02399 -3.22977,4.78006 -1.16272,2.75608 -1.16272,5.85666 0,3.10059 1.16272,5.85666 1.20578,2.75608 3.22977,4.82313 2.02399,2.02399 4.78007,3.22978 2.75607,1.20578 5.94278,1.20578 3.14365,0 5.89973,-1.20578 2.75607,-1.20579 4.78006,-3.27284 2.06706,-2.06706 3.22978,-4.78007 1.20578,-2.75607 1.20578,-5.85666 0,-3.10058 -1.20578,-5.81359 -1.16272,-2.75608 -3.22978,-4.82313 -2.02399,-2.06706 -4.78006,-3.27284 -2.75608,-1.20579 -5.89973,-1.20579 z m 15.11535,34.75239 v -0.86128 q -3.22977,2.58382 -7.01938,3.96186 -3.7896,1.37804 -8.09597,1.37804 -9.99077,0 -17.05321,-7.06244 -7.06244,-7.06245 -7.06244,-17.05322 0,-9.99077 7.06244,-17.05321 7.06244,-7.06244 17.05321,-7.06244 9.90465,0 17.05322,7.06244 7.06244,7.06244 7.06244,17.05321 v 19.63704 q 0,1.85173 -1.33497,3.18671 -1.29191,1.29191 -3.14365,1.29191 -1.8948,0 -3.22978,-1.29191 -1.29191,-1.33498 -1.29191,-3.18671 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:88.1944px;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';fill:#000000;stroke-width:0.264583px"
id="path1469" />
<path
d="m 224.32598,224.53073 q 3.14364,0 5.89972,-1.20578 2.75607,-1.20579 4.78007,-3.27284 2.06705,-2.06706 3.22977,-4.78007 1.20578,-2.75607 1.20578,-5.85666 0,-3.10058 -1.20578,-5.81359 -1.16272,-2.75608 -3.22977,-4.82313 -2.024,-2.06706 -4.78007,-3.27284 -2.75608,-1.20579 -5.89972,-1.20579 -3.18672,0 -5.94279,1.20579 -2.75608,1.20578 -4.78007,3.27284 -2.02399,2.02399 -3.22977,4.78006 -1.16272,2.75608 -1.16272,5.85666 0,3.10059 1.16272,5.85666 1.20578,2.75608 3.22977,4.82313 2.02399,2.02399 4.78007,3.22978 2.75607,1.20578 5.94279,1.20578 z m -15.11535,-33.89111 q 6.41648,-5.33989 15.11535,-5.33989 9.90464,0 17.05321,7.06244 3.53122,3.48816 5.29683,7.79452 1.76561,4.26331 1.76561,9.25869 0,10.0769 -7.06244,17.05322 -7.14857,7.06244 -17.05321,7.06244 -9.99078,0 -17.05322,-7.06244 -7.06244,-7.06245 -7.06244,-17.05322 v -40.30759 q 0,-1.93787 1.24885,-3.18672 1.29191,-1.29191 3.22977,-1.29191 1.8948,0 3.18671,1.29191 1.33498,1.24885 1.33498,3.18672 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:88.1944px;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';fill:#000000;stroke-width:0.264583px"
id="path1471" />
<path
d="m 303.56312,209.41538 q 0,10.0769 -7.06244,17.05322 -7.14857,7.06244 -17.05321,7.06244 -9.99077,0 -17.05322,-7.06244 -7.06244,-7.06245 -7.06244,-17.05322 0,-9.99077 7.06244,-17.05321 7.06245,-7.06244 17.05322,-7.06244 9.90464,0 17.05321,7.06244 3.53122,3.53122 5.25377,7.79452 1.76561,4.26331 1.80867,9.25869 z m -24.11565,-15.11535 q -3.18671,0 -5.94279,1.20579 -2.75607,1.20578 -4.78007,3.27284 -2.02399,2.02399 -3.22977,4.78006 -1.16272,2.75608 -1.16272,5.85666 0,3.10059 1.16272,5.85666 1.20578,2.75608 3.22977,4.82313 2.024,2.02399 4.78007,3.22978 2.75608,1.20578 5.94279,1.20578 3.14364,0 5.89972,-1.20578 2.75607,-1.20579 4.78007,-3.27284 2.06705,-2.06706 3.22977,-4.78007 1.20579,-2.75607 1.20579,-5.85666 0,-3.10058 -1.20579,-5.81359 -1.16272,-2.75608 -3.22977,-4.82313 -2.024,-2.06706 -4.78007,-3.27284 -2.75608,-1.20579 -5.89972,-1.20579 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:88.1944px;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';fill:#000000;stroke-width:0.264583px"
id="path1473" />
<path
d="m 319.28137,189.77835 v 0.86127 q 3.22977,-2.58382 7.01938,-3.96186 3.7896,-1.37803 8.09597,-1.37803 1.8948,0 4.04798,0.25838 2.19625,0.25838 4.00492,0.9474 1.85174,0.64595 3.05752,1.80867 1.20579,1.16272 1.20579,3.01446 0,0.9474 -0.38758,1.76561 -0.3445,0.81821 -0.9474,1.46417 -0.60289,0.60289 -1.4211,0.9474 -0.81821,0.34451 -1.76561,0.34451 -0.81821,0 -1.8948,-0.4737 -2.71301,-1.0766 -5.89972,-1.0766 -3.14365,0 -5.89972,1.20579 -2.75608,1.16272 -4.82314,3.22977 -2.02399,2.02399 -3.22977,4.78007 -1.16272,2.75607 -1.16272,5.89972 v 19.63704 q 0,1.85173 -1.33497,3.18671 -1.29191,1.29191 -3.14365,1.29191 -1.8948,0 -3.22978,-1.29191 -1.29191,-1.33498 -1.29191,-3.18671 v -39.27407 q 0,-1.85174 1.29191,-3.14365 1.33498,-1.33497 3.22978,-1.33497 1.85174,0 3.14365,1.33497 1.33497,1.29191 1.33497,3.14365 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:88.1944px;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';fill:#000000;stroke-width:0.264583px"
id="path1475" />
<path
d="m 375.9101,194.30003 q -3.18671,0 -5.94279,1.20579 -2.75607,1.20578 -4.78007,3.27284 -2.02399,2.02399 -3.22977,4.78006 -1.16272,2.75608 -1.16272,5.85666 0,3.10059 1.16272,5.85666 1.20578,2.75608 3.22977,4.82313 2.024,2.02399 4.78007,3.22978 2.75608,1.20578 5.94279,1.20578 3.14365,0 5.89972,-1.20578 2.75608,-1.20579 4.78007,-3.27284 2.06705,-2.06706 3.22977,-4.78007 1.20579,-2.75607 1.20579,-5.85666 0,-3.10058 -1.20579,-5.81359 -1.16272,-2.75608 -3.22977,-4.82313 -2.02399,-2.06706 -4.78007,-3.27284 -2.75607,-1.20579 -5.89972,-1.20579 z m 15.11535,34.75239 v -0.86128 q -3.22978,2.58382 -7.01938,3.96186 -3.7896,1.37804 -8.09597,1.37804 -9.99077,0 -17.05322,-7.06244 -7.06244,-7.06245 -7.06244,-17.05322 0,-9.99077 7.06244,-17.05321 7.06245,-7.06244 17.05322,-7.06244 9.90464,0 17.05321,7.06244 7.06244,7.06244 7.06244,17.05321 v 19.63704 q 0,1.85173 -1.33497,3.18671 -1.29191,1.29191 -3.14365,1.29191 -1.8948,0 -3.22977,-1.29191 -1.29191,-1.33498 -1.29191,-3.18671 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:88.1944px;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';fill:#000000;stroke-width:0.264583px"
id="path1477" />
<path
d="m 411.13619,185.29973 h 2.02399 v -16.19194 q 0,-1.85174 1.29191,-3.14365 1.33497,-1.33498 3.22978,-1.33498 1.85173,0 3.14364,1.33498 1.33498,1.29191 1.33498,3.14365 v 16.19194 h 5.38296 q 1.85173,0 3.14364,1.33497 1.29191,1.29191 1.29191,3.14365 0,1.8948 -1.29191,3.22977 -1.29191,1.29191 -3.14364,1.29191 h -5.38296 v 21.66103 q 0,8.56967 8.61273,8.56967 1.85174,0 3.14365,1.33497 1.29191,1.29191 1.29191,3.14365 0,1.8948 -1.29191,3.22978 -1.29191,1.29191 -3.14365,1.29191 -17.61304,0 -17.61304,-17.56998 v -21.66103 h -2.02399 q -1.80868,0 -3.14365,-1.29191 -1.29191,-1.33497 -1.29191,-3.22977 0,-1.85174 1.29191,-3.14365 1.33497,-1.33497 3.14365,-1.33497 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:88.1944px;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';fill:#000000;stroke-width:0.264583px"
id="path1479" />
<path
d="m 487.01436,209.41538 q 0,10.0769 -7.06245,17.05322 -7.14857,7.06244 -17.05321,7.06244 -9.99077,0 -17.05321,-7.06244 -7.06245,-7.06245 -7.06245,-17.05322 0,-9.99077 7.06245,-17.05321 7.06244,-7.06244 17.05321,-7.06244 9.90464,0 17.05321,7.06244 3.53122,3.53122 5.25377,7.79452 1.76561,4.26331 1.80868,9.25869 z M 462.8987,194.30003 q -3.18671,0 -5.94279,1.20579 -2.75607,1.20578 -4.78006,3.27284 -2.024,2.02399 -3.22978,4.78006 -1.16272,2.75608 -1.16272,5.85666 0,3.10059 1.16272,5.85666 1.20578,2.75608 3.22978,4.82313 2.02399,2.02399 4.78006,3.22978 2.75608,1.20578 5.94279,1.20578 3.14365,0 5.89972,-1.20578 2.75608,-1.20579 4.78007,-3.27284 2.06706,-2.06706 3.22978,-4.78007 1.20578,-2.75607 1.20578,-5.85666 0,-3.10058 -1.20578,-5.81359 -1.16272,-2.75608 -3.22978,-4.82313 -2.02399,-2.06706 -4.78007,-3.27284 -2.75607,-1.20579 -5.89972,-1.20579 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:88.1944px;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';fill:#000000;stroke-width:0.264583px"
id="path1481" />
<path
d="m 502.73262,189.77835 v 0.86127 q 3.22977,-2.58382 7.01938,-3.96186 3.7896,-1.37803 8.09597,-1.37803 1.8948,0 4.04798,0.25838 2.19625,0.25838 4.00492,0.9474 1.85174,0.64595 3.05752,1.80867 1.20579,1.16272 1.20579,3.01446 0,0.9474 -0.38758,1.76561 -0.34451,0.81821 -0.9474,1.46417 -0.60289,0.60289 -1.4211,0.9474 -0.81821,0.34451 -1.76561,0.34451 -0.81821,0 -1.8948,-0.4737 -2.71301,-1.0766 -5.89972,-1.0766 -3.14365,0 -5.89973,1.20579 -2.75607,1.16272 -4.82313,3.22977 -2.02399,2.02399 -3.22977,4.78007 -1.16272,2.75607 -1.16272,5.89972 v 19.63704 q 0,1.85173 -1.33498,3.18671 -1.29191,1.29191 -3.14364,1.29191 -1.89481,0 -3.22978,-1.29191 -1.29191,-1.33498 -1.29191,-3.18671 v -39.27407 q 0,-1.85174 1.29191,-3.14365 1.33497,-1.33497 3.22978,-1.33497 1.85173,0 3.14364,1.33497 1.33498,1.29191 1.33498,3.14365 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:88.1944px;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';fill:#000000;stroke-width:0.264583px"
id="path1483" />
<path
d="M 551.09312,229.05242 535.5902,191.80234 q -0.43064,-0.99046 -0.43064,-2.02399 0,-0.90434 0.34451,-1.72255 0.34451,-0.81821 0.9474,-1.4211 0.60289,-0.64595 1.4211,-0.99046 0.81821,-0.34451 1.76562,-0.34451 1.33497,0 2.49769,0.77514 1.16272,0.73208 1.76561,2.19625 l 12.10089,28.89572 12.10089,-28.98185 q 0.51677,-1.29191 1.46417,-2.06705 0.99046,-0.81821 2.75607,-0.81821 0.9474,0 1.76561,0.34451 0.81821,0.34451 1.4211,0.99046 0.60289,0.60289 0.9474,1.4211 0.38758,0.81821 0.38758,1.72255 0,0.9474 -0.4737,2.02399 l -24.76161,59.3848 q -0.55983,1.33498 -1.72255,2.15319 -1.16272,0.86127 -2.54076,0.86127 -1.93786,0 -3.22977,-1.29191 -1.24885,-1.29191 -1.24885,-3.22978 0,-1.03352 0.43064,-1.98093 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:88.1944px;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';fill:#000000;stroke-width:0.264583px"
id="path1485" />
</g>
</g>
</g>
</svg>
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
# Features as benefits, always. Market the improvement your product brings to the customer’s life, rather than selling what your product does.
# Use video to show how your product works. It’s easier to understand by example than through instructions.
# Talk about your integrations: Make and request separate landing pages for all your integrations.
# Talk about the problem your customers are facing that you can solve. Slack became famous as the email killer only because they pointed out lengthy, confusing email threads as the problem.
# Actually explain your product in your header. Visitors will only read further if they think your product could be of help. Tell visitors the outcome of your product and why it’s worth buying, in clear words.
# Position your product as a real solution that understands your specific, ideal, carefully chosen audience’s needs and is best equipped to help them.
# Create segmented landing pages based on deep research of different use cases, what the audience of that segment cares about, and how your product solves their problems.
# Localised landing pages make visitors relate to the content on your landing page. It evokes an emotional connection, which eases conversions.
!This is an encrypted Tiddler
Having trouble getting elements positions to remain consistent across device view ports when using sticky positioning. Need to [[read the docs|https://developer.mozilla.org/en-US/docs/Web/CSS/position]] and reevaluate.
14/9/2021: Still not getting the fab button to stay put when I remove items beyond the position defined by the css bottom property. Perhaps if used the top property instead...?
15/9/2021: turns I was supposed to set the position property to `fixed`.😂
* [[Guideline|http://www.lcars-terminal.de/tutorial/guideline.htm]]
* [[LCARS on codepen|https://codepen.io/tomhazledine/pen/MELGrp]]
** Font used: https://fonts.googleapis.com/css?family=Saira+Extra+Condensed:600
* [[LCARs themed Pomodoro clock|https://codepen.io/codinger/full/dYZMjN]]
We've got a couple of leads so far:
# Sycmore ventures based in Kinshasa via ingenious city incubator.
# Smartlabs who would like a partnership proposal this week
# The United Nations fellow that Albert mentioned
# Stanbic Tanzania has an innovation sub-unit inside the IT department and reports to the IT head
# DSE <div>
```
DSE
Creating Opportunities
Moremi Marwa Chief Executive Officer
Dar es Salaam Stock Exchange PLC
3"Floor,
Kambarage House,
6 Ufukoni Street
PO, Box 70081
Dar es Salaam
Tanzania
Telephone
Cellular
Email
Website:
: 255 (0) 22 2128983
:255 (0) 22 2128522
: 255 (0) 756 007786
255 (0) 782 007785
: moremi@dse.co.tz
www.dse.co.tz
```
</div>
__Problem__
Lean canvas tools are not easy to use, portable or archive-friendly.
Canvases can be created with excel sheets, but these do not lend themselves well to the art of written thought. They're mostly useful for calculations.
__Solution__
A canvas template tool for creating lean canvases that can be easily organized, annotated with notes, compiled, and exported to an excel sheet if the user so wishes.
__Project notes and tools__
<<list-links "[tag[Lean Canvas Project]sort[title]]">>
A tool that a team can use to rapidly identify forward movement creators (strengths), backward movement creators (weaknesses) and create a prioritized backlog of potential solutions for a prioritized list of "How might Wes" chosen by a facilitator from the top three problems identified by voting.
[[Tool overview|https://1drv.ms/b/s!AnpVkYogMePJkBRErB6_wQx9dcdU]]
<$button tooltip="Create New Lean Project">
<$action-createtiddler $basetitle="New Lean Project" tags="[[Lean Project]]" text="{{||new-project-template}}" />
{{$:/plugins/absamma/lean-canvas-creator/icon}} Create New Project
</$button>
!!! ''Your Lean Projects (sorted by latest)''
<<list-links "[tag[Lean Project]sort[title]]" "" "" "" "No new Projects here.">>
!!!!! Note, you should tag your projects, if any, with the tag <<tag "Lean Project">>for them to appear above
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69fp4Ycf0tatW5Wenh72eCAQ0I8//qjly5dq2rQn9MUXXyg7Ozv0+OrVq7Vy5YoyY8mSl5Samlrh4ywqKtKOHTs0d+4cLVy4QHv27FZhYWHo8Y0bN5T7eV5++WXl5+dLkn799VctX768+LGV2rVrp06fPh16jby8PC1fvlyZmZmh+3bu3Kk33nijzLF8+uknmjFjup5//nnt378/9NiBAwfKPY4VK5br8OHDkqTk5GQtX7487Pj379+vr7/+OnS7sLBQq1at0sqVK7R8+XK9/fbWsOMKfj0rVpz5vi5RWlpahd9XAKgOqirQd+7cGfp7dNWqldq376ewnwuStHr1K2X+Tn/rrS2SpNOnT+vll1fpyJEjoeenp6dr2bJlysjICN0X/vPHxtq1a0I/c/ft+0nLly9TXl5e6GM2btyopKSk0O0tWzbr5MmTodtFRUVavfoVBQKB0H179uwuc6ybN795Xu9JUVGRfvnlF82e/bQWLVqof/7z87D35PXXXy/359wrr7ysgoICSfZvi+XLl4V+3n722WfKysoK+zzvv/9+mfdk9erVZd5/SXr00Ull7vvPf/6jlStXhH7GS/Zvkk2bNik5OTl0X0FBgd5+e6umTXtcy5cv048//lDm3zoAUJ0Q6A6oqkDfsOF1NWnSWAcOHFBcXJwaNbpJM2Y8GXo8Oztbd955u9555x0lJCRo5swndcstN4f9YDt27KiaNbtN33zztU6ePKlhw4aoW7cuoX8wHD16RIcPH9Z//vMfXX99Q+3du1eHDx/WwYMHw36onsvLL69S//4xOnbsmA4dOqgJE8bp6aefCj1+/PhxHT58WPv27dOll16i7ds/1uHDh3XkyOHQ8e7YsUM1a9bQgQMHdPjwIT355HT16tUjFMrp6en685//N+wfQBMnTtAdd9wediwLFy7QlCmTdfz4cX3++R7Vr39N6B9n6enpOnz4sI4dO6b77++sLl0668iRwzp8+FAosPfv369LL71Eubm5pf4sNmjhwoWh27m5uapbt7b27t2rgwcP6o03NujWW28Je+937typ5s3v0m+//abDhw+Xel8LKvy+AkB1UFWBPmHCeN1xRzOdOHFCP/74g7p2vV99+vQOe07durU1a9ZTob9nDx8+rH//+9+hx++4o5kmTBgfur1t2zbVqlUz7Jewu3btUv/+MWGvcfTo0dDP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
<!--Remember that these hypotheses to be tested must be SMART: Specific, Measurable, Attainable, Relevant, Time constrained and especially. Actionable-->
# Acquisition:
# Activation:
# Retention:
# Referral:
<!--Alternatively, you can use the RAT approach-->
# Problem hypothesis: ''We believe people like customer type have a need for (or problem doing) need/action/behavior. We will know we have validated this when we see quantitative/measurable outcome or qualitative/observable outcome.''
# Solution hypothesis: ''We believe people like customer type will solve their problem by solution behavior. We will know we have validated this when we see quantitative/measurable outcome or qualitative /observable outcome.''
# Implementation hypothesis: ''We believe our company can provide a solution by implementation method. We will know we have validated this when we see quantitative/measurable outcome or qualitative /observable outcome.''
https://drive.google.com/file/d/15YBnslzxuNdURQSwv75VnabnLciMr1Lv/view?usp=sharing
[[Startup school material|https://www.startupschool.org/library]] from Y Combinator
!This is an encrypted Tiddler
A ''Let Expression'' allows one or more [[local variables|LocalVariable]] to be created and used inside it. As a rule of thumb, this is useful when some computed value needs to be used in more than one place.
Its syntax is:
```
let(<name>=<value>[,<name>=<value>...]):(<body>)
```
Where `<name>` is an alphanumeric name for the new variable, `<value>` is an [[expression|Expression]] that computes the variable. One or more variables can be defined. Each variable can use the variables that come before it in its expression.
`<body>` is an expression produces the result of the `let` construct, and can use any of the local variables. Local variables are //not// available inside called functions or imported formulas.
LET expressions may be used in any [[Parenthesized Expression]] or [[Function]] (in the body). Values bound by LET behave exactly like function arguments.
!!Examples
Compute x^^5^^:
```
let(x=<<x>>, x2=x*x):(x2*x2*x)
```
A ''Let Statement'' comes before an [[Expression]], and allows one or more [[local variables|LocalVariable]] to be created. Its syntax is:
`let(x=<<x>>,x2=x*x):(3*x2-2*x*x2)`
```
let(<name>=<value> [, <name>=<value> ...]):(<expression>)
```
Where `<name>` is an alphanumeric name for the new variable, `<value>` is an [[expression|Expression]] that computes the variable. One or more variables can be defined. Each variable can use the variables that come before it in its expression.
The final expression after the `;` produces the result of the formula, and can use any of the local variables. Local variables are //not// available inside called functions or imported formulas.
Let statements may be used inside a [[Parenthesized Expression]] or [[Function]] (in the body).
!!Examples
Compute
```
let x=<<x>>, x2=x*x;
```
<<list-links "[tag<currentTiddler>sort[created]]">>
<<<
A standard project typically has the following four major phases (each with its own agenda of tasks and issues): initiation, planning, implementation, and closure. Taken together, these phases represent the path a project takes from the beginning to its end and are generally referred to as the project “life cycle.
<<<
[[Source|https://opentextbc.ca/projectmanagement/chapter/chapter-3-the-project-life-cycle-phases-project-management/#:~:text=A%20standard%20project%20typically%20has,the%20project%20%E2%80%9Clife%20cycle.%E2%80%9D]]
This is what most official projects go through. But what about less organized, more open projects like open source projects? Here's an outline for such projects, and I think this can be extrapolated to other forms of informal projects in other fields. Many projects that are not institutional usually follow this pattern:
{{Open source life cycle}}
__Way forward__
* Emily's email for a shell [[outline|https://docs.google.com/document/d/1S5o-YJYxNFIn3bWQsng_B8AGpznYB-NNB54q6CmjclY/edit]]
* [[Key messages document|https://docs.google.com/document/d/1Ka4bnF4whKo0FpsRhRISoM9i94Q05FfzYK-BEfnquRo/edit]] - summarizes, at a high level, what we saw in the data. Note that this is continually evolving as [we] add more data.
* Linda et al will share the [[6 month life manuscripts|]] to make sure we do not duplicate stuff
* Share starting google document with Sarah after reading emily's outline
* [[Sampling for Qualitative ext|https://docs.google.com/spreadsheets/d/1_TzSJXIEvQZ_Yddl63ZyaDZyaabUFVO0jJzuoFuF-3M/edit?ts=5f5b310e#gid=289021104]]
* [[Timeline|https://docs.google.com/spreadsheets/d/19Lsc_LPyOw5mk4vpmr0zUHq58QByTqnVAnviGeRPch4/edit#gid=0]]
* [[Transcription Format|https://docs.google.com/document/d/1Fv1iNtGvZyvxViPT-O-rJQXs6_e6tjDU/edit?dls=true]]
* [[Training slides|https://docs.google.com/presentation/d/1Lbo75AMrAUGWjK43-oz53tRiQt7n50EYbFycwpf9uLA/edit#slide=id.g6039b92b4a_0_437]]
* 14/9: discussed week schedule with team:
** We will aim to do two idi per week as per schedule
** We will spend no more than two weeks on transcribing idi of the week
** We will submit IDs from each group to the site coordinators to call and invite. First IDI scheduled tentatively for tomorrow at 12 noon
** George will call Damarietha to correspond with Mary Glory about room availability and get back to me today
** The next interview for this week will be on 17/9/2020 tentatively
** We will interview 101-1055-1 tomorrow
** Discovered that there are a lot of twins in the sample sheet. Informed Sarah. Ariadne has informed us that we should not interview twins wherever we see them
[[Transcript|https://docs.google.com/document/d/113CBq_c-Ei7jkzqyBTBHjpFoihLdmadgqLG52HlTqLI/edit]]
Items to discuss wrt Pilot-01
* Qn five wording: the swahili uses an inappropriate word. So I improvised and used a word that closely matches the English meaning. This is a literal translation of what I said
* We didn't put 5 minute marks in the transcription. My apologies.
* We should try to probe how much time is spent on complementary feeds vs direct breastfeeding. This is key.
* We should also try to probe in what way family members help, and whether directly or indirectly.
* What do we fill in growth faltering field? Sarah has noted that the sampling excel sheet indicates that the categories are as such to account for growth faltering. However, does this mean we should leave out this field? Natalie will come back with an answer.
<div>Below are the materials you will need for next steps of the LIFE qualitative analysis:</div>
<div>
<ol>
<li>Training <a href="https://docs.google.com/presentation/d/1GPgj_Ihh25wunv2C-h8JzWsoMyEBtMDDslGl988tKPk/edit#slide=id.p" target="_blank">slides</a></li>
<li><a href="https://docs.google.com/document/d/1hsJt0dXwPcItQs5yDr2SjtxGsuF862-V4NG6MQSxxJE/edit" target="_blank">Codebook</a> (for reference)</li>
<li>Link to a <a href="https://docs.google.com/spreadsheets/d/1UHR5jdz5NuxpiSYK2PpNBKO8lBLs1AO-p_Pb_2mJ05g/edit#gid=935298462" target="_blank">list of all of the codes</a> that need to be analyzed. You will see which ones you are assigned to as well as due dates.</li>
<li>Link to <a href="https://drive.google.com/drive/u/1/folders/1ZpghpnT8BLRv7HTdqCfbM4Xw7N_s-B4i" target="_blank">folder</a> on Google Drive where you will access your unique Analysis Table for code "Feeding baby_night_what"
<ol>
<li>Will be updated later today, 4 June**</li>
<li>Template found <a href="https://docs.google.com/document/d/16-4emyAB9GQ-J78Otzro-8YbGBCGQiIBUHYAfx1L8TI/edit" target="_blank">here</a></li></ol></li>
<li>Link to <a href="https://hu.sharepoint.com/:f:/s/bb_life/Emu8Mcxx_yJDvH6ajU3QUMcBvrPlf6U695DmrreeOqvUSQ?e=5%3aASILRA&at=9" target="_blank">Sharepoint</a> where you will access the excel spreadsheet to download and save</li></ol></div>
[[Findings that were discussed|https://docs.google.com/presentation/d/1qfEkkWyS_6gi6uxxNV8iscyOvJK_SikVD_JsHSzbGw8/edit#slide=id.g7228bfb3d3_0_348]]
I think we could identify some areas of interest:
# mothers feeling like there's a need to add on to exclusive BF before 6 months. what does this mean? does it mean we're not counseling well enough? what could be the reasons behind this? and what are the consequences? More importantly, how do we intervene hear?
# mothers not being able to breastfeed immediately after non-CS and CS deliveries; what are the short-term and long-term consequences; should we be concerned? How does it play a role in young infant mortalitIES and morbidity?
# Delayed lactation: what's the story here? CS section can cause this, but are we clinicians really helping or not to alleviate the problem?
# To what extent is adult undernutrition a serious problem to milk production in mothers?
# The role of expressed breast milk as a solution for delayed breastfeeding; best practices vs real practices, how widespread is this knowledge?
# <mark>positioning and attachment was talked about much less by Tanzanian clinicians compared to other countries, and it seems to be more talked about by nurses</mark>. But what does this mean?
__11/12/2020 DISCUSSION FOR DHM__
* Food and formula analysis recap
** Participants do report babies being fed before six months. The most commonly fed food was porridge
** This is is a theme for the upcoming paper. This seems more prominent in Tanzania.
** Monday and wednesday sessions for the life consortium meeting will be heavily based on qualitative analysis
* Opinions on dhm was far more mixed in tz compared to other sites; though none of the sites have any actual hands on knowledge about dhm
*
__Agenda__
* Discuss and agree on [[proposed authorship|Proposed authorship]]
* roles, responsibilities and timelines
__Notes__
* home env and social support is the primary focus
* how many interviews: each total of 63 interviews done. Odisha did 15 while the others did 16
* feeding and wash paper points in life proper should not be duplicated in this paper
* over the next two weeks, send concerns to linda because emily will be out of the office for the next two weeks
{{Life ext qual manuscript: way forward}}
# https://data.unicef.org/topic/child-survival/under-five-mortality/
# https://data.unicef.org/topic/child-survival/neonatal-mortality
# https://www.unicef.org/media/60561/file/UN-IGME-child-mortality-report-2019.pdf
# https://www.nature.com/articles/jp200819 Impact of early infant feeding practices on mortality in low birth weight infants from rural Ghana
# https://internationalbreastfeedingjournal.biomedcentral.com/articles/10.1186/s13006-020-00315-7 Reported infant feeding practices and contextual influences on breastfeeding: qualitative interviews with women registered to ~MomConnect in three South African provinces
# https://www.nature.com/articles/jp200819#ref-CR5
# https://www.nature.com/articles/jp200819#ref-CR4
# https://doi.org/10.3390/nu12072044 Feeding Interventions for Infants with Growth Failure in the First Six Months of Life: A Systematic Review
# Blencowe H, Krasevec J, de Onis M, Black RE, An X, Stevens GA, et al. National, regional, and worldwide estimates of low birthweight in 2015, with trends from 2000: a systematic analysis. Lancet Glob Health. 2019 May 15;7(7):e849–60.
# Guidelines on Optimal Feeding of Low Birth-Weight Infants in Low- and Middle-Income Countries. Geneva: World Health Organization; 2011
# Qualitative methods references
## Pope C, Mays N. Qualitative methods in health research. Qualitative research in health care. 2006 Jan 1;3:1-1.
## Camfield L, Crivello G, Woodhead M. Wellbeing research in developing countries: Reviewing the role of qualitative methods. Social Indicators Research. 2009 Jan;90(1):5-31.
Cost studies: https://doi.org/10.1093/heapol/czaa005 costs of scaling up interventions
The key limitation of books, web pages and classical wikis as means of disseminating [[design patterns|pattern languages]] is that they're essentially ossified into their own respective use contexts, and not open to interpretation or customization, growth and evolution according to the different needs, contexts and approaches. [[Federated Wikis]] offer a solution to this problem: they allow for overlapping duplication of work to suite diverse needs not anticipated by original authors.
A possible reason that could explain the rapid adoption of [[pattern languages]] in other fields like software development than in say urban design and architecture is that in the former, the field has a rapid turnover rate in terms of new hypotheses being generated (i.e. new patterns), tested and falsified. [[This rapidity is a key common feature in wikis and pattern languages|Features common to pattern languages and wikis]].
Fields like architecture and urban design may not have ready access to that level of turnover; outcomes can take years to decades to materialize, and therefore it may take equally long for anything to be falsified.
<<<
Many people who are familiar with both pattern languages and wikis are surprised to learn of the direct connection
(discussed in more detail below). But in simplest terms, a pattern represents a structure in the world that has value in
a particular context. At a fundamental level, a wiki does the same thing.
Wikis were developed in 1995 as a tool to support the development of pattern languages in software (Cunningham, 2009). More specifically, it was developed as a tool to allow collaboration between many people as they evolve better collective solutions to shared problems. That means, among other things, that both the knowledge of the problem, and of the solutions that have worked so far, needs to be captured and refined, in a form that can be shared and further refined (Leuf and Cunningham, 2001).
<<<
Wikis and pattern languages aka design patterns both [[share a lot of common features|Features common to pattern languages and wikis]]. Books, web pages also have design patterns for different contexts linked via hypertext in ways that may be useful to users. [[However, they do have some limitations in this area of use.|Limitations of classical wikis & other media & alternatives]]
Implementing lessons learned from [[this Twitter thread|SEO and Canva]] about Canva's SEO:
* [[Why OnePlaybook|Processes being optimized]]?
* Product
** [[Create Wiki Space]]: {{Create Wiki Space!!subdirectory}}
** [[Templates]]: {{Templates!!subdirectory}}
** [[Explore]]: {{Explore!!subdirectory}}
** [[Cloud service]]: {{Cloud service!!subdirectory}}
* Solutions
** [[By Team function]]: {{By Team function!!subdirectory}}
** [[By Team size]]: {{By Team size!!subdirectory}}
** [[OnePlaybook for]]: {{OnePlaybook for!!subdirectory}}
* Resources
** [[Blog]]: /blog
** [[Documentation]]: {{Documentation!!subdirectory}}
** [[Guides and Tutorials]]: {{Guides and Tutorials!!subdirectory}}
** TiddlyWiki
** [[Help center]]: {{Help center!!subdirectory}}
* [[Pricing]]
* [[Contact]]
* About
We'll have to create page templates and feed markdown files from TiddlyWiki. [[Here are the instructions for Gatsby|https://www.gatsbyjs.com/docs/how-to/routing/adding-markdown-pages/]]
<ul>
<li>
<p><strong>Low SES, poor growth outcomes (particularly stunting), micronutrient deficiencies and limited opportunities for learning/ cognitive stimulation are risk factors for developmental delays among >200 million children under-5 in low-resource settings (<a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4642432/">Black 2015</a>; <a href="https://journals.sagepub.com/doi/full/10.1177/1476718X211020031">Munoz-Chereau 2021</a>) </strong></p></li>
<li>
<p><strong>Children 6–23 months whose met the minimum dietary diversity had 39% lower risk of delayed development compared to those who did not meet minimum dietary diversity (<a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7729803/">Zhao 2021</a>; <a href="https://protect.everywomaneverychild.org/">EWEC</a>)</strong></p></li>
<li>
<p><strong>Play and stimulation is essential to foster brain development and monitoring of developmental outcomes is needed to prevent chronic delays (<a href="https://www.unicef.org/early-childhood-development">UNICEF</a>) </strong></p></li>
<li>
<p><strong>UNICEF supports counseling and support for parents, improvements in quality of childcare and early education and financial support for food and support to parents to enable time with their children (<a href="https://www.unicef.org/early-childhood-development">UNICEF</a>) </strong></p></li>
<li>
<p><strong>Early childhood development can be fostered through nurturing care, which involves the establishment of a supportive environment that promotes health, nutrition, learning, safety and security and responsive caregiving for young children by their caretakers and communities (<a href="https://nurturing-care.org/ncf-for-ecd">WHO Nurturing Care Framework 2018</a>; <a href="https://els-jbs-prod-cdn.jbs.elsevierhealth.com/pb-assets/Lancet/stories/series/ecd/Lancet_ECD_Executive_Summary-1507044811487.pdf">Lancet 2016</a>)</strong></p></li>
<li>
<p><strong>Community-based educational interventions focusing on responsive feeding and caregiver-child interactions have been found to improve early child development outcomes (<a href="https://onlinelibrary.wiley.com/doi/epdf/10.1111/j.1740-8709.2012.00413.x">Vazir 2012</a>)</strong></p></li>
<li>
<p><strong>Male sex is a risk factor for cognitive developmental delays (<a href="https://www.frontiersin.org/articles/10.3389/fpsyg.2019.02739/full">Ranjitkar 2019</a>; <a href="https://journals.plos.org/plosmedicine/article?id=10.1371/journal.pmed.1002034">McCoy 2016</a>)</strong></p></li>
<li>
<p><strong>Among very preterm/LBW children under-5, male sex and lower birthweight were predictive of developmental impairments (<a href="https://jamanetwork.com/journals/jamapediatrics/article-abstract/2448717">Linsell 2015</a>) </strong></p></li></ul>
OnePlaybook went live on the 6th October 2020. I will continue evaluating the number of submissions without marketing or promotion or any form of content marketing or SEO till next week.
An idea for a whiteboard system for teams using [[Spatial tiddlywiki]].
# WebDAV [[(icons|https://icons8.com/icons/set/webdav]] for future reference)
#
A ''Local Variable'' is a variable that is declared in the enclosing expression through either a [[let assignment|LetConstruct]] or a [[function parameter|Function]].
These variables behave differently than TiddlyWiki's `<<variables>>`. They will only be available in the piece of formula code where they appear, //not// in any transcluded formulas.
Local variables can be captured by a [[Function]].
I am considering changing the logo to something more aesthetically pleasing; a Celtic triskelion with Archimedean spirals signifying unified, interconnected constellations of wikis with no center, creating a networked whole that's decentralized, but with hierarchical structure.
Here's a free SVG template which we can work with: https://commons.wikimedia.org/wiki/File:Triskele-hollow-triangle.svg
It has been suggested that the human species may be undergoing an evolutionary transition in individuality (ETI). But there is disagreement about how to apply the ETI framework to our species, and whether culture is implicated as either cause or consequence. Long-term gene–culture coevolution (GCC) is also poorly understood. Some have argued that culture steers human evolution, while others proposed that genes hold culture on a leash. We review the literature and evidence on long-term GCC in humans and find a set of common themes. First, culture appears to hold greater adaptive potential than genetic inheritance and is probably driving human evolution. The evolutionary impact of culture occurs mainly through culturally organized groups, which have come to dominate human affairs in recent millennia. Second, the role of culture appears to be growing, increasingly bypassing genetic evolution and weakening genetic adaptive potential. Taken together, these findings suggest that human long-term GCC is characterized by an evolutionary transition in inheritance (from genes to culture) which entails a transition in individuality (from genetic individual to cultural group). Thus, research on GCC should focus on the possibility of an ongoing transition in the human inheritance system
The web is chock full of problems that people want solved. What if we could provide a platform that collects all these problems into one place for others to use?
This knowledge includes documentation, responsibilities, procedures as well as new integrating new knowledge into the team's corpus.
When NASA decided to re-familiarize itself with its F1 engines that took men to the moon, they realized that a lot of the engine was built by hand using methods that no longer apply to today's manufacturing practices.
In fact most of the methods used by the engineers at the time when the F1 engines were built required the use of techniques and skills that were [[never formally captured|https://youtu.be/ovD0aLdRUs0]]. And as a result a lot of this knowledge was lost over time as these engineers retired or passed away. This illustrates the importance of [[knowledge management|Knowledge management]].
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
exports.name = "date-counter";
exports.params = [
{ name: "end" }
];
/*
Run the macro
*/
exports.run = function(end) {
var startDate = new Date();
var endDate = end || "July 1, 2018 23:59:00";
var d1 = startDate.getTime();
var d2 = new Date(endDate);
var diffMs = d2.getTime() - d1
var timeSecs = diffMs/1000;
var time = timeSecs/3600;
var days = parseInt(time/24);
var hours = Math.round(((time/24) - days)*24);
if (days > 0 || hours > 0) return days + " days and " + hours + " hours";
return "Times up! t+ " + Math.abs(days) + " days and " + Math.abs(hours) + " hours";
};
})();
With a macro recorder that records robotic procedures with third party API primitives, we could build a wikibot that can automatically fulfill any desired action.
Imagine if you had to create certificates for 50, or even 100 people in a few hours. It's a nightmare right? Maybe even impossible. Especially since you tend to work with documents. PDFs no less! Working with PDF editors is not a walk in the park and is not something most people do everyday (most people only interact with word processors and PPT editors).
But what if we took a content/data driven approach? Then we could easily manipulate this data with programming and automate a lot of stuff. Here's a possible flow:
# Enter folks details via a self-service form or via a wiki
# Then automatically generate certificate from reusable templates
# Authorized users may automatically apply electronic signature at a click of a button; or they can print it and sign it old school if they wish!
# Automatically send the certificates to achievers at a click of a button or after an event
Putting your affairs in order can be hard. And in the midst of grief, it can be harder. If you could do the essentials in a few clicks, that would be great.
Those essentials include:
* Legal arrangements
* Digital bequeathments (including periodic messages to comfort loved ones, records, etc)
* Funeral arrangements
* Insurance
We already have services like Deadsocial already doing something like this using the theme of social media management after death using a trusted digital executor.
In terms of:-
* Tools (some of which may be difficult to interact with)
* Manpower (moderation requires dedicated moderators)
* Engagement maintenance
<h1>The Process</h1>
<p>Preparation can be broken down into two areas:</p>
<ol>
<li><strong>Knowledge: Do you know your stuff?</strong></li>
<li><strong>Nerves: Can you perform under pressure?</strong></li></ol>
<h1>Building your knowledge 🤓</h1>
<p>Targeted drilling is the most efficient way to improve on your weaknesses.<br />
<br />
<strong>Step 1: Diagnostics</strong></p>
<p>To identify areas you need to work on (it’s okay if it’s all of them), use the Cracking the Coding Interview (CTCI) “Interview Questions” chapters as a diagnostic test since it covers all the major question categories. Go through one chapter at a time. If you get through a few problems in one category (ex. Arrays) and they seem easy, move on to next chapter. Otherwise, work through all the problems in a chapter. As you go through the book, jot down your confidence with each section. I use a 4 point scale, where 1 = No confidence, 2 = Shaky, and 3 = Passable, and 4 = Rock solid. After going through the CTCI chapters you will end up with something like this:</p>
<ul>
<li><em>Arrays and Strings: 2</em></li>
<li><em>Linked Lists: 1</em></li>
<li><em>Stacks and Queues: 3</em></li>
<li><Repeat for every chapter></li></ul>
<p><strong>Step 2: Efficient practice</strong></p>
<p><strong>Use Python for speed. </strong>It’s the best language for coding interviews because the syntax is concise and it contains utilities for arrays and string manipulation, allowing you to code quickly. The faster you can code, the more attempts you have for each question. Python lets you fail fast and learn fast during practice, and more importantly during the interviews. I learned Python specifically for interviewing and it paid off.</p>
<p><strong>Only attempt Easy and Medium</strong> difficulty questions on LeetCode. <strong>Hards take too long and as a result are rarely if ever asked in actual interviews</strong>, since interviews are typically only 45 min long. You get the most bang for your buck with the Easy/Mediums.</p>
<p><strong>Drill one category at a time. </strong>Start with your weakest area and LeetCode the crap out of it. Drill one category at a time (e.g. only Array questions) in sets of 5–10 questions. As opposed to doing a mixed bag of question categories, drilling individual categories provides the repetition you need to build intuition around solving specific problem types. As you work through one category, let’s say Arrays, you will observe the patterns and strategies that can help you solve any Array question.</p>
<p><strong>Get LeetCode Premium. </strong>I pay for premium because it helps me see which problems are popular and I always start with the most popular ones in each category since I want practice questions I’m likely to see in real interviews. The difference between a bad offer and a good offer is tens to hundreds of thousands of dollars a year, so $35/mo is a small price to pay to improve your chances. I’ve also heard AlgoExpert is well worth the price.</p>
<p><strong>Cap each question at 30 minutes. </strong>Start a timer for 30<strong> </strong>minutes. If it runs out and you’re not close, look at the answers since spending more time has diminishing returns.</p>
<p><strong>Calculate the runtime complexity. </strong>Since your interviewer will always ask you for runtime complexity, practice on every question.</p>
<p><strong>Think out loud. </strong>Since you’ll have to talk while you code during an interview, practice thinking out loud so it becomes second nature.</p>
<p><strong>Review popular questions you found difficult a few days later. </strong>This<strong> </strong>reinforces your learnings and being able to nail all the popular questions builds a strong foundation. After all, most questions are just a variation of the common ones.<br />
<br />
<strong>How much drilling should you do? </strong>I would shoot for at least a comfort level 3 in every category before moving onto <em>Part 2: Nerves</em>. Hopefully you’ll be at a 3 or 4 in every category before doing real interviews. For reference during my first interview prep period I practiced roughly 150 questions. My second time around I re-did about 100 I’d previously done before + 50 new ones. I’m a strong believer in focusing on the most common questions hence the overlap.<br />
<br />
<strong>TL;DR for Part 1 — </strong>Do CTCI to diagnose weaknesses, then drill on Leetcode. Only do Easy/Medium. Use Python.</p>
<h1>Conquering your nerves 🥵</h1>
<p>Getting your nerves under control is equally important as knowing your stuff. Even if you’re great at solving problems alone, it’s a completely different experience to have someone watching your every thought and mistake and it will throw you off your game —during one of my first interviews I couldn’t even print out the elements of an array backwards because I was so nervous. The key to minimizing your nerves is getting as much time as possible simulating high pressure live interview situations so you feel comfortable during the real thing.</p>
<p><strong>Step 1: Simulate the real environment</strong><br />
Now that all interviews are done virtually, set up your desk and laptop exactly as you would in a virtual interview. Open up a Zoom call. Use Coderpad to write and run your code in an environment without autocomplete.</p>
<p><em>Note about white-boarding: In the past with physical onsite interviews, you would want to practice on an actual whiteboard. I also have a friend who asks to use a laptop even in whiteboard sessions and he has never been denied.</em></p>
<p><strong>Step 2: Have someone watch you</strong><br />
You need a live person watching you while you code and talk out loud to simulate the pressure of a live interview. Ideally this person is a software engineer and can act as a proctor, but in the worst case just get any person — your mom, friend, or sibling — to just be there watching you. Since interviews are now all virtual, have them proctor you through a Zoom call.</p>
<p><strong>Step 3: Do</strong> <strong>a bunch of practice interviews</strong><br />
If your proctor is a SWE, have them pick a question you’ve never seen before, then set a timer for 35 minutes and begin. Each person has their own interview style, but I used the format below for all my successful interviews.</p>
<p><strong>Recommended Live Interview Format (35 min)</strong></p>
<ol>
<li><strong>Clarification (~2 min): </strong>Restate the problem multiple times and make sure they confirm your understanding is correct. Ask clarifying questions for ~2 minutes even if you think you understand the question. 90% of interviewees jump straight to coding and will be penalized by the interviewer for poor communication. Ask about inputs, edge cases (do we have to handle null values, empty arrays, etc.).</li>
<li><strong>Start with the naive solution (~3 min)</strong>: In most questions, there is a trivial, brute force approach. It’s good to throw out that solution to get started. You can say “I’m going to start off with the naive solution, and then we can improve from there, how does that sound?” You can write some pseudocode on the board/Coderpad for the brute force but I usually just think out loud and come up with it. Then from there, you can say “okay how can we improve on this?”</li>
<li><strong>Optimize the naive solution (~10 min): </strong>Very few questions have O(N²) solutions or worse, so you can almost assume they’re looking for O(N) or O(NlogN) or O(logN). Work on a low-fi pseudocode solution, since this will make it easier to modify your solution because you’ll make some mistakes while you explore. Try not to spend more than 10 minutes on a barebones pseudocode solution. At this point you should have the runtime. State the runtime and ask your interviewer if it’s good enough.</li>
<li><strong>Translate the pseudocode into real code (~15 min): </strong>You<strong> </strong>may not be 100% confident in your solution but you’re against the clock and have to get started. Turn your solution into real code. It’s okay to write code in silence for a few minutes at a time, but make sure to keep the interviewer in the loop as you go. Write down any test cases you think of along the way. Re-check your runtime.</li>
<li><strong>Test thoroughly (5 min): </strong>Look at the test cases that you’ve come up with. Any more to add? Go down the list and test each case. Print out local variables’ values so you can keep track of them as they change. Make sure you hit every line of your code with testing. This means if you have a bunch of if statements, make sure you go into every if statement and every loop.</li></ol>
<p><strong>TL;DR for Part 2— </strong>Simulate the real environment as closely as possible.</p>
<h1>Random tips</h1>
<ol>
<li><strong>Think out loud — </strong>You need to practice talking out loud for while you code. When you’re silent, the interviewer has no way to assess you. But it’s okay to be silent for periods of time to fully focus.</li>
<li><strong>Leverage Stubs</strong> — Add stubs for trivial functions and say you’ll implement them later. Your interviewer likely won’t make you implement them especially if you’re short on time and it will save you precious time to tackle the meat of the problem. A simple example would be if you need to capitalize the first letter of a list of strings, you can pretend you have a helper that does that and save 2 minutes of implementing that helper function.</li>
<li><strong>Write down test cases as you go </strong>— As you are writing code, you’ll likely think of edge cases to check. Quickly jot them down in a comment but continue writing the code so you don’t lose your train of thought but also will remember to go back to test later.</li>
<li><strong>Think through the lens of data structures — </strong>remember those areas you drilled in LeetCode / CTCI? (Arrays, LinkedLists, Trees, Maps, Stack/Queue, DP, Recursion). The question they’re asking must fit into one of these categories, so figure out which ones are appropriate. Using the right data structure will usually get you halfway to your solution.</li>
<li><strong>Pace yourself —</strong> Exercise well. Eat well. See friends. Have some fun. Stay sane, it’s a long process.</li></ol>
<h1>Bonus tip: Ordering your interviews</h1>
<p>You’ve put in the work and you’re ready to schedule interviews! <strong>Order your interviews from least to most desirable. </strong>Despite your best efforts to simulate real interviews, you’ll probably still fail your first 5 real interviews simply because it’s so damn nerve wracking. Because these “throwaway” interviews are unavoidable, try and line up your interviews from least to most desirable. After the first five, your success rate will improve. For reference, I’ve probably failed ~75% of my interviews, but since I saved all my most important interviews for the end when I was at peak performance, I was able to secure the jobs I desired most.</p>
An open source alternative to Slack. I like the way it tries to strike a balance between open source and commercial, and between cloud versus self-hosted.
It illustrates that it is possible to monetize open source software. But it requires some exploration of the [[options|Open source]].
Link: https://mattermost.com
* Zoom: good for calls and meetings. But doesn't allow for asynchronous team thinking and is time constrained
* WhatsApp: good for quick chats and informal groups. Terrible for getting stuff done well
* Notion: good balance, but....
* Google Docs: excellent collaboration, but does not allow iterative thinking
* Slack: numerous issues. Does not allow for asynchronous thought
Key themes:
* Accessible
* Balance of asynchronous vs synchronous communication
* Enable iterative thinking
* Bonus: easy extension. Should be easy for novice users to tie in apps and apply automation
__Attendees__
# Ben
# Abraham
__Podcast__
# Recruit Brian Paul Mnyampi, then Benjamin Fernandes for upcoming episode of African Unicorn. Topic?
# Ask around for ideal length of episodes and type of contents
# Lady representation: eventually.
__Toolboksi__
# Pitch the service towards making the business model robust to covid-19 as well as allowing for growth despite the pandemic
# We'll do value based pricing and offer a blank check.
# We'll hold the meeting for this at 10:30-11:00 tomorrow.
Writing meeting minutes and keeping track of decisions and tasks, promises and reminders is difficult without secretaries.
Zoom et al give us opportunities to provide digital flexibility via:
* Building minutes as annotations around key action items
* These action items can be in the form of to-do lists, tasks assigned, reminders or whatever. They must be outputs in general of a discussion. And they need to be annotated to provide context automatically.
* The generated minutes become machine readable, actionable and trackable automatically.
Challenge here is to find a way to turn the conversation into contextual annotations for each item accurately.
Benefits include not having to deal with the added item of creating minutes after the fact. Minutes after the fact is good for archiving, but that's just about it. An almost pointless exercise.
# Paul Shilla has experience with Fintech startups
# He mentioned that they will soon host fintech startups that will be given access to their customer base. They will need all the help that they can get
# We will send the proposal, then Paul will schedule a meeting with their marketing team
* OnePlaybook
** We need to orient the product around templates, because as Ben says, templates allow users to immediately connect the product to their needs.
** So we can perhaps use Notion's flow: Home page -> Templates -> Dialog window showing common curated templates WITH WORKING EXAMPLES (can we do that?) -> Browse more templates
** We can also use Whimsical's flow: Home page has template explorer built right into the home page
* Innovation peer
** The Invincible Company. [[Read it|https://drive.google.com/file/d/1TEcivWJxI7Hhk9oO6FkCihpgiSZ6VZrZ/view?usp=sharing]]
** It is an interesting way of allowing companies to sustainably allow for intrapreneurship programs within established companies.
<$button>
<$action-sendmessage $message="tm-new-tiddler" tags="[[innovpeer meeting]]" title="New innovation peer meeting" />
New Meeting
</$button>
<<list-links "[tag[innovpeer meeting]!sort[created]]">>
<span style="box-sizing: border-box; color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; background-color: yellow;">The 1945 Memex design also introduced the concept of “trails”, a concept derived from work in neuronal storage-retrieval networks at the time, which was a method of connecting information by linking units together in a networked manner, similar to hypertext paths</span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">. The process of<span> </span></span><span style="box-sizing: border-box; color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; background-color: yellow;">making trails was called “trailblazing”, and was based on a mechanical provision “whereby any item may be caused at will to select immediately and automatically another”</span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"><span> </span></span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"> </span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">[</span><a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#bush1991c" style="box-sizing: border-box; background-color: rgb(255, 255, 255); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;">Bush 1991c</a><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">,</span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"> </span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">107], just<span> </span></span><span style="box-sizing: border-box; color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; background-color: yellow;">as though these items were being “gathered together from widely separated sources and bound together to form a new book”</span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"><span> </span></span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"> </span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">[</span><a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#bush1991c" style="box-sizing: border-box; background-color: rgb(255, 255, 255); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;">Bush 1991c</a><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">,</span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"> </span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">104]. Electro-optical devices borrowed from the Rapid Selector used spinning rolls of microfilm, abstract codes and a mechanical selection-head inside the desk to find and create these links between documents. “</span><span style="box-sizing: border-box; color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; background-color: yellow;">This is the essential feature of the Memex. The process of tying two items together is the important thing”</span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"><span> </span></span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"> </span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">[</span><a href="http://digitalhumanities.org/dhq/vol/2/1/000015/000015.html#bush1991c" style="box-sizing: border-box; background-color: rgb(255, 255, 255); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;">Bush 1991c</a><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">,</span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"> </span><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">103]. Bush went so far as to suggest that in the future, there would be professional trailblazers who took pleasure in creating useful paths through the common record in such a fashion.</span>
nick.scialli.me
An Introduction to Memoization in JavaScript
4-5 minutes
I made a video version of this post! Check it out on YouTube if you prefer consuming your tutorial content that way.
Memoization is an optimization technique used in many programming languages to reduce the number of redundant, expensive function calls. This is done by caching the return value of a function based on its inputs. In this post, we’ll create a suboptimal, but hopefully educationally-informative, JavaScript function memoizer!
Here’s a function for us to memoize. It finds the square of a number in a very inefficient way.
```javascript
const inefficientSquare = num => {
let total = 0;
for (let i = 0; i < num; i++) {
for (let j = 0; j < num; j++) {
total++;
}
}
return total;
};
```
We can run this function with the same value and, each time, it’ll take a while to execute.
```javascript
const start = new Date();
inefficientSquare(40000);
console.log(new Date() - start);
const start2 = new Date();
inefficientSquare(40000);
console.log(new Date() - start2);
```
Over one second each time, yikes!
Let’s reason through our memoizer before we write any code.
Takes a reference to a function as an input
Returns a function (so it can be used as it normally would be)
Creates a cache of some sort to hold the results of previous function calls
Any future time calling the function, returns a cached result if it exists
If the cached value doesn’t exist, calls the function and store that result in the cache
Here’s an implementation of the above pseudocode outline. As mentioned in the introduction, this is suboptimal and you should not use this in production. I’ll explain why after!
```javascript
const memoize = func => {
const results = {};
return (...args) => {
const argsKey = JSON.stringify(args);
if (!results[argsKey]) {
results[argsKey] = func(...args);
}
return results[argsKey];
};
};
```
The most suboptimal part of this implementation, and why I wouldn’t recommend it be used in production code, is using JSON.stringify to create keys in our results cache. The biggest problem with JSON.stringify is that it doesn’t serialize certain inputs, like functions and Symbols (and anything you wouldn’t find in JSON).
Let’s replicate our inefficientSquare example, but this time we’ll use our memoizer to cache results.
```javascript
const memoize = func => {
const results = {};
return (...args) => {
const argsKey = JSON.stringify(args);
if (!results[argsKey]) {
results[argsKey] = func(...args);
}
return results[argsKey];
};
};
const inefficientSquare = memoize(num => {
let total = 0;
for (let i = 0; i < num; i++) {
for (let j = 0; j < num; j++) {
total++;
}
}
return total;
});
const start = new Date();
inefficientSquare(40000);
console.log(new Date() - start);
const start2 = new Date();
inefficientSquare(40000);
console.log(new Date() - start2);
```
Success! The second time we call inefficientSquare with the same input it takes no time to recompute; we’re simply pulling the cached value from an object.
Memoization is great, but it only works if your function is pure. In other words, if your function’s returned value is dependent on more than its inputs, then your cached value for those inputs won’t always be correct. Also, if your function has side-effects, the memoizer doesn’t replicate those, it simply returns the ultimately-returned function value.
You should now have a good idea of how and why we use memoization! While our memoization function was suboptimal, there are plenty of third party libraries out there you can use that will do a much better. Just make sure the functions you’re memoizing are pure!
Mendix is a close behind [[Appian]] for number one. The platform seems designed for more serious enterprise users, hence its steeper learning curve and higher pricing compared to the competition. Plus, its collaboration features are more basic but the fact they are there at all is an important plus. This gives at solid 4.1
A meta-tool for thought: a tool that helps one organize other tools for thought and similar services: think something like Segment, but for knowledge. This is a useful vision to guide OnePlaybook's development, as most companies already offer specialized tools for thought that are mature, yet disconnected, with many preferring tools that simply do not fit the corporate tools used e.g. EMACS vs Office apps, etc.
A service that makes sure folks are accessing and editing the same data source/knowledge source from any internal or external service no matter what tool could be useful. An internal knowledge infrastructure akin to an internal web of knowledge. One that is easier to use and extend. Then maybe with this, we can shape out the seeds of the [[network effect|Network effect]] that will protect this project from copycats.
Michelin pricing based on <mark>value</mark> (mileage driven per month on tires vs charging trucks for the number of tires they bought). What does this give them? Scaled value:
<<<
Michelin’s price per kilometer (PPK) metric allowed fleet managers to focus on their businesses and customers without having to worry about expensive or damaged tires. <mark>They paid for their actual usage of the tires rather than for the ownership of them.</mark> And they were also able to flexibly manage their tire costs depending on the prevailing market conditions (a bad season with reduced demand for the fleet meant reduced truck usage, which in turn reduced the tire charges).
By changing the way they charged their customers, Michelin shifted their vision from building better tires to improving transportation and mobility. And the tires became one of the elements in the value chain that supported that vision.
<<<
Microsoft just unveiled their not so subtle take on Notion: Loop. It's their latest addition to the Office apps ensemble; their answer to the emerging hybrid environment. This is a problem because it demonstrates big tech's capability of cloning just about any useful piece of enterprise software out there to strengthen their position in the market by offering their clones as part of their bundle, exploiting their strong network effect. Notion on the other hand doesn't have much of a [[network effect|Network effect]] to defend itself with.
This also means that for OnePlaybook, we need to think beyond the client facing app: we need to orient ourselves from just another tool for thought to a [[meta-tool for thought|Meta-tool for thought]] that supports a seamless knowledge infrastructure for enterprise.
Migrating your data between consumer apps is quite difficult and prevents many users from branching out to different competing services. Could a migration as a service help?
__''Focus''__: Mipango, an AI-based personal finance mobile application that enables users to manage their income, expenses, savings, financial targets and budgets, and access relevant investment opportunities.
# Let's talk about Mipango; what is it for the uninitiated, what does it do?
# Talk about the opportunities of the NVIDIA inception program ([[Tanzanian fintech startup Mipango has been selected to take part in NVIDIA Inception, a virtual programme designed to nurture startups revolutionising industries with advancements in artificial intelligence (AI) and data sciences.|https://disrupt-africa.com/2020/08/tanzanian-fintech-mipango-joins-nvidia-inception-programme/]]). How has it helped enhance the value of your offering? Any challenges?
# Let's talk about the team behind it?
# What does innovation mean to you? What would you say is unique about your approach to innovation?
# What is your background and how did you become a tech entrepreneur?
# How did you manage to crack partnerships with Jubilee Insurance and Vodacom Tanzania?
# What was your journey into entrepreneurship like and what inspired you to become an entrepreneur?
# What advice and recommendations do you want to give current and future female entrepreneurs in Tanzania and Africa?
# The milkman
# The police officer
# The beggar
# Banyan tree worshippers
Mixin – is a generic object-oriented programming term: a class that contains methods for other classes.
Some other languages allow multiple inheritance. JavaScript does not support multiple inheritance, but mixins can be implemented by copying methods into prototype.
We can use mixins as a way to augment a class by adding multiple behaviors, like event-handling as we have seen above.
Mixins may become a point of conflict if they accidentally overwrite existing class methods. So generally one should think well about the naming methods of a mixin, to minimize the probability of that happening.
<div><a class="domain reader-domain" href="https://javascript.info/mixins">javascript.info</a>
<div> </div>
<h1>Mixins</h1>
<div> </div>
<div>
<div>7-8 minutes</div></div></div>
<div>
<hr />
<div>
<div>
<div>
<div>
<p>In JavaScript we can only inherit from a single object. There can be only one <code>[[Prototype]]</code> for an object. And a class may extend only one other class.</p>
<p>But sometimes that feels limiting. For instance, we have a class <code>StreetSweeper</code> and a class <code>Bicycle</code>, and want to make their mix: a <code>StreetSweepingBicycle</code>.</p>
<p>Or we have a class <code>User</code> and a class <code>EventEmitter</code> that implements event generation, and we’d like to add the functionality of <code>EventEmitter</code> to <code>User</code>, so that our users can emit events.</p>
<p>There’s a concept that can help here, called “mixins”.</p>
<p>As defined in Wikipedia, a <a href="https://en.wikipedia.org/wiki/Mixin">mixin</a> is a class containing methods that can be used by other classes without a need to inherit from it.</p>
<p>In other words, a <em>mixin</em> provides methods that implement a certain behavior, but we do not use it alone, we use it to add the behavior to other classes.</p>
<h2><a href="about:reader?url=https%3A%2F%2Fjavascript.info%2Fmixins#a-mixin-example" name="a-mixin-example">A mixin example</a></h2>
<p>The simplest way to implement a mixin in JavaScript is to make an object with useful methods, so that we can easily merge them into a prototype of any class.</p>
<p>For instance here the mixin <code>sayHiMixin</code> is used to add some “speech” for <code>User</code>:</p>
<div>
<pre><code><em><span>// mixin</span></em>
<span>let</span> sayHiMixin <span>=</span> <span>{</span>
<span>sayHi</span><span>(</span><span>)</span> <span>{</span>
<span>alert</span><span>(</span><span><span>`</span><span>Hello </span><span><span>${</span><span>this</span><span>.</span>name<span>}</span></span><span>`</span></span><span>)</span><span>;</span>
<span>}</span><span>,</span>
<span>sayBye</span><span>(</span><span>)</span> <span>{</span>
<span>alert</span><span>(</span><span><span>`</span><span>Bye </span><span><span>${</span><span>this</span><span>.</span>name<span>}</span></span><span>`</span></span><span>)</span><span>;</span>
<span>}</span>
<span>}</span><span>;</span>
<em><span>// usage:</span></em>
<span>class</span> <span>User</span> <span>{</span>
<span>constructor</span><span>(</span><span>name</span><span>)</span> <span>{</span>
<span>this</span><span>.</span>name <span>=</span> name<span>;</span>
<span>}</span>
<span>}</span>
<span>// copy the methods</span>
Object<span>.</span><span>assign</span><span>(</span><span>User</span><span>.</span>prototype<span>,</span> sayHiMixin<span>)</span><span>;</span>
<span>// now User can say hi</span>
<span>new</span> <span>User</span><span>(</span><span>"Dude"</span><span>)</span><span>.</span><span>sayHi</span><span>(</span><span>)</span><span>;</span> <span>// Hello Dude!</span></code></pre></div>
<p>There’s no inheritance, but a simple method copying. So <code>User</code> may inherit from another class and also include the mixin to “mix-in” the additional methods, like this:</p>
<div>
<pre><code><span>class</span> <span>User</span> <span>extends</span> <span>Person</span> <span>{</span>
<span>// ...</span>
<span>}</span>
Object<span>.</span><span>assign</span><span>(</span><span>User</span><span>.</span>prototype<span>,</span> sayHiMixin<span>)</span><span>;</span></code></pre></div>
<p>Mixins can make use of inheritance inside themselves.</p>
<p>For instance, here <code>sayHiMixin</code> inherits from <code>sayMixin</code>:</p>
<div>
<pre><code><span>let</span> sayMixin <span>=</span> <span>{</span>
<span>say</span><span>(</span><span>phrase</span><span>)</span> <span>{</span>
<span>alert</span><span>(</span>phrase<span>)</span><span>;</span>
<span>}</span>
<span>}</span><span>;</span>
<span>let</span> sayHiMixin <span>=</span> <span>{</span>
__proto__<span>:</span> sayMixin<span>,</span> <span>// (or we could use Object.create to set the prototype here)</span>
<span>sayHi</span><span>(</span><span>)</span> <span>{</span>
<em> <span>// call parent method</span></em>
<span>super</span><span>.</span><span>say</span><span>(</span><span><span>`</span><span>Hello </span><span><span>${</span><span>this</span><span>.</span>name<span>}</span></span><span>`</span></span><span>)</span><span>;</span> <span>// (*)</span>
<span>}</span><span>,</span>
<span>sayBye</span><span>(</span><span>)</span> <span>{</span>
<span>super</span><span>.</span><span>say</span><span>(</span><span><span>`</span><span>Bye </span><span><span>${</span><span>this</span><span>.</span>name<span>}</span></span><span>`</span></span><span>)</span><span>;</span> <span>// (*)</span>
<span>}</span>
<span>}</span><span>;</span>
<span>class</span> <span>User</span> <span>{</span>
<span>constructor</span><span>(</span><span>name</span><span>)</span> <span>{</span>
<span>this</span><span>.</span>name <span>=</span> name<span>;</span>
<span>}</span>
<span>}</span>
<span>// copy the methods</span>
Object<span>.</span><span>assign</span><span>(</span><span>User</span><span>.</span>prototype<span>,</span> sayHiMixin<span>)</span><span>;</span>
<span>// now User can say hi</span>
<span>new</span> <span>User</span><span>(</span><span>"Dude"</span><span>)</span><span>.</span><span>sayHi</span><span>(</span><span>)</span><span>;</span> <span>// Hello Dude!</span></code></pre></div>
<p>Please note that the call to the parent method <code>super.say()</code> from <code>sayHiMixin</code> (at lines labelled with <code>(*)</code>) looks for the method in the prototype of that mixin, not the class.</p>
<p>Here’s the diagram (see the right part):</p>
<p>That’s because methods <code>sayHi</code> and <code>sayBye</code> were initially created in <code>sayHiMixin</code>. So even though they got copied, their <code>[[HomeObject]]</code> internal property references <code>sayHiMixin</code>, as shown in the picture above.</p>
<p>As <code>super</code> looks for parent methods in <code>[[HomeObject]].[[Prototype]]</code>, that means it searches <code>sayHiMixin.[[Prototype]]</code>, not <code>User.[[Prototype]]</code>.</p>
<h2><a href="about:reader?url=https%3A%2F%2Fjavascript.info%2Fmixins#eventmixin" name="eventmixin">EventMixin</a></h2>
<p>Now let’s make a mixin for real life.</p>
<p>An important feature of many browser objects (for instance) is that they can generate events. Events are a great way to “broadcast information” to anyone who wants it. So let’s make a mixin that allows us to easily add event-related functions to any class/object.</p>
<ul>
<li>The mixin will provide a method <code>.trigger(name, [...data])</code> to “generate an event” when something important happens to it. The <code>name</code> argument is a name of the event, optionally followed by additional arguments with event data.</li>
<li>Also the method <code>.on(name, handler)</code> that adds <code>handler</code> function as the listener to events with the given name. It will be called when an event with the given <code>name</code> triggers, and get the arguments from the <code>.trigger</code> call.</li>
<li>…And the method <code>.off(name, handler)</code> that removes the <code>handler</code> listener.</li></ul>
<p>After adding the mixin, an object <code>user</code> will be able to generate an event <code>"login"</code> when the visitor logs in. And another object, say, <code>calendar</code> may want to listen for such events to load the calendar for the logged-in person.</p>
<p>Or, a <code>menu</code> can generate the event <code>"select"</code> when a menu item is selected, and other objects may assign handlers to react on that event. And so on.</p>
<p>Here’s the code:</p>
<div>
<pre><code><span>let</span> eventMixin <span>=</span> <span>{</span>
<span>/**
* Subscribe to event, usage:
* menu.on('select', function(item) { ... }
*/</span>
<span>on</span><span>(</span><span>eventName<span>,</span> handler</span><span>)</span> <span>{</span>
<span>if</span> <span>(</span><span>!</span><span>this</span><span>.</span>_eventHandlers<span>)</span> <span>this</span><span>.</span>_eventHandlers <span>=</span> <span>{</span><span>}</span><span>;</span>
<span>if</span> <span>(</span><span>!</span><span>this</span><span>.</span>_eventHandlers<span>[</span>eventName<span>]</span><span>)</span> <span>{</span>
<span>this</span><span>.</span>_eventHandlers<span>[</span>eventName<span>]</span> <span>=</span> <span>[</span><span>]</span><span>;</span>
<span>}</span>
<span>this</span><span>.</span>_eventHandlers<span>[</span>eventName<span>]</span><span>.</span><span>push</span><span>(</span>handler<span>)</span><span>;</span>
<span>}</span><span>,</span>
<span>/**
* Cancel the subscription, usage:
* menu.off('select', handler)
*/</span>
<span>off</span><span>(</span><span>eventName<span>,</span> handler</span><span>)</span> <span>{</span>
<span>let</span> handlers <span>=</span> <span>this</span><span>.</span>_eventHandlers<span>?.</span><span>[</span>eventName<span>]</span><span>;</span>
<span>if</span> <span>(</span><span>!</span>handlers<span>)</span> <span>return</span><span>;</span>
<span>for</span> <span>(</span><span>let</span> i <span>=</span> <span>0</span><span>;</span> i <span><</span> handlers<span>.</span>length<span>;</span> i<span>++</span><span>)</span> <span>{</span>
<span>if</span> <span>(</span>handlers<span>[</span>i<span>]</span> <span>===</span> handler<span>)</span> <span>{</span>
handlers<span>.</span><span>splice</span><span>(</span>i<span>--</span><span>,</span> <span>1</span><span>)</span><span>;</span>
<span>}</span>
<span>}</span>
<span>}</span><span>,</span>
<span>/**
* Generate an event with the given name and data
* this.trigger('select', data1, data2);
*/</span>
<span>trigger</span><span>(</span><span>eventName<span>,</span> <span>...</span>args</span><span>)</span> <span>{</span>
<span>if</span> <span>(</span><span>!</span><span>this</span><span>.</span>_eventHandlers<span>?.</span><span>[</span>eventName<span>]</span><span>)</span> <span>{</span>
<span>return</span><span>;</span> <span>// no handlers for that event name</span>
<span>}</span>
<span>// call the handlers</span>
<span>this</span><span>.</span>_eventHandlers<span>[</span>eventName<span>]</span><span>.</span><span>forEach</span><span>(</span><span>handler</span> <span>=></span> <span>handler</span><span>.</span><span>apply</span><span>(</span><span>this</span><span>,</span> args<span>)</span><span>)</span><span>;</span>
<span>}</span>
<span>}</span><span>;</span></code></pre></div>
<ul>
<li><code>.on(eventName, handler)</code>– assigns function <code>handler</code> to run when the event with that name occurs. Technically, there’s an <code>_eventHandlers</code> property that stores an array of handlers for each event name, and it just adds it to the list.</li>
<li><code>.off(eventName, handler)</code>– removes the function from the handlers list.</li>
<li><code>.trigger(eventName, ...args)</code>– generates the event: all handlers from <code>_eventHandlers[eventName]</code> are called, with a list of arguments <code>...args</code>.</li></ul>
<p>Usage:</p>
<div>
<pre><code><span>// Make a class</span>
<span>class</span> <span>Menu</span> <span>{</span>
<span>choose</span><span>(</span><span>value</span><span>)</span> <span>{</span>
<span>this</span><span>.</span><span>trigger</span><span>(</span><span>"select"</span><span>,</span> value<span>)</span><span>;</span>
<span>}</span>
<span>}</span>
<span>// Add the mixin with event-related methods</span>
Object<span>.</span><span>assign</span><span>(</span><span>Menu</span><span>.</span>prototype<span>,</span> eventMixin<span>)</span><span>;</span>
<span>let</span> menu <span>=</span> <span>new</span> <span>Menu</span><span>(</span><span>)</span><span>;</span>
<span>// add a handler, to be called on selection:</span>
<em>menu<span>.</span><span>on</span><span>(</span><span>"select"</span><span>,</span> <span>value</span> <span>=></span> <span>alert</span><span>(</span><span><span>`</span><span>Value selected: </span><span><span>${</span>value<span>}</span></span><span>`</span></span><span>)</span><span>)</span><span>;</span></em>
<span>// triggers the event => the handler above runs and shows:</span>
<span>// Value selected: 123</span>
menu<span>.</span><span>choose</span><span>(</span><span>"123"</span><span>)</span><span>;</span></code></pre></div>
<p>Now, if we’d like any code to react to a menu selection, we can listen for it with <code>menu.on(...)</code>.</p>
<p>And <code>eventMixin</code> mixin makes it easy to add such behavior to as many classes as we’d like, without interfering with the inheritance chain.</p>
<h2><a href="about:reader?url=https%3A%2F%2Fjavascript.info%2Fmixins#summary" name="summary">Summary</a></h2>
<p><em>Mixin</em> – is a generic object-oriented programming term: a class that contains methods for other classes.</p>
<p>Some other languages allow multiple inheritance. JavaScript does not support multiple inheritance, but mixins can be implemented by copying methods into prototype.</p>
<p>We can use mixins as a way to augment a class by adding multiple behaviors, like event-handling as we have seen above.</p>
<p>Mixins may become a point of conflict if they accidentally overwrite existing class methods. So generally one should think well about the naming methods of a mixin, to minimize the probability of that happening.</p></div></div></div></div>
<div> </div></div>
<p>In 2021, <a href="http://uis.unesco.org/en/topic/literacy#:~:text=Despite%20the%20steady%20rise%20in,most%20of%20whom%20are%20women." rel="noopener nofollow">0.8</a> billion adults worldwide are illiterate <span style="background-color:Yellow">and <a href="https://www.independence.edu/blog/who-in-the-world-holds-a-college-degree#:~:text=Higher%20Education%20in%20the%20World%20vs.&text=Only%206.7%25%20of%20the%20world%20population%20has%20a%20Bachelor's%20degree.&text=But%20that's%20worldwide%3B%20the%20number,college%20degree%20in%20the%20USA%3F" rel="noopener nofollow">7.4</a> billion people don’t have a Bachelor’s degree</span>. These people are also poor. People in the bottom 50% of income have only <a href="https://www.gfmag.com/global-data/economic-data/wealth-distribution-income-inequality" rel="noopener nofollow">12–13%</a> of the world’s wealth.</p>
<p><span style="background-color:Yellow">Making education plainly cheaper is a huge opportunity. </span>And it is not only relevant to the poorest of the world. Education is expensive also for the people in the top 10% of wealth distribution.</p>
<p>Source: {{!!source}}</p>
<p><a href="https://coryrylan.com/blog/javascript-module-pattern-basics#:~:text=The%20Module%20Pattern%20is%20one,for%20services%20and%20testing/TDD.">coryrylan.com</a></p>
<h1>JavaScript Module Pattern Basics</h1>
<p>4 - 5 minutes</p>
<hr />
<p>The Module Pattern is one of the most common design patterns used in JavaScript and for good reason. The module pattern is easy to use and creates encapsulation of our code. Modules are commonly used as singleton style objects where only one instance exists. The Module Pattern is great for services and testing/TDD. There are many different variations of the module pattern so for now I will be covering the basics and the Revealing Module Pattern in ES5.</p>
<p>Something to note, the next version of JavaScript ES6 has a new specification for asynchronous module loading. You can use the module patterns that will be covered with the new ES6 module loading syntax.</p>
<h2>Creating a module</h2>
<p>First we start using a anonymous closure. Anonymous closures are just functions that wrap our code and create an enclosed scope around it. Closures help keep any state or privacy within that function. Closures are one of the best and most powerful features of JavaScript.</p>
<pre><code>(function() {
'use strict';
})();
</code></pre>
<p>This pattern is well known as a <strong>Immediately Invoked Function Expression</strong> or IIFE. The function is evaluated then immediately invoked. Its also a good practice to run your modules in ES5 strict mode. Strict mode will protect you from some of the more dangerous parts in JavaScript.</p>
<h2>Exporting our module</h2>
<p>Next we will want to export our module. This basically assigns the module to a variable that we can use to call our modules methods.</p>
<pre><code>var myModule = (function() {
'use strict';
})();
</code></pre>
<p>Next lets create a public method for our module to call. To expose this method to code outside our module we return an <code>Object</code> with the methods defined. <a href="https://webcomponent.dev/" rel="noopener" target="_blank"> </a></p>
<p><a href="https://webcomponent.dev/" rel="noopener" target="_blank"><img alt="Web Component Essentials Course and Book" src="https://coryrylan.com/assets/images/books/web-components-and-frameworks-small.png" /> </a></p>
<h3><a href="https://webcomponent.dev/" rel="noopener" target="_blank">Web Component Essentials </a></h3>
<p><a href="https://webcomponent.dev/" rel="noopener" target="_blank">Save development time, improve product consistency and ship everywhere. With this new Course and E-Book learn how to build UI components that <strong>work in any JavaScript framework</strong> such as <strong>Angular</strong>, <strong>Vue</strong>, <strong>React</strong>, and more! </a></p>
<p><a href="https://webcomponent.dev/" rel="noopener" target="_blank">Start building now! </a></p>
<p> </p>
<pre><code>var myModule = (function() {
'use strict';
return {
publicMethod: function() {
console.log('Hello World!');
}
};
})();
myModule.publicMethod();
</code></pre>
<h2>Private methods & properties</h2>
<p>JavaScript does not have a private keyword by default but using closures we can create private methods and private state.</p>
<pre><code>var myModule = (function() {
'use strict';
var _privateProperty = 'Hello World';
function _privateMethod() {
console.log(_privateProperty);
}
return {
publicMethod: function() {
_privateMethod();
}
};
})();
myModule.publicMethod();
console.log(myModule._privateProperty);
myModule._privateMethod();
</code></pre>
<p>Because our private properties are not returned they are not available outside of out module. Only our public method has given us access to our private methods. This gives us ability to create private state and encapsulation within our code.</p>
<p>You may have noticed the <code>_</code> before our private methods and properties. Because JavaScript does not have a private keyword its common to prefix private properties with an underscore.</p>
<h2>Revealing Module Pattern</h2>
<p>The Revealing Module Pattern is one of the most popular ways of creating modules. Using the return statement we can return a object literal that ‘reveals’ only the methods or properties we want to be publicly available.</p>
<pre><code>var myModule = (function() {
'use strict';
var _privateProperty = 'Hello World';
var publicProperty = 'I am a public property';
function _privateMethod() {
console.log(_privateProperty);
}
function publicMethod() {
_privateMethod();
}
return {
publicMethod: publicMethod,
publicProperty: publicProperty
};
})();
myModule.publicMethod();
console.log(myModule.publicProperty);
console.log(myModule._privateProperty);
myModule._privateMethod();
</code></pre>
<p>The benefit to the Revealing Module Pattern is that we can look at the bottom of our modules and quickly see what is publicly available for use.</p>
<p>The Module Pattern is not a silver bullet for adding code re-usability to your JavaScript. Using the Module Pattern with <a href="https://coryrylan.com/blog/javascript-prototypal-inheritance">Prototypal Inheritance</a> or <a href="https://coryrylan.com/blog/javascript-es6-class-syntax">ES6 Classes</a> can give you a wide range of design patterns with varying pros and cons.</p>
\define describe() {{$:/language/Docs/ModuleTypes/$(type)$}}
The `module-type` field of a [[JavaScript module|Modules]] is a string that identifies the type of the module. Here is a list of the module types used in this wiki:
<dl>
<$list filter="[moduletypes[]]">
<dt>{{!!title}}</dt>
<$set name=type value=<<currentTiddler>>>
<dd><<describe>></dd>
</$set>
</$list>
</dl>
//[[Zero to One|https://drive.google.com/file/d/0B7Y3fyJBbo7-SGhlbmdDOVo0aHM/view?usp=sharing&resourcekey=0-tztce4Hz9bxt2Y6pmbBo-g]]: Notes on Startups, or How to Build the Future is a 2014 book by the American entrepreneur and investor Peter Thiel co-written with Blake Masters.//
__What do we mean by monopoly?__
A monopoly as presented in this book is a company that dominates a small market that then grows in lockstep with it, excluding any competition along the way who wouldn't be able to meet the needs of such a small, unanticipated market.
__Why is a monopoly better than competition?__
Because competition in a large market leads to very small profit margins (compare 37 cents per trip for an airline vs Google's revenue for a search)
__What are the characteristics of a monopoly?__
# Proprietary technology: your technology must be 10x better than the alternative. You can either build something new, or you can radically improve an existing alternative.
# Network effects: Network effects can be powerful, but you’ll never reap them unless your product is valuable to its very first users when the network is necessarily small.
# Economies of scale: A monopoly business gets stronger as it gets bigger: the fixed costs of creating a product (engineering, management, office space) can be spread out over ever greater quantities of sales. Software startups can enjoy especially dramatic economies of scale because the marginal cost of producing another copy of the product is close to zero.
# Branding: own your identity completely; reinforce and guard it. Apple is a good example of branding. However, do not focus on this first before working on your core business.
__Some key advice__
# Start small: target a small market; dominate it completely and it will grow with you in lockstep. For example, Paypal; it was easier for them to reach a few thousand eBay "power sellers" who really needed their product than to try to compete for the attention of millions of scattered individuals. DO NOT GO AFTER BIG MARKETS that are already being served by bigger folks.
# Scale up after you have dominated a niche market into other related and slightly broader markets, like Amazon did as they graduated from books to CDs, video and software.
# Don't disrupt: avoid competition as much as possible.
Always ask yourself: what is the billion dollar company that no one is building?
Moving stuff in Tanzania is a pain. Why can't we have a last mile logistics app?
Moving the navbar to the bottom will provide better user experience on mobile because everything is within the reach of a person's thumb. It's interesting that this is more common in mobile apps than in web apps. Perhaps because of an unhealthy bias towards desktop among web devs?
This pattern does raise a couple of questions on how we will arrange menu items. Here's an article that explores possible arrangements for this pattern: https://www.smashingmagazine.com/2019/08/bottom-navigation-pattern-mobile-web-pages/
We could design our navbar with [[glassmorphism|https://glassmorphism.com/]]. {{Firefox glassmorphism backdrop-filter workaround}}
''Addendum'': I've decided that the menu items will remain at the top on desktop, and when activating the app, the background will collapse into a bottom navbar.
On mobile, the menu items will collapse to a...
* Wikis need to be updated and maintained
* Yet another software to use (user burden)
* Not really part of the routine for most people (email or chat channels usually are)
On this note, we do have a [[means of encrypting data in pouchdb|https://github.com/calvinmetcalf/crypto-pouch]]
We could implement multiple saving solutions for users that work independently of Maarfapad (giving Maarfapad an excuse to become a defacto plugin for TW5 😈). It could use something like [[BrowserFS v2.0.0-beta]] to implement these save strategies.
A challenge would be how to serve these files. We could somehow find a way to implement this with service workers. Time to research stuff! 😁
https://www.youtube.com/watch?v=dpV5BVnvuoI
A gridded layout for TiddlyWiki5
https://burningtreec.github.io/tiddlywiki-muuri/
<div>Some basic differences can be written in short:</div>
<div>
<p><strong>MVC:</strong></p>
<p>Traditional MVC is where there is a</p>
<ol>
<li>Model (database): Acts as the model for data</li>
<li>View (client) : Deals with the view to the user which can be the UI</li>
<li>Controller (server): Controls the interaction between Model and View, <strong>where view calls the controller to update model</strong>. View can call multiple controllers if needed.</li></ol>
<p>Use in situations where the connection between the view and the rest of the program is not always available (and you can’t effectively employ MVVM or MVP). This clearly describes the situation where a web API is separated from the data sent to the client browsers. Microsoft’s ASP.NET MVC is a great tool for managing such situations and provides a very clear MVC framework</p>
<p><strong>MVP:</strong></p>
<p>Similar to traditional MVC but Controller is replaced by Presenter. <strong>But the Presenter, unlike Controller is responsible for changing the view as well. The view usually does not call the presenter</strong>, but merely routes user commands to the presenter to act upon that data .</p>
<p>Use in situations where binding via a datacontext is not possible. Windows Forms is a perfect example of this. In order to separate the view from the model, a presenter is needed. Since the view cannot directly bind to the presenter, information must be passed to the view via an interface (IView).</p>
<p><strong>MVVM</strong></p>
<p>The difference here is the presence of View Model. It is kind of an implementation of Observer Design Pattern, where changes in the model are represented in the view as well, by the VM. Eg: If a slider is changed, not only the model is updated but the data which may be a text, that is displayed in the view is updated as well. So there is a two-way data binding. e.g Knockoutjs apps, ~TiddlyWiki</p>
<p>Use in situations where binding via a datacontext is possible. Why? The various IView interfaces for each view are removed which means less code to maintain. Some examples where MVVM is possible include WPF and javascript projects using Knockout.</p></div>
__Attendees__
* Ben
* Brayson
* Frank
* Abraham
[[References this mvp tree|Building MVP for CRDB and NMB]]
__Long-term goal__
To build a BI platform that provides insights for corporations faster and cheaper
__Sprint questions__
# Can we build this platform?
# Can we sell this platform?
# Can we compete against other BI platforms?
# Can we validate our customer archetype?
# Can we get a BI champion to buy our platform?
__HMW__
# ''Development'': How might we understand our customer data strategies?
# ''Deployment'': How might we deliver insights to customers?
# ''Integration'': How might we integrate AI/data analysis?
# ''Business strategies'': How might we get connections to the champions?
# ''Security and compliance'': How might we ensure data security between our platform and banking database?
# ''Sales'': How might we demonstrate value of our BI platform to banks?
# ''Testing'': How might we obtain baseline data to validate out platform effectiveness?
<iframe src="//www.slideshare.net/slideshow/embed_code/key/G8dz7YBmPVZijK" width="100%" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/sblank/mvp-tree" title="MVP Tree" target="_blank">MVP Tree</a> </strong> from <strong><a href="https://www.slideshare.net/sblank" target="_blank">Steve Blank</a></strong> </div>
Now if you can name the relations, that allows you to
# create shorter notes and push more information into the edges and
# it makes the graph into a true "mind map".
When you can't name relations, you're forced to make "nodes" for Topics or Tags. And this is where the difficulty comes in with "where do I put this?" Not only that but you're forced to write notes for basic concepts like "programming language" and then you find yourself re-making wikipedia altogether. It becomes absurd.
Options for making a native app for:
# Native mobile app: Probably going to stick with a PWA, then move on to perhaps ReactNative, NativeScript or even [[Jasonette]] when it is justifiable
# Desktop app: options include:-
## [[Electronjs|https://www.electronjs.org/]]
## [[Neutralinojs|https://neutralino.js.org/]], claims to be less bloated than Electronjs and [[NWjs|https://nwjs.io/]]
## [[Tauri apps|https://tauri.studio/en/]], which claims to result in small apps that are fast and secure.
## NWjs, which seems difficult to use and bloated
Criteria for choosing:
# Startup time should be relatively fast
# Simple and mature API with little in terms of dependencies
# User friendly; it should not require much fiddling with
What if we could represent graphs of knowledge, i.e. linked pages with ~~an infinitely long breadcrumb trails~~ an edge visualizer. You could switch between ~~trails~~ nodes using ~~cross-links to other trails~~ this visualizer ([[like so|Graph node edge visualizer in Codex OS]]).
This would be far more useful than a graph explorer. It would be akin to exploring [[Memex Trails]].
As explained [[here|Example of Beta app sign up design]], though we have a lot of engineers wanting a knowledge management solution or something similar, we still need to further understand their exact needs. That will be the main focus for our next contact with the early sign ups.
The network effect originated in the early 20th century, with the advent of the telephone. Theodore Vail, the first post-patent president of Bell Telephone, used the network effect to argue why Bell Telephone should have a monopoly on telephone networks. Later Robert Metcalfe, the creator of Ethernet, helped to popularize the idea by introducing Metcalfe's law, which states that the value of a telecommunications network is proportional to the square of the number of connected users of the system.
#### Build your own `Network Stack`
* [**C**: _Beej's Guide to Network Programming_](http://beej.us/guide/bgnet/html/multi/index.html)
* [**C**: _Let's code a TCP/IP stack_](http://www.saminiir.com/lets-code-tcp-ip-stack-1-ethernet-arp/)
* [**Ruby**: _How to build a network stack in Ruby_](https://medium.com/geckoboard-under-the-hood/how-to-build-a-network-stack-in-ruby-f73aeb1b661b)
#### Build your own `Neural Network`
* [**C#**: _Neural Network OCR_](https://www.codeproject.com/Articles/11285/Neural-Network-OCR)
* [**Go**: _Build a multilayer perceptron with Golang_](https://made2591.github.io/posts/neuralnetwork)
* [**Go**: _How to build a simple artificial neural network with Go_](https://sausheong.github.io/posts/how-to-build-a-simple-artificial-neural-network-with-go/)
* [**Go**: _Building a Neural Net from Scratch in Go_](https://www.datadan.io/building-a-neural-net-from-scratch-in-go/)
* [**Java**: _Neural Networks: Perceptron_](https://www.youtube.com/watch?v=ntKn5TPHHAk&feature=youtu.be) [video]
* [**JavaScript**: _Neural Network implementation in JavaScript, by an example_](https://franpapers.com/en/machine-learning-ai-en/2017-neural-network-implementation-in-javascript-by-an-example/)
* [**JavaScript**: _Neural networks from scratch for JavaScript linguists (Part1 — The Perceptron)_](https://hackernoon.com/neural-networks-from-scratch-for-javascript-linguists-part1-the-perceptron-632a4d1fbad2)
* [**JavaScript**: _You can build a neural network in JavaScript even if you don’t really understand neural networks_](https://itnext.io/you-can-build-a-neural-network-in-javascript-even-if-you-dont-really-understand-neural-networks-e63e12713a3)
* [**JavaScript**: _How to create a Neural Network in JavaScript in only 30 lines of code_](https://medium.freecodecamp.org/how-to-create-a-neural-network-in-javascript-in-only-30-lines-of-code-343dafc50d49)
* [**Python**: _Optical Character Recognition (OCR)_](http://aosabook.org/en/500L/optical-character-recognition-ocr.html)
* [**Python**: _A Neural Network in 11 lines of Python_](https://iamtrask.github.io/2015/07/12/basic-python-network/)
* coined by Bmann
* Distinguishes told for thought from mere word processors
* Also, does workflow inform tool design or vice versa?
<p>This new generation of wiki innovates by: 1. [[federated sharing]], 2. drag refactoring and 3. data visualization.<br />
<br />
What does this mean in practical terms? <br />
<br />
This new wiki can handle data and perform calculations. (Say, for totaling up costs, or sustainability scores.) You can also use it to put together your own simple calculator (or even a complex one). That allows it to make quick but powerful comparisons -- say, on costs, or on sustainability "externalities" (hidden costs and benefits).<br />
<br />
Most important, you can share and develop your own wiki tools with others, through the web, and -- through what is known as "federation" -- the tools can grow to be much more powerful and useful over time. (Wikipedia is the best-known example of this collaborative development, using an older form of open-source development -- but there are many others.)<br />
<br />
{{Wiki as a Pattern Language}}<br />
<br />
To see a 10-minute video about the new wiki: <a href="https://www.youtube.com/watch?v=d6pX0S34CZk" style="font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;" target="_blank">https://www.youtube.com/watch?v=d6pX0S34CZk</a><br />
<br />
To go to the Github development site: <a href="http://github.com/fedwiki" style="font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;" target="_blank">github.com/fedwiki</a><br />
<br />
Ward Cunningham's notes from his talk at the Splash Conference (previously OOPSLA) in Portland in October 2014:<br />
<br />
<a href="http://splash.fed.wiki.org/view/welcome-visitors/view/splash-2014/view/federated-wiki-design-principles" style="font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;" target="_blank">http://splash.fed.wiki.org/view/welcome-visitors/view/splash-2014/view/federated-wiki-design-principles</a><br />
<br />
Here are notes from his approach to the presentation:<br />
<br />
<a href="http://splash.fed.wiki.org/view/welcome-visitors/view/ward-cunningham/view/wikis-open-history" style="font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;" target="_blank">http://splash.fed.wiki.org/view/welcome-visitors/view/ward-cunningham/view/wikis-open-history</a></p>
* Completed from Faircode license to MPL-2.0 in commit 9ebc290f9d0f69b146c4eb794f3bfde7efb293b5 on master branch.
* Started move from Faircode license in commit 428c0687aa8faff3e495ab9f9863352783828c00 on master branch
\define tag() [[$(currentTiddler)$]]
\define title() $(currentTiddler)$ Canvas
\define filter()
[prefix[$(currentTiddler)$]] [prefix[$(currentTiddler)$]tagging[]] [canvas[$(currentTiddler)$]] [project[$(currentTiddler)$]]
\end
\define state-tiddler() $:/state/$(currentTiddler)$
\define big-red-delete-button()
<$button class="danger-delete-btn" to="Overview">
<$action-sendmessage $message="tm-notify" $param="deletion-notification" />
<$action-deletetiddler $filter=<<filter>>/>
Yes, Delete Project
</$button>
\end
<$button tooltip="Go to Lean Projects Overview" to="Overview">
{{$:/core/images/left-arrow}}
Back to Lean Projects Overview
</$button>
<$button tooltip="Create New Lean Canvas">
<$action-createtiddler $basetitle=<<title>> tags=<<tag>> text="{{||canvas-template}}" project=<<currentTiddler>> />
<$action-sendmessage $message="tm-notify" $param="create-canvas-notify" />
<$list filter="[<tv-config-toolbar-icons>match[yes]]">
{{create-canvas-icon.svg}} Create New Lean Canvas
</$list>
</$button>
<$button tooltip="Delete Project" popup=<<state-tiddler>> setTo="open">
{{$:/core/images/delete-button}}
Delete this Project
</$button>
<$reveal type="popup" state=<<state-tiddler>>>
<div class="tc-drop-down">
<p>''Are you sure you want to delete this project?''</p>
<p>''This operation is irreversible!''</p>
<<big-red-delete-button>>
</div>
</$reveal>
!!! ''__<<currentTiddler>> canvases__''
!!!!! Sorted by oldest
<<list-links [tag<currentTiddler>sort[created]]>>
Structure of Innovator's Digest
|!First section |Introduce week's theme|
|!Second section |Interesting Links |
|!Third section |Thematic CTA |
|!Fourth section |Motivational quote |
|!Fifth section |Have a suggestion? Email us at inovationpeer@gmail.com |
<<list-links "[tag[News Letter]!sort[title]]">>
An NLP library for building bots, with entity extraction, sentiment analysis, automatic language identify, and so more
link: https://github.com/axa-group/nlp.js
<div class="tc-table-of-contents">
<<toc-selective-expandable 'NMB'>>
</div>
Through __innovative distribution__ and its extensive branch network, NMB offers __affordable and customer focused financial services__ to the Tanzanian community, in order to realize __sustainable benefits__ for all its stakeholders.
A notes based workflow for teams to augment synchronous and semi-synchronous communication channels and promote knowledge sharing and knowledgebase creation naturally:
__Rationale__
Real-time communication channels and email can be messy and do not allow for knowledge building. We could instead augment them with an asynchronous channel that forces real-time communication to be condensed into something more manageable for individuals teammates to consume, recall and track without being overwhelmed.
__Solution__
* Replace often disjointed, duplicated and unorganized emails between teams with shared notes/books where one can scribble questions and answers and assign trackable, measurable tasks to one another.
* However, because these are notes/books, there can be imposed limitations on how many questions and tasks one can be assigned at a time. Only perhaps in emergencies administered by a leader can these limitations be overridden.
* This way, the questions and answers can be organized into an emergent, coherent knowledgebase that is free of duplications and can be referenced programmatically
* Tasks can be easily tracked, triaged, remembered and checked in with
* Maybe we can add in a calendar functionality for consensus building on events
Gripping stories need to engage the reader from the get go. So I think for this opening chapter, we should take a more direct approach and introduce the reader to a hair raising moment.
Some scenarios I was thinking of:
# Our protagonist wakes suddenly from a deep sleep at her house, as if she had been asleep for ages. She finds her elder siblings missing, while her mother nurses her ailing father who was mysteriously injured somehow. All communications are down. There is no power. The surrounding overgrown forest is silent and the air is still and oppressive. But our protagonist could swear that only yesterday, everything was seemingly normal, and everyone in the house was happy.
# Our protagonist is out with her father coming back from the market with supplies. They're in a car talking. She talks to him about the book she's reading called 'The Odyssey'. It's an abridged version for children her age. They talk about Scylla and Charybdis, and what it entails. We learn about the father's literary astuteness and Aika's intense curiosity that he nurtures. We also catch glimpses about the tension within the family, in particular regarding Aika's mother and some of the siblings who are close to her. Then when they arrive at the house, they find no one. Then while searching, they're both overcome by a heaviness that makes them lose consciousness.
I will take the second one because it gives me time to flesh out this father daughter relationship early before later contrasting it with the other siblings and the mother.
Continuing with this scenario, we follow them to the family estate. But, along the way, they see a mysterious person lurking outside the gate. When they approach to see what is wrong, the person stares and bolts into the bush. This causes George to become worried and put everyone on alert inside. He telephones his neighbor about seeing such a person. We can add something to this worry, like the father seeing a symbol or something else.
We will discover that George is on paid leave due to some work-related issues. We begin to understand the nature of his work at a private research facility higher up the mountain.
We could also ramp up the tension by adding some evidence of stalking in the area by bizarre people that escalates into a wider problem. His telephoning the neighbors puts the whole street on alert. ~~Then we reveal at night the distant blast, the desperate phone call and the deep sleep.~~
* 17 more CRP kits coming in. Will need TMDA permits
* About SOPs for the CRP kits:
** Yasir says "YN: use SOPs which are given with the machine. ''Wherever you feel you need site-specific SOPs please draft and share with us.''"
* Concerning IF baby died before even we reached 48 hours, not yet enrolled, do we finish the 1.7.1 section and close?
** Yasir says "Yes"
* Notion - currently using but so. slow. and no offline mode is terrible.
* ~OneNote - too 'app' heavy, some loved it, I never got into it.
* Evernote - My first love, but linking pages was terrible.
* Apple Notes - use it every day, but move stuff out of it when I want to store and organize
* Coda - Felt too heavy for personal use, interesting business options
* Bear - Evernote front end, can't stand the exposed Markdown
* ~SimpleNote - Evernote front end, nice used it for a while cause it was faster, but suffers from the Evernote linking issue.
* Roam - Love the note linking features, hard to get used to.
[[Source|https://www.producthunt.com/discussions/what-s-your-fav-note-taking-tool?comment=1690043#:~:text=Notion%20%2D%20currently%20using,get%20used%20to.]]
My needs are: -fast and light, -''sync between mobile and desktop'', -''offline mode'', -''linking between documents'', -''don't need markdown'',
[[Source|https://www.producthunt.com/discussions/what-s-your-fav-note-taking-tool?comment=1690043#:~:text=My%20needs%20are%3A%20%2Dfast%20and%20light%2C%20%2Dsync%20between%20mobile%20and%20desktop%2C%20%2Doffline%20mode%2C%20%2Dlinking%20between%20documents%2C%20%2Ddon%27t%20need%20markdown%2C]]
Noticing from this [[HN thread|https://news.ycombinator.com/item?id=30320977]]:
# Folks try to use a lot of [[tools for thought]] for everything, but fail make it work
# Most folks want a note-taking tool that doesn't distract with //meta tasks//. E.g. [[this guy over at HN|https://news.ycombinator.com/item?id=30320977#:~:text=As%20someone%20quite%20deeply%20into%20the%20%22tools%20for%20thought%22%20thing...%20I%20hardly%20ever%20worry%20about%20the%20meta%2Dtask.]] when he talks about [[Zim|https://zim-wiki.org/]]
# There's the question of the necessity of [[reviewing notes|The opportunity cost of writing for knowledge rediscovery]]
# Relations in graphs may only have value if you can have [[named relations|Named relations]].
In line with the ideas in [[Intranet-as-a-service, but for Ad hoc networks]], this might be related with the idea of creating ad hoc intranets by [[bringing different client systems and software that workers might favor to work|Bring Your Own Client]] in order to reduce costs and stress on the IT dept.
Addendum: from reading the article on [[Bring Your Own Client]], there seems to be an unmet need present: decoupling collaboration logic from frontend client editors.
After reading more about [[Bricolage-based systems]], we could could synthesize a new term: Bring Your Own Editable Client
<<<
Nothing in life is to be feared, it is only to be understood. Now is the time to understand more, so that we may fear less.
- Marie Curie
<<<
Just got an email from Notion announcing the release of Notion 2.8. I must say I am impressed. They've given unlimited number of content blocks for all their personal users so that's interesting. It's something we have to note.
On top of that, they've improved their invitation to edit system. Now a user doesn't have to enter email addresses of people to invite them to edit.
They've also improved startup times for their iOS and Android apps, so that's good. It means they're paying attention to user feedback.
They continue to also offer tips and videos on how to use their product. I on the other hand want to somewhat invert that model. But I have no idea whether that will help in terms of revenue. This is similar to Red hats' business model. but I have no idea whether it will work in real life TiddlyWiki.
More importantly, how do I address the question of achieving collaboration without charging people. So far that's the most pressing problem in my mind.
{{Notion's philosophy}}
Reading list:
# [[Notion's design|https://www.figma.com/blog/design-on-a-deadline-how-notion-pulled-itself-back-from-the-brink-of-failure/]]
# [[Notion's features|https://medium.com/keep-productive/why-notion-isnt-a-replacement-yet-652368bb23ea]]
<<<
He and Simon set out to rebuild Notion from scratch, keeping the same mission: Give non-techies the ability to make their own tools without writing code. They wanted people to customize technology to solve their own problems.
<<<
[[Source |https://www.figma.com/blog/design-on-a-deadline-how-notion-pulled-itself-back-from-the-brink-of-failure/]]
But initially, the product didn't click with people. Why? And what did they do to turn it around?
According to this article by [[usefyi|https://usefyi.com/notion-history/]], Notion was initially conceived and designed as a "no code" app programming environment like Airtable. The year that happened, 2015, was the peak of the bootcamp movement. But nobody wanted this tool.
But there was more to this than just demand:
<<<
However, the biggest issue with the original product wasn’t necessarily that there was no demand for another no-code product—though that was a factor. The biggest issue was that Zhao and his co-founder, Simon Last, had built the product using a tech stack that couldn’t possibly scale. Stability was a major problem and the product crashed frequently.
<<<
So, they moved cities and started to rebuild Notion. In the process, Ivan Zhao noticed something:
<<<
To Zhao, very little had changed since the days when IBM mainframes occupied entire rooms and filing cabinets were the preferred means of information storage. Rather than combining the tools we use every day, Zhao observed that software companies had merely created digital versions of legacy systems. This antiquated perception of work itself had created a fractured mess of apps, tools, workspaces, and file systems—none of which seemed to interact well with one another.
During development of their original product, Zhao and Last had collaborated extensively using Figma, a collaborative design and prototyping tool. Although Figma allowed Zhao and Last to design, code, and collaborate on their project, they still had to rely on a multitude of tools to get their work done. This gave Zhao an idea—what if there were a single tool that could do practically everything people needed to work together?
This is what Zhao and Last would offer the world.
<<<
They also have a good onboarding experience, asking the user what best describes themselves before committing them to a particular template.
<<<
Notion had carefully optimized its onboarding flow throughout the product’s development. Users were guided through setting up an account based on the use-cases that best described the user’s job role and which tasks were most important to them. Each feature was explained clearly, as was how users could navigate between Notion’s various templates.
<<<
Not to mention the smart integration and migration tools. Their slack integration is also key.
But they also put a lot of value in their iterative design approach. They create many versions of a single action until they've got it right. And they keep these versions for future employees to study and learn from. They value institutional knowledge.
keithcirkel.co.uk
How to Use npm as a Build Tool
24-30 minutes
Update: I frequently get asked, considering this post is now years old, whether or not I still stand by the advice in this post, and whether new developers should use npm as a build tool. The advice still stands, and I believe developers should use npm as a build tool. Myself; I’ve been Gulp & Grunt free since 2013™. Should I ever change my stance on this, I will immediately update this post.
Last month I noted my opinions on why we should stop using Grunt, Gulp et al. I suggested we should start using npm instead. npm’s scripts directive can do everything that these build tools can, more succinctly, more elegantly, with less package dependencies and less maintainence overhead. The first draft of the original post was way over 6,000 words - because it went in depth into how npm could be used as an alternative, but I removed it for brevity - and because the point of that post was me expressing opinions, not a tutorial post. However, the response was pretty overwhelming - many people replied telling me that these build tools offers them features that npm cannot (or does not), some developers were brazen enough to present me with a Gruntfile and say “how could this be done in npm?!”. I thought I’d pull out how-tos from the original draft and make a new post, just focussing on how to do these common tasks with npm.
npm is a fantastic tool that offers much more than meets the eye. It has become the backbone of the Node.js community - many, including me, use it pretty much every day. In fact, looking at my Bash History (well, Fish history) npm is second only to git as my most used command. Still, I find new features in npm every day (and of course, new ones are still being developed!). Most of these aim at making npm a great package manager, but npm has a great subset of functionality decidated to running tasks to facilitate in a packages lifecycle - in other words, it is a great tool for build scripts.
npm Scripts
Firstly, we need to figure out how npm can manage our build scripts. As part of npm’s core, it has the npm run-script command (npm run for short). This command dives into your package.json and pulls out the scripts Object. The first argument passed to npm run refers to a property in the scripts object - it will execute the property’s value as a command in the operating systems default shell (usually Bash, except on Windows - but we’ll get to that later). So let’s say you have a package.json config that looks like this:
{
"name": "myproject",
"devDependencies": {
"jshint": "latest",
"browserify": "latest",
"mocha": "latest"
},
"scripts": {
"lint": "jshint **.js",
"test": "mocha test/"
}
}
If you run npm run lint - npm will spawn a shell and run jshint **.js. If you run npm run test, npm will spawn a shell and run mocha test/. The shell environment has your node_modules/.bin folder added to the PATH which means any of the dependencies you have that install binaries will be runnable directly - in other words, no need to put "./node_modules/.bin/jshint **.js" or "$(npm bin)/jshint **.js". If you run npm run without any arguments it gives you a list of the available commands to run, like so:
Available scripts in the user-service package:
lint
jshint **.js
test
mocha test/
The npm run shell environment provides lots of helpful features to make sure your scripts are as succinct as they can be. For example the shell’s PATH has your ./node_modules/.bin/ folder inside of it, meaning any dependencies you install which have binaries can be called directly from a scripts shell. Also, there’s a whole slew of super convenient environment variables that npm exposes, such as the currently running task, the package name and version, npm loglevel, and so on. Find them all out by making a script that runs env, and running it, like so:
"scripts": {
"env": "env"
}
Shortcut scripts
npm also provides a few convinient shortcuts. The npm test, npm start, npm stop commands are all shortcuts for their run equivalents, e.g. npm test is just a shortcut for npm run test. These shortcuts are useful for 2 reasons:
These are common tasks that most projects will use, and so it’s nice to not have to type as much each time.
Much more importanlty - it provides a standard interface within npm for testing, starting and stopping a package. Many CI tools, such as Travis, take advantage of this behaviour by making the default command for a Node.js project npm test. It also makes introducing new developers to your project a breeze, if they know they can simply run scripts like npm test without ever having to read any docs.
Pre and Post Hooks
Another cool feature about npm is that any script that can be executed also has a set of pre- and post- hooks, which are simply definable in the scripts object. For example, if you execute npm run lint, despite npm having no preconceived idea of what the lint task is, it will immediately run npm run prelint, followed by npm run lint, followed by npm run postlint. The same is true for any command, including npm test (npm run pretest, npm run test, npm run posttest). The pre and post scripts are also exit-code-sensitive, meaning if your pretest script exits with a non-zero exit code, then NPM will immediately stop, and not run the test and posttest scripts. You can’t pre- a pre- script though, so prepretest gets ignored. npm also runs the pre- and post- hooks for a few internal commands: install , uninstall, publish, update. You can’t override the behaviours for the internal commands - but you can affect their behaviour with pre- and post- scripts. This means you can do cool stuff like:
"scripts": {
"lint": "jshint **.js",
"build": "browserify index.js > myproject.min.js",
"test": "mocha test/",
"prepublish": "npm run build # also runs npm run prebuild",
"prebuild": "npm run test # also runs npm run pretest",
"pretest": "npm run lint"
}
Passing Arguments
Another cool feature with npm (since npm 2.0.0, at least) is passing argument sets through to the underlying tools. This can be a little complex, but here’s an example:
"scripts": {
"test": "mocha test/",
"test:xunit": "npm run test -- --reporter xunit"
}
With this config, we can simply run npm run test - which runs mocha test/, but we can extend it with custom parameters with a -- prefix. For example npm run test -- anothertest.js will run mocha test/ anothertest.js, or more usefully npm run test -- --grep parser will expand to mocha test/ --grep parser (which runs only the tests with “parser” in the title). In the package.json we have test:xunit which effectively runs mocha test --reporter xunit. This setup can be incredibly useful for composing commands together for some advanced configurations.
NPM Config Variables
One last thing that is worth mentioning - npm has a config directive for your package.json. This lets you set arbitrary values which can be picked up as environment variables in your scripts. Here’s an example:
"name": "fooproject",
"config": {
"reporter": "xunit"
},
"scripts": {
"test": "mocha test/ --reporter $npm_package_config_reporter",
"test:dev": "npm run test --fooproject:reporter=spec"
}
Here, the config object has reporter property - set to 'xunit'. All config options are exposed as environment variables prefixed with npm_package_config_ (which, admittedly, does make the variable names a mouthful). In the above example, the npm run test command uses the $npm_package_config_reporter variable which gets expanded to mocha test/ --reporter xunit. This can get replaced in two convinient ways:
Just like the test:dev task, you can change the reporter config variable to spec - by using --fooproject:reporter. You’d replace fooproject with your project’s name, and reporter with the config variable to override.
They can also be overriden as part of a user’s config. By running npm config set fooproject:reporter spec - an entry in my ~/.npmrc appears (fooproject:reporter=spec) which is read at runtime, and overrides the npm_package_config_reporter variable, meaning that on my local machine, forever more, npm run test gets expanded to mocha test/ --reporter spec. I can remove my personalised setting for this using npm config delete fooproject:mocha_reporter. A good set up for this is to have some sensible defaults in your package.json - but your own customisations can be tucked away inside your own ~/.npmrc.
Now, if I’m totally honest I’m not in love with the way this works. While the setup seems trivial (having a "config" object in your JSON), trying to use them is seems too verbose and complicated. I would also like a simpler way to override package configs, without specifying the package’s name - it’d be awesome if standard conventions could come into place where I could set my favourite mocha reporter for all packages in my ./.npmrc.
The other downside to these configs is that they’re not very Windows friendly - Windows uses % for variable substitution, while bash uses $. They work fine if you use them within a Node.js script, but if anyone knows of a way to get them working in Windows via the shell commands, let me know!
The Windows Problem
Let’s get something out of the way before we progress. Because npm is reliant on the operating systems shell to run scripts commands, they can quickly become unportable. While Linux, Solaris, BSD and Mac OSX come preinstalled with Bash as the default shell, Windows does not. On Windows, npm will resort to using Windows command prompt for these things.
Frankly, this is less of a problem than it seems. A good chunk of syntax that works in Bash will also work in Windows command prompt the same way:
&& for chaining tasks
& for running tasks simaltaneously
< for inputting the contents (stdin) of a file to a command
> for redirecting output (stdout) of a command and dumping it to a file
| for redirecting output (stdout) of a command and sending it to another command
The biggest problems between the two is the availability and naming of commands (e.g. cp is COPY in Windows) and variables (Windows uses % for variables, Bash $). I feel like both of these are completely surmountable problems:
Rather than relying on built in commands, you could simply use alternatives - for example instead of using rm, use the npm rimraf package.
Rather than trying to use syntax that is not cross compatible, stick to just the above ones. You’d be surprised just how much you can get done with just &&, >, |, and <. Variables are for suckers anyway.
Ok, lets get to the brass tacks of this post. If we want to replace build tools like Grunt or Gulp, we need like-for-like replacements for plugins and features of these tools. I’ve taken the most popular tasks & paradigms from various projects, and questions from commenters of my last post and demonstrated how to do them in npm:
Using multiple files
I had a few people responding to my last post, saying the benefit of task runners is their ability to handle multiple files in tasks using file “globs” which look like *.js, *.min.css or assets/*/*. This feature was actually inspired from Bash, which in turn was inspired from the glob command from Unix in 1969. The shell will automatically look at a command line arguments such as *.js and expand the stars out as wildcards. Using two stars allows it to search recursively. If you’re on a Mac or Linux machine, try opening up your shell and playing with it (try something like ls *.js).
Now, the problem herein lies that, of course, the Windows command line does not have this functionality. Luckily, when given a command line argument like *.js - Windows passes it verbatum to the application, meaning that tool vendors can install compatibility libraries to give Windows glob like functionality. Many, many tools on npm do; the two most popular glob libraries, minimatch and glob, share 1500 dependents, including JSHint, JSCS, Mocha, Jade, Stylus, Node-Sass… the list goes on.
This means you can just use file globs within npm scripts, like so:
"devDependencies": {
"jshint": "latest"
},
"scripts": {
"lint": "jshint *.js"
}
Running multiple tasks
Grunt, Gulp etc all have the capability of tying multiple tasks up together to make one single task - typically useful for building or testing. With npm you have two options here - depending on which one is semantically the right fit. You can either use the pre- or post- hooks - which are a good fit if the task is a prerequisite thing (i.e concating js before minfiying it), or you can use the bash && operator - like so:
"devDependencies": {
"jshint": "latest",
"stylus": "latest",
"browserify": "latest"
},
"scripts": {
"lint": "jshint **",
"build:css": "stylus assets/styles/main.styl > dist/main.css",
"build:js": "browserify assets/scripts/main.js > dist/main.js",
"build": "npm run build:css && npm run build:js",
"prebuild:js": "npm run lint"
}
In the above example build will execute both build:css and build:js - but not before running the lint task. Using this pattern you can also run the build:css or build:js tasks separately, and build:js will also run lint beforehand. Tasks can be composed and chained like this as much as you like, and it is all Windows compatible.
Streaming to multiple tasks
One of Gulp’s biggest features is that it streams the output seamlessly from one task to the next (as opposed to Grunt which constantly dips in and out of the filesystem). Bash and the Windows command line have the pipe operator (|), which can stream one command’s output (stdout) and send it to another command’s input (stdin). Let’s say you want to run all of your CSS first through Autoprefixer, then CSSMin, then output to a file (using the > operator, which outputs stdout to a given file):
"devDependencies": {
"autoprefixer": "latest",
"cssmin": "latest"
},
"scripts": {
"build:css": "autoprefixer -b 'last 2 versions' < assets/styles/main.css | cssmin > dist/main.css"
}
As you can see autoprefixer adds the CSS vendor prefixes to our CSS, which is then piped to cssmin which minifies the output - then the whole thing gets dumped into dist/main.css. Most good tools will support stdin and stdout and the above code is fully compatible with Windows, Mac and Linux.
Version Bumping
Version bumping is a popular Grunt or Gulp task. Effectively it increments the version number up by one inside the package.json, makes a git commit, and tags said commit.
This actually comes baked into npm (it is a package manager after all). Simply run npm version patch to increment the patch number (e.g. 1.1.1 -> 1.1.2), npm version minor to increment the minor version number (e.g. 1.1.1 -> 1.2.0) or npm version major (e.g. 1.1.1 -> 2.0.0). It’ll commit and tag up your package for you, all that is left is to git push and npm publish.
This can be fully customised too. For example, if you don’t want it running git tag, simply run it with the --git-tag-version=false flag (or set it to permanently not with npm config set git-tag-version false). Want to configure the commit message? Simply run it with the -m flag, e.g. npm version patch -m "Bumped to %s" (set it permanently with npm config set message "Bumped to %s"). You can even get it to sign the tags for you, by running with the --sign-git-tag=true flag (or, once again, set it permanently with npm config set sign-git-tag true).
Clean
Many build runners come with a clean task. This task usually just removes a bunch of files so you can start with a fresh working copy to start building into. Well, turns out that Bash has a pretty good clean command all by itself: rm. Passing the -r (recursive) flag lets rm remove directories too! It couldn’t be simpler:
"scripts": {
"clean": "rm -r dist/*"
}
If you really need to have Windows support, it does not support rm - luckily there is rimraf which is a cross-compatible tool to do the same thing:
"devDependencies": {
"rimraf": "latest"
},
"scripts": {
"clean": "rimraf dist"
}
Compiling files to unique names
Effectively, trying to replace the functionality of gulp-hash and grunt-hash - take an input of JS and name it with the hash of its contents. This one turned out to be really complex to do using existing command line tools, so I had a look on npm to see if anything fit the bill, and it didn’t - so I wrote one (I can hear the Grunt/Gulp proponents telling me I cheated already). I have two points about this - firstly, it’s pretty disappointing to see lots of siloed efforts from various plugin authors - and no generic solutions that work with any build tool. Secondly - if you can’t find something that fits, write your own! My hashmark library clocks in around the same lines of code as the grunt/gulp versions, and has a similar or better featureset, depending on the plugin - mine even supports streaming! Going back to the autoprefixer example, we can output a file with a specific hash using pipes:
"devDependencies": {
"autoprefixer": "latest",
"cssmin": "latest"
},
"scripts": {
"build:css": "autoprefixer -b '> 5%' < assets/styles/main.css | cssmin | hashmark -l 8 'dist/main.#.css'"
}
Now the ouput of build:css will ouput a file in dist named with a hash, such as dist/main.3ecfca12.css.
Watch
This is definitely the most popular reason why people using Grunt/Gulp, and by far the most requested example from comments around my previous post. A lot of these build tools come with commands for watching a filesystem, detecting changes to files (e.g. from saving), and then reloading the server/recompiling assets/rerunning tests. Very useful for rapid development. It seems like most developers replying to my last post simply assumed that this wasn’t an option outside of Grunt/Gulp (or perhaps thought it was something too difficult to do without them).
Well, most tools facilitate this option themselves - and usually are much more in tune with the intricacies of the files that should be listened for. For example Mocha has the -w option, as does Stylus, Node-Sass, Jade, Karma, and others. You could use these options like so;
"devDependencies": {
"mocha": "latest",
"stylus": "latest"
},
"scripts": {
"test": "mocha test/",
"test:watch": "npm run test -- -w",
"css": "stylus assets/styles/main.styl > dist/main.css",
"css:watch": "npm run css -- -w"
}
Of course, not all tools support this, and even when they do - you might want to compose multiple compile targets into one task which watches for changes and runs the whole set. There are tools that watch files and execute commands when files change, for example watch, onchange, dirwatch, or even nodemon:
"devDependencies": {
"stylus": "latest",
"jade": "latest",
"browserify": "latest",
"watch": "latest",
},
"scripts": {
"build:js": "browserify assets/scripts/main.js > dist/main.js",
"build:css": "stylus assets/styles/main.styl > dist/main.css",
"build:html": "jade assets/html/index.jade > dist/index.html",
"build": "npm run build:js && npm run build:css && npm run build:html",
"build:watch": "watch 'npm run build' .",
}
There you go - pretty painless. This 13 lines of JSON will watch our whole project directory, and build HTML, CSS and JS assets every time any file changes. Just run npm run build:watch and start developing! You could even optimise this further, with a little tool I wrote (once again, while writing this post): Parallelshell, which will keep multiple processes running at one time - a little like this:
"devDependencies": {
"stylus": "latest",
"jade": "latest",
"browserify": "latest",
"watch": "latest",
"parallelshell": "latest"
},
"scripts": {
"build:js": "browserify assets/scripts/main.js > dist/main.js",
"watch:js": "watch 'npm run build:js' assets/scripts/",
"build:css": "stylus assets/styles/main.styl > dist/main.css",
"watch:css": "watch 'npm run build:css' assets/styles/",
"build:html": "jade index.jade > dist/index.html",
"watch:html": "watch 'npm run build:html' assets/html",
"build": "npm run build:js && npm run build:css && npm run build:html",
"build:watch": "parallelshell 'npm run watch:js' 'npm run watch:css' 'npm run watch:html'",
}
Now running npm run build:watch will run the individual watchers all through Parallelshell and if, for example, you only change the CSS, then only the CSS will recompile. If you change the JS then only the JS will recompile and so on. Parallelshell combines the outputs (stdout and stderr) of each of the tasks, and will listen to the exit code to ensure logs and failed builds propagate out (unlike the Bash/Windows & operator).
LiveReload
LiveReload was another popular one. If you don’t know what LiveReload is - its a combination of command line tool and browser extension (or custom server) - as files change, LiveReload triggers the page you’re looking at to reload meaning you never have to press refresh. The npm package live-reload is a pretty suitable command line client for this - it runs a server which only serves a JS file, which if you include on your page will notify the page of changes. Simple, yet effective. Here’s an example of how to get it working:
"devDependencies": {
"live-reload": "latest",
},
"scripts": {
"livereload": "live-reload --port 9091 dist/",
}
<!-- In your HTML file -->
<script src="//localhost:9091"></script>
Now running npm run livereload - when you visit the HTML page it’ll start listening to the livereload server. Any changes to files in the dist/ directory will notifiy clients, and the page will be reloaded.
Running tasks that don’t come with binaries
It was pointed out to me that there are libs that don’t come with binaries - such as favicon - and so Grunt/Gulp plugins can be useful because they wrap the tools so they can be used within the task runners. If you find a package that you want to use, but it doesn’t have a binary then simply write some JavaScript! You would have to if using Grunt or Gulp, so don’t be afraid to just chuck a bit of JavaScript somewhere that wires it all up (or even better, submit a PR to the maintainers convincing them to support a command line interface!):
// scripts/favicon.js
var favicons = require('favicons');
var path = require('path');
favicons({
source: path.resolve('../assets/images/logo.png'),
dest: path.resolve('../dist/'),
});
"devDependencies": {
"favicons": "latest",
},
"scripts": {
"build:favicon": "node scripts/favicon.js",
}
A fairly complex config
In my previous post many were telling me I was missing the point about task runners - they’re for wiring up complex sets of tasks, not just running odd tasks. So I thought I’d wrap up this piece with a complex set of tasks typical of a multi-hundred-line Gruntfile. For this example I want to do the following:
Take my JS and lint, test & compile it into 1 versioned file (with a separate sourcemap) and upload it to S3
Compile Stylus into CSS, down to a single, versioned file (with separate sourcemap), upload it to S3
Add watchers for testing and compilation
Add a static file server to see my single page app in a web browser
Add livereload for CSS and JS
Have a task that combines all these files so I can type one command and spin up an environment
For bonus points, open a browser window automagically pointing to my website
I’ve chucked up a simple repository on GitHub called npm-scripts-example. It contains the layout for a basic website, and a package.json to fit the above tasks. The lines you’re probably interested in are:
"scripts": {
"clean": "rimraf dist/*",
"prebuild": "npm run clean -s",
"build": "npm run build:scripts -s && npm run build:styles -s && npm run build:markup -s",
"build:scripts": "browserify -d assets/scripts/main.js -p [minifyify --compressPath . --map main.js.map --output dist/main.js.map] | hashmark -n dist/main.js -s -l 8 -m assets.json 'dist/{name}{hash}{ext}'",
"build:styles": "stylus assets/styles/main.styl -m -o dist/ && hashmark -s -l 8 -m assets.json dist/main.css 'dist/{name}{hash}{ext}'",
"build:markup": "jade assets/markup/index.jade --obj assets.json -o dist",
"test": "karma start --singleRun",
"watch": "parallelshell 'npm run watch:test -s' 'npm run watch:build -s'",
"watch:test": "karma start",
"watch:build": "nodemon -q -w assets/ --ext '.' --exec 'npm run build'",
"open:prod": "opener http://example.com",
"open:stage": "opener http://staging.example.internal",
"open:dev": "opener http://localhost:9090",
"deploy:prod": "s3-cli sync ./dist/ s3://example-com/prod-site/",
"deploy:stage": "s3-cli sync ./dist/ s3://example-com/stage-site/",
"serve": "http-server -p 9090 dist/",
"live-reload": "live-reload --port 9091 dist/",
"dev": "npm run open:dev -s & parallelshell 'npm run live-reload -s' 'npm run serve -s' 'npm run watch -s'"
}
(If you’re wondering what the -s flag is, it just silences output from npm on those tasks, cleaning up the log output, try disabling them to see the difference)
To do the equivalent in Grunt, it’d take a Gruntfile of a few hundred lines, plus (my finger in the air estimate) around 10 extra dependencies. It’s certainly subjective as to which version would be more readable - and while npm is certainly not the holy grail of readability, I personally think the npm scripts directive is easier to reason about (i.e. I can see all tasks and what they do, at a glance).
Conclusion
Hopefully this article shows you how capable npm can be as a build tool. Hopefully it has demonstrated to you that tools like Gulp and Grunt should not always be the first thing to jump to in a project, and that tools you probably already have on your system are worth investigating.
As always, feel free to discuss this with me on The Twitter, I’m @keithamus, you can “Follow” me there too, apparently.
A ''Number'' in Formulas may consists of at least one digit and an optional decimal point. `12`, `.001`, `13.5`, `1` and `50000.` are all valid numbers.
Exponential notation, NaN and infinities are not currently supported.
* frequency of giving rusf and timing; does it matter? this is important in terms of standardized consumption
* logistics on the distribution; daily or weekly? place of picking up rusf packets for example?
* video demonstration of preparing recipes?
* we need several laf recipes with the right caloric content
* if we give more than one recipe, do we give the mother the freedom to choose the ingredients?
* how do we modify the ingredients with age-specific requirements. can we use the imci guidelines for normal and paids nutrient requirements?
* laf and mdcf
** will the tnsf prepare it?
** will we need to monitor?
** what is our relationship with them wrt above?
** are they familiar with mdcf?
** quality is key here, but we don't need to seek formal certification
* protocol says we should deliver the foods at least weekly
* ~~review and/or translate 12, 2,3, 17-19~~
Object Relational Mapping (ORM) is a programming technique for converting data between incompatible type systems using object-oriented programming languages e.g. mapping objects in JavaScript to strings and integers in an SQL database.
There are two popular architectural patterns for ORMs:
# {{Active record pattern}}
# {{Data mapper pattern}}
__What we offer__
# Partner in crime: we want to help you listen to your customers better, and turn these insights into irresistible mafia offers for your clients
# We want to show you a better way of innovating by building a company wide approach to innovation via Design sprints
# Startup mentorship, including:
## Creative support
## Management
## Technical assistance
## Partnership:: Smartlab will connect startups with our reliable customer network and partners to create strategic business relationships.
#Talent outsourcing services
# [[Corporate training|http://smartlab.co.tz/program/corporate-training]]
Referring to this [[article|Rise of Discord and fall of Slack for developers]], how can we make OnePlaybook relevant to both personal projects as well as organizational projects, and avoid becoming like Slack to developers?
This is something we must think about early on, because the landing page and business model is heavily skewed towards organization teams.
A mild-mannered and brilliant man, Okami worked for the American tech company NeonoeticTechnologies. He had arrived in Africa to investigate the work of the company's star CEO there but both went missing somewhere in East Africa soon after. The company has reported him as "missing".
In the story it's been 1 year since their disappearance and the company has since filed for chapter 11 protection after failing to pay the debts incurred from the missing CEO's mysterious African escapades.
Okami outwardly is reserved and appears as a rather stoic man. But underneath, he hides a bitter loss. He never quite recovers from it despite regular counselling sessions. Sometimes this feeling of loss bubbles up through the cracks and manifests as sudden bouts of anger before returning to his usual composure. Some of his co-workers find this unnerving.
<p><p><strong>Developer Pays</strong></p></p><p><p>In this model, the
developer pays the enterprise to use the API to gain a competitive
advantage. The developer, in turn, earns downstream revenue through the
use of the API. The developer pays model has several sub-models:
Freemium, Pay As You Go, Tiered, Points-Based, and Transactions Fee.</p></p><p><ul>
<li><strong>Freemium</strong> – In this model, the basic features are free, and the premium features priced. Dropbox is a relevant example of this model.</li>
<li><strong>Pay As You Go</strong> – This is a straightforward model in
which the developer only pays for the consumed services, without any
minimum guarantee or tiers. The billing in this model is done
periodically, such as monthly. Amazon Web Services (AWS) is one such
example.</li>
<li><strong>Tiered</strong> – Some API providers set multiple tiered
resource access for the developers to choose from, such as bronze,
silver, and platinum. The developers can select their desired level and
access and pay for it. In most cases, the lowest tier is free so that
the developers can test the waters. The developers are billed for the
chosen tier during the said period whether they use the entire amount or
not.</li>
<li><strong>Points-Based</strong> – Google Adwords is an example of a
points-based monetisation model. Different APIs have different value and
are assigned points. The developer has the option to either pre-buy
points (tiers) or is billed by the number of points on a pay as you go
basis.</li>
<li><strong>Transaction Fee</strong> – <a class="tc-tiddlylink tc-tiddlylink-missing" href="https://maarfapad.cloudno.de/wiki/home#PayPal">PayPal</a>
uses a transaction fee model in which the API provider receives a fixed
or percentage as a transaction fee on every transaction.</li></ul></p>
Inspired by [[WorldBrain Memex]], I think we could create a streamlined clone that uses TiddlyWiki as its dashboard and cloud service choice/sovereignty as the backend framework.
One interesting thing we could do with this is enabling folks to create private or public community clipbooks that folks can clip to directly as they browse the web or brainstorm together.
We could fork this [[webclipper|https://github.com/webclipper/web-clipper]] to quickly build something workable
__[[Problem being solved]]__
{{Problem being solved}}
{{OnePlaybook description}}
__[[The Mission|OnePlaybook's mission]]__
{{OnePlaybook's mission}}
[[TW5 development flow]]
[[Release roadmap]]
[[oneplaybook uvp|?]]
{{To do list for OnePlaybook}}
__Tagged tiddlers__
<div class="tc-table-of-contents">
<<toc-selective-expandable 'OnePlaybook'>>
</div>
<<list-links "[tag<currentTiddler>sort[title]]">>
Building from what has been explored on [[making a web clipper|OneClipbook]] with [[WorldBrain Memex]], I think it would be more convenient and fun to have the entire OnePlaybook service contained in a web browser extension.
__[[What is OnePlaybook?|OnePlaybook description]]__
It's a distributed wiki workspace platform.
* startups
* founders
* entrepreneurs
* students
* academia
* office
* engineers
* students
* business person
* lawyers
* accountants
{{||new-project-template}}
{
"channels": "* Word of mouth\n* Team invitations\n* Tool publishing via content marketing"
}
{
"channels": "Twitter community\n\nContent marketing, especially LinkedIn\n\nStartup accelerators and hubs"
}
{
"channels": "Productivity forums and business forums\n\nContent marketing\n\nDirect to IT department sales"
}
{
"channels": "Twitter\nFission Zoom calls and TiddlyWiki events, following people who care about PKM & TiddlyWiki & Decentralized software"
}
{
"channels": "Startup accelerator partnerships and events\n\nContent marketing on Twitter and LinkedIn\n\nInvestor forums\n\nInnovation peer\n"
}
{
"channels": "TiddlyWiki forum\n\nTwitter"
}
{
"channels": "Twitter: Zoom calls and TiddlyWiki events, following people who care about knowledge management"
}
{
"channels": "Content creation on twitter & demos at online meetups like fission codes & tools for thought interchange."
}
<$tmap view="OnePlaybook system" height="500px" editor="vis" ></$tmap>
<p>What is our hook? So far, OnePlaybook feels like Asana for teams with tighter budgets. Let's introspect:</p>
<ol>
<li>Asana is bloated with features that slow it down. OnePlaybook starts with a simple base that allows you to add exactly what you need and no more.</li>
<li>It costs less because it allows self-hosting</li>
<li>It actually tries to assist you to get the job done.</li></ol>
<p>But what exactly do people who start projects need exactly in terms of assistance? That's the question that will make or break this offer.</p>
To help document and organize knowledge into one [[tool|Knowledge exchange: super wikis as playbooks]] that augments knowledge work.
<$tmap view="Default" editor="advanced" height="500px" ></$tmap>
What if we could allow one to organize anything and everything: cloud systems, apps, organizational software, departments, sysadmins into [[portable notebook workspaces|?]] backed with a dedicated backend space?
A Jupyter notebook, but for everything. A simpler, more elegant literate programming environment to tame our increasingly complex world.
There are some parallels between [[problems we want to solve|Problems being solved]] and the problems being addressed by the [["everything as code" paradigm|Everything as code]], especially with regards to the question of dispersed knowledge vis-a-vis configuration sprawl.
[[Map of possible areas of growth|Goal Explorer]]
An open source organization that's dedicated to the advancement of [[OnePlaybook's vision]] through solving problems the wiki way.
<<list-links "[tag<currentTiddler>sort[title]]">>
The Open Hyperdocument System (OHS) is a world-wide open source framework championed by [[Doug Engelbart|https://en.wikipedia.org/wiki/Douglas_Engelbart]] for developing collaborative, knowledge management systems and applications. Its primary objective is to support Dynamic Knowledge Ecosystems (DKEs). The quality of a group's DKE directly determines how high or low its Collective IQ, its capacity to innovate, learn and evolve.
The modern Web satisfies many of the [[framework's requirements|Hyperdocument features]] (see this [[W3C note comparing the two|https://www.w3.org/Architecture/NOTE-ioh-arch]]). Many subsequent web-based applications like TiddlyWiki and Gmail have gone on to satisfy even more of these feature requirements.
<<list-links "[tag[Open source]!sort[created]]">>
<h2>Phase 1: Concept</h2>
<p>Some ideas have been kicked around by a few people. Some spike code has been written. A project site is up (Google Code, ~CodePlex, etc) and there is maybe a working prototype to show off and talk about. Definitely no documentation, wiki, or anything like that. There may be a blog post or two about the concepts.</p>
<h2>Phase 2: Bootstrap</h2>
<p>There are one or two serious authors/committers. There might already be one or two actual users experimenting with the framework. The build is continually in a “works on my machine!” state. Some more blog posts have been done and maybe a wiki with a few articles, but otherwise no docs to speak of.</p>
<h2>Phase 3: Early Development</h2>
<p>A few more committers have signed on, but still there is only one or two primary contributors. A few more users have started playing with it now and are providing feedback. A mailing list has certainly been set up by now, if not earlier. The build is more stable and works in many environments. More blog posts and wiki articles have emerged, but still no serious documentation effort yet.</p>
<h2>Phase 4: Early Adoption</h2>
<p>More committers are signing on now and contributing more and more. The project is at a state with many of the baseline features are done and the product is quite usable now. There are a few dozen users experimenting with it and even building some interesting applications upon it. Multiple people are blogging about it. The wiki is starting to materialize into categories and sub-topics. Some sparse documentation has started to emerge in the form of some limited API docs and some FAQ’s and getting started guides.</p>
<h2>Phase 5: Development</h2>
<p>There are several devoted committers now, cranking out serious features and functionality. There are dozens of users – approaching 100 or more. There is an automated (nightly?) build. Binaries are available for download regularly. Many people are blogging about it and buzz is growing. The wiki is really taking shape and being fleshed out. At this point documentation is “moderate” and is growing into more scenarios and topics.</p>
<h2>Phase 6: Adoption</h2>
<p>Many people are submitting patches and other forms of contributions. The inner circle of committers is growing. There are more than 100 users, perhaps several hundred. There are frequent “point” releases available for download. There’s now likely a basic installer which helps configure your environment for the framework. Frequent, in-depth blog posts by noted authors. The Wiki is now very rich and there are frequent contributions. Documentation at this point is “adequate”. You would likely start seeing “contrib” projects sprouting up here and there and coalescing .</p>
<h2>Phase 7: Maturity</h2>
<p>There are so many patches and contributors that a hierarchy has been set up to evaluate and approve changes. Multiple releases creates management issues with patches and defects requiring more organization. There over a thousan users by now and like thousands. There are releases and installers for various scenarios (maybe x86/x64, or a Mono compatible release, etc). There is lots of documentation activity and many contrib projects have emerged.</p>
<h2>Phase 8: Mainstream</h2>
<p>By now, many of the original contributors have moved on or are less involved. A new generation of contributors have taken over and are taking the project into different directions and expanding it greatly. There are hundreds of thousands of users. Perhaps there are even consulting companies forming business services around the project and offering commercial support. There are now multiple “dot-oh” releases. There is no doubt this project is here to stay and provides real value to people. The project has its own active web site with lots of content, guides, add-ons, forums, blogs, etc.</p>
<p><a href="https://lostechies.com/chadmyers/2009/05/28/lifecycle-of-an-open-source-project/" target="_blank">Source</a></p>
<p><a href="https://blog.timescale.com/blog/how-open-source-software-makes-money-time-series-database-f3e4be409467/">blog.timescale.com</a></p>
<h1>5 ways open source software companies make money</h1>
<p>14 - 17 minutes</p>
<hr />
<p><em>A guide on how to evaluate the long-term sustainability of the business behind any open-source software you are using (or considering working on yourself). Article co-authored by Mike Freedman.</em></p>
<p><strong><strong><em>(Interested in helping us build the next great open-source company?</em></strong></strong><a href="http://bit.ly/2BAfsNx" rel="noopener"><strong><strong><em>Timescale is hiring</em></strong></strong></a><strong><strong><em>!)</em></strong></strong></p>
<p><strong>As <strong>open source software becomes <a href="https://blog.timescale.com/open-source-demise-of-proprietary-software-a49f73f54165/">more and more popular</a></strong></strong>, one of the most common questions we hear is: <em>How do these projects make money?</em></p>
<p>Or, to put it another way: <em>How do I know that these companies, who are building all this open source software I’m using, won’t go out of business?</em></p>
<p>And since we’re the co-founders of <a href="http://bit.ly/2DKGBPc" rel="noopener"><strong><strong>TimescaleDB</strong></strong></a>, an open source time-series SQL database company, this question can also mean, <em>How do I know that </em><strong><strong><em>you</em></strong><em> </em></strong><em>won’t go out of business?</em></p>
<p>All are variations of the same straightforward question. But the answer is complex, and quickly evolving.</p>
<p>There is already a cohort of open-source software companies, some of which are public, that are surpassing $100M (or even $1B) in annual revenue: RedHat, Cloudera / Hortonworks (Hadoop), MuleSoft, Automattic (Wordpress), Elastic, MongoDB, Acquia (Drupal), Hashicorp, Confluent (Kafka), Databricks (Spark), and more. (<a href="https://docs.google.com/spreadsheets/d/17nKMpi_Dh5slCqzLSFBoWMxNvWiwt2R-t4e_l7LPLhU/edit#gid=0" rel="noopener">Here are over 30 of them</a>.) If we analyze their success, we see a common pattern to how they’ve built sustainable businesses.</p>
<p>In this article we describe that common pattern by sharing 5 business models these open-source software companies use to make money.</p>
<p><strong><strong>If you are adopting open-source software in your own company, or working on an open-source business of your own, or even just considering working for an open-source startup, understanding these business models will help you evaluate not just the software, but also the long-term sustainability of the business behind that software.</strong></strong></p>
<p>But first, there are two requirements every open-source company needs before it can even consider making money.</p>
<h2>What every open-source company needs before it can consider making money</h2>
<h4>Prerequisite #1: Broad adoption</h4>
<p>The first prerequisite is <em>broad adoption</em>: the open-source project needs to have a large user base and community.</p>
<p>Broad adoption is necessary because an open-source company can capture only a small amount of the value it creates. To be clear: an open-source company gives most, if not all, of its developed software away for free, and most of its users will never pay for that software.</p>
<p>In fact, most open-source monetization rates (the conversion rate from users to paying customers) are fairly small: often in the low single-digit percentages (if not lower). But given a large enough community, that conversion rate can be enough. This dynamic is one of the drivers behind the economies of scale in the open-source model. In other words, the need to have broad adoption is one of the reasons why there are often category “winners” in open-source.</p>
<p>This need for a large up-front investment in adoption is also why most successful open-source companies today start off as projects in a large company (e.g., Hadoop/HDFS at Yahoo!, Kafka at LinkedIn, Kubernetes at Google), as research areas in academia (e.g., Spark at Berkeley), or as VC-backed startups.</p>
<h4>Prerequisite #2: Primary credibility</h4>
<p>The second prerequisite is <em>primary credibility </em>within the community. This is important because it enables the open-source company to build an efficient sales and marketing process, which is especially important given the low monetization rates.</p>
<p>Having “primary credibility” means that anyone who needs help with the software reaches out to the open-source company and not someone else for assistance. Not having this credibility means having to slog it out with others in the market for that attention, leading to a far less efficient business model and lower margins.</p>
<p>The value of primary credibility, which today is often achieved by being the main contributors to the project, can be seen by comparing the market caps, annualized revenue, and multiples of Elastic ($4.59 billion market cap, $160 million revenue, 29x) and MongoDB ($3.97 billion market cap, $155 million revenue, 26x) vs. (pre-merger) Hortonworks ($1.23 billion market cap, $262 million revenue, 5x) and Cloudera ($1.73 billion market cap, $367 million revenue, 5x). <em>(Market caps as of November 27, 2018; revenue numbers are from latest reported fiscal year.)</em></p>
<p>Because Elastic and MongoDB had primary credibility in their respective communities, they were able to build a much more efficient business model, and capture far more value with less revenue than either Hortonworks or Cloudera, who had to raise more money and fight fiercely over the Hadoop market. (One could even speculate that the need to possess primary credibility was one of the reasons behind the recent Hortonworks/Cloudera merger.)</p>
<p>Once an open-source company has broad adoption and primary credibility, it can build a pipeline of companies who need assistance, and start layering in a variety of business models to build a sustainable business.</p>
<p>Now, let’s talk about those business models.</p>
<h2>The 5 open-source business models</h2>
<p>From analyzing successful open-source companies today, five common business models emerge:</p>
<ol>
<li>Support</li>
<li>Hosting</li>
<li>Restrictive licensing</li>
<li>Open-core</li>
<li>Hybrid licensing</li></ol>
<h3>1. Support</h3>
<p>The support model, also known as the “RedHat” model, goes like this: sell deployment and integration services, production-oriented “insurance policies”, certified binaries, trainings, bug fixes, etc., to businesses deploying the project in production.</p>
<p>This model becomes limiting over the long-term for a few reasons: (1) support often requires a lot of manual work, and so reduces business margins; (2) scaling is hard because support work is often not easily repeatable; (3) it creates perverse incentives on the part of the open-source company, where making the product easier to use cannibalizes support revenue. In fact, this model works very well when the project requires complex deployments with sprawling ecosystems, which often goes against building the best user experience.</p>
<p>This model is also notoriously inefficient, typically converting less than 1% of all users into paying customers. This inefficiency should come as no surprise. Open-source software itself is free. In order to feel the need to pay for support, a company needs to rely on the project for mission critical systems. Yet over time, companies that do rely heavily on the project will naturally invest their own engineering efforts to understand the project, reducing the need for external support. So there’s only a small usage window where this model works.</p>
<p>The support model is still where every open-source company starts today. Yet, with all these challenges, and the fact that RedHat is still the only company to build a multi-billion dollar revenue business in open-source in the past 25 years, it’s become clear that open-source companies need better business models than just support.</p>
<h3>2. Hosting</h3>
<p>Hosting means offering a fully-managed version of your project, so that when users want to try out the project, or even deploy it in production, they can spin up a remote server with the software in just a few clicks, and not have to worry about operating it in steady state (i.e., not worry about backups, downtime, upgrades, etc.).</p>
<p>Given the popularity of the cloud and managed services in general, it should come as no surprise that this has also become a popular model for open-source. In particular, this has become a common way for the public cloud providers (and in particular, AWS) to monetize open-source projects without giving back to the community, which has led to <a href="https://techcrunch.com/2018/09/07/commons-clause-stops-open-source-abuse/" rel="noopener">some complaints</a> and <a href="https://www.theinformation.com/articles/aws-developing-new-services-amid-open-source-tensions" rel="noopener">tensions</a> (and the emergence of other models, which we’ll soon discuss).</p>
<p>The hosting-only model can work well. Some companies (e.g. Databricks, Acquia) have been quite successful with it. Yet typically hosting is layered in with a few of the following other models.</p>
<h3>3. Restrictive licensing</h3>
<p>The restrictive licensing model creates a legal reason for users of open-source software to pay. It does this by providing an open-source license with slightly onerous terms, such that anyone using the software in production is highly incentivized to strike a commercial deal with the vendor. The GPL and AGPL licenses, as well as the newly created Commons Clause (<a href="https://redislabs.com/community/licenses/" rel="noopener">adopted by certain Redis modules</a>), are examples of this model. In particular, AGPL and Commons Clause (as well as the new <a href="https://techcrunch.com/2018/10/16/mongodb-switches-up-its-open-source-license/" rel="noopener">SSPL launched by MongoDB</a>) are licenses also designed to defend against the public cloud providers.</p>
<p>But this approach has limitations: the GPL-based license restrictions do not restrict unmodified usage, and only apply if one makes modifications and does not want to open-source them; the Common Clause has some ambiguity in its language, and it remains to be seen how this will play out in the courts. Still, the largest drawback of this approach is that these licenses hurt adoption, often turning off potential users. In particular, there are quite a few large companies who have explicit policies against using restrictive licenses. Because of the inherent friction of this approach, many rule it out, relying on other business models.</p>
<h3>4. Open-core</h3>
<p>Open-core has quickly emerged as the most popular way for open-source companies to make money. The idea behind open-core is that the majority of the code base is open-source, while a smaller percentage (targeted at production or enterprise users) is proprietary. The proprietary portion may be packaged into separate modules or services that interface with the open-source base, or could be distributed in a forked version of the open-source base.</p>
<p>Typically the proprietary features are ones needed for production deployments and/or at scale. (As an example, for an open-source database, features like monitoring, administration, backup/restore, and clustering are often proprietary.) One benefit here is that it allows the open-source company to license the core with a very permissive license (e.g., Apache 2), while retaining the ability to charge for proprietary features. It also allows open-source companies to defend against free-loading participants (e.g., such as the public cloud providers) by keeping certain features in the proprietary code base.</p>
<p>The challenge with this model is in balancing the open-source value versus the proprietary: if an open-source company gives away too much, then it gives up the opportunity to make money; but if it gives away too little, then the open-source project effectively becomes “lame-ware” (and the project will likely fail to get broad adoption).</p>
<p>Another challenge is that cleanly separating the open-source from proprietary features in code is sometimes difficult. Even if separating them is easy, maintaining two different code bases can also be challenging from an engineering process perspective: e.g., managing independently versioned releases that might need to interoperate and/or porting code back-and-forth to prevent code divergence over time. And often engineers would rather work in the open-source repo than the “business” repo. But despite all these reasons, this model is quite powerful.</p>
<h3>5. Hybrid licensing</h3>
<p>The hybrid licensing model is the newest one on this list. Initially popularized by <a href="https://www.cockroachlabs.com/blog/how-were-building-a-business-to-last/" rel="noopener">CockroachDB (Jan 2017)</a>, and later adopted by <a href="https://www.elastic.co/blog/doubling-down-on-open" rel="noopener">Elastic (Feb 2018)</a>, hybrid licensing takes the open-core approach but improves on it in a few key ways.</p>
<p>What hybrid licensing does is intermingle open-source and proprietary software in the same repository, and then make the code for the entire repo available. That is, the entire repository is “open code” (or “source available”), just not all licensed under an <a href="https://opensource.org/licenses" rel="noopener">OSI-approved</a> open-source license. Users can choose to use a binary with just the open-source bits (available under an open-source license), or use a binary with both the open-source and proprietary bits (available under the proprietary license). The proprietary licensed binary often will have paid functionality that is off by default, but can be unlocked by purchasing a license key.</p>
<p>The advantages of this approach for an open-source company include all of the ones listed under <em>open-core</em>, plus a few more: (1) having everything in the same code base makes it easier to manage engineering process and development; (2) it enables the entire team to work on the core project; (3) it allows users to upgrade from free to paid in-place, often without downtime (and without needing to interact with a salesperson); (4) it allows external community members to comment on, file issues on, and (if they so choose) contribute to proprietary features using the same workflow they’d normally use for open-source features (e.g., via GitHub).</p>
<p>The largest challenge is also the same as <em>open-core</em>: balancing the quantity and value of open-source vs. proprietary features.</p>
<h2>A business model layer cake</h2>
<p>We just discussed five common open-source business models, yet there is no one-size-fits-all. Some will find success with a purely managed offering model, e.g., Databricks. Others will have such broad adoption, like SQLite (reportedly billions of installs), that they will be able to support a small core development team with just support and warranties.</p>
<p>That said, most open-source companies will make money using a combination of the five models we discussed, forming a revenue layer cake. For example, by combining support and licensing, or support and hosting and open-core.</p>
<p>If you adopt open-source software in your company, these are also the various ways you can support an open-source business, and ensure that the software continues to improve and be maintained. So if you do decide to use open-source software, and if there is a company behind the project, please support it.</p>
<p><em>This post, <a href="https://blog.timescale.com/open-source-demise-of-proprietary-software-a49f73f54165/">like another that preceded it</a>, was built on the shoulders of giants. A big thank you to all of the following people who have shared their open-source wisdom and time with myself and my co-founder Mike over the past few years: Harry Weller (RIP), Forest Baskett, Greg Papadopoulos, and the rest of the team at NEA; Peter Fenton, Chetan Puttagunta, and Eric Vishria and the rest of the team at Benchmark; Rob Bearden, Shaun Connolly, Herb Cunitz, Mitch Ferguson, Jeff Miller, and the rest of the Hortonworks diaspora; Gaurav Gupta from Elastic; Jay Kreps from Confluent; Spencer Kimball from CockroachDB; and so many, many more. We are honored to have such great peers in our industry.</em></p>
<hr />
<p><em>Want to learn more about the business of open source software? Hear from <a href="https://opensourceunderdogs.com/episode-17-timescaledb-time-series-sql-database-with-ajay-kulkarni-and-michael-freedman/">myself and my co-founder,</a> along with other OSS business leaders on the podcast series <a href="https://opensourceunderdogs.com/#">Open Source Underdogs</a>. </em></p>
<p><em>Like this post and want to learn more? Sign up for the community mailing list below! Interested in helping us build the next great open-source company? </em><a href="http://bit.ly/2TQG8QX" rel="noopener"><em>We’re hiring</em></a><em>!</em></p>
[[From this article|http://drexel-coas-elearning.blogspot.com/2006/09/open-notebook-science.html]]:
Open Source Science (OSSci) is:
<<<
...research already in progress is opened up to allow labs anywhere in the world to contribute experiments. The deeply networked nature of modern laboratories, and the brief down-time that all labs have between projects, make this concept quite feasible. Moreover, such distributed-collaborative research spreads new ideas and discoveries even faster, ultimately accelerating the scientific process.
<<<
Many however erroneously believe that OSSci is simply about discussions around pre-prints around regular journal articles. Instead, it is supposed to mean all the components of a given research is open to others to use, reuse and repurpose, including failed experiments:
<<<
In Open Source Software, the code is made available to anyone to modify and repurpose. What we have been trying to do with ~UsefulChem is to provide the analogous entity for chemical research, which is raw experimental data along with the researcher's interpretation in a format that anyone can easily re-analyze, re-interpret and re-purpose. A good example of re-purposing is using some results and observations from a failed experiment in a way that was never intended by the original researcher. This just doesn't happen regularly in science because failed experiments are almost never included in publications.
<<<
The author of the article coins a new term to capture the essense of this idea called "Open Notebook Science":
<<<
By this I mean that there is a URL to a laboratory notebook (like this [link broken]) that is freely available and indexed on common search engines. It does not necessarily have to look like a paper notebook but it is essential that all of the information available to the researchers to make their conclusions is equally available to the rest of the world. ''Basically, no insider information''.
<<<
I think that last sentence is key. Insider information means that not everything has been documented and therefore many details may escape scientific scrutiny.
We have ~SlideShare, Pinterest, Flickr, etc that exploit [[network effects|Network effect]]. Why not something for tiddlers, microSaaS or services? A new niche could be in the making here
An ''Operand'' may be:
|Operand type|example|h
|[[Parenthesized Expression]]|`(2+4)`|
|[[Function Call]]|`add(2, 2)`|
|[[Transclusion]]|`{{Apples!!count}}`|
|[[Variable]]|`<<currentTiddler>>`|
|[[Filter]]|`[tag[Expenses]get[value]]`|
|[[Number Literal]]|`123.456` or `4` or `.001`|
|[[String Literal]]|`"kittens"` or `'kittens'`|
|[[Array Literal]]|`{1, 2, 3}`|
|[[Regular Expression Literal]]|`/kittens/g`|
|[[Cell Reference]]|`B3`|
|[[Let Expression|LetConstruct]]|`let(x=2):(x+x)`|
|[[Function]]|`function(x):(x*x)`|
|[[Local Variable|LocalVariable]]|`myvar`|
#### Build your own `Operating System`
* [**Assembly**: _Writing a Tiny x86 Bootloader_](http://joebergeron.io/posts/post_two.html)
* [**C**: _Operating Systems: From 0 to 1_](https://tuhdo.github.io/os01/)
* [**C**: _The little book about OS development_](https://littleosbook.github.io/)
* [**C**: _Kernel 101 – Let’s write a Kernel_](https://arjunsreedharan.org/post/82710718100/kernel-101-lets-write-a-kernel)
* [**C**: _Kernel 201 – Let’s write a Kernel with keyboard and screen support_](https://arjunsreedharan.org/post/99370248137/kernel-201-lets-write-a-kernel-with-keyboard)
* [**C**: _Build a minimal multi-tasking kernel for ARM from scratch_](https://github.com/jserv/mini-arm-os)
* [**C**: _How to create an OS from scratch_](https://github.com/cfenollosa/os-tutorial)
* [**C**: _Malloc tutorial_](https://danluu.com/malloc-tutorial/)
* [**C**: _Hack the virtual memory_](https://blog.holbertonschool.com/hack-the-virtual-memory-c-strings-proc/)
* [**C++**: _Writing a Bootloader_](http://3zanders.co.uk/2017/10/13/writing-a-bootloader/)
* [**Rust**: _Writing an OS in Rust_](https://os.phil-opp.com/first-edition/)
An ''Operator'' is a symbol that goes before, after or between two [[Operands]] and performs a calculation on them. Operators regard a special order of operations.
See [[Operators]] for more information.
\define t_num() [[number|NumberValue]]
\define t_str() [[string|StringValue]]
\define t_arr() [[array|ArrayValue]]
\define t_bool() [[boolean|BooleanValue]]
!Introduction
''Operators'' let you write concise math functions with automatic prededence. For example, the formula:
`2+2`
Evaluates to 4.
!Operators
|Operator|Result|Function|h
|`+a`|<<t_num>>|Returns the argument.|
|`-a`|<<t_num>>|Negates the argument.|
|`a+b`|<<t_num>>|Adds numbers `a` and `b`.|
|`a-b`|<<t_num>>|Subtracts `b` from `a`.|
|`a*b`|<<t_num>>|Multiplies numbers `a` and `b`.|
|`a/b`|<<t_num>>|Divides `a` by `b`.|
|`a^b`|<<t_num>>|Raises base `a` to exponent `b`.|
|`a=b`|<<t_bool>>|Compare `a` with `b`.|
|`a<>b`|~|~|
|`a>b`|~|~|
|`a<b`|~|~|
|`a<=b`|~|~|
|`a>=b`|~|~|
|`a%` |<<t_num>>|Divides `a` by 100.|
|`a&b`|<<t_str>>|Appends `a` and `b` as strings.|
Remember the three rules of optimization:
1) Don't.
2) Don't, yet. (Experts only)
3) Profile before optimizing. Even if this experiment showed that variables inside loops use more memory, that wouldn't justify the blanket advice to not declare variables in loops, because that's probably not where most of your program is using its memory; instead of hurting readability and violating best-practices, you should find where your program is actually wasting most of its memory.
Also, taking an average of multiple runs before and after optimization would be a more informative thing to do because the Javascript garbage collector is not deterministic.
📖 List
# [[Rebuttals and discussing under this article |https://dev.to/nicolalc/why-you-should-stop-declaring-variables-inside-a-for-loop-3npo]]
# [[Notes on v8 gc|https://dev.to/nicolalc/why-you-should-stop-declaring-variables-inside-a-for-loop-3npo]]
Optimize for:
* Consumption: using wikis should be one of the simplest things one can possibly do. Everything must be done to grease the process of creating and using wikis to engage a community. This last part can also be optimized further with...
* Engagement: feeling invested in something is important. Offering marks of achievement and accomplishment as well as promoting a real community ownership (versus manufactured ownership that is prevalent in modern social networks, where the company, not you, is in control) and responsibility is important. However, in the end, the most important reason for these two to exist in the end is to enable...
* Prosumption: everyone must experience real empowerment in terms of passive consumption and production with the wiki, and become a real 'prosumer' who benefits from others via real and valuable mutual growth and empowerment.
<p><a href="https://thenewstack.io/options-for-monetizing-your-open-source-project/">thenewstack.io</a></p>
<h1>Options for Monetizing Your Open Source Project</h1>
<p>11 - 13 minutes</p>
<hr />
<p>Open source is everywhere. It is almost unheard of for a developer to start a software project and not consider using open source components in it. In fact, 90% of software projects developed today rely on open source components for, well, pretty much anything. All developers use these incredible pieces of software, freely available online, but rarely think about the developers behind them. Open source developers spend countless hours of their spare time, coding, debugging and documenting, only to get paid exactly $0 for their talent and hard work.</p>
<h2>Why Don’t All Developers Monetize Their Code?</h2>
<p><a href="https://xscode.com/" target="_blank"><img src="https://cdn.thenewstack.io/media/2020/08/9b052f61-chen-ravid-headshot.jpg" /> </a></p>
<p><a href="https://xscode.com/" target="_blank">Chen Ravid</a></p>
<p><a href="https://xscode.com/" target="_blank">Chen Ravid is a free software enthusiast and serial entrepreneur. He is the co-founder and chief product officer at xs:code, a platform for connecting software companies with open source developers.</a></p>
<p>Open source developers are obviously not in it for the money. There are easier ways making a living than giving away great code for free. They most likely started their project out of curiosity, interest or to address a problem or need that they encountered. Most open source developers don’t even consider monetizing their projects. That is usually because they don’t really know where to start, but also because of some common myths:</p>
<ul>
<li>Monetization is “anti-open source.”</li>
<li>I have to “close” my code to monetize it.</li>
<li>Monetization is complicated. I have to start a company, hire lawyers, handle billing, etc.</li>
<li>Why should anyone pay me? My code’s already free on GitHub.</li></ul>
<p>These misconceptions are as common as they are wrong.</p>
<h2>The Monetization Spectrum</h2>
<p>Monetization can be viewed as a bell curve with two extremes: Donations on one end, and full commercialization on the other. The Y-axis is the number of projects that can benefit from those monetization methods.</p>
<p><img alt="" src="https://cdn.thenewstack.io/media/2020/08/02bc1b9d-cr1.png" style="height:220px; width:468px" /></p>
<p>On one end, there are donations, or sponsorships. Developers ask the good people that use their project, to donate money as they see fit, usually via Open Collective or Github Sponsors, so that they can continue maintaining their project. While donations are a noble notion, only a handful of open source projects actually accumulate enough ongoing donations to be considered a significant source of revenue. These are usually very large projects that have got the attention of major companies, who decided to give back to the team behind the project. The average open source project just gets the occasional donation here and there, and the reason for that — is the value (or the lack thereof) provided to the person or company making the donation. There’s no value exchange, just an act of good faith.</p>
<p>On the other side of the monetization spectrum, is the full commercialization of a project. That usually means a project is large enough and mature enough to warrant setting up a company around it, that offers enterprise versions, professional services and paid support tiers. Many great companies started just like that. Think Red Hat, or Redis labs, who took open source projects and turned them into billion-dollar companies. Forming a company, hiring staff and raising capital are all major commitments most open source developers are not ready for. And rightfully so. Most open source projects are great, but will never be big enough to be a Fortune 500 company. That doesn’t mean they can’t make a lot of money, though, even while keeping their project in the same scope as it is today.</p>
<h2>Value Is Always a Good Business Model</h2>
<p>The two extremes of the curve work well for just a handful of projects (and developers). Like all bell curves, the “meat” is in the middle. The middle represents a different approach, that is not as loose as donations, but not as intense as full commercialization. Using a platform like <a href="https://xscode.com/" rel="external ">xs:code</a>, a developer can generate revenue with their project by providing real value, but they do not have to commit to incorporating as a company. With xs:code, the code that the creator offers is free (free of charge AND free as in freedom), but they offer another value proposition on top of that free code. That value proposition can be one or more of three models: services, premium code or dual licensing. By offering paid features and services with their free code, developers provide users the ability to enjoy the additional value that is not available for free. It also shows that the project has someone committed behind it, and that the project is actively maintained. A paid offering can be a subscription or a one-time purchase. It is totally up to the project creator to decide how and how much to charge for each offering. Since xs:code handles all billing/payments/payout/storefront etc., the creator enjoys the freedom of not worrying about the business side. They can focus on creating value for users, which leads to revenue that can be spent on making their project better.</p>
<h2>Choosing a Monetization Model</h2>
<p>Choosing to monetize an open source project is a challenging decision in itself. However, once that choice is made, there is still another hurdle to overcome: deciding what is the best approach to monetize the project. Different projects might benefit from different models, and not all models will work for all developers — but almost all open source projects can be monetized. It’s just a matter of selecting the right model.</p>
<h2>Additional Services – Offer Time and Expertise to Users</h2>
<p>Developers who use open source projects (namely, everyone) often find themselves in need of help. Sometimes it is a code issue that is wreaking havoc in production and needs to be solved fast. Sometimes it is getting open source code to play nice with a company’s codebase. Sometimes people just need to ask a few questions instead of spending hours looking for an answer on their own. In the end, the developer (or maintainer) behind an open source project is best equipped to help with all of the above — and more. By making themselves available for paid services, developers create a great way to help their user base, generate revenue AND show people that using their project is safe to use, since there is actually someone available to help if the need arises. On xs:code, the developer can offer ad-hoc services on an hourly basis, such as bug fixing, consulting or even writing custom features for clients who need them. The developer sets the price, the time and how they will provide the service (for example, only on weekdays, 6 p.m. – 9 p.m. GMT). Users should be asked to contact the developer or maintainer before they buy a service. The in-app chat inside xs:code will email them when someone has pinged them, and this enables you to have even more granular control over what jobs to take, for how much and when.</p>
<h2>Licensing – Offer Another License to Paying Users</h2>
<p>While open source licenses can sometimes seem intimidating, they are actually powerful tools that developers can use to regulate what users can and cannot do with their code. Using paid licensing is an extremely popular monetization option, and it is easier to use than one might think.</p>
<p>A monetization model called “dual licensing” allows developers to offer two identical copies of their code. Each copy has a different license. The free version has one license, and the paid version has a different license. By assigning a restrictive license (such as a GPL license) to the free version, and a permissive license (such as the MIT license) to the paid version, the developer can incentivize users who need to use the code in a commercial setting to pay for it.</p>
<p>Restrictive licenses place restrictions that commercial companies may not be able to afford. But they are great for community use and for keeping code open source. Companies that need to use a specific repository can purchase access to an MIT licensed version and can then use the code freely, without worrying about restrictions posed by the free, more restrictive license.</p>
<p>A good recommendation is offering dual licensing as a subscription. On <a href="https://xscode.com/" rel="external ">xs:code</a>, for example, a subscription gives users access to a git repository with a permissive license, that’s locked unless a subscription is active. A valid question we often get, is why would anyone pay if they are “giving away” their code with an MIT license, which can then be distributed freely. While that is true, it is only true for the CURRENT version of the code. A license is only valid for the version that the user downloaded. If users want to access the latest version and enjoy future updates, they will need to keep their subscription active. That should also incentivize developers to keep developing and maintaining their project, to keep their users happy and paying.</p>
<p>While the process of using dual-licensing will require developers to re-license their code and keep two separate repositories, xs:code has made it pretty easy to get started with a “dual-licensing wizard” that will get them through the process of setting up dual-licensing within a few minutes.</p>
<h2>Premium Code – Offer a Paid Version of Your Code</h2>
<p>Many software companies use a concept called “open-core” to monetize their open source software. The idea is simple — They offer a “basic” or “core” version of their project for free while offering additional features, functionality or more frequent updates to paying clients. This means they will keep two sets of code (free and paid), and grant access to the paid version as a subscription. On xs:code, this is done by keeping a paid version on a private repository, and granting access only to users who purchase a subscription.</p>
<p>It is up to the developer to decide what features to include in the paid version, but as long as the paid features provide value to users — people will pay. Keep in mind that the free version has to provide value on its own, as not all users will convert to paying customers. This is the part where some might say that this approach means that the paid subset of code is not truly open source. While that is somewhat true, as long as a free version is kept, the developer is entirely entitled to offer some paid features.</p>
<h2>Comparing the Models</h2>
<table>
<tbody>
<tr>
<td> </td>
<td>Services</td>
<td>Licensing</td>
<td>Premium Code</td>
</tr>
<tr>
<td>Why yes</td>
<td>Flexible
<p>Easy to get started</p>
<p>Only 1 repository is needed</p></td>
<td>No availability needed
<p>No need to keep two versions of code</p>
<p>Code remains 100% open source</p></td>
<td>No availability needed</td>
</tr>
<tr>
<td>Why not</td>
<td>Requires availability</td>
<td>Requires relicensing</td>
<td>Requires keeping two repositories
<p>Paid repository is non-open source</p></td>
</tr>
<tr>
<td>Works best for</td>
<td>Anyone!</td>
<td>Components
<p>(not stand-alone projects)</p></td>
<td>Where extra features provide value</td>
</tr>
<tr>
<td>Scalability</td>
<td>Low – Get paid for work done only</td>
<td>High – Code once, sell many</td>
<td>High – Code once, sell many</td>
</tr>
<tr>
<td>Revenue Potential</td>
<td>Medium</td>
<td>Very high</td>
<td>High</td>
</tr>
</tbody></table>
<h2>Let’s Go</h2>
<p>Different options can be mixed-and-matched. For example, a premium version can be offered that includes support hours. Or multiple separate options, like a paid license or support hours. It is totally up to the developer and what they are willing to do to monetize. It is important to note that value is the best business model. As long as the project and services provide value to users — they will pay for it.</p>
<p>With the right monetization model and the right platform, anyone can monetize their project, while keeping it entirely open source and free.</p>
<p>Good luck!</p>
<p>Feature image <a href="https://pixabay.com/photos/euro-laptop-account-business-cash-3479899/" rel="external ">via</a> Pixabay.</p>
<$button>
<$action-sendmessage $message="tm-new-tiddler" tags="aika org" title="New Organisation Name" />
Create Organisation
</$button>
__Organisations in A&EF__
<<list-links "[tag[org]sort[title]]">>
* [[Unigraph]]
* [[LogSeq]]
* Title: Mapping the past, present and future of the Wiki philosophy: challenges and opportunities
* Beginning:
** Hook: "Thinking about metacognition: exploring how we think helps inform our thinking better. For example, which way achieves simplicity better: to maximize work done or work NOT done?"
** Core: "The genius of the wiki philosophy is that it encourages maximizing work not done! But why?"
* Middle:
** Point one: "wikis were originally designed by Ward Cunningham & Michael M. to capture pattern languages: a playbook of design patterns."
** Point two: "from this was derived the principles of wiki philosophy: rapidity, easy editability, generativity, bottom-up learning, embracing change, adaptability, falsification and constant refinement to stave off ossification. This eventually spawned agile development, and the art of maximizing work not done via generativity: enabling future complex behaviors via creation of simple rule-sets, like language being enabled by alphabets and not specifications"
** Point three: "Wikipedia could be considered the biggest agile project in human history! But we're not stopping there: there has been a surge in market interest in PKM solutions: Notion, RoamResearch, and new opensource software like Obsidian, AthensResearch, TiddlyWiki, etc. Moreover, we have federated wikis; the future is becoming more open and distributed"
* End: I am involved in the TiddlyWiki community: a truly open endeavor. Most of the software is being developed by folks with no programming background (thanks to generativity). We invite you to come and share in our collective journey to bring the wiki philosophy to more people in the form of useful wiki-based solutions.
* [[Overleaf|https://en.m.wikipedia.org/wiki/Overleaf]]
* [[Mathcha|https://twitter.com/MilesCranmer/status/1449797489675096066?s=20]]: http://mathcha.io
The above are both latex editors, but the latter cannot be used on its own because it lacks macros that take arguments, which is an essential feature of latex. Otherwise, it offers an incredible wysiwyg experience for latex editing; some have resorted to using the latter for drafting and then moving to overleaf for final formatting (a key strength of the former; I also like how it presents the source and final render in two separate panels.
[[Basecamp|https://basecamp.com]] has built itself into the go-to platform for a better way of doing collaborative work, without contributing to [[collaboration overload|Collaboration Overload]]. They have created several books to market their culture and viewpoints on the matter of work (content marketing at work here). Moreover, their approach seems solid and I can see why they have been successful.
However, their price point of $99/month flat may make some in our corner of the earth balk, though it is still attractive. But I think we could do better with a federated approach that will allow customers to feel more in control of their projects and workspaces, while trying to prevent all the things that would lead to collaboration overload.
{{Lean Projects Overview}}
P2Pedia is a distributed Wiki system running on a Peer-to-Peer network. Participants of the wiki store the pages of interest to them on their local node. You can edit pages written by others, but you must first download a local copy of the page; your new version will be on your node, and the old version may still be available somewhere in the network!
With this process, different versions of a page can co-exist in the network, unlike in Wikipedia and other traditional wikis, where the participants work towards a single authoritative version of each page. See also our centralized version of P2Pedia called SocialWiki.
Lawyers and law firms in general have lots of things to do and organize. Their main drains include:
# [[Paralegal services]]
# Information overload management
A degree of automation and intelligent info management can produce a ton of savings here.
<h2>An Overview of Paralegal Services:</h2>
<h2>Legal Secretarial Services:</h2>
<ul>
<li>Transcription Services</li>
<li><a href="https://www.cogneesol.com/law-firm-accounting">Accounting for Law Firms</a></li>
<li><a href="https://www.cogneesol.com/data-entry-services">Data Entry Services</a></li>
<li>Proofreading and Editing</li>
<li>Creation and Maintenance of Client files</li>
<li>Arranging for Travel</li>
<li>Email Support</li>
<li>Web Research</li></ul>
<h2><a href="https://www.cogneesol.com/litigation-support-services">Litigation Support Services:</a></h2>
<ul>
<li>Processing of Information Stored Electronically</li>
<li>Electronic Data Discovery Solutions</li>
<li><a href="https://www.cogneesol.com/document-review-services">Document Review Management</a></li>
<li>Medical Records</li>
<li>Depositions</li></ul>
<h2><a href="https://www.cogneesol.com/contract-review-and-management">Contract Management Services:</a></h2>
<ul>
<li>Retainer Agreements</li>
<li>Title Search</li>
<li>Sales Bill</li>
<li>Employee Manuals</li>
<li>Premarital and Postnuptial Agreements</li>
<li>Contracts</li>
<li>Business Partner Agreements</li>
<li>Loan Agreements</li>
<li>Separation Agreements</li>
<li>Warranty and Supervisorship Deeds</li></ul>
<h2>Law Clerk Solutions:</h2>
<ul>
<li>Legal Research Memos</li>
<li>Complaints</li>
<li>Summons</li>
<li>Motions</li>
<li>Answers</li>
<li>Collaborating with outside dealers for trial preparation & deposition</li></ul>
<p><a href="https://www.cogneesol.com/paralegal-services" target="_blank">Source</a></p>
Here's how we should run network requests in series when using async/await.
```javascript
{// Bad, Requests run in serial waterfall.
const foo = await fetchFoo();
const bar = await fetchBar();
const baz = await fetchBaz();
}
//Good, fetches run in parallel
const [
foo,
bar,
baz
] = await Promise.all([
fetchFoo(),
fetchBar(),
fetchBaz()
]);
```
A ''Parenthesized Expression'' is an [[Expression]] in parentheses:
```
(2^20 - 10^6)
```
<p><a href="https://reactjs.org/docs/faq-functions.html">reactjs.org</a></p>
<h1>Passing Functions to Components – React</h1>
<p>9-11 minutes</p>
<hr />
<h3> </h3>
<h3>How do I pass an event handler (like onClick) to a component?</h3>
<p>Pass event handlers and other functions as props to child components:</p>
<pre><code><button onClick={this.handleClick}></code></pre>
<p>If you need to have access to the parent component in the handler, you also need to bind the function to the component instance (see below).</p>
<h3> </h3>
<h3>How do I bind a function to a component instance?</h3>
<p>There are several ways to make sure functions have access to component attributes like <code>this.props</code> and <code>this.state</code>, depending on which syntax and build steps you are using.</p>
<h4> </h4>
<h4>Bind in Constructor (ES2015)</h4>
<pre><code>class Foo extends Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
console.log('Click happened');
}
render() {
return <button onClick={this.handleClick}>Click Me</button>;
}
}</code></pre>
<h4> </h4>
<h4>Class Properties (Stage 3 Proposal)</h4>
<pre><code>class Foo extends Component {
handleClick = () => {
console.log('Click happened');
}
render() {
return <button onClick={this.handleClick}>Click Me</button>;
}
}</code></pre>
<h4> </h4>
<h4>Bind in Render</h4>
<pre><code>class Foo extends Component {
handleClick() {
console.log('Click happened');
}
render() {
return <button onClick={this.handleClick.bind(this)}>Click Me</button>;
}
}</code></pre>
<blockquote>
<p><strong>Note:</strong></p>
<p>Using <code>Function.prototype.bind</code> in render creates a new function each time the component renders, which may have performance implications (see below).</p></blockquote>
<h4> </h4>
<h4>Arrow Function in Render</h4>
<pre><code>class Foo extends Component {
handleClick() {
console.log('Click happened');
}
render() {
return <button onClick={() => this.handleClick()}>Click Me</button>;
}
}</code></pre>
<blockquote>
<p><strong>Note:</strong></p>
<p>Using an arrow function in render creates a new function each time the component renders, which may break optimizations based on strict identity comparison.</p></blockquote>
<h3> </h3>
<h3>Is it OK to use arrow functions in render methods?</h3>
<p>Generally speaking, yes, it is OK, and it is often the easiest way to pass parameters to callback functions.</p>
<p>If you do have performance issues, by all means, optimize!</p>
<h3> </h3>
<h3>Why is binding necessary at all?</h3>
<p>In JavaScript, these two code snippets are <strong>not</strong> equivalent:</p>
<pre><code>var method = obj.method;
method();</code></pre>
<p>Binding methods helps ensure that the second snippet works the same way as the first one.</p>
<p>With React, typically you only need to bind the methods you <em>pass</em> to other components. For example, <code><button onClick={this.handleClick}></code> passes <code>this.handleClick</code> so you want to bind it. However, it is unnecessary to bind the <code>render</code> method or the lifecycle methods: we don’t pass them to other components.</p>
<p><a href="https://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/" rel="nofollow noopener noreferrer" target="_blank">This post by Yehuda Katz</a> explains what binding is, and how functions work in JavaScript, in detail.</p>
<h3> </h3>
<h3>Why is my function being called every time the component renders?</h3>
<p>Make sure you aren’t <em>calling the function</em> when you pass it to the component:</p>
<pre><code>render() {
return <button onClick={this.handleClick()}>Click Me</button>
}</code></pre>
<p>Instead, <em>pass the function itself</em> (without parens):</p>
<pre><code>render() {
return <button onClick={this.handleClick}>Click Me</button>
}</code></pre>
<h3> </h3>
<h3>How do I pass a parameter to an event handler or callback?</h3>
<p>You can use an arrow function to wrap around an event handler and pass parameters:</p>
<pre><code><button onClick={() => this.handleClick(id)} /></code></pre>
<p>This is equivalent to calling <code>.bind</code>:</p>
<pre><code><button onClick={this.handleClick.bind(this, id)} /></code></pre>
<h4> </h4>
<h4>Example: Passing params using arrow functions</h4>
<pre><code>const A = 65
class Alphabet extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
this.state = {
justClicked: null,
letters: Array.from({length: 26}, (_, i) => String.fromCharCode(A + i))
};
}
handleClick(letter) {
this.setState({ justClicked: letter });
}
render() {
return (
<div>
Just clicked: {this.state.justClicked}
<ul>
{this.state.letters.map(letter =>
<li key={letter} onClick={() => this.handleClick(letter)}>
{letter}
</li>
)}
</ul>
</div>
)
}
}</code></pre>
<h4> </h4>
<h4>Example: Passing params using data-attributes</h4>
<p>Alternately, you can use DOM APIs to store data needed for event handlers. Consider this approach if you need to optimize a large number of elements or have a render tree that relies on React.PureComponent equality checks.</p>
<pre><code>const A = 65
class Alphabet extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
this.state = {
justClicked: null,
letters: Array.from({length: 26}, (_, i) => String.fromCharCode(A + i))
};
}
handleClick(e) {
this.setState({
justClicked: e.target.dataset.letter
});
}
render() {
return (
<div>
Just clicked: {this.state.justClicked}
<ul>
{this.state.letters.map(letter =>
<li key={letter} data-letter={letter} onClick={this.handleClick}>
{letter}
</li>
)}
</ul>
</div>
)
}
}</code></pre>
<h3> </h3>
<h3>How can I prevent a function from being called too quickly or too many times in a row?</h3>
<p>If you have an event handler such as <code>onClick</code> or <code>onScroll</code> and want to prevent the callback from being fired too quickly, then you can limit the rate at which callback is executed. This can be done by using:</p>
<ul>
<li><strong>throttling</strong>: sample changes based on a time based frequency (eg <a href="https://lodash.com/docs#throttle" rel="nofollow noopener noreferrer" target="_blank"><code>_.throttle</code></a>)</li>
<li><strong>debouncing</strong>: publish changes after a period of inactivity (eg <a href="https://lodash.com/docs#debounce" rel="nofollow noopener noreferrer" target="_blank"><code>_.debounce</code></a>)</li>
<li><strong><code>requestAnimationFrame</code> throttling</strong>: sample changes based on <a href="https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame" rel="nofollow noopener noreferrer" target="_blank"><code>requestAnimationFrame</code></a> (eg <a href="https://github.com/alexreardon/raf-schd" rel="nofollow noopener noreferrer" target="_blank"><code>raf-schd</code></a>)</li></ul>
<p>See <a href="http://demo.nimius.net/debounce_throttle/" rel="nofollow noopener noreferrer" target="_blank">this visualization</a> for a comparison of <code>throttle</code> and <code>debounce</code> functions.</p>
<blockquote>
<p>Note:</p>
<p><code>_.debounce</code>, <code>_.throttle</code> and <code>raf-schd</code> provide a <code>cancel</code> method to cancel delayed callbacks. You should either call this method from <code>componentWillUnmount</code> <em>or</em> check to ensure that the component is still mounted within the delayed function.</p></blockquote>
<h4> </h4>
<h4>Throttle</h4>
<p>Throttling prevents a function from being called more than once in a given window of time. The example below throttles a “click” handler to prevent calling it more than once per second.</p>
<pre><code>import throttle from 'lodash.throttle';
class LoadMoreButton extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
this.handleClickThrottled = throttle(this.handleClick, 1000);
}
componentWillUnmount() {
this.handleClickThrottled.cancel();
}
render() {
return <button onClick={this.handleClickThrottled}>Load More</button>;
}
handleClick() {
this.props.loadMore();
}
}</code></pre>
<h4> </h4>
<h4>Debounce</h4>
<p>Debouncing ensures that a function will not be executed until after a certain amount of time has passed since it was last called. This can be useful when you have to perform some expensive calculation in response to an event that might dispatch rapidly (eg scroll or keyboard events). The example below debounces text input with a 250ms delay.</p>
<pre><code>import debounce from 'lodash.debounce';
class Searchbox extends React.Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
this.emitChangeDebounced = debounce(this.emitChange, 250);
}
componentWillUnmount() {
this.emitChangeDebounced.cancel();
}
render() {
return (
<input
type="text"
onChange={this.handleChange}
placeholder="Search..."
defaultValue={this.props.value}
/>
);
}
handleChange(e) {
this.emitChangeDebounced(e.target.value);
}
emitChange(value) {
this.props.onChange(value);
}
}</code></pre>
<h4> </h4>
<h4><code>requestAnimationFrame</code>throttling</h4>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame" rel="nofollow noopener noreferrer" target="_blank"><code>requestAnimationFrame</code></a> is a way of queuing a function to be executed in the browser at the optimal time for rendering performance. A function that is queued with <code>requestAnimationFrame</code> will fire in the next frame. The browser will work hard to ensure that there are 60 frames per second (60 fps). However, if the browser is unable to it will naturally <em>limit</em> the amount of frames in a second. For example, a device might only be able to handle 30 fps and so you will only get 30 frames in that second. Using <code>requestAnimationFrame</code> for throttling is a useful technique in that it prevents you from doing more than 60 updates in a second. If you are doing 100 updates in a second this creates additional work for the browser that the user will not see anyway.</p>
<blockquote>
<p><strong>Note:</strong></p>
<p>Using this technique will only capture the last published value in a frame. You can see an example of how this optimization works on <a href="https://developer.mozilla.org/en-US/docs/Web/Events/scroll" rel="nofollow noopener noreferrer" target="_blank"><code>MDN</code></a></p></blockquote>
<pre><code>import rafSchedule from 'raf-schd';
class ScrollListener extends React.Component {
constructor(props) {
super(props);
this.handleScroll = this.handleScroll.bind(this);
this.scheduleUpdate = rafSchedule(
point => this.props.onScroll(point)
);
}
handleScroll(e) {
this.scheduleUpdate({ x: e.clientX, y: e.clientY });
}
componentWillUnmount() {
this.scheduleUpdate.cancel();
}
render() {
return (
<div
style={{ overflow: 'scroll' }}
onScroll={this.handleScroll}
>
<img src="/my-huge-image.jpg" />
</div>
);
}
}</code></pre>
<h4> </h4>
<h4>Testing your rate limiting</h4>
<p>When testing your rate limiting code works correctly it is helpful to have the ability to fast forward time. If you are using <a href="https://facebook.github.io/jest/" rel="nofollow noopener noreferrer" target="_blank"><code>jest</code></a> then you can use <a href="https://facebook.github.io/jest/docs/en/timer-mocks.html" rel="nofollow noopener noreferrer" target="_blank"><code>mock timers</code></a> to fast forward time. If you are using <code>requestAnimationFrame</code> throttling then you may find <a href="https://github.com/alexreardon/raf-stub" rel="nofollow noopener noreferrer" target="_blank"><code>raf-stub</code></a> to be a useful tool to control the ticking of animation frames.</p>
A pattern language is an organized and coherent set of patterns, each of which describes a problem and the core of a solution that can be used in many ways within a specific field of expertise. The term was coined by architect Christopher Alexander and popularized by his 1977 book A Pattern Language.
When a designer designs something – whether a house, computer program, or lamp – they must make many decisions about how to solve problems. A single problem is documented with its typical place (the syntax), and use (the grammar) with the most common and recognized good solution seen in the wild, like the examples seen in dictionaries. Each such entry is a single design pattern. Each pattern has a name, a descriptive entry, and some cross-references, much like a dictionary entry. A documented pattern should explain why that solution is good in the pattern's contexts.
Saw this tweet about logseq that got me thinking 🤔
<<<
@logseq has one of the best built-in PDF annotation systems. Split-Screen. Fast, effective, and intuitive. Allows highlighting of text and images. Creates references with backlinks automatically. Refs are editable (to add notes or links). PDFs are stored in your notes vault.
<<<
[[Source|https://twitter.com/rcvd_io/status/1495510101213466628?s=20&t=UJeteOGl9FiVJ1RnWmDDTg]]
[[This case study for Conclave|https://conclave-team.github.io/conclave-site/]] seems to be a good guide for building a peer to peer text editor.
__Pending items__
* Second addendum: better add an explicit before item `load-item` so that plugins are loaded only after startup has finished processing all new tiddlers stored in PouchDB.
* Should we also load all tiddlers stored in the server in the startup module so that any new plugin data is loaded and ready to processed?
We can persist tiddlers to a hashmap/object(if we're sure we don't need to convert this into a json object later, then let's use Map to manage our keys) of multiple databases:
```javascript
class LocalStoreHandler {
constructor (opts) {
super(opts);
this.wikiDatabases = {}; // or use new Map([]);
// we should also instantiate whatever databases already exist in the index database here and add them to this.wikiDatabases
}
// use this method when creating new wikis
createWikiDatabase (name) {
if (this.wikiDatabases[name]) return;
const db = new PouchDB(name);
this.wikiDatabases[name] = db;
}
}
```
* Service statuses should reflect the possible states of authentication. Namely:
** `logged-out`
** `authenticating`
** `logged-in`
** Errors during authentication should be displayed without persisting and should invite to try again. The status for failed authentication should revert to `logged-out`
* the APIHandler class should instantiate login status using local storage statuses if any
* Successful persistence should only happen after successful redirect with code or access token obtained. So the status should persist after authentication.
Federated Wikis is the next wiki-generation. It is a software that allows everybody to create individual wiki pages while circulating its content in a global - federated - environment. It opens multiple paths for individual knowledge organization while demanding equal responsibility in creating a knowledge commons . This knowledge commons emerges out of thousands of wiki sites people freely contribute to.
In short: ''Federated Wikis provide a discrimination-free infrastructure that allows for co-creation in diversity.''
<<<
"The philosophy that drives me forward is this notion, that we can all be unique but we can still make wise choices together." (Ward Cunningham)
<<<
<<<
"Just as the wiki changed how people write, FedWiki will change how people work." (Ward Cunningham)
<<<
Some benefits and advantages:-
* support communities in a digital environment
* get people & knowledge together in a common space while conserving their individual space
* share data among people with different points of view recognizing that there is no such thing as a neutrality in data
[[Source|http://makecommoningwork.fed.wiki/view/federated-wiki]]
#### Build your own `Physics Engine`
* [**C**: _Game physics series by Allen Chou_](http://allenchou.net/game-physics-series/)
* [**C**: _Video Game Physics Tutorial_](https://www.toptal.com/game/video-game-physics-part-i-an-introduction-to-rigid-body-dynamics)
* [**C++**: _How to Create a Custom Physics Engine_](https://gamedevelopment.tutsplus.com/series/how-to-create-a-custom-physics-engine--gamedev-12715)
* [**C++**: _Game physics series by Glenn Fiedler_](https://gafferongames.com/post/integration_basics/)
* [**C++**: _3D Physics Engine Tutorial_](https://www.youtube.com/playlist?list=PLEETnX-uPtBXm1KEr_2zQ6K_0hoGH6JJ0) [video]
* [**C#**: _TowerFall Physics_](https://mattmakesgames.tumblr.com/post/127890619821/towerfall-physics)
* [**JavaScript**: _Build your own basic physics engine in JavaScript_](https://www.graphitedigital.com/blog/build-your-own-basic-physics-engine-in-javascript)
* [**JavaScript**: _How Physics Engines Work_](http://buildnewgames.com/gamephysics/)
* [**JavaScript**: _Broad Phase Collision Detection Using Spatial Partitioning_](http://buildnewgames.com/broad-phase-collision-detection/)
* [**JavaScript**: _Build a simple 2D physics engine for JavaScript games_](https://www.ibm.com/developerworks/library/wa-build2dphysicsengine/index.html)
[[Picovoice|https://picovoice.ai/]] is the end-to-end platform for adding voice to anything
In today's meeting, I've learnt a few things about pilot studies:
* Participants should be informed about this being a pilot study
* Data is usually not included or two reasons:
** The consent is usually different from the real study
** The methodology and protocol may differ from the real study
Otherwise, you could technically add the data. You might also need to make some arrangements for the pilot participants so that they can benefit despite the fact that they were enrolled into a pilot study.
Innovation Peer is a platform that helps teams innovate better. We give you access to on demand information sessions in the form of workshops and consultation sprints designed to allow corporates to learn how to make it big while failing fast and cheap, i.e. the chances of payoffs should be big while the risks of failure should be reduced.
Now begin talking about Innovation Peer's services:
__TL,DR;__
Innovation Peer offers a variety of workshops designed to get your teams started on modern methodologies designed to increase productivity while minimizing wastage of time and limited resources. Furthermore, they're designed to prevent costly failures and instead encourage small failures and success discovery.
For example, we have a tool for marketers that allows them to reduce their project lifecycle from weeks or months to just 4 day sprints or 1 day sprints if required. Another popular tool we have is the LEAN DECISION MAKER which allows you to avoid ten meetings that produce little to no decisions in favor of one three hour meeting that produces an entire sprint roadmap plan for a department.
We are ready to offer you a one-time free demo of our services.
__Details__
Our methodologies are used at many companies and have their origins in the Toyota principles of lean manufacturing. They are designed to bring disciplined, evidence-based decision making to the fore of organizations in order to move forward faster while reducing wasteful activities such as "meeting culture", "communication overload", "waterfall methods", et cetera.
We classify our offers into the following three categories which are designed to cater to every aspect of the product life cycle:
# Business model innovation: more than a revenue model, but a way of discovering and testing new ways of creating, capturing and delivering value.
# Design sprints: A Design Sprint is a unique five day process for validating ideas and solving big challenges through prototyping and testing ideas with all stakeholders.
# Ethical growth hacking: providing traction to your project in the least amount of time with the least amount of overhead via short, smartly designed growth experiments.
<p><a href="https://www.ycombinator.com/library/6q-how-to-pitch-your-startup">www.ycombinator.com</a></p>
<h1>How to Pitch Your Startup: Getting Started, Press, Fundraising + Investors</h1>
<p>36 - 46 minutes</p>
<hr />
<p>In this lecture, YC Partner Kevin Hale goes over how to package up your idea and communicate it to an investor. He shares his tips on how to craft your pitch in a clear and concise way that effectively grabs your audience's attention.</p>
<p><strong>Watch if:</strong></p>
<ul>
<li>this is a must watch!</li>
<li>you want investors to pay attention to your startup</li>
<li>people have a hard time understanding what your startup does</li></ul>
<h2>Transcript</h2>
<p>Kevin: This is gonna be part two of a talk I gave at the very beginning of Startup School on evaluating startup ideas. And the thing to know about both of these talks is we've been talking about them from the point of view of the investor. Basically, it was helpful, I thought, to explain to founders how investors evaluate startup ideas and looking at that structure so that they can better understand their own ideas, opportunities, and then in this presentation, present them better to the people that they want to get excited.</p>
<p>So, a quick recap. In the first part, I basically say a startup idea is a hypothesis for why your company is gonna grow really quickly. That hypothesis must compose of three different parts: the problem, the solution, and insight. And the basic parts is your problem should be pretty big, pretty pervasive, have a lot of these characteristics to make it feel like there's a very big market that a lot people have the problem. Don't think you need to know about the solution is that you should not start with a technology, you should start with a problem. And lastly, you're looking to have something that's gonna make your company unique and have some kind of unfair advantage that we call an insight that will show why your company will grow faster than other companies.</p>
<p>I talked about five different types of unfair advantages that your company can have, and kind of what are the benchmarks for meeting them. Now, the thing to keep in mind about understanding and creating this startup idea is that I don't need you to do all the work that lay all of that out in detail. That stuff that you'll kind of want to know or keep in mind, but a really good investor will do that on their own. They'll hear what you're talking about and extrapolate.</p>
<p>And so, what I'm gonna cover in this presentation is how do you package up that hypothesis? How do you take all the things that you understand about your company and your startup idea, and how you present it to an investor so that they can make a decision that's in your favor? This is the YC startup application. And basically, this is the application, all the questions that we ask that YC partners will use to evaluate your startup.</p>
<p>So, down here, when you're filling out the YC application, we actually linked to a couple of things and one of them is How to Apply Successfully. I can't tell because I've read so many applications, but it feels like founders are not reading that essay. It was written by Paul Graham in 2009 and almost everything in there still holds to this day, and people still make mistakes on it. So, I'm just gonna like, point out some stuff and really, like, punch it in here while I have your attention.</p>
<p>So, here's a quote from that essay. Basically, we believe for every company that we will interview at YC, we bet there's probably another company that's just as good to them out there but they messed up on the application and we didn't realize it. We didn't invite them. And basically, the reason is because they didn't express their idea clearly. That's it. Like, you might think, "Oh, I didn't show off all that complex stuff about my startup idea and that's why they didn't pick me." And I want you to know, that's not true. And so, the first thing I want you to keep in mind is I do not need you to sell me as a YC partner. Right?</p>
<p>So, average investor, what they do is they talk to you when you tell them about your idea, and it feels like they're poking holes, all the questions they ask about what's all the reasons why this could go wrong? A good investor does it the other way around. They hear what you say and they imagine and they use their optimism and they use knowing that some kind of rare event has to happen for you to become a billion-dollar company and they try to imagine all the those rare events that could possibly happen to you, and then they pitch that path back to you.</p>
<p>And so, we are really good at selling ourselves. So, you don't need to do that. And the thing is, you guys are kind of bad at selling things in the beginning, right? And what I need you to understand is that I'm trying to evaluate these three statements when I'm hearing your idea. Do I understand it? Am I excited by it? Do I like the team and do I wanna work with them?</p>
<p>Surprise, in your weekly updates, when you do your group sessions, these are the questions that we ask you to ask one another. It's basically the questions that we're trying to figure out for ourselves. And we're hoping that every week, when you talk with other companies, you are practicing getting feedback and understanding whether you're able to instill this in other people. So, your goal is just to be clear, I will do everything else.</p>
<p>So, back to the application. These are the only two things we're gonna focus on today. What do I put in the what's my company going to make? How do I describe my company in a very efficient manner? The first way to do this is to be clear. The reason we focus on this is because a clear idea is a foundation for growth.</p>
<p>And what I mean by that is that the best companies in YC, or around the world, grow organically, they grow by word of mouth. What does word of mouth look like? It looks like this. It's basically, I talk about your company, what you're doing, making, etc. and I'm the most interesting person at the dinner table. And I tell it to other people, and those people wanna tell other people. That's it. Word of mouth is something where I remember what you do, I talk about it enthusiastic, and it spreads on its own. Marketing and advertising, it's a tax I believe companies pay because they did not make something remarkable.</p>
<p>Now, before anyone can remember at the dinner table what you do, they have to understand. And so, I have very simple rules for how to make things easy to understand. This will sound familiar if you're familiar with an essay I wrote on "How to Design a Better Pitch Deck." And I'm gonna focus on basically saying that the way I talk about designing a pitch deck actually works for ideas and lots of other things. And so, the way I make things easy to understand on a pitch deck or a slide is to make it legible, to make it simple, and make it obvious.</p>
<p>In today's presentation, we're just gonna focus on making your idea legible. It's gonna sound interesting, right? For clarity. Now, in my essay, I talked about how at demo day, when our startups are presenting to a roomful of 1,000 investors, it's kind of an interesting audience. Number one, the audience is filled with really old people, they tend to not have very good eyesight as a result, they all can't sit in the front row like you lovely people. Some of them have to sit in a way back and stand up. And that means if you create a legible slide, they have to be ones that even old people in the back row with bad eyesight can read.</p>
<p>Now, how does that apply to a legible idea? Well, basically, you are designing a slide that democratizes the idea, right? And so people who are blind or people who are ignorant, you're basically designing something for everyone in the room, not just the ones in the first row. So, a legible idea can be understood by people who know nothing about your business. That will make things very clear to the widest possible audience. Now, this is super important because you will talk about your company more than anything else. It is actually the thing that we are really great at Y Combinator. We have our companies constantly practice talking about their startup.</p>
<p>Startup School curriculum is designed around helping you constantly practice talking about your startup. And this is because you are going to need a lot of people if you're going to become a billion-dollar company. So, you are trying to find a co-founder, you have to have a way of talking about your company clearly. Whether you're getting users, or investors, or employees, or shareholders, you have to get really good at this. And you have to be able to do it quickly and efficiently.</p>
<p>Here are things to avoid that makes things not clear, that makes your idea muddy. The first is ambiguity, right? So, that's like, obviously, the opposite of clear or straightforward. Something's a little abstract, something could be interpreted in two ways. And therefore, it might take a question to understand what you do.</p>
<p>Complexity. So, I've a very specific definition of complexity. And so, if you look at the root word, simple and complex come from the same root and having to do with twists or braids. Things that are simple are ones that have one braid and things that are complex have multiple braids. They're intertwined with one another. A simple idea is one idea that does not fold. A complex idea are ideas that are intertwined. So, simplicity means you are not trying to mix a bunch of things in your description.</p>
<p>Mystery. So, this is an odd one. Well, what I mean is anything where it's like, I'm not gonna understand what is going on when you're talking about your company. Jargon is one, obviously, any words that I don't understand, anything that's fake like indefinite pronouns. So, if you just use this, etc., and you don't describe what those nouns are, and then things that you just suggest, but aren't explicit about.</p>
<p>And the last is ignorable. And so, what I mean by that is there's some language that we will just ignore. So, in UX design, people will create a sort of blindness to things that they don't wanna look at or they don't find to be of important value. So, for example, ad blindness is a big one that people sort of understand. And the thing is, when you're talking about ideas, there's a way of using language that is also easily ignorable, things that just won't stick in your head.</p>
<p>Things like marketing speak. It's probably lots of stuff that you heard about that, MBA speak, where you kind of like, puff yourself up, talk that doesn't give any extra information, and then buzzwords. And so, when you say certain types of words, that as an investor I've heard over and over again or I will equate with zero information or value, then I will ignore them. And the result is parts of your pitch will end up being not even heard by me, and therefore I will not remember them.</p>
<p>What you wanna do is be conversational. A great pitch is one where you can tell it to your mom and she gets it. She's proud of you, right? She's not gonna shake her head. And that means it's got to be conversational. And that's really good for word of mouth because we talk in normal conversational speak. We don't talk like an MBA. We don't talk like CEOs all the time. So, it's best to talk conversationally.</p>
<p>Again, avoid jargon, words that are only understood or used by your industry. No preamble. We'll have some examples of this. But if you wanna be clear, let's go straight to what you want to talk about. Let's not have a winding path to eventually getting there.</p>
<p>And the last one, this one's a big one, it's being reproducible. So, when I hear your idea, can I imagine it in my mind? Can I see what I would have to build to create your company? If I don't have that, then I have no picture in my head about what your company does. And until I have that picture, I can't ask any of the questions that helps me understand, if I'm excited about you or understand other nuances of your business. To make things reproducible, I need to know nouns. I need to have objects that I'm gonna imagine in my head.</p>
<p>And there's three types of nouns that I should understand from your startup idea. First one is what are you making? That should be really clear. What is the problem? And then who is the customer? The two are kind of related to the market, right? But I should have these kind of three nouns in my head.</p>
<p>So, let's go through some examples. This says, we are going to transform the relationship between individuals and information. This sucks. The thing is, we see this all the time. Number one, all the nouns that you see down here are abstract. They're ideas. I can't reproduce based off of this, has zero informational value. I still have to ask questions to answer the three nouns that I need to have. This is a bad description for a company.</p>
<p>We will see stuff that starts like this, when we ask, "Describe what your company is gonna make." I don't even wanna read it. But basically, it starts talking about the story of the company. Or basically, like, "In the beginning, there was this problem, and we're gonna go through this issue, right? And then there's these bad guys, and they showed up, but then who's gonna save us? We're finally here to save..." And you're like, "I have to read another thousand applications." That's not gonna work for me.</p>
<p>This is the description on the actual application that Airbnb put to YC. Airbnb is the first online marketplace that lets travelers book rooms with locals, instead of hotels. It's concise, it's descriptive. I understand what they're building, I have a sense for what they're making. And then I can start thinking about my other two ideas of whether I'm excited about it. And then am I gonna like this team?</p>
<p>Here's Dropbox. Synchronizes files across your or your team's computers. The thing about this is it's refreshing but also there's no pretense. They aren't playing defense. I see a lot of company descriptions where they're like, "I'm worried about this, or I've gotten this kind of feedback." And so, they give up clarity to make themselves look bigger and blow themselves up or make themselves try to look more interesting. They're trying to protect themselves against something way ahead of time. And the whole problem is usually what ends up doing is it brings me farther away from you, all that padding that you've put on yourself.</p>
<p>Here's a description from a company in the current batch. Lumineye is building X-ray vision for soldiers and first responders. We don't have to go deep into the details. I don't need to understand how they exactly do this, etc. This creates a foundation for my curiosity. Now, I will start from here to try to figure out, "Oh, how do you do this? Is this the right team to do this? How far along are they? Do they have traction? Do they have customers?" I start going down the route of asking all the right questions based off this one description. This is a good one.</p>
<p>There's another one. So, Vahan, in the current batch, is building LinkedIn for the next billion internet users. So, doesn't perfectly connect me to what they're sort of making, but I'm intrigued. I'm excited about someone building the LinkedIn and I know it's some kind of social network for business people. And so, now I'm curious about how. I don't need you to answer how in the description, but I understand what you're doing. And then, now, I can start making questions in my head about like, how would I evaluate whether this is working or successful or promising or not? Or is this the right team? Do they have a certain amount of traction, etc.? It gets me on the right track.</p>
<p>Now, the reason I've used this example is because we have a lot of companies who try to use the X for Y. And what I mean by that is like LinkedIn for whatever or Uber for blank or Airbnb for blank. And so, that X for Y is super useful because it allows you to shortcut business model and some kind of complex behavior, right? And then attach it to some other vertical or something that you're trying to make work. X for Y is okay but most people abuse it or do it incorrectly. So, I'm gonna give you some tips.</p>
<p>First, should you use X for Y? Sorry for the legibility. Number one, is X a household name? This should be like a billion-dollar company, right? You can't use your uncle's like pet shoe store as the X for this because people don't know your uncle's pet shoe store and they don't know if it's successful or not, right? So, everyone, as many people should know about this as possible, and for an investor, it should be clear that it's a billion-dollar-company opportunity. Everyone has to agree that it is successful. So, you could have a really big X everyone knows about it but it's infamous, right? So, a lot of people don't think it's successful. So, be careful of that.</p>
<p>Does Y want X? So, is it really clear why the target that you're going after wants this kind of model applied to it, this kind of solution applied to it? Whether it's Airbnb for, Airbnb, or Uber for, etc. It should be really clear that that's a segment that's either missing it, it's not being served well by the other one, and also that those people want to have that kind of model.</p>
<p>And then third one is Y should be a huge market? So, if you're building X for Y and in the last part doesn't sound like a really big business, that's not gonna work well for you, right? Because what we want, because you're essentially saying that you are something but it's a subset. And what we want to make sure is that subset feels like it could be really, really big. If you choose the subset that sounds like it's going to be really, really small, investors won't be as interested. It means that I'm worried that you will not have enough potential headroom to grow to become a billion-dollar company.</p>
<p>So, here's an example that it doesn't work. So, we had a company in the batch that started off by describing themselves as Buffer for Snapchat. Buffer is a nice company, but definitely smaller than Snapchat. So, don't wanna do that.</p>
<p>All right, so basic summary for this section. Lead with what not why or how. You don't need all that other stuff, that stuff gets in the way of your clarity for the most part. I read that like 1,000 applications every single batch and it's a really hard thing to do. Basically, even though it's my job, it's really, really difficult to have that much focus and attention across all these different applications. So, I need some empathy. I need you to help me out.</p>
<p>And what we want is that when I bring up your application, and I'm looking at it, let's make our intimate time really pleasurable, right? Let's make the time that I spend on your idea very efficient. I'll just look at it, I'll understand really clearly, I'll move around your application to be like, "Oh, I'm kind of excited, maybe there's gonna have this." And I'll look at that part and I'm like, "Oh, they do have it, that sounds awesome. Oh, what about this? Oh, that sounds awesome, too."</p>
<p>What we don't want is me to go like, "I don't know what they're talking about." Then I have to like, go to your website, I'm like, "I don't know what they're talking about. I don't know how that sort of works." I go back to it, I try to figure something else out, I try to see if like some other partner might understand what you're doing, etc. Super inefficient. Where is there going to be room for me to get excited as a result?</p>
<p>So, to be efficient, we need to be concise. Concise. The best way, I wanna keep this in mind, is to use some examples. And so, here's some things I need you to keep in mind. Yes, I want you to be concise, use as few words as possible. And what I want you to understand is the concision, it actually gives me secondary information about you as a team. It lets me one, know that you've thought deeply about your idea. Because you've thought so deeply about it and because you've practiced talking about it so much, and you've gotten really good at getting people excited and understand your thing really quickly, you probably figured out how to do it in a short amount of time. So, it lets me know that this is a founder that has thought deeply about the idea.</p>
<p>The other thing about being concise, it shows me that you are efficient. And if you're efficient with your words, then you're probably efficient with your thoughts, and that means you're probably also efficient with your actions. And what that means is that I will start to believe that you understand what is most important about your business, you understand and communicate it clearly. And you might actually know how to always figure out the most important part of what to do about your company to make it grow, to make it work, etc.</p>
<p>So, there's a minimum stuff that we want to have, even though we're trying to be as concise as possible. Again, I wanna understand the nouns. So, if we're so concise, that I can't understand these, then your concision is too much. The other is, I want to get to this point, when I read the concision or this short version of whatever it is you're talking about, because again, I know there's like 100,000 reasons why your company is great, but when I'm reading your application, I'm only going to maybe remember two to three of them. And so we have to try to make sure those most important ones come up to the top.</p>
<p>This is a real Startup School company description. It's an online ecommerce store. I can picture what it is, but again, it's not a description that helps me get excited about, it doesn't help me lead to all the other things. I have to do now more work to understand why this is fast growing and its potential. I also don't know, based on this, some nouns. I don't know exactly who the customer is. Is it people that are selling stuff too? Are they making an e commerce store for other shop owners? It's ambiguity.</p>
<p>IT security services. This is most of the descriptions that we see on Startup School. It makes it really, really hard for us to understand it.</p>
<p>A meritocratic decision support system. The thing is, I wanna know for what, for whom, I don't even understand what the problem is that they're solving based off of this. And so, is it because a lot of people have non... Basically, I have to ask so many questions in my head to figure out why did they get to this sort of description.</p>
<p>Learn and sharing knowledge about Data Science and Artificial Intelligence. Sounds more like a mission. I can't tell what the product is, and how they're sorted and go about it. Like, I couldn't reproduce this. If I had 10 companies build based off this description, you'd have 10 very different products. The only thing that's odd about company descriptions is you guys tend to capitalize and make proper nouns very weird words and phrases. You should not do that. It's not like a magazine title. And it makes me think sometimes you're emphasizing the wrong things. Like you're thinking the data science and artificial intelligence is the thing that's gonna make me excited. And the thing is like, those are the buzzwords, those are the solutions, and it makes me worried that you haven't started with a problem.</p>
<p>Let's do an example of like how to adjust a description. So, here's a much longer one. So, our company will make low cost and low power consumption medical devices based on artificial intelligence and IoT suitable for sub-Saharan communities. Now, relatively clear, I could understand it reading it, but it's not the most concise form of this and I feel like there's a lot of things get in the way. And so, when I work with companies to help shrink and reduce and improve their descriptions so that I will get the most out of it. I wanna talk through the process.</p>
<p>The first thing I wanna do is figure out what are the nouns in the description? Here we go. Our company, medical devices, for sub-Saharan communities. Oh shit, we're almost done, right? Everything else that gets added on here, whatever verb, adjectives or adverbs you want, you wanna be really careful. You wanna know like, is it giving maximum punch for this? Right? And so, really, the verb is going to be usually just you're making something, etc.</p>
<p>But usually it's going to be whatever the product, like, the verb is like the thing that we're making. If we're thinking about this in an active voice structure, the subject, the verb, and then the object - the customer, the market, the people we're going after. Everything else, if we add anything back to this, I really wanna be really careful about why we're gonna add back to it. Is that gonna be the stuff that makes me excited?</p>
<p>So, the artificial intelligence, IoT suitable stuff, that's like how they wanna get to it, the technology, and I'm more worried that they're wanting to use buzzwords to describe it, right? Hopefully, that's like a secret weapon that you have. But I bet it's not the defining characteristics of whether this company is successful or not.</p>
<p>And then up here, I see two modifiers for medical devices, low cost, low power consumption. So, low cost, I could definitely see, that's super interesting. If you make a low-cost device in sub-Saharan community, then I'm like, "Oh, that's interest. That's really interesting." Because that's, like, it's hard just to make something, you know, for developing countries, but to make it so that actually affordable for them, that'd be interesting. The low power consumption, I can give or take there, I'd have to know more about the company to know whether that's actually crucial to understanding whether this company has an unfair advantage or not.</p>
<p>So, if I was to redo this, we come out to, "We create affordable medical devices for sub-Saharan Africa." Some people are gonna be very squeamish about this. A lot of founders are worried it's like, "You're putting me in a box, man. It's too reductive. My business is complex, I do a lot of things and a lot of things make me great. I wanna tell you all of them." And the thing is, like, you don't have time, and I know it, as an investor. There is no investor that thinks any business is like simple and easy. I just don't think that from the default, so you shouldn't be worried that I'm going to think something small of that.</p>
<p>And again, you wanna be careful of the defense on here. Once I get to this, then I'll start asking the other questions. It creates that foundation for curiosity.</p>
<p>All right, I'm pretty much here at the end. The best way to help me, and I would love for you to help me, is to be clear and concise. Thank you very much.</p>
<p>All right, so we'll do a couple of questions about this presentation. And then I'll have Adora join me and then we'll answer questions about anything. Right here.</p>
<p>Man 1: Thanks for the presentation, Kevin. You talked a lot about what is presenting an application but you also hear a lot of pitches, especially in demo day. And what, in your opinion, are the killer tips to make a great pitch and get people to like you in a demo day?</p>
<p>Kevin: So, he's asking about, like, I talked a lot about here about writing an idea for the application, how's that might be different for companies who are pitching or presenting investors on like a demo day? What are things that we look for? And so, I talked about in that essay that I wrote how to pitch, how to design a pitch deck and talk about like how to present the ideas. The main thing to keep in mind is that at...</p>
<p>So let me describe the situation. So, demo day at Y Combinator, it's like 1,000 people in the room, and you have two minutes to talk about your company and show what you've built to get them excited. And then there's gonna be 200 other companies that will do the same thing on the stage. It's an extremely hard problem. And so, in two minutes, what do you get across? How do we get it so that in two minutes, a company on average will then raise $1.5 million after demo day?</p>
<p>And the thing to keep in mind is that, yes, there's 100 reasons why your company is great. You cannot say all of them in two minutes, you can't say them in a short conversation when you're meeting a bunch of investors inside of the room. There's like maybe five to six points that are really, really great about your company, maybe the investor will remember one or two of them. One of them has to be remembering what you do. And so, the goal of you being on stage is not to say all the things that's great about your company, it is to get people to want to have a conversation with you, to say, like, "I can't ignore having a conversation with that person." That's what a great pitch does.</p>
<p>And what that means is, you don't make the slides be the thing that they remember. You wanna make yourself. It's about your presence, the way you talk, how confident you are, etc. Basically, do you present yourself in a way that people go, "I wanna interact with you."? And so, the presentation is more about making the founders look formidable and impressive to use a language that everyone understands and is clear, but feels inevitable. And so, the goal is not to do all this fancy stuff. It is to do very simple fundamentals and talk about them in a way so that everyone will understand. Right there.</p>
<p>Man 2: I applied a couple of times and the one question that's always the bane of my existence is the, "What's the surprising or amusing thing that you've noticed about the world?" Could you provide some clarity in terms of what you're looking for there? Is it something about the business or is it like something witty? Like, I just spend way too much time on that question.</p>
<p>Kevin: So, we have a question on the application to YC that is about explain what you...</p>
<p>Man 2: It's like, what's something surprising or amusing that you like to...?</p>
<p>Kevin: Yeah. So, share something surprising, amusing that you've noticed about the world. And he's saying I'm having a hard time with the question. And so, any tips about that? So, again, we at YC, we don't really judge ideas. I talked a lot about how to present your idea. But the idea is a reflection of how you think. So, everything that we have in the application is to try to understand more about the team and the people who are behind the company.</p>
<p>So, a question like that is very obvious. It lets us know, how do you think about stuff? What do you find interesting or amusing? Because part of it is that YC is optimized to spend time with lots of people every single week for dinner. And I want to spend time with people I like, people who are not assholes, and are kind of interesting. Right? And so that kind of question, it's a basically a dating question, to letting me know, it's like, "Oh, I wanna buy this guy dinner." Right here.</p>
<p>Man 3: In my example, it's a very specific financial problem that I'm trying to attack. So, should I work on trying to make that very complex in very specific problem, something that anyone understands? Or should I talk to the right people that understand that type of problem?</p>
<p>Kevin: Gotcha. So, the question is he's working on a very complex FinTech solution or app. And he's wondering, it's like, how do I balance this talking to the right people so I can use jargon and who understand the complexity versus making a version of the idea that everybody can sort of understand? The answer is you have to do both. So, everyone that you're talking to at industry, your users, customers, or your business partners, you get a shortcut with them. And that's most of the people you're gonna interact with. And the thing to know about that is you need to have that developed, right? That customer or business partner speech so that you're efficient and talking with them.</p>
<p>The thing is, you also have this other one, if you're interested in outside investment, having the press want to talk about you, etc. You need to have a good storytelling narrative for non-experts. So, really, it is not one or the other is how you have to do both. And the thing is for FinTech people, because there's so much around all these other people who just understand this stuff, they rarely practice the other thing, because they just assume it's always going to be like that. But when they come to YC, it's the first time they want money from investors who might not know about their space or they wanna talk to press who's not gonna understand what they're doing, etc. Right here, sitting down.</p>
<p>Woman: How do the best, most memorable applications make you feel?</p>
<p>Kevin: So, how do the best, most memorable applications make me feel? Probably the best ones. Make me go like, "Fuck. I wanna join their company." That's like the best ones, right? It's like, "Man, these guys seem really cool, they're super smart. I feel like I'll learn a lot of stuff from them. Man, how do I get on their bandwagon?" Right. Like, I'm thinking about quitting YC. So, would be, like, the best ones possible.</p>
<p>In the second tier, it's really just like, I'm energized. Because when I'm reading tons of applications, I just don't understand what's going on or I feel like people wasted a lot of time on the wrong stuff. I'm just getting frustrated. Like, when I hit an application where all of a sudden it goes like, "Oh, it's a breath of fresh air." And I like, "I wanna spend time with them, I wanna ask them a bunch of questions, I get very curious and then I like want to jump around the room." I'm a very active guy.</p>
<p>So, like, think if like Adora got excited. She'd like drink a glass of water something like that. But really, the best ones are the ones that makes us wish we had done the company or that we would join them. That's the best. Right here.</p>
<p>Man 4: Why or the how are very important for the idea, how can you include them?</p>
<p>Kevin: How can I what?</p>
<p>Man 4: Include them?</p>
<p>Kevin: Oh, okay, yeah. So, I talked a lot about focusing on the what and then kind of avoid the how and the why, but they might be really important. How do I include them? You will not include them in the description. They will be included elsewhere. So, there's questions on the application that asked you about how are you gonna get your users, what is an insight that you understand about the business no one else does, how you came across this, etc. So, there's opportunities elsewhere.</p>
<p>One thing to keep in mind is, I would highly recommend trying to keep your answers within one to two paragraphs at the most. That makes it for an application that's very skimmable by me. So, the whole thing is the how and why is important, but you can't just say it all at once. Like, sometimes you'd like to talk to someone and they're telling you a story, but they're trying to tell everything about everything all at once. And it feels like he's not giving you time to breathe or think. You wanna sort of avoid that context. Right over there, enthusiastic curly hair.</p>
<p>Man 5: How do you know a company is on the right track to getting product-market fit?</p>
<p>Kevin: How? That sounds like a together question, but I'll answer it. So, how do you know if a company's on the right path to product-market fit? So, if you have to ask a question, do I have product-market fit? The answer is probably no, you probably don't. Right? But if you're so busy, and you're frightened that the company is gonna fall apart, because you have so many customers coming in asking stuff for you, you're just figuring out how do I hire? How do I serve everyone that wants to come to me? You're too busy to ask that question because you're just making money hand over fist, that's product-market fit, you're on the right path.</p>
<p>The whole thing is it feels like something else, changes in the company. It feels like you're out of control. So, if you are in control of your company, you feel like you can relax and you're sleeping well, you're not on the right track. Very few companies ever experience this. Far back .</p>
<p>Man 6: Okay. Well, if you can talk about your experience doing this because right now, you're on the other side of the stories, but you can go back to when you were applying to Y Combinator on and making this exciting?</p>
<p>Kevin: So I tell a small anecdote about when I applied to YC, and about how this sort of applies. When I applied to Y Combinator, I was really bad at describing what our company does. So, we actually had pitched two different ideas. They told us to prepare for both and when we got into the interview, one of the ideas they immediately said, not interested. And the other idea we needed a pivoting in the middle of the interview.</p>
<p>And so, the way I had described the company, in the beginning, was I said, "We are building a content management system that has a concept called reversible forms that allows you to both put data input in from the back end, and also collect data from users on the front end." That's a horrible description of a company. And part of that idea that fed that is like, I wanted to be a content management system because what was hot at the time, it was buzz, where it was movable type in WordPress. We wanted to build software like that and we wanted to build a new version of this.</p>
<p>And then I added, not even normal jargon, I made up jargon that I put into my description and I pitched it. And Paul Graham was just like, "Oh, no, what are you talking about?" But he was like, "I think you're building a Form Builder." And then we were like, "No, no." We looked at everyone in that space, they suck, they're really bad. We don't like what they're making, we don't want to be there. Not realizing that was the opportunity. Everyone was really bad there but their businesses still succeeded. And so, that's like the clear example of this from like the other side.</p>
<p>And so, I actually spent a lot of times, like, Adora and I spent a lot of time fixing, mentally in our heads, what you guys are making or doing. And so, actually after we're reading applications, a lot of times, partners have to basically redescribe or repitch back what you're making, so that way they can understand why they're gonna get excited.</p>
<p>I'm gonna do one more question and then we're gonna do combo, right here.</p>
<p>Man 7: So, hello. So, how do you tell an idea that has multiple stages? For instance, if you want to become Z, but before that you need to do X and Y.</p>
<p>Kevin: So, how do you tell and describe an idea that has multiple stages, like you have to do part one, before you can do part two and three. I would focus only on describing what part one is and then later on, you talk about what are the other phases that are important. Now, oftentimes, when I hear something like that, a YC partner will immediately have like an alarm go in their head, and they really are going to push you on. Why do we really have to do part one? I'm gonna push so hard and why can't we go straight to part three. Because what you're basically saying is like...it sounds almost like a defense instead of you saying your strategy.</p>
<p>It sounds like it's like, "Hey, I'm gonna talk about what my company's doing but I'm worried that you're gonna think it's really small. So, don't worry, we're gonna do parts two and three, they're gonna be even bigger." And the thing is, that's a really weak pitch, doesn't sound very confident, etc. Now, what you wanna avoid is saying, like, "We're doing number three..."</p>
<p>What you could do is if we're doing number three and we're starting with number one, but that has to be very efficient. That number three is very quickly can be said and that number one makes it sense. So it's like, I wanna build automated market...I just met a Colombian company today and they wanna make automated marketing software for WhatsApp, for small, medium businesses. And they're starting with hair salons, right. And then they're gonna move on to all the other industries that need help with them.</p>
<p>All right. Thank you very much. I'm gonna invite Adora to come on.</p>
<h1>Reddit</h1>
<ul>
<li>/r/AlphaandBetausers - <a href="https://www.reddit.com/r/alphaandbetausers/">https://www.reddit.com/r/alphaandbetausers/</a></li>
<li>/r/Coupons - <a href="https://www.reddit.com/r/coupons/">https://www.reddit.com/r/coupons/</a></li>
<li>/r/Design_Critiques - <a href="https://www.reddit.com/r/design_critiques/">https://www.reddit.com/r/design_critiques/</a></li>
<li>/r/Entrepreneur - <a href="http://reddit.com/r/entrepreneur">http://reddit.com/r/entrepreneur</a></li>
<li>/r/EntrepreneurRideAlong - <a href="http://www.reddit.com/r/EntrepreneurRideAlong/">http://www.reddit.com/r/EntrepreneurRideAlong/</a></li>
<li>/r/IMadeThis - <a href="http://reddit.com/r/imadethis">http://reddit.com/r/imadethis</a></li>
<li>/r/IndieBiz - <a href="https://www.reddit.com/r/indiebiz/">https://www.reddit.com/r/indiebiz/</a></li>
<li>/r/LadyBusiness - <a href="https://www.reddit.com/r/ladybusiness/">https://www.reddit.com/r/ladybusiness/</a></li>
<li>/r/RoastMyStartup - <a href="https://www.reddit.com/r/roastmystartup">https://www.reddit.com/r/roastmystartup</a></li>
<li>/r/ShamelessPlug - <a href="https://www.reddit.com/r/shamelessplug/">https://www.reddit.com/r/shamelessplug/</a></li>
<li>/r/SideProject - <a href="http://reddit.com/r/sideproject">http://reddit.com/r/sideproject</a></li>
<li>/r/SmallBusiness - <a href="https://www.reddit.com/r/smallbusiness/">https://www.reddit.com/r/smallbusiness/</a></li>
<li>/r/Startups - <a href="http://reddit.com/r/startups">http://reddit.com/r/startups</a></li></ul>
<h1>Websites</h1>
<ul>
<li>10words - <a href="https://10words.io/">https://10words.io</a></li>
<li>All My Faves - <a href="http://www.allmyfaves.com/">http://www.allmyfaves.com/</a></li>
<li>All Startups - <a href="http://www.allstartups.info/Startups/Submit">http://www.allstartups.info/Startups/Submit</a></li>
<li>All Top Startups - <a href="http://alltopstartups.com/submit-startup/">http://alltopstartups.com/submit-startup/</a></li>
<li>Alternative To - <a href="http://alternativeto.net/">http://alternativeto.net/</a></li>
<li>App 400 - <a href="http://apps400.com/">http://apps400.com/</a></li>
<li>App Advice - <a href="http://appadvice.com/page/about-us">http://appadvice.com/page/about-us</a></li>
<li>App Appeal - <a href="http://www.appappeal.com/contact/suggest">http://www.appappeal.com/contact/suggest</a></li>
<li>App Rater - <a href="https://apprater.net/add/">https://apprater.net/add/</a></li>
<li>Appcrawlr - <a href="http://appcrawlr.com/">http://appcrawlr.com/</a></li>
<li>Appoid - <a href="http://appiod.com/submit-app-for-review/">http://appiod.com/submit-app-for-review/</a></li>
<li>appPicker - <a href="http://www.apppicker.com/">http://www.apppicker.com/</a></li>
<li>Apps 400 - <a href="http://apps400.com/submit-your-application-for-review">http://apps400.com/submit-your-application-for-review</a></li>
<li>Apps Listo - <a href="http://appslisto.com/submit-your-app/">http://appslisto.com/submit-your-app/</a></li>
<li>Apps Mamma - <a href="http://appsmamma.com/submit-your-app/">http://appsmamma.com/submit-your-app/</a></li>
<li>Apps Mirror - <a href="http://www.appsmirror.com/submit-your-app-for-review">http://www.appsmirror.com/submit-your-app-for-review</a></li>
<li>AppsNow - <a href="http://appsnow.us/submit-app-for-review/">http://appsnow.us/submit-app-for-review/</a></li>
<li>AppsThunder - <a href="http://appsthunder.com/submit-your-app/">http://appsthunder.com/submit-your-app/</a></li>
<li>AppStorm - <a href="http://appstorm.net/">http://appstorm.net/</a></li>
<li>Appvita - <a href="http://www.appvita.com/">http://www.appvita.com/</a></li>
<li>AppZapp - <a href="http://www.appzapp.net/en/app-review-request/">http://www.appzapp.net/en/app-review-request/</a></li>
<li>Arctic Startup - <a href="http://arcticstartup.com/">http://arcticstartup.com/</a></li>
<li>Beta Bound - <a href="http://www.betabound.com/announce/">http://www.betabound.com/announce/</a></li>
<li>Beta Page - <a href="https://betapage.co/">https://betapage.co/</a></li>
<li>Betafy - <a href="https://www.betafy.co/easysignup/startup">https://www.betafy.co/easysignup/startup</a></li>
<li>BetaList - <a href="https://betalist.com/submit">https://betalist.com/submit</a></li>
<li>Beterest - <a href="https://beterest.com/submit-startup/">https://beterest.com/submit-startup/</a></li>
<li>Boing Boing - <a href="http://boingboing.net/sub/">http://boingboing.net/sub/</a></li>
<li>BuiltInChicago - <a href="http://www.builtinchicago.org/send-us-tip">http://www.builtinchicago.org/send-us-tip</a></li>
<li>Capterra - <a href="http://www.capterra.com/vendors/sign-up">http://www.capterra.com/vendors/sign-up</a></li>
<li>CloudShowPlace - <a href="http://www.cloudshowplace.com/add-your-company/">http://www.cloudshowplace.com/add-your-company/</a></li>
<li>Cnet - <a href="https://upload.cnet.com/">https://upload.cnet.com/</a></li>
<li>Collaborizm - <a href="https://www.collaborizm.com/">https://www.collaborizm.com</a></li>
<li>Crazy About Startups - <a href="http://www.crazyaboutstartups.com/index.php/share-your-startup-form">http://www.crazyaboutstartups.com/index.php/share-your-startup-form</a></li>
<li>CrozDesk - <a href="https://vendor.crozdesk.com/user/signup">https://vendor.crozdesk.com/user/signup</a></li>
<li>Crunch Base - <a href="https://www.crunchbase.com/#/home/index">https://www.crunchbase.com/#/home/index</a></li>
<li>CSS Mania - <a href="http://www.cssmania.com/submit/">http://www.cssmania.com/submit/</a></li>
<li>Designer News - <a href="https://www.designernews.co/">https://www.designernews.co/</a></li>
<li>Digg - <a href="http://digg.com/submit">http://digg.com/submit</a></li>
<li>Discova - <a href="http://www.discova.co/">http://www.discova.co/</a></li>
<li>Discover Cloud - <a href="https://www.discovercloud.com/become-a-vendor">https://www.discovercloud.com/become-a-vendor</a></li>
<li>Erlibird - <a href="https://erlibird.com/beta-testing">https://erlibird.com/beta-testing</a></li>
<li>F6S - <a href="http://www.f6s.com/">http://www.f6s.com/</a></li>
<li>Feed My App - <a href="https://feedmyapp.com/submit/">https://feedmyapp.com/submit/</a></li>
<li>G2 Crowd - <a href="https://www.g2crowd.com/products/new">https://www.g2crowd.com/products/new</a></li>
<li>Geek Wire - <a href="http://geekwire.com/startup-list/">http://geekwire.com/startup-list/</a></li>
<li>Get App - <a href="http://getapp.com/">http://getapp.com/</a></li>
<li>Getworm - <a href="https://getworm.com/submit-startup">https://getworm.com/submit-startup</a></li>
<li>Gust - <a href="https://www.gust.com/">https://www.gust.com</a></li>
<li>Haro - <a href="https://www.helpareporter.com/sources/">https://www.helpareporter.com/sources/</a></li>
<li>Idea Hunt - <a href="http://ideahunt.io/">http://ideahunt.io/</a></li>
<li>Inc 42 - <a href="https://inc42.com/startup-submission/">https://inc42.com/startup-submission/</a></li>
<li>Index.co - <a href="https://index.co/startup">https://index.co/startup</a></li>
<li>Indie Hackers - <a href="https://www.indiehackers.com/">https://www.indiehackers.com/</a></li>
<li>Killer Startups - <a href="http://killerstartups.com/submit-startup/">http://killerstartups.com/submit-startup/</a></li>
<li>Land-book - <a href="https://land-book.com/guidelines">https://land-book.com/guidelines</a></li>
<li>Launch List - <a href="https://launchlister.com/submit-startup">https://launchlister.com/submit-startup</a></li>
<li>Launched - <a href="https://launched.io/SubmitStartup">https://launched.io/SubmitStartup</a></li>
<li>Launching Next - <a href="http://www.launchingnext.com/submit/">http://www.launchingnext.com/submit/</a></li>
<li>Loop - <a href="https://app.loopinput.com/">https://app.loopinput.com/</a></li>
<li>MakeUseOf - <a href="http://www.makeuseof.com/about/">http://www.makeuseof.com/about/</a></li>
<li>Maqtoob - <a href="https://maqtoob.com/submit-a-tool">https://maqtoob.com/submit-a-tool</a></li>
<li>Mobilzed - <a href="https://www.moblized.com/vendors/register">https://www.moblized.com/vendors/register</a></li>
<li>Netted - <a href="https://www.netted.net/contact-us/">https://www.netted.net/contact-us/</a></li>
<li>Next Big Product - <a href="http://nextbigproduct.net/product-submission/">http://nextbigproduct.net/product-submission/</a></li>
<li>Next Big What - <a href="http://nextbigwhat.com/">http://nextbigwhat.com/</a></li>
<li>Paggu - <a href="http://www.paggu.com/submit-your-startup/">http://www.paggu.com/submit-your-startup/</a></li>
<li>pFind - <a href="http://www.pfind.com/submit">http://www.pfind.com/submit</a></li>
<li>Postmake - <a href="https://postmake.io/submit">https://postmake.io/submit</a></li>
<li>Postscapes - <a href="http://about.postscapes.com/tools">http://about.postscapes.com/tools</a></li>
<li>PreApps - <a href="http://www.preapps.com/">http://www.preapps.com/</a></li>
<li>Product Hunt - <a href="http://www.producthunt.com/">http://www.producthunt.com/</a></li>
<li>Programmable Web - <a href="https://www.programmableweb.com/news/how-to-pitch-programmableweb-covering-your-news/2016/11/18">https://www.programmableweb.com/news/how-to-pitch-programmableweb-covering-your-news/2016/11/18</a></li>
<li>PublicityX - <a href="https://www.publicityx.com/startups/new">https://www.publicityx.com/startups/new</a></li>
<li>Robingood - <a href="http://tools.robingood.com/">http://tools.robingood.com/</a></li>
<li>SaaSHub - <a href="https://www.saashub.com/">https://www.saashub.com/</a></li>
<li>Saasified - <a href="https://saasified.co/">https://saasified.co</a></li>
<li>Show HN - <a href="https://news.ycombinator.com/showhn.html">https://news.ycombinator.com/showhn.html</a></li>
<li>Side Projectors - <a href="https://www.sideprojectors.com/">https://www.sideprojectors.com</a></li>
<li>SideProjects - <a href="https://sideprojects.net/">https://sideprojects.net</a></li>
<li>SimilarSiteSearch - <a href="http://www.similarsitesearch.com/tips.html">http://www.similarsitesearch.com/tips.html</a></li>
<li>Slant - <a href="https://www.slant.co/">https://www.slant.co/</a></li>
<li>SnapMunk - <a href="https://www.snapmunk.com/submit-your-startup/">https://www.snapmunk.com/submit-your-startup/</a></li>
<li>Software Advice - <a href="https://softwareadvice-markets.questionpro.com/">https://softwareadvice-markets.questionpro.com/</a></li>
<li>Springwise - <a href="http://springwise.com/tipus/">http://springwise.com/tipus/</a></li>
<li>Stack Share - <a href="http://stackshare.io/">http://stackshare.io/</a></li>
<li>Starter Story - <a href="https://starterstory.com/">https://starterstory.com/</a></li>
<li>Startup 88 - <a href="https://startup88.com/">https://startup88.com/</a></li>
<li>Startup Base - <a href="https://startupbase.io/submit">https://startupbase.io/submit</a></li>
<li>Startup Beat - <a href="http://startupbeat.com/startup-beat-featured-startup-pitch-guidelines/">http://startupbeat.com/startup-beat-featured-startup-pitch-guidelines/</a></li>
<li>Startup Benchmarks - <a href="https://www.startupbenchmarks.com/">https://www.startupbenchmarks.com/</a></li>
<li>Startup Buffer - <a href="http://startupbuffer.com/">http://startupbuffer.com</a></li>
<li>Startup Collections - <a href="http://startupcollections.com/">http://startupcollections.com/</a></li>
<li>Startup Dope - <a href="http://startupdope.com/submit-news/">http://startupdope.com/submit-news/</a></li>
<li>Startup Inspire - <a href="https://www.startupinspire.com/submit">https://www.startupinspire.com/submit</a></li>
<li>Startup Lift - <a href="http://www.startuplift.com/">http://www.startuplift.com/</a></li>
<li>Startup Ranking - <a href="http://www.startupranking.com/">http://www.startupranking.com/</a></li>
<li>Startup Register - <a href="http://startupregister.net/register-your-startup/">http://startupregister.net/register-your-startup/</a></li>
<li>Startup Resources - <a href="https://startupresources.io/">https://startupresources.io</a></li>
<li>Startup Stash - <a href="http://startupstash.com/">http://startupstash.com/</a></li>
<li>Startup Tabs - <a href="http://startuptabs.com/">http://startuptabs.com/</a></li>
<li>Startup Tracker - <a href="https://startuptracker.io/">https://startuptracker.io/</a></li>
<li>StartupBlink - <a href="http://www.startupblink.com/">http://www.startupblink.com/</a></li>
<li>Startups List - <a href="https://www.startups-list.com/">https://www.startups-list.com/</a></li>
<li>State of Tech - <a href="http://stateoftech.net/advertise?submit-an-app-for-review">http://stateoftech.net/advertise?submit-an-app-for-review</a></li>
<li>Tabscape - <a href="https://www.tapscape.com/">https://www.tapscape.com/</a></li>
<li>Tech Faster - <a href="http://techfaster.com/submit-your-company/">http://techfaster.com/submit-your-company/</a></li>
<li>Tech Map - <a href="http://thetechmap.com/">http://thetechmap.com/</a></li>
<li>Tech Pluto - <a href="http://www.techpluto.com/submit-a-startup/">http://www.techpluto.com/submit-a-startup/</a></li>
<li>The Changelog - <a href="https://github.com/thechangelog/ping">https://github.com/thechangelog/ping</a></li>
<li>The iPhone Mom - <a href="https://www.theiphonemom.com/">https://www.theiphonemom.com/</a></li>
<li>The Startup Pitch - <a href="http://thestartuppitch.com/post-a-pitch/">http://thestartuppitch.com/post-a-pitch/</a></li>
<li>Top Alternatives - <a href="https://topalternatives.com/">https://topalternatives.com/</a></li>
<li>Vator - <a href="http://www.vator.tv/">http://www.vator.tv/</a></li>
<li>VB Profiles - <a href="http://vbprofiles.com/">http://vbprofiles.com/</a></li>
<li>Venture Beat - <a href="http://venturebeat.com/news-tips/">http://venturebeat.com/news-tips/</a></li>
<li>Web App Rater - <a href="http://www.webapprater.com/webapprater-free-app-review">http://www.webapprater.com/webapprater-free-app-review</a></li>
<li>Webwide - <a href="https://webwide.io/forums/project-showcase.15/">https://webwide.io/forums/project-showcase.15/</a></li>
<li>Ycombinator - <a href="https://news.ycombinator.com/">https://news.ycombinator.com/</a></li>
<li>YouNoodle - <a href="https://ww2.younoodle.com/startups/">https://ww2.younoodle.com/startups/</a></li></ul>
<<<
Of course the platform owner Andreessen Horowitz (A16Z) makes vastly more money than platform participants by miles, but let’s focus on the opportunities for creators, right? You get to keep 90% of your success and 100% of your failure! That’s platforming.
[A16Z's more successful portfolio companies] make great software with investor money and then collect rents off of users’ content.
<<<
What will playbooks consist of? A collection of wikis linked together by a data repository that may be connected to other data repositories? How do we visualize this?
I guess we could call a playbook a wiki connected to one or more data repositories, modeled after the git workflow. How we understand this affects how we're going to design it to solve problem.
A loosely coupled wiki can be designed to query hundreds of databases at once and help distribute new inputs and insights to others in the federation via this common data repository or repositories.
Each wiki will be self contained with its own database or databases if any.
~~Each wiki will have to describe what backend it uses and tag its wikis accordingly to indicate:-
* What is public or private `{ public: name-of-recipient or [array-of-names-of-recipients] or world }`
* What is its backend `{ public: [array-of-names-of-recipients, backend, ?access-control] or world }`
* And what url/domain can the repository be accessed `{ public: [array-of-urls-of-recipients, backend, ?access-privileges] or [world, ?access-privileges] }`
All this probably be tracked by the plugin. No `public` property automatically means private and not owned by another data repository.
Permissions and access control could also be synced across the federation of playbooks and wikis via the playbook plugin.~~
We could simply create multiple databases and give each database its own rules. That would be simpler she more in line with the federation paradigm.
Imagine trying to wing it making a complicated pastry in the kitchen. It's going to end in disaster.
The benefits of using [[Project management]] is that it can protect you from this stress by:-
# Boosting Alignment: helps make clear how specific project objectives support broader business goals. You might think the goals of your project or even your entire organization are crystal clear, but you’d likely be surprised by how murky things actually are. Research from MIT Sloan School of Management found that one-third of leaders tasked with carrying out their company’s strategy could not list even one of their company’s strategic priorities.
# Improve collaboration: if project teams don't know their responsibilities, nothing works. Project management involves hashing out a detailed project plan—which includes clarifying the project scope, roles, action items, and timeline.
# Avoid risks and pitfalls: project planning and management process involves anticipating risks and identifying a backup plans, because no plan ever survives first contact with reality. This helps you steer around those roadblocks when they crop up, without popping the tires on your entire project.
# Reduces overwhelm: too much work per person leads to stress. Effective project management makes it easier to manage people’s capacity and ensure they have reasonable workloads across all of the different projects they’re involved in.
# Leads to successful projects: When you have a rock solid plan and monitor progress carefully, you’re far more likely to deliver a project that satisfies goals, meets requirements, and sticks with your budget and timeline.
* Critical Path: The longest path of dependent project activities. If a delay happens on your critical path, you run the risk of your entire project running behind schedule.
* Dependencies: Elements of a project that are tied together—meaning one can’t happen without the other. There are both task dependencies and resource dependencies.
* Kickoff: The first meeting of the project team to discuss project goals, requirements, and more.
* Life Cycle: The set of stages the project moves through from beginning to end. The five phases discussed above make up the project life cycle.
* Milestone: A specific progress deadline within the project.
* Resources: What your team needs in order to complete the project. Resources can include people, budget, materials, equipment or software, space, and more.
* Scope: The details of exactly what’s included in the project. You’ll hear things referred to as “in scope” or “out of scope.”
* Stakeholder: Anybody who has an interest in or will be impacted by the project.
A TW pocket client to retrieve, analyze and reference articles saved via Pocket.
Knowledge cannot be quickly used to build apps and automate processes because it isn't organized, and the skills are siloed away to 2 IT personnel. This reduces productivity and increases chances of friction and loss of communication
Knowledge is siloed and even when it's shared, it is incomplete and inaccessible to people and machines.
<p>by <a href="https://medium.com/@chris-ashby?source=email-b82c15111fb0-1632613181249-digest.reader-f5af2b715248-f7c6b4e31f88----0-1------------------a0f852eb_20ee_4e76_b6f1_0427132ba6de-31-4d3be0db_d4c9_4ee8_8b79_42a32edfcd1b" target="_blank">Chris Ashby</a></p>
<p>As I’m writing this my <a href="https://www.producthunt.com/posts/blobs-2" rel="noopener ugc nofollow">second launch on Product Hunt has made it’s way into the top 10 for the day</a> (not super high, but still, hooray!)</p>
<p>And after failing miserably with my first Product Hunt launch (5 upvotes total), I wanted to talk about having (a bit) of Product Hunt launch success — without many followers (26 at time of writing), and without a big email list (46 at time of writing).</p>
<p>This is for those of you who want to maximise success on Product Hunt, but maybe don’t have the time or the ability to generate a large email list or a lot of followers first. Some things I learnt between my first and second launch that can help you with your launch.</p>
<h1>A big caveat first</h1>
<p>There’s no doubt, that having some email subscribers, having a good idea well executed, and having followers on Product Hunt can hugely increase your chances come launch day.</p>
<p>And there is no doubt that both setting up a good profile in advance, and spending about 1 month before your launch engaging every day with the community will give you a little boost if you can do it (even just spending 1 week and getting 20 or 30 followers can help).</p>
<p>In fact, I’d go as far to say that having a decent profile, that shows a small amount of engagement, and a selection of upvotes goes a long way on Product Hunt — so make sure to do at least this before you launch.</p>
<p>But there are other things that affect your chances of success, beyond these.</p>
<p>Product Hunt is a great community, of people who genuinely care about great products, not just upvoting what they are told to or have been promoted to upvote.</p>
<p>So let’s forget email list, follower count, and product idea for now, and just focus on the other things that impact your success.</p>
<h1>Lesson 1 — Get a well-known hunter to hunt your product</h1>
<p>Now, this is something I didn’t do for my current product launch, which has been rising up the ranks today.</p>
<p>You don’t <em>need</em> to use a well-known hunter to launch your product, but it certainly helps to, and it would have helped me eek out extra more upvotes if I had.</p>
<p>Product Hunt sends out a notification when one of the people you follow launches a new product, so the larger the following, the more people get notified when you launch.</p>
<p>All you need to do to do this is to google well known product hunters, and then pick one that you think matches your product best. Get in contact with them, provide assets and copy, and you’re off!</p>
<p>Oh, and make sure to post the first comment explaining what your product is, on the product launch page, as soon as it launches!</p>
<h1>Lesson 2 — Launch at exactly midnight PST</h1>
<p>I made the mistake in my first launch of choosing to launch just after midnight. I thought I was being clever by launching at a different time to everyone else.</p>
<p>In reality, what I did was miss the boat on the early upvotes, and it cost me a spot on the homepage.</p>
<p>See, the top 14 or so products, are shown on the homepage, and another 10 or so are shown underneath a ‘show more’ button beneath that. Then, there are even more products that don’t even make it into the show more section.</p>
<p>My product didn’t even make it into the show more section. And it sat there, unloved, unnoticed, with not votes to kickstart it’s momentum, left to die a modest and untimely death (the product itself is still growing in use, thankfully).</p>
<p>The second time around, I launched at exactly midnight, the same time as everyone else, and it worked. People saw the product as it hit Product Hunt along with every other product, and those early few upvotes from the launch timing helped get it into the ‘show more’ section, which in turn propelled it into the homepage section.</p>
<p>And this lesson leads me neatly into the next one.</p>
<h1>Lesson 3— Focus on getting 10 votes and at least 1 comment in the first hour of launching</h1>
<p>See, when you launch, it’s a race to get your product onto the homepage featured section, so that it can get more traction from users who come to the homepage and see it there.</p>
<p>The higher up you get, the more people will see it (because it’s not as far down the page — so users don’t have to scroll as far).</p>
<p>This means that your one most important objective during that first hour, is to get at least 10 votes. Call in favours, ask friends, send to your small email list if you have one, post it wherever you can, get your family to sign up to product hunt.</p>
<p>The 10 votes and 2 comments I got on my current product launch in the first hour have been the single most important thing that helped it gain momentum.</p>
<p>And alongside that, make sure to try and get at least 1 comment. Comments feed the Product Hunt algorithm, and can help propel your product up the ranks even with a lower number of upvotes than other products.</p>
<h1>Lesson 4— Engage with the community as much as possible on the day</h1>
<p>Once you have your product launched, you then have 2 more jobs to do, and these jobs will continue for most of the day.</p>
<p>First, engage with the Product Hunt community as much as you can. Post in as many discussions as you can to gain more followers, and get more organic traffic to your profile.</p>
<p>When traffic goes to your profile, some of that traffic will look at what you have ‘made’ — products you are listed as a maker of ie, the product you have launched. And some of that traffic will go on to upvote it.</p>
<p>Second…</p>
<h1>Lesson 5 — Post your product on other channels</h1>
<p>Make sure you also post your product launch in other channels. I’m talking LinkedIn, Facebook groups (you can search to find groups that allow product hunt promotion), Twitter, Indie Hackers (if you’re a member), Forums, Slack channels, Discord channels, and more.</p>
<p>Heck, maybe even write a Medium post on the day of your product launch about what you learned (can you see what I did there…)</p>
<p>The thing is, these won’t get you a slew of upvotes. Heck, most of the people you post too won’t even have a Product Hunt account.</p>
<p>But, it will get you a few upvotes, and it will prompt support from people who like you and want to help.</p>
<p>And as I’ve said before, every upvote counts, especially at the beginning of your launch, and especially to get your product one or two spots higher up the list.</p>
<p>And last but not least…</p>
<h1>Some things that don’t really affect your launch</h1>
<p>There are a lot of misconceptions out there when it comes to launching on Product Hunt — here are some of them that don’t really affect your launch:</p>
<ul>
<li>A gif thumbnail</li>
<li>A video on your product page</li>
<li>Adding the Product Hunt badge to your website (unless you get a lot of organic traffic, in which case, this <em>will </em>help you)</li></ul>
<h1>Some things to help you after your launch</h1>
<p>Once you’ve decided on a launch date, you’ll also want to get some other things in place, just to get the most long-term benefit from your launch as you can. These are:</p>
<ul>
<li>A way to collect users email addresses when they click through to the website from your Product Hunt product page (depending on the product you could do this with most CRM tools or use Zapier to automate it)</li>
<li>A website that is optimised to convert users through the main action you want them to take (think about what action you want Product Hunt users to take, and optimise your landing page to incentivise this action)</li></ul>
<p>And that’s it!</p>
<p>Everything you need to know to launch your product on Product Hunt with no following, no email list, and only your product.</p>
Sync PouchDB to Anything
=====
This is a plugin that lets you use CouchDBs replication algorithm with checkpointing, resuming, etc, but provide your own function to write the documents. This can be used to sequentially write updates to a REST API,
How to use
----
```javascript
var PouchDB = require('pouchdb')
PouchDB.plugin(require('pouchdb-sync-to-anything')
var myDb = new PouchDB('exampleDB')
myDb.syncToAnything(function (docs) {
// Sync function receives a document batch
// Should return a promise
// Example:
return $.ajax({
url: 'http://example.com/my-rest-endpoint',
data: JSON.stringify(docs),
method: 'POST'
})
}, {
sync_id: 'talkingToMyRestAPI',
batch_size: 10
})
```
### Arguments
#### Syncer (function)
A function which you use for writing whatever you need to write the documents to. **Should return a promise**. The function will be passed **an array of documents** that is minimum 1 document (never called empty) and maximum `batch_size` documents.
#### Options (object)
- `sync_id` or `syncId` (string) **required** used as a checkpoint name. Change this to something else and the replication will start over from 0.
- `batch_size`(number) the number of documents passed in to the `syncer` function.
The CouchDB protocol for not-CouchDB:
-----
This is a partial implementation of the [CouchDB replication protocol](http://docs.couchdb.org/en/2.0.0/replication/protocol.html). It allows you to use PouchDB's tools to save replication checkpoints for syncing with your API. Using those checkpoints, we can start the next replication from the last good checkpoint.
### How it works
Every write you make to a PouchDB/CouchDB instance has a `sequence number`. This is the base for the replication protocol, we use it to read every change that was made sequentially from the database.
1. Using the `sync_id` passed in from the user, read the last sync checkpoint (will be 0 if we never synced before with that id).
2. Read the changes feed from the PouchDB, limiting the number of changes to `batch_size`.
3. Call the user provided sync function, passing in the documents from the changes batch. The sync function should return a promise that fails if the write failed.
4. If the sync promise resolves, write a checkpoint of the last sequence numbers from the written batch
5. Go back to 1
Good to know/Caveats:
-----
* Using this works best for **one way data-flows** only. If you're interested in a 2-way data flow, consider syncing data from the server to a different PouchDB instance, and write changes that are to be sent to the server separately.
* A document is only sent to the sync function once per sync cycle. If you create a document, hit your sync function, update the document twice, and then hit sync again, it will be passed to the sync function once in the first sync call, and once in the second sync call.
<<list-links "[tag<currentTiddler>sort[title]]">>
A pre-release version MAY be denoted by appending a hyphen and a series of dot separated identifiers immediately following the patch version. Identifiers MUST comprise only ASCII alphanumerics and hyphens [0-9A-Za-z-]. Identifiers MUST NOT be empty. Numeric identifiers MUST NOT include leading zeroes. Pre-release versions have a lower precedence than the associated normal version. A pre-release version indicates that the version is unstable and might not satisfy the intended compatibility requirements as denoted by its associated normal version. Examples: 1.0.0-alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92, 1.0.0-x-y-z.–.
Build metadata MAY be denoted by appending a plus sign and a series of dot separated identifiers immediately following the patch or pre-release version. Identifiers MUST comprise only ASCII alphanumerics and hyphens [0-9A-Za-z-]. Identifiers MUST NOT be empty. Build metadata MUST be ignored when determining version precedence. Thus two versions that differ only in the build metadata, have the same precedence. Examples: 1.0.0-alpha+001, 1.0.0+20130313144700, 1.0.0-beta+exp.sha.5114f85, 1.0.0+21AF26D3—-117B344092BD.
Everyone wants to get a good deal. The market may have hidden offers and affordable alternatives that get buried by the noise.
One could create an app that can help surface this information.
https://www.ycombinator.com/library/6o-how-to-prioritize-your-time
\define problem-tag()
[[$(currentTiddler)$]] [[$(currentTiddler)$ Problem]]
\end
\define problem-filtertagparam()
$(currentTiddler)$ Problem
\end
\define alt-tag()
[[$(currentTiddler)$]] [[$(currentTiddler)$ Alternative]]
\end
\define alt-filtertagparam()
$(currentTiddler)$ Alternative
\end
''Problem''
<$button style="border: none; font-size: 10px">
➕
<$action-sendmessage $message="tm-new-tiddler" tags=<<problem-tag>> title="Problem item" canvas={{!!project}} />
Add item
</$button>
<ol>
<$list filter="[!has[draft.of]tag<problem-filtertagparam>sort[created]]">
<li style="font-size: 12px">
<$link to={{!!title}}><$view field="title"/></$link>
<$button message="tm-delete-tiddler" param={{!!title}} style="border:none;">❎</$button>
</li>
</$list>
</ol>
Existing Alternatives
<$button style="border: none; font-size: 10px">
➕
<$action-sendmessage $message="tm-new-tiddler" tags=<<alt-tag>> title="Existing Alternative" />
Add item
</$button>
<ol>
<$list filter="[!has[draft.of]tag<alt-filtertagparam>sort[created]]">
<li style="font-size: 12px">
<$link to={{!!title}}><$view field="title"/></$link>
<$button message="tm-delete-tiddler" param={{!!title}} style="border:none;">❎</$button>
</li>
</$list>
</ol>
Your [[actionable knowledge|??]] should all be in one place. Today, your knowledge is balkanized across hundreds of apps that profit from it instead of you. OnePlaybook will help to bring it all together in easy-to-use wiki apps ^^[[rationale of hypermedia|Ted Nelson on hypermedia]]^^.
# [[The dispersed knowledge problem]]: {{The dispersed knowledge problem}}
# [[Problems of centralized collaboration]]:- <$transclude tiddler="Problems of centralized collaboration" mode="block" />
# [[Dynamic software needs]]:- <$transclude tiddler="Dynamic software needs" mode="inline" />
Centralized collaboration via tools like Slack means:-
# You're vulnerable to expensive outages and cannot easily work offline (sometimes by design!)
# You sometimes lack freedom to experiment, modify, add on, and are vulnerable to vendor lock-ins; you cannot change the service & you can't take your business elsewhere easily
Having a distributed means of collaboration means that everyone is able to stay productive without worrying about the above issues.
Problem Space refers to the entire range of components that exist in the process of finding a solution to a problem.
What are we trying to optimize?
Informing problem solving with a smart knowledge space. Current solutions force us to balkanize our knowledge into different services, apps and documents.
Moreover, googling how to do an action can cost time, and sometimes you're not even sure if you're approaching a problem the correct way. Why not bring useful intent tiddlers to your work instead. We can use OnePlaybook to map out and design wiki apps around these intents.
While project thinking focuses on coming up with solutions up-front and then delivering against a schedule, product thinking keeps the focus on the outcome.
Things to note when looking for PMF:
# Keep track of your metrics. [[Here's a report template for each stage|Product-Market fit report card]] of growth
# Work on your metrics until they are 10x...
# ... By running experiments quickly. Choose experiments...
# ...Based on data from user interviews.
Source: {{!!source}}
''What is the difference between an EOR and a PEO?''
Though some use the terms interchangeably, PEOs and EORs have a few important distinctions. PEOs mostly handle HR functions for businesses, while EORs go one step further to employ workers on behalf of their client companies. If you do not own an entity in the country where you want to employ someone, you need an employer of record, not a PEO.
Your employer of record handles the legal employment of your workers in other countries via a service agreement. On paper, the EOR is the employer. In reality, the EOR simply facilitates the paperwork for the sake of compliance. You continue to work with your employees under the EOR the same way you work with all your other employees. In this way, an EOR allows you to employ full-time workers in countries where you do not own a legal entity.
Professional employer organizations lack the ability to employ workers in other countries on your behalf. PEOs typically provide most of the same human resources services as EORs, but without the additional layer of international compliance. PEOs also do not typically offer the local legal guidance that an EOR would.
Your PEO is typically not involved in your employment contracts. A PEO is more of a services provider than a partner for global expansion. An EOR, on the other hand, immediately allows your company to employ workers around the world. Your business, your employee, and your EOR all participate in employment contracts to ensure your employment of international workers is legal.
It is important to remember that an EOR can also provide all the HR services your business needs, such as payroll and benefits management. When you expand your team into new countries, having an all-in-one partner to handle these key processes in addition to your compliance needs can make life much easier.
```javascript
<Dialog onClose={handleClose} aria-labelledby="simple-dialog-title" open={open}>
<DialogTitle id="simple-dialog-title">Set backup account</DialogTitle>
<List>
{emails.map((email) => (
<ListItem button onClick={() => handleListItemClick(email)} key={email}>
<ListItemAvatar>
<Avatar className={classes.avatar}>
<PersonIcon />
</Avatar>
</ListItemAvatar>
<ListItemText primary={email} />
</ListItem>
))}
<ListItem autoFocus button onClick={() => handleListItemClick('addAccount')}>
<ListItemAvatar>
<Avatar>
<AddIcon />
</Avatar>
</ListItemAvatar>
<ListItemText primary="Add account" />
</ListItem>
</List>
</Dialog>
```
Good SaaS companies take 1.5 years for obtain positive contribution margins from their customers:
<<<
i) you lose money on the customer in year 1 (about -100% marign); ii) in year 2 the customer becomes very profitable and you recover the cost of acquiring the customer; iii) over time, your customers buy more product from you rather than less so long as net dollar retention is over 100%+. Maintain these same attributes in your own SaaS business and you’ll be on your way to joining these companies in an IPO.
<<<
Here's an example from Confluent's prospectus:
<iframe src="https://miro.medium.com/max/1062/1*JukOZIjvEQ4TEDt2-KMmJQ.jpeg" width="100%" height="400px" frameborder=0></iframe>
#### Build your own `Programming Language`
* [**(any)**: _mal - Make a Lisp_](https://github.com/kanaka/mal#mal---make-a-lisp)
* [**C**: _Baby's First Garbage Collector_](http://journal.stuffwithstuff.com/2013/12/08/babys-first-garbage-collector/)
* [**C**: _Build Your Own Lisp: Learn C and build your own programming language in 1000 lines of code_](http://www.buildyourownlisp.com/)
* [**C**: _Implement a minimal interpreter, Compiler (x86/Arm) and JIT compiler from scratch_](https://www.slideshare.net/jserv/jit-compiler)
* [**C**: _Writing a Simple Garbage Collector in C_](http://maplant.com/gc.html)
* [**C++**: _Writing Your Own Toy Compiler Using Flex_](https://gnuu.org/2009/09/18/writing-your-own-toy-compiler/)
* [**C++**: _How to Create a Compiler_](https://www.youtube.com/watch?v=eF9qWbuQLuw) [video]
* [**F#**: _Understanding Parser Combinators_](https://fsharpforfunandprofit.com/posts/understanding-parser-combinators/)
* [**Go**: _The Super Tiny Compiler_](https://github.com/hazbo/the-super-tiny-compiler)
* [**Go**: _Lexical Scanning in Go_](https://www.youtube.com/watch?v=HxaD_trXwRE) [video]
* [**Haskell**: _Let's Build a Compiler_](http://alephnullplex.github.io/cradle/)
* [**Haskell**: _Write You a Haskell_](http://dev.stephendiehl.com/fun/)
* [**Java**: _Crafting interpreters: A handbook for making programming languages_](http://www.craftinginterpreters.com/)
* [**JavaScript**: _The Super Tiny Compiler_](https://github.com/jamiebuilds/the-super-tiny-compiler)
* [**OCaml**: _Writing a C Compiler_](https://norasandler.com/2017/11/29/Write-a-Compiler.html)
* [**Python**: _A Python Interpreter Written in Python_](http://aosabook.org/en/500L/a-python-interpreter-written-in-python.html)
* [**Python**: _lisp.py: Make your own Lisp interpreter_](http://khamidou.com/compilers/lisp.py/)
* [**Python**: _Simple Iterator-based Parsing_](http://effbot.org/zone/simple-iterator-parser.htm)
* [**Python**: _Simple Top-Down Parsing in Python_](http://effbot.org/zone/simple-top-down-parsing.htm)
* [**Python**: _How to Write a Lisp Interpreter in Python_](http://norvig.com/lispy.html)
* [**Racket**: _Beautiful Racket: How to make your own programming languages with Racket_](https://beautifulracket.com/)
* [**Ruby**: _A Compiler From Scratch_](https://www.destroyallsoftware.com/screencasts/catalog/a-compiler-from-scratch)
* [**Ruby**: _Markdown compiler from scratch in Ruby_](https://blog.beezwax.net/2017/07/07/writing-a-markdown-compiler/)
* We can use pouchdb instances to persist data inside each handler and tiddler instance
* Indexed playbooks/wikis inside one master pouchdb index database will store info about wiki to be used to map each tiddlywiki instance to correct database
** each indexed wiki will have a service and tags metadata properties
* We can use the [[pouchdb-sync-to-anything plugin|https://github.com/karlwestin/pouchdb-sync-to-anything]] to connect handler pouchdb databases to rest apis used
<<list-links "[tag[Project journal]!sort[created]]">>
[[Source|https://blog.trello.com/ultimate-guide-team-project-management]]
Project management is the process of
* planning,
* executing,
* and monitoring a project so that it’s completed successfully.
Project management is generally overseen by a dedicated project manager who has the skills, experience, and know-how to keep things on track.
However, that’s not always an option—especially for smaller teams or smaller projects. In that case, a different project team member needs to step up to become the point person.
In any project, it is important to track [[dependencies|PMx Glossary]] and to centralize communications:
<<<
All of the project management jargon and careful planning won’t be much help if your project communication is scattered between tools, endless email threads, instant messages, and random meeting notes.
Project management is a whole lot easier when you use a dedicated project management tool or project management software.
<<<
Having a
<<<
[...] single source of truth, [...] keeps progress, files, resources, and conversations centralized—so everybody on the team can immediately get the information and context they need.
<<<
__Content__
<<list-links "[tag<currentTiddler>sort[created]]">>
<p>Excerpts from the article: <a href="https://doi.org/10.1038/d41586-020-01918-0">Nature 583, 157-158 (2020)</a>, Four tools that help researchers working in collaborations to see the big picture</p>
<p> </p>
<blockquote>
<p>project-management tools and the managers who use them “connect the details with the high-level goals”, says Tracy Teal. As the executive director of Dryad, a non-profit repository for open data in Durham, North Carolina, she uses several such tools.</p></blockquote>
<p>On the kanban:</p>
<blockquote>
<p>Project-management tools tend to have a common visual style, called a Kanban board. This is divided into columns, called lists, with multiple cards pinned to them to represent different projects, protocols or topics.</p></blockquote>
<p>On focus and simplicity:</p>
<blockquote>
<p>“It’s worth exploring the different tools a bit and finding the right ones for you,” recommends José Sánchez-Gallego, an astronomer at the University of Washington in Seattle. “Personally, I prefer tools that do one thing but do it well, rather than tools that allow you to do many things but become more cumbersome.”</p></blockquote>
<p>On multiplicity of tools and privacy:</p>
<blockquote>
<p>Sánchez-Gallego actually uses multiple tools for project management in his day-to-day work. These include ZenHub for managing GitHub issues for the Sloan Digital Sky Survey telescope in New Mexico; Jira for overarching project management, hardware issues and input from users; and OmniPlan for creating timelines and tracking time. “I like to look for simplicity and good overall design,” Sánchez-Gallego says. “I also prefer apps that can work offline over web apps that only work when connected to the Internet. And I prefer tools that don’t require me to share too much personal information.”</p></blockquote>
<p>On establishing usage habits:</p>
<blockquote>
<p>With any project-management tool, the most difficult part is establishing a routine for using it, says Cimini. “It’s easier to enforce doing that when it’s collaborative,” she says. “My collaborative Trello boards stay more up to date sometimes than my personal one.”</p>
<p> </p>
<p>Appoint a manager to run the tool at a team level, Teal advises. The Data Curation Network, of which Dryad is a partner, has a project manager who goes through the team’s Jira to-do items and pings a message to people if tasks aren’t done, Teal notes. “The social connection between the tool and the team is a person who consistently makes that connection,” she says.</p>
<p>the tags alert people until checking the tool becomes a habit, he says. “Make it reach out to them,” says Salas, “instead of making it a static board that they need to actively go and check.”</p>
<p>No matter which management tool you choose, engage your team early in the decision-making process, Teal advises. Think about their needs and how they spend their time — for example, on GitHub or in their e-mail inboxes. Otherwise, your project-management tool risks becoming “sort of like another inbox”, she says — just another thing that’s hard to remember to check.</p></blockquote>
<p>And finally, some fantastic use cases and set-ups:</p>
<p> </p>
<blockquote>
<p>For the Magellan II telescope collaboration, Teske says, it is Trello’s nested structure that allows the team to manage its users’ needs. There’s a board for each of the five institutions, which is visible only to that institution, and a separate board for the administrative team that is filled with astronomical targets for each slot of observing time. When a scientist wants telescope time, they create a card on their institution’s board, which the administration team then moves to the observation board. Cards can include notes, PDFs and data files, and any other useful information. An archive board serves as a record of everything that has been done. “I think people find it intuitive,” Teske says.</p>
<p> </p>
<p>But small teams can also benefit from such tools. For Cimini’s five-member team, Trello’s integration with Tick, its time-tracking and billing software, has proved particularly useful to automatically track the amount of time they’ve spent working on projects that are billed separately, or to allocate how much time to spend on specific tasks. (Asana also integrates with Tick.)</p>
<p> </p>
<p>Pre-formatted boards called templates are also useful, because they provide a starting place for common tasks. In Cimini’s group, every time a team member kicks off one of their standard experiments, they use a template so they can be sure of completing every step in the protocol, she says. Cimini has also created a template for travel, which includes standard tasks such as booking flights and hotels, and preparing presentations. This feature is particularly useful, she says, because the travel card stays on her Trello board until she remembers to file for reimbursements.</p>
<p> </p>
<p>In her previous position at The Carpentries in Oakland, California, an organization that teaches coding and data workshops, Teal and her co-workers used Asana templates to ensure that they would remember to add essential components such as context, recurring tasks and milestones to every project. And they had a standard template to ensure that they completed all the tasks in the right order to be able to launch their workshops.</p>
<p> </p>
<p>Project-management tools typically support plug-ins to enhance functionality. Trello, Jira and Asana can all integrate with the code-sharing site GitHub, for instance. But for developers and scientists who already spend a lot of time on the site, GitHub project boards are particularly appealing, say Teal and Cimini, whose teams both use this tool.</p>
<p> </p>
<p>GitHub is a collaborative platform for people who develop software. Project boards organize GitHub’s social elements — issue trackers, comments and code updates called pull requests — into a Kanban-like board. “It’s this quick graphical way to understand how behind I am,” says Clair Sullivan, a machine-learning engineer at GitHub, who is based in Breckenridge, Colorado. Whenever a programmer flags an issue (such as a bug report or a request for a new feature in the software), the software automatically slots it into the board’s to-do column. As the team addresses these requests with finalized code fixes, GitHub’s built-in Actions tool automatically marks the issues as done.</p>
<p> </p>
<p>Sánchez-Gallego spends a lot of time using GitHub when he works with the team that maintains Marvin, an open-source data-visualization tool. But for his work managing the Sloan Digital Sky Survey helpdesk, he favours Jira, which his team has found to be more accessible for people who do not have experience in developing software. Observers and technicians at the two observatories his team supports use Jira to log tickets when something goes wrong. “What I find most useful is the ability to create personal filters,” he says. This lets him see only the tickets that are most relevant to him.</p></blockquote>
<<list-links "[tag[Projects]!sort[created]]">>
When she accepted a prestigious position as a microbiologist at [[Noetic Technologies Inc|NoeticTechnologies]], Hadija had never in her life considered the possibility that it would lead her to face the specter of death. Now her she was; alone, scared and defenseless. Trembling in the dark bowels of her company's East African regional headquarters. Easy prey for what had just been unleashed in the darkness.
Before the lights went out, she had done a good job evading... whatever it was that shredded them all. She had only time to glimpse with the corner of her eyes torsos of colleagues being tossed into the air when she ran. Though she did not directly see it, blood and pieces of flesh flew all over the lab with a ferocity that alluded to the power of their assailant. It's piercing, ungodly shrieks have been following her ever since she bolted from the horrid scene, interspersed with the sickening thuds and drowned out cries of humans being cut down and gutted. The sounds died down after she took shelter in a section of the facility's labyrinthine basement. The lights going out helped, but now the darkness has become a liability. She couldn't see shit, and she has no idea what was happening. The deafening silence did not help too; was the building under lockdown? Where was everyone? Why wasn't anyone coming to rescue her after so long?
All these questions made her head swirl. She had earlier crawled into a narrow between some now silent machinery to keep herself from being discovered. But now the silence and her unhinged imagination created an almost overpowering sense of dread and urgency. She had to get out of here. In one piece. That's all that mattered. She strained her ears to listen. Nothing. It had been quiet for a long time now. She didn't know for how long. She had left her phone upstairs, and she didn't have her watch on. She waited for a few minutes, but still nothing. Could she risk it?
She tried getting up from her crouched position. Her knees ached from staying like in one position for so long. Despite that, she carefully got up again. She felt the cold concrete floor against her bare feet. She had tossed her shoes away earlier to walk more quietly. As she stood up, she stretched out her arms to feel her way in the dark. The blackness felt oppressive to her eyes, almost suffocating. A wave of panic swept through her and she bit down to suppress it. This was not good. She won't be able to find her way out like this. This section of the building was still unfamiliar to her. She quickly withdrew her arms and resumed her position in the narrow space, adjusting to a more comfortable posture. She would probably have to wait until power came back, or until someone rescued her. If there are still people left.
She wrapped her arms around herself to stave off another momentary wave of panic. Her heart was racing, and her ears felt like like they were on fire. She was also beginning to hyperventilate. //Get a grip//, she murmured to herself. She began reciting a small prayer from her childhood days in //madrassah// to keep calm. She hadn't done such a thing since she was a budding teen when she was gripped by what her parents later told her was sleep paralysis after a long bout of late night studying. //Oh. Oh God. Mama, Papa.//, she whimpered as she rocked her body back and forth. Then a sudden sound made her jolt up. A crash, like something slamming against the concrete wall, filled the empty space around her with a harsh echo. When it faded, silence returned, but it was soon replaced by another, ominous noise. The sound of something walking. Footsteps. A person?
Hadija caught herself in time; she wanted to cry out, but she held back. She had to know for certain who or what was walking down the stairs leading into the basement. The sound was becoming louder, and clearer. Slow, almost methodical footsteps. She immediately recognized them!
"Doctor Hadija, are you in here?"
<ul>
<li>There are five properties:
<ol>
<li>For any level L (where L is a whole number), there can only be a maximum of 2<sup>L </sup>nodes. The root level is 2<sup>0</sup>=1</li>
<li>Maximum number of nodes in a binary of height h is 2<sup>h</sup>-1. Note this holds if the height of a tree with 1 node is 1. If taken as 0, then max nodes = 2<sup>h+1</sup>-1
<ul>
<li>A tree has maximum nodes if all levels have maximum nodes (refer [[max binary heap|Binary trees]])</li>
<li>This is a geometric series</li></ul></li>
<li>In a binary tree with n nodes, minimum possible height or minimum number of levels is ⌈Log2(n+1)⌉
<ul>
<li>This derived directly from 2 above</li>
<li>If height of a leaf node is taken as 0 instead, then ⌈Log2(n+1)⌉ -1</li></ul></li>
<li>A binary tree with L leaves has at least ⌈Log2(n+1)⌉ +1 levels</li>
<li>In a binary tree where every node has 0 or 2 children (full/strict binary tree), number of leaf nodes is equal to number of internal nodes plus one
<ul>
<li>
<pre>L = T + 1
Where L = Number of leaf nodes
T = Number of internal nodes</pre></li>
<li>[[Proof|https://www.geeksforgeeks.org/handshaking-lemma-and-interesting-tree-properties/]]</li></ul></li></ol></li></ul>
<p>Comments in the article used for these notes indicate there are some problems with these statements. I'll have to find a more reliable source. Leaving this hear for the future note.</p>
<p>Let's continue with [[Types of Binary Trees]]</p>
<table>
<tbody>
<tr>
<td colspan="4">
<p>Proposed authorship (to be discussed and confirmed by publication committee): </p>
<p>First: Abraham Samma - data collection, major work on analysis and writing</p>
<p>Co-first: Sarah Somji - data collection, major work on analysis and writing</p>
<p>3rd: Emily Benotti - study design, qual training, analysis, management of process, writing </p>
<p>4th: Lauren Spigel - study design, analysis, writing (lit rev, discussion and parts of results)</p>
<p>5th-9th: Tisu Mvalo, Umesh Charantimath, Jennifer Tseka, Mercy Tsidya, Chandrashekhar Karadiguddi - data collection, minor contributions to analysis, writing (will take on pieces of the manuscript writing)</p>
<p>Others: sites, AL, SMEs</p>
<p>Senior: Linda - study design, quantitative analysis and interpretation, writing </p>
<p>And the LIFE study </p></td>
</tr>
<tr>
<td colspan="4">
<p>Target date of draft due to co-authors: 8 November</p>
<p>Target submission date: 20 December</p></td>
</tr>
<tr>
<td>
<p>Section</p></td>
<td>
<p>Components</p></td>
<td>
<p>Proposed lead person</p></td>
<td>
<p>Due date</p></td>
</tr>
<tr>
<td>
<p>Outline of paper</p></td>
<td>
<ul>
<li>
<p>Introduction - justification and overall objectives</p></li>
<li>
<p>Methods</p></li>
<li>
<p>Results and key messages</p></li>
<li>
<p>Discussion</p></li>
<li>
<p>Conclusion</p></li></ul></td>
<td>
<ul>
<li>
<p>Abraham Samma</p></li>
<li>
<p>Sarah Somji</p></li></ul></td>
<td>
<p>30 September</p></td>
</tr>
<tr>
<td>
<p>Literature review for intro and discussion</p></td>
<td>
<ul>
<li>
<p>Home environment</p></li>
<li>
<p>Social support</p></li>
<li>
<p>Decision-making</p></li>
<li>
<p>Feeding self-efficacy</p></li>
<li>
<p>Complementary feeding </p></li>
<li>
<p>LBW feeding, health and growth</p></li>
<li>
<p>Mom’s well-being/postpartum</p></li>
<li>
<p>And more...</p></li></ul></td>
<td>
<ul>
<li>
<p>Lauren Spigel</p></li></ul></td>
<td>
<p>First pass for select topics by 1 Oct </p>
<p>Additional literature reviews thereafter</p></td>
</tr>
<tr>
<td>
<p>Introduction writing</p></td>
<td>
<ul>
<li>
<p>Challenges</p></li>
<li>
<p>Opportunities</p></li>
<li>
<p>Aims/objectives</p></li></ul></td>
<td>
<ul>
<li>
<p>Abraham Samma</p></li>
<li>
<p>Sarah Somji</p></li></ul></td>
<td>
<p>25 Oct</p></td>
</tr>
<tr>
<td>
<p>Methods</p></td>
<td>
<ul>
<li>
<p>Study design </p></li>
<li>
<p>Study population</p>
<ul>
<li>
<p>Recruitment and eligibility</p></li>
<li>
<p>Stratification </p></li></ul></li>
<li>
<p>Data collection</p></li>
<li>
<p>Data analysis</p></li></ul></td>
<td>
<ul>
<li>
<p>Emily Benotti</p></li>
<li>
<p>Linda to add quant inputs for incorporation</p></li></ul></td>
<td>
<p>25 Oct</p></td>
</tr>
<tr>
<td>
<p>Results</p></td>
<td>
<ul>
<li>
<p>Qual results</p></li>
<li>
<p>Quant results</p></li></ul>
<p>These will need to be integrated </p></td>
<td>
<ul>
<li>
<p>Abraham Samma</p></li>
<li>
<p>Sarah Somji</p></li>
<li>
<p>Linda Vesel (quant)</p></li>
<li>
<p>Additions/input from core team - potentially divide up results </p></li></ul></td>
<td>
<p>25 Oct</p></td>
</tr>
<tr>
<td>
<p>Discussion</p></td>
<td>
<ul>
<li>
<p>Summary of results</p></li>
<li>
<p>Comparison to other studies</p></li>
<li>
<p>Strengths</p></li>
<li>
<p>Limitations</p></li></ul></td>
<td>
<ul>
<li>
<p>Abraham Samma</p></li>
<li>
<p>Sarah Somji</p></li>
<li>
<p>Tisu Mvalo</p></li>
<li>
<p>Umesh Charantimath</p></li>
<li>
<p>Lauren Spigel</p></li></ul></td>
<td>
<p>25 Oct</p></td>
</tr>
<tr>
<td>
<p>Conclusion</p></td>
<td>
<ul>
<li>
<p>Implications </p></li></ul></td>
<td>
<ul>
<li>
<p>Abraham Samma</p></li>
<li>
<p>Sarah Somji</p></li></ul></td>
<td>
<p>27 October</p></td>
</tr>
</tbody></table>
<<list-links "[tag<currentTiddler>!sort[created]]">>
|!CRF |!Question number |!Comment |
|Form A1 |Qn 7 |Qn 7 "does the infant have any exclusion criteria [6.11=1 study staff ''or'' hospital physician]" shouldn't this be ''and''? ''Note this comment also applies to Form B1 Qn 8.2''. Also, how do we handle disagreements in this same question should they arise? |
|Form A2 |Qn 3.6 |Qn 3.6 option 5 "renal signs": I assume the option for signs of renal failure is being retained because we're expected to get this information from the patient file, right? In which case, it might be helpful to add instructions on what these signs are e.g. uremia, acidosis, electrolyte imbalance and oedema. Note this option is present in Form B2 as well |
|Form A2 | - |The instructions say this form can be filled with information from the mother or the hospital records. Can we standardize the source of the information with just one? |
|Form B1 |Qn 2.3 |Qn 2.3 Actim crp kits can have 4 possible results. Suggest replacing option 3 (''>= 40 mg/l'') with ''>=40 -- < 80mg/l'' and adding a new option 4 with: ''>80mg/l'' |
|All forms | - |All forms have section As that still require personal identifiable information such as name of the child, mother and father. Presently, we fill these with initials. Kindly advise that this is appropriate. |
|Form N-1| - |Form instructions specify that this form is for "non-enrolled children". We suggest adding a definition for this group in the instructions to constrain what a non-enrolled infant is exactly |
|Form E-1| - |Would like confirmation that E-1 Withdrawal form also applies to participants who have completed day 15 follow-up, or is it only for early terminations? |
|Form D-1| - |Would like confirmation that D-1 Protocol deviation for non-enrolled infants only applies to scenarios where non-enrolled infants haven't been given a day 15 visit as per protocol; are there other scenarios where it may also apply to this group? |
{{Items in preparation for 1st June start}}
* From [[WHO generic SOP v3 dated May 2021|https://onedrive.live.com/edit.aspx?cid=c9e331208a91557a&page=view&resid=C9E331208A91557A!2775&parId=C9E331208A91557A!2776&app=Word]]:
** section 7.3: "Young infants up to 2 months of age at outpatient or emergency department will be examined, triaged and stabilised by the paediatrician or physician of the participating hospital. If the hospital physician observes any low or moderate risk signs during their initial assessment and the clinical condition of the infant is stable, the infant will be referred to and assessed by the study Screening and Enrolment (SET) team. Screening of sick young infants will be performed by a study team member (who is a nurse/physician) in the outpatient or emergency department of the participating hospital, and information will be captured on CRF A-1 [Screening and enrolment form]."
** the key question here is what constitutes a SYI? The sop states that the SET team should screen SYIs.
** if the problem is the 99% psbi yield?
** the pilot yield was 75% psbi (96 out of 128 screened)
** we carried forward the same processes from the pilot into the study. no changes have been made except incorporating feeder sites. So maybe this last thing may have increased the yield of patients. Does this mean we should screen every single infant who comes at the feeder sites?
** either way, the assertion that we screen ALL YIs WHO COME TO THE OPD is still wrong. Rather, we should screen all SYIs who are sent to us by the hospital staff. So, we should clarify with WHO what SYI should mean in this context.
<<list-links "[tag[Python]sort[title]]">>
[[Literature review|https://docs.google.com/spreadsheets/d/1lVMUm22ZdovHvBWZUUoJNINeXZeV4U3HA9E65rQZreE/edit#gid=0]]
[[Protocol paper|https://docs.google.com/document/d/1tqD5BKhFbjAYTJBHZ0K52ug6-kIM7PgadA7mJf5j1pc/edit]]
[[Paper|https://docs.google.com/document/d/1Eg6AreeyiDRRiMkExGpdDriaH9b9vgE3dWKDxb0-Mm8/edit]]
* //Point out global gaps, showcasing://
** //Gaps in mortality rates// Global efforts towards attaining Sustainable Development Goal number 3.2 by 2030, to reduce neonatal mortality to at least as low as 12 per 1,000 live births and under-5 mortality to at least as low as 25 per 1,000 live births as well as previous Millennium Development Goal number 4, have yielded significant progress, particularly in under five mortality rates, which have declined by 59% globally from 1990 to 2019 [1] to 38 deaths per 1000 live births, while neonatal mortality rates have also declined by 52% within the same period. However, child mortality rates still remain above the current set goals, signifying more should be done by focusing attention on the most vulnerable groups, such as low birthweight (LBW) infants (whose body weight is < 2.5kg) who account for a large percentage of neonatal deaths [reference] due to their vulnerability to infections, neurodevelopmental impairments and growth faltering. These in turn may lead to, or be exacerbated by poor or inadequate feeding practices.
** //Hot spots// Most of the burden is shouldered by low and middle income countries (LMICs) with Sub Saharan Africa (SSA) accounting for the most with an average under-five mortality rate of 76 deaths per 1,000 live births [1], despite more than halving the mortality rate since 1990. South Asia and SSA together accounted for 82% of the under-five deaths in the world in 2019.
** //Zoom into importance of feeding intervention to improve growth and survival, HOWEVER// Targeted improvement of feeding practices in these regions will help improve growth and developmental outcomes of LBW infants and therefore contribute to the reduction of these high mortality rates. This can be achieved by introducing feeding interventions early on in the child's development such as direct breastfeeding support, feeding expressed breastmilk with cup or spoon, breastmilk fortification, artificial milk or formula feeding as well as donor human milk. However...
* //Point out lack of knowledge in://
** //qualitative picture of current feeding practices in the community//
** //Point out critical importance in knowing how community members and leaders of all cadres and segments play their role in feeding LBW infants and their attitudes towards them//
** //Understand the beliefs of healthcare providers in these matters//
** //Understand the points where healthcare providers, mothers and other community members agree or disagree//
** //Beliefs surrounding feeding interventions that may be introduced but are novel to locals//
I have noticed that our colleagues at Ariadne Labs have had to deal with [[two software packages for mixed research analysis|Software for Qualitative Research]]. And there is an obvious gap.
One of them is love because it supports collaborative research work easily, but it is slow and clunky to use and is based on flash technology which is being phased out.
The other one which is called NVIVO is better but does not offer support for collaborative work.
The gap here is that there is none that is:
# not clunky
# not based on obsolete technology
# supports collaboration without being difficult on the user experience
# Quality editing experience. A simple wysiwyg editor with no pivots to other systems (and I think this is the problem with asking someone to use something like PRs to add contributions for example)
# Editable by all. However this does not mean no reviews. This should be built into the process
# “The more KM can connect holders of knowledge with consumers of knowledge, the smarter an organization is, and the more effective it can be about transferring that knowledge.”1 As such, your KM tool should show who edited content and how often they contribute to particular articles or themes. Being new to an organization, it can be difficult to know who has subject matter expertise across different areas- such a feature can remove such barriers. Tools that provide the ability to ''award badges for contributions can provide a lightweight incentive for folks across the organization.'' Such mechanisms also provide the ability to benchmark employee involvement and set goals for increased engagement.
# Default to publicly available: from the link: For many federal agencies, the work that is conducted does not need to happen under lock and key. Instead, there is little harm in publicizing processes or procedures via a publicly accessible site. Doing so makes it easier for your employees to access the information and even share it with other agencies. Following such a path provides transparency to vendors and enables collaboration by other agencies or individuals.
# Open source technology reduces contractual risks by avoiding vendor lock-in. In the event of a COOP incident, a mirrored copy of your KM tool can be quickly deployed to new infrastructure or managed locally on a laptop. Features to support should include export content and manage backups.
# A robust search experience
# Content over documents. However, I have a contrarian view here which is the essence of OnePlaybook's innovation: because updating wikis is important in the knowledge management culture, but documents are also important for companies and many organizations, so much so that it is arguably the norm, we shouldn't burden users with double work i.e. forcing them to update both wikis and documents. Instead, the documents could become the backend medium of their wikis and wikis the frontend, content only medium for easter accessibility.
The following code queries for permission to use persistent storage mechanisms in the browser:
```javascript
navigator.permissions.query({name:'persistent-storage'}).then(function(result) {
if (result.state == 'granted') {
console.log(result.state);
} else if (result.state == 'prompt') {
console.log(result.state);
navigator.storage.persist().then(function(result){
if (result) {
console.log(result)
} else {
console.log(result)
}
})
} else if (result.state == 'denied') {
console.log(result.state);
}
})
```
Options for the query operation consist of a comma-separated list of name-value pairs. The available options are:
* name: The name of the API whose permissions you want to query. Valid values are `'geolocation', 'midi', 'notifications', 'push', 'persistent-storage', 'camera'` and `'microphone'`.
* userVisibleOnly: (Push only, not supported in Firefox — see the Browser Support section below) Indicates whether you want to show a notification for every message or be able to send silent push notifications. The default is false.
* sysex: (Midi only) Indicates whether you need and/or receive system exclusive messages. The default is false.
You should check for these APIs before using them:
```javascript
if ('permissions' in navigator) {
}
```
A wiki can help:
* to make sure documents are versioned properly
* content is not duplicated unnecessarily
* content is error free
* content is fed only once into the system, so no need to write and transfer content multiple times for the same thing
* repetition is replaced with automation
* expand to accomodate more complex documents and objects beyond ppt, google docs, sheets and charts
But wikis are sometimes difficult to set up and not approachable to most folks.
All article quotes and citations come here:
<<list-links "[tag[Quote]] [tag[Citation]]">>
\define range_example(range)
```
[range[$range$]]
```
<$list variable=n filter="[range[$range$]]"><<n>> </$list>
\end
The `range` operator allows a range of numbers to be enumerated, similar to a `for` loop in other programming languages. It's useful in combination with the [[Formula Plugin]].
|!Purpose|produce a range of numbers|
|!Input|ignored.|
|!Parameter|1-3 numbers separated by `,` or `;`.|
|!Output|A range of numbers starting with |
|!`!` Output|As ''Output'', but with order reversed.|
The parameter has three forms:
* `<end>`
* `<begin>,<end>`
* `<begin>,<end>,<step>`
Each part must be a number, and works as follows:
* `<begin>`: start counting at this number. Defaults to 0.
* `<end>`: stop counting at this number.
** It will be included unless it falls between two steps.
* `<step>`: count up (or down) by this amount.
** It may be negated so it counts in the right direction.
** It cannot be zero.
The number of decimal points in the output is fixed, and based on the parameter with the //most// decimal points.
To prevent the browser from freezing, `range` is currently limited to 10,000 values.
!!Examples
<<range_example "7">>
<<range_example "1, 10">>
<<range_example "17,13">>
<<range_example "1.001, 5, 1">>
<<range_example ".5,1.4,.004">>
<p>The Raspberry Pi can do a lot, especially now that the new Raspberry Pi comes with wireless capabilities already on board. It can take the place of a ton of different (and more expensive) devices – including a router! If you turn your Raspberry Pi into a wireless access point, you can make it act as a router. It’s not the most powerful thing in the world, but it does work, and the project is a lot of fun.</p>
<h2>How to use your Raspberry Pi as a wireless access point</h2>
<p>We’re going to get into the command line a bit here, but this project isn’t really all that difficult. All we’re really doing is using Raspbian and installing a couple packages that give the Pi the ability to do router-like things like assign IP addresses to devices that connect to it.</p>
<h3>Step 1: Install and update Raspbian</h3>
<p><a href="https://thepi.io/how-to-install-raspbian-on-the-raspberry-pi/">Check out our complete guide to installing Raspbian for the details on this one.</a> Then plug everything in and hop into the terminal and check for updates and ugrades:</p>
<pre>sudo apt-get update
sudo apt-get upgrade</pre>
<p>If you get an upgrade, It’s a good idea to reboot with <strong>sudo reboot</strong>.</p>
<h3>Step 2: Install hostapd and dnsmasq</h3>
<p>These are the two programs we’re going to use to make your Raspberry Pi into a wireless access point. To get them, just type these lines into the terminal:</p>
<pre>sudo apt-get install hostapd
sudo apt-get install dnsmasq</pre>
<p>Both times, you’ll have to hit y to continue. hostapd is the package that lets us create a wireless hotspot using a Raspberry Pi, and dnsmasq is an easy-to-use DHCP and DNS server.</p>
<p>We’re going to edit the programs’ configuration files in a moment, so let’s turn the programs off<br />
before we start tinkering:</p>
<pre>sudo systemctl stop hostapd
sudo systemctl stop dnsmasq
</pre>
<h3>Step 3: Configure a static IP for the wlan0 interface</h3>
<p>For our purposes here, I’m assuming that we’re using the standard home network IP addresses, like 192.168.###.###. Given that assumption, let’s assign the IP address <strong>192.168.0.10</strong> to the wlan0<br />
interface by editing the dhcpcd configuration file. Start editing with this command:</p>
<pre>sudo nano /etc/dhcpcd.conf</pre>
<p>Now that you’re in the file, add the following lines at the end:</p>
<pre>interface wlan0
static ip_address=192.168.0.10/24
denyinterfaces eth0
denyinterfaces wlan0</pre>
<p>(The last two lines are needed in order to make our bridge work –- but more on that in<br />
Step 8.)</p>
<p>After that, press <strong>Ctrl+X</strong>, then<strong> Y</strong>, then<strong> Enter</strong> to save the file and exit the editor.</p>
<h3>Step 4: Configure the DHCP server (dnsmasq)</h3>
<p>We’re going to use dnsmasq as our DHCP server. The idea of a DHCP server is to<br />
dynamically distribute network configuration parameters, such as IP addresses, for<br />
interfaces and services.</p>
<p>dnsmasq’s default configuration file contains a lot of unnecessary information, so<br />
it’s easier for us to start from scratch. Let’s rename the default configuration file and<br />
write a new one:</p>
<pre>sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo nano /etc/dnsmasq.conf</pre>
<p>You’ll be editing a new file now, and with the old one renamed, this is the config file that dnsmasq will use. Type these lines into your new configuration file:</p>
<pre>interface=wlan0
dhcp-range=192.168.0.11,192.168.0.30,255.255.255.0,24h</pre>
<p>The lines we added mean that we’re going to provide IP addresses between 192.168.0.11 and 192.168.0.30 for the wlan0 interface.</p>
<h3>Step 5: Configure the access point host software (hostapd)</h3>
<p>Another config file! This time, we’re messing with the hostapd config file. Open ‘er up:</p>
<pre>sudo nano /etc/hostapd/hostapd.conf</pre>
<p>This should create a brand new file. Type in this:</p>
<pre>interface=wlan0
bridge=br0
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
ssid=<strong>NETWORK</strong>
wpa_passphrase=<strong>PASSWORD</strong></pre>
<p>Note that where I have “NETWORK” and “PASSWORD,” you should come up with your own names. This is how you’ll join the Pi’s network from other devices.</p>
<p>We still have to show the system the location of the configuration file:</p>
<pre>sudo nano /etc/default/hostapd</pre>
<p>In this file, track down the line that says #DAEMON_CONF=”” – delete that <strong>#</strong> and put the path to our config file in the quotes, so that it looks like this:</p>
<pre>DAEMON_CONF="/etc/hostapd/hostapd.conf"</pre>
<p>The # keeps the line from being read as code, so you’re basically bringing this line to life here while giving it the right path to our config file.</p>
<h3>Step 6: Set up traffic forwarding</h3>
<p>The idea here is that when you connect to your Pi, it will forward the traffic over your Ethernet cable. So we’re going to have wlan0 forward via Ethernet cable to your modem. This involves editing yet another config file:</p>
<pre>sudo nano /etc/sysctl.conf</pre>
<p>Now find this line:</p>
<pre>#net.ipv4.ip_forward=1</pre>
<p>…and delete the “#” – leaving the rest, so it just reads:</p>
<pre>net.ipv4.ip_forward=1</pre>
<h3>Step 7: Add a new iptables rule</h3>
<p>Next, we’re going to add IP masquerading for outbound traffic on eth0 using iptables:</p>
<pre>sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE</pre>
<p>…and save the new iptables rule:</p>
<pre>sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"</pre>
<p>To load the rule on boot, we need to edit the file /etc/rc.local and add the following<br />
line just above the line exit 0:</p>
<pre>iptables-restore < /etc/iptables.ipv4.nat</pre>
<h3>Step 8: Enable internet connection</h3>
<p>Now the Raspberry Pi is acting as an access point to which other devices can connect. However, those devices can’t use the Pi to access the internet just yet. To make the possible, we need to build a bridge that will pass all traffic between the wlan0 and eth0 interfaces.</p>
<p>To build the bridge, let’s install one more package:</p>
<pre>sudo apt-get install bridge-utils</pre>
<p>We’re ready to add a new bridge (called br0):</p>
<pre>sudo brctl addbr br0</pre>
<p>Next, we’ll connect the eth0 interface to our bridge:</p>
<pre>sudo brctl addif br0 eth0</pre>
<p>Finally, let’s edit the interfaces file:</p>
<pre>sudo nano /etc/network/interfaces</pre>
<p>…and add the following lines at the end of the file:</p>
<pre>auto br0
iface br0 inet manual
bridge_ports eth0 wlan0</pre>
<h3>Step 9: Reboot</h3>
<p>Now that we’re ready, let’s reboot with <strong>sudo reboot.</strong></p>
<p>Now your Pi should be working as a wireless access point. Try it out by hopping on another device and looking for the network name you used back in step 5.</p>
!This is an encrypted Tiddler
<p>The security of your Raspberry Pi is important. Gaps in security leave your Raspberry Pi open to hackers who can then use it without your permission.</p>
<p>What level of security you need depends on how you wish to use your Raspberry Pi. For example, if you are simply using your Raspberry Pi on your home network, behind a router with a firewall, then it is already quite secure by default.</p>
<p>However, if you wish to expose your Raspberry Pi directly to the internet, either with a direct connection (unlikely) or by letting certain protocols through your router firewall (e.g. SSH), then you need to make some basic security changes.</p>
<p>Even if you are hidden behind a firewall, it is sensible to take security seriously. This documentation will describe some ways of improving the security of your Raspberry Pi. Please note, though, that it is not exhaustive.</p>
<h2>Change your default password</h2>
<p>The default username and password is used for every single Raspberry Pi running Raspbian. So, if you can get access to a Raspberry Pi, and these settings have not been changed, you have <code>root</code> access to that Raspberry Pi.</p>
<p>So the first thing to do is change the password. This can be done via the raspi-config application, or from the command line.</p>
<pre>sudo raspi-config</pre>
<p>Select option 2, and follow the instructions to change the password.</p>
<p>In fact, all raspi-config does is start up the command line <code>passwd</code> application, which you can do from the command line. Simply type in your new password and confirm it.</p>
<pre>passwd</pre>
<h2>Changing your username</h2>
<p>You can, of course, make your Raspberry Pi even more secure by also changing your username. All Raspberry Pis come with the default username <code>pi</code>, so changing this will immediately make your Raspberry Pi more secure.</p>
<p>To add a new user, enter:</p>
<pre>sudo adduser alice</pre>
<p>You will be prompted to create a password for the new user.</p>
<p>The new user will have a home directory at <code>/home/alice/</code>.</p>
<p>To add them to the <code>sudo</code> group to give them <code>sudo</code> permissions as well as all of the other necessary permissions:</p>
<pre>sudo usermod -a -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,gpio,i2c,spi alice</pre>
<p>You can check your permissions are in place (i.e. you can use <code>sudo</code>) by trying the following:</p>
<pre>sudo su - alice</pre>
<p>If it runs successfully, then you can be sure that the new account is in the <code>sudo</code> group.</p>
<p>Once you have confirmed that the new account is working, you can delete the <code>pi</code> user. In order to do this, you'll need to first close its process with the following:</p>
<pre>sudo pkill -u pi</pre>
<p>Please note that with the current Raspbian distribution, there are some aspects that require the <code>pi</code> user to be present. If you are unsure whether you will be affected by this, then leave the <code>pi</code> user in place. Work is being done to reduce the dependency on the <code>pi</code> user.</p>
<p>To delete the <code>pi</code> user, type the following:</p>
<pre>sudo deluser pi</pre>
<p>This command will delete the <code>pi</code> user but will leave the <code>/home/pi</code> folder. If necessary, you can use the command below to remove the home folder for the <code>pi</code> user at the same time. Note the data in this folder will be permanently deleted, so make sure any required data is stored elsewhere.</p>
<pre>sudo deluser -remove-home pi</pre>
<h2>Make <code>sudo</code> require a password</h2>
<p>Placing <code>sudo</code> in front of a command runs it as a superuser, and by default, that does not need a password. In general, this is not a problem. However, if your Pi is exposed to the internet and somehow becomes exploited (perhaps via a webpage exploit for example), the attacker will be able to change things that require superuser credential, unless you have set <code>sudo</code> to require a password.</p>
<p>To force <code>sudo</code> to require a password, enter:</p>
<pre>sudo nano /etc/sudoers.d/010_pi-nopasswd</pre>
<p>and change the <code>pi</code> entry (or whichever usernames have superuser rights) to:</p>
<pre>alice ALL=(ALL) PASSWD: ALL</pre>
<p>Now save the file.</p>
<h2>Ensure you have the latest security fixes</h2>
<p>This can be as simple as ensuring your version of Raspbian is up-to-date, as an up-to-date distribution contains all the latest security fixes. Full instructions can be found <a href="https://www.raspberrypi.org/documentation/raspbian/updating.md">here</a>.</p>
<p>If you are using SSH to connect to your Raspberry Pi, it can be worthwhile to add a cron job that specifically updates the ssh-server. The following command, perhaps as a daily cron job, will ensure you have the latest SSH security fixes promptly, independent of your normal update process. More information on setting up cron can be found <a href="https://www.raspberrypi.org/documentation/linux/usage/cron.md">here</a></p>
<pre>apt install openssh-server</pre>
<h2>Improving SSH security</h2>
<p>SSH is a common way of accessing a Raspberry Pi remotely. By default, logging in with SSH requires a username/password pair, and there are ways to make this more secure. An even more secure method is to use key based authentication.</p>
<h3>Improving username/password security</h3>
<p>The most important thing to do is ensure you have a very robust password. If your Raspberry Pi is exposed to the internet, the password needs to be very secure. This will help to avoid dictionary attacks or the like.</p>
<p>You can also <strong>allow</strong> or <strong>deny</strong> specific users by altering the <code>sshd</code> configuration.</p>
<pre>sudo nano /etc/ssh/sshd_config</pre>
<p>Add, edit, or append to the end of the file the following line, which contains the usernames you wish to allow to log in:</p>
<pre><code>AllowUsers alice bob</code></pre>
<p>You can also use <code>DenyUsers</code> to specifically stop some usernames from logging in:</p>
<pre><code>DenyUsers jane john</code></pre>
<p>After the change you will need to restart the <code>sshd</code> service using <code>sudo systemctl restart ssh</code> or reboot so the changes take effect.</p>
<h3>Using key-based authentication.</h3>
<p>Key pairs are two cryptographically secure keys. One is private, and one is public. They can be used to authenticate a client to an SSH server (in this case the Raspberry Pi).</p>
<p>The client generates two keys, which are cryptographically linked to each other. The private key should never be released, but the public key can be freely shared. The SSH server takes a copy of the public key, and, when a link is requested, uses this key to send the client a challenge message, which the client will encrypt using the private key. If the server can use the public key to decrypt this message back to the original challenge message, then the identity of the client can be confirmed.</p>
<p>Generating a key pair in Linux is done using the <code>ssh-keygen</code> command on the <strong>client</strong>; the keys are stored by default in the <code>.ssh</code> folder in the user's home directory. The private key will be called <code>id_rsa</code> and the associated public key will be called <code>id_rsa.pub</code>. The key will be 2048 bits long: breaking the encryption on a key of that length would take an extremely long time, so it is very secure. You can make longer keys if the situation demands it. Note that you should only do the generation process once: if repeated, it will overwrite any previous generated keys. Anything relying on those old keys will need to be updated to the new keys.</p>
<p>You will be prompted for a passphrase during key generation: this is an extra level of security. For the moment, leave this blank.</p>
<p>The public key now needs to be moved on to the server: see <a href="https://www.raspberrypi.org/documentation/remote-access/ssh/passwordless.md#copy-your-public-key-to-your-raspberry-pi">Copy your public key to your Raspberry Pi</a>.</p>
<p>Finally, we need to disable password logins, so that all authentication is done by the key pairs.</p>
<pre>sudo nano /etc/ssh/sshd_config</pre>
<p>There are three lines that need to be changed to <code>no</code>, if they are not set that way already:</p>
<pre>ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no</pre>
<p>Save the file and either restart the ssh system with <code>sudo service ssh reload</code> or reboot.</p>
<h2>Install a firewall</h2>
<p>There are many firewall solutions available for Linux. Most use the underlying <a href="http://www.netfilter.org/projects/iptables/index.html">iptables</a> project to provide packet filtering. This project sits over the Linux netfiltering system. <code>iptables</code> is installed by default on Raspbian, but is not set up. Setting it up can be a complicated task, and one project that provides a simpler interface than <code>iptables</code> is <a href="https://www.linux.com/learn/introduction-uncomplicated-firewall-ufw">ufw</a>, which stands for 'Uncomplicated Fire Wall'. This is the default firewall tool in Ubuntu, and can be easily installed on your Raspberry Pi:</p>
<pre>sudo apt install ufw</pre>
<p><code>ufw</code>is a fairly straightforward command line tool, although there are some GUIs available for it. This document will describe a few of the basic command line options. Note that <code>ufw</code> needs to be run with superuser privileges, so all commands are preceded with <code>sudo</code>. It is also possible to use the option <code>--dry-run</code> any <code>ufw</code> commands, which indicates the results of the command without actually making any changes.</p>
<p>To enable the firewall, which will also ensure it starts up on boot, use:</p>
<pre>sudo ufw enable</pre>
<p>To disable the firewall, and disable start up on boot, use:</p>
<pre>sudo ufw disable</pre>
<p>Allow a particular port to have access (we have used port 22 in our example):</p>
<pre>sudo ufw allow 22</pre>
<p>Denying access on a port is also very simple (again, we have used port 22 as an example):</p>
<pre>sudo ufw deny 22</pre>
<p>You can also specify which service you are allowing or denying on a port. In this example, we are denying tcp on port 22:</p>
<pre>sudo ufw deny 22/tcp</pre>
<p>You can specify the service even if you do not know which port it uses. This example allows the ssh service access through the firewall:</p>
<pre>sudo ufw allow ssh</pre>
<p>The status command lists all current settings for the firewall:</p>
<pre>sudo ufw status</pre>
<p>The rules can be quite complicated, allowing specific IP addresses to be blocked, specifying in which direction traffic is allowed, or limiting the number of attempts to connect, for example to help defeat a Denial of Service (DoS) attack. You can also specify the device rules are to be applied to (e.g. eth0, wlan0). Please refer to the <code>ufw</code> man page (<code>man ufw</code>) for full details, but here are some examples of more sophisticated commands.</p>
<p>Limit login attempts on ssh port using tcp: this denies connection if an IP address has attempted to connect six or more times in the last 30 seconds:</p>
<pre>sudo ufw limit ssh/tcp</pre>
<p>Deny access to port 30 from IP address 192.168.2.1</p>
<pre>sudo ufw deny from 192.168.2.1 port 30</pre>
<h2>Installing fail2ban</h2>
<p>If you are using your Raspberry Pi as some sort of server, for example an <code>ssh</code> or a webserver, your firewall will have deliberate 'holes' in it to let the server traffic through. In these cases, <a href="http://www.fail2ban.org">Fail2ban</a> can be useful. Fail2ban, written in Python, is a scanner that examines the log files produced by the Raspberry Pi, and checks them for suspicious activity. It catches things like multiple brute-force attempts to log in, and can inform any installed firewall to stop further login attempts from suspicious IP addresses. It saves you having to manually check log files for intrusion attempts and then update the firewall (via <code>iptables</code>) to prevent them.</p>
<p>Install fail2ban using the following command:</p>
<pre>sudo apt install fail2ban</pre>
<p>Note that the version of Fail2ban in the repository (v0.8.13) does not support IPv6 networks. If you use IPv6, you will need to install version v0.10 or higher from source. Please see the <a href="http://www.fail2ban.org">Fail2ban</a> website for more information on how to do this.</p>
<p>On installation, Fail2ban creates a folder <code>/etc/fail2ban</code> in which there is a configuration file called <code>jail.conf</code>. This needs to be copied to <code>jail.local</code> to enable it. Inside this configuration file are a set of default options, together with options for checking specific services for abnormalities. Do the following to examine/change the rules that are used for <code>ssh</code>:</p>
<pre>sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local</pre>
<p>Look for the section on <code>[ssh]</code>. It will look something like this.</p>
<pre><code>[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6</code></pre>
<p>As you can see, this section is named ssh, is enabled, examines the ssh port, filters using the <code>/etc/fail2ban/filter.d/sshd.conf</code> parameters, parses the <code>/var/log/auth.log</code> for malicious activity, and allows six retries before the detection threshold is reached. Checking the default section, we can see that the default banning action is:</p>
<pre># Default banning action (e.g. iptables, iptables-new,
# iptables-multiport, shorewall, etc) It is used to define
# action_* variables. Can be overridden globally or per
# section within jail.local file
banaction = iptables-multiport</pre>
<p><code>iptables-multiport</code>means that the Fail2ban system will run the <code>/etc/fail2ban/action.d/iptables-multiport.conf</code> file when the detection threshold is reached. There are a number of different action configuration files that can be used. Multiport bans all access on all ports.</p>
<p>If you want to permanently ban an IP address after three failed attempts, you can change the maxretry value in the <code>[ssh]</code> section, and set the bantime to a negative number:</p>
<pre><code>[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = -1</code></pre>
<p>There is a good tutorial on some of the internals of Fail2ban <a href="https://www.digitalocean.com/community/tutorials/how-fail2ban-works-to-protect-services-on-a-linux-server">here</a>.</p>
<div class="container font-size5 content-width3">
<div class="header reader-header reader-show-element">
<a class="domain reader-domain" href="https://medium.freecodecamp.org/why-react16-is-a-blessing-to-react-developers-31433bfc210a">medium.freecodecamp.org</a>
<div class="domain-border"></div>
<h1 class="reader-title">Why React16 is a blessing to React developers – freeCodeCamp.org</h1>
<div class="credits reader-credits">Harsh makadia</div>
<div class="meta-data">
<div class="reader-estimated-time">9-12 minutes</div>
</div>
</div>
<hr>
<div class="content">
<div class="moz-reader-content line-height4 reader-show-element"><div id="readability-page-1" class="page"><div><p name="b5dd" id="b5dd">Just
like how people are excited about updating their mobile apps and OS,
developers should also be excited to update their frameworks. The new
version of the different frameworks come with new features and tricks
out of the box.</p><p name="645d" id="645d">Below are some of the good features you should consider when migrating your existing app to React 16 from React 15.</p><blockquote name="f274" id="f274"><em>Time to say Goodbye React15 👋</em></blockquote><h3 name="b598" id="b598">Error Handling</h3><figure name="aabe" id="aabe"><div></div><figcaption>Error Handling be like :)</figcaption></figure><p name="9ec2" id="9ec2">React 16 introduces the new concept of an <em>error boundary</em>.</p><p name="b2a2" id="b2a2">Error boundaries are React components that <strong>catch JavaScript errors anywhere in their child component tree. They log those errors, and display a fallback UI</strong>
instead of the crashed component tree. Error boundaries catch errors
during rendering, in lifecycle methods, and in constructors of the whole
tree below them.</p><p name="49f0" id="49f0">A class component becomes an error boundary if it defines a new lifecycle method called <code>componentDidCatch(error, info)</code>:</p><figure name="3d5c" id="3d5c"><div></div></figure><p name="acf5" id="acf5">Then you can use it as a regular component.</p><pre name="009c" id="009c"><ErrorBoundary> <br> <MyWidget /><br></ErrorBoundary></pre><p name="728d" id="728d">The <code>componentDidCatch()</code> method works like a JavaScript <code>catch {}</code>
block, but for components. Only class components can be error
boundaries. In practice, most of the time you’ll want to declare an
error boundary component once. Then you’ll use it throughout your
application.</p><p name="160a" id="160a">Note that <strong>error boundaries only catch errors in the components below them in the tree</strong>.
An error boundary can’t catch an error within itself. If an error
boundary fails trying to render the error message, the error will
propagate to the closest error boundary above it. This, too, is similar
to how <code>catch {}</code> block works in JavaScript.</p><p name="9385" id="9385">Check out the live demo:</p><figure name="33b5" id="33b5"><div></div><figcaption>ComponentDidCatch</figcaption></figure><p name="a916" id="a916">For more information on error handling, head <a href="https://reactjs.org/blog/2017/07/26/error-handling-in-react-16.html" data-href="https://reactjs.org/blog/2017/07/26/error-handling-in-react-16.html" rel="noopener" target="_blank">here</a>.</p><h3 name="d8ca" id="d8ca">New render return types: fragments and strings</h3><p name="99e4" id="99e4">Get rid of wrapping the component in a div while rendering.</p><p name="17e9" id="17e9">You can now return an array of elements from a component’s <code>render</code> method. Like with other arrays, you’ll need to add a key to each element to avoid the key warning:</p><pre name="ddc0" id="ddc0"><code>render() {<br> // No need to wrap list items in an extra element!<br> return [<br> // Don't forget the keys :)<br> <li key="A">First item</li>,<br> <li key="B">Second item</li>,<br> <li key="C">Third item</li>,<br> ];<br>}</code></pre><p name="8aaf" id="8aaf"><a href="https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html" data-href="https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html" rel="noopener" target="_blank">Starting with React 16.2.0</a>, it has support for a special fragment syntax to JSX that doesn’t require keys.</p><p name="4401" id="4401">Support for returning strings :</p><pre name="b215" id="b215"><code>render() {<br> return 'Look ma, no spans!';<br>}</code></pre><h3 name="a98f" id="a98f">Portals</h3><p name="1efe" id="1efe">Portals
provide a first-class way to render children into a DOM node that
exists outside the DOM hierarchy of the parent component.</p><pre name="9276" id="9276"><code>ReactDOM.createPortal(child, container)</code></pre><p name="f00e" id="f00e">The first argument (<code>child</code>) is any <a href="https://reactjs.org/docs/react-component.html#render" data-href="https://reactjs.org/docs/react-component.html#render" rel="noopener" target="_blank">renderable React child</a>, such as an element, string, or fragment. The second argument (<code>container</code>) is a DOM element.</p><h4 name="6144" id="6144"><strong>How to use it</strong></h4><p name="29b7" id="29b7">When you return an element from a component’s render method, it’s mounted into the DOM as a child of the nearest parent node:</p><pre name="2169" id="2169"><code>render() {<br> // React mounts a new div and renders the children into it<br> return (<br> <div><br> {this.props.children}<br> </div><br> );<br>}</code></pre><p name="02ff" id="02ff">Sometimes it’s useful to insert a child into a different location in the DOM:</p><pre name="27d0" id="27d0"><code>render() {<br> // React does *not* create a new div. It renders the children into `domNode`.<br> // `domNode` is any valid DOM node, regardless of its location in the DOM.<br> return ReactDOM.createPortal(<br> this.props.children,<br> domNode<br> );<br>}</code></pre><p name="1d4a" id="1d4a">A typical use case for portals is when a parent component has an <code>overflow: hidden</code> or <code>z-index</code> style, but you need the child to visually “break out” of its container. For example, dialogs, hovercards, and tooltips.</p><figure name="2a00" id="2a00"><div></div><figcaption>Portals</figcaption></figure><h3 name="b0ca" id="b0ca">Custom DOM Attribute</h3><figure name="c44e" id="c44e"><div></div></figure><p name="dd1c" id="dd1c">React15 used to ignore any unknown DOM attributes. It would just skip them since React didn’t recognize it.</p><pre name="a6f0" id="a6f0"><code>// Your code:<br><div mycustomattribute="something" /></code></pre><p name="4b36" id="4b36">Would render an empty div to the DOM with React 15:</p><pre name="4d96" id="4d96"><code>// React 15 output:<br><div /></code></pre><p name="c39d" id="c39d">In React16, the output will be the following (<em>custom attributes will be shown and not be ignored at all</em>):</p><pre name="d47c" id="d47c"><code>// React 16 output:<br><div mycustomattribute="something" /></code></pre><h3 name="06cd" id="06cd">Avoid Re-render with setting NULL in state</h3><figure name="69f0" id="69f0"><div></div></figure><p name="6d0c" id="6d0c">With React16 you can prevent state updates and re-renders right from <code>setState()</code>. You just need to have your function return <code>null</code>.</p><pre name="b46a" id="b46a"><code>const MAX_PIZZAS = 20;<p>function addAnotherPizza(state, props) {<br> // Stop updates and re-renders if I've had enough pizzas.<br> if (state.pizza === MAX_PIZZAS) {<br> return null;<br> }</p><p> // If not, keep the pizzas coming! :D<br> return {<br> pizza: state.pizza + 1,<br> }<br>}</p><p>this.setState(addAnotherPizza);</p></code></pre><p name="9135" id="9135">Read more <a href="https://x-team.com/blog/react-render-setstate/" data-href="https://x-team.com/blog/react-render-setstate/" rel="noopener" target="_blank">here</a>.</p><h3 name="4764" id="4764">Creating Refs</h3><p name="5150" id="5150">Creating refs with React16 is now much easier. Why you need to use refs:</p><ul><li name="47b6" id="47b6">Managing focus, text selection, or media playback.</li><li name="1463" id="1463">Triggering imperative animations.</li><li name="9eb0" id="9eb0">Integrating with third-party DOM libraries.</li></ul><p name="2689" id="2689">Refs are created using <code>React.createRef()</code> and are attached to React elements via the <code>ref</code>attribute.
Refs are commonly assigned to an instance property when a component is
constructed so they can be referenced throughout the component.</p><pre name="dcb3" id="dcb3"><code>class MyComponent extends React.Component {<br> constructor(props) {<br> super(props);<br> this.myRef = React.createRef();<br> }<br> render() {<br> return <div ref={this.myRef} />;<br> }<br>}</code></pre><h4 name="1f4f" id="1f4f"><strong>Accessing Refs</strong></h4><p name="353a" id="353a">When a ref is passed to an element in <code>render</code>, a reference to the node becomes accessible at the <code>current</code> attribute of the ref.</p><pre name="e2a3" id="e2a3"><code>const node = this.myRef.current;</code></pre><p name="9616" id="9616">The value of the ref differs depending on the type of the node:</p><ul><li name="aaa8" id="aaa8">When the <code>ref</code> attribute is used on an HTML element, the <code>ref</code> created in the constructor with <code>React.createRef()</code> receives the underlying DOM element as its <code>current</code> property.</li><li name="6697" id="6697">When the <code>ref</code> attribute is used on a custom class component, the <code>ref</code> object receives the mounted instance of the component as its <code>current</code>.</li><li name="b942" id="b942"><strong>You may not use the </strong><code><strong>ref</strong></code><strong> attribute on functional components</strong> because they don’t have instances.</li></ul><h3 name="da0a" id="da0a">Context API</h3><p name="ff28" id="ff28">Context provides a way to pass data through the component tree without having to pass props down manually at every level.</p><h4 name="e922" id="e922"><code>React.createContext</code></h4><pre name="af47" id="af47"><code>const {Provider, Consumer} = React.createContext(defaultValue);</code></pre><p name="a3a2" id="a3a2">Creates a <code>{ Provider, Consumer }</code> pair. When React renders a context <code>Consumer</code>, it will read the current context value from the closest matching <code>Provider</code> above it in the tree.</p><p name="88fa" id="88fa">The <code>defaultValue</code> argument is <strong>only</strong>
used by a Consumer when it does not have a matching Provider above it
in the tree. This can be helpful for testing components in isolation
without wrapping them. Note: passing <code>undefined</code> as a Provider value does not cause Consumers to use <code>defaultValue</code>.</p><h4 name="9c59" id="9c59"><code>Provider</code></h4><pre name="e56d" id="e56d"><code><Provider value={/* some value */}></code></pre><p name="9e9b" id="9e9b">A React component that allows Consumers to subscribe to context changes.</p><p name="b0d2" id="b0d2">Accepts a <code>value</code>
prop to be passed to Consumers that are descendants of this Provider.
One Provider can be connected to many Consumers. Providers can be nested
to override values deeper within the tree.</p><h4 name="a23d" id="a23d"><code>Consumer</code></h4><pre name="ed20" id="ed20"><code><Consumer><br> {value => /* render something based on the context value */}<br></Consumer></code></pre><p name="e4b5" id="e4b5">A React component that subscribes to context changes.</p><p name="fe98" id="fe98">Requires a <a href="https://reactjs.org/docs/render-props.html#using-props-other-than-render" data-href="https://reactjs.org/docs/render-props.html#using-props-other-than-render" rel="noopener" target="_blank">function as a child</a>. The function receives the current context value and returns a React node. The <code>value</code> argument passed to the function will be equal to the <code>value</code> prop of the closest Provider for this context above in the tree. If there is no Provider for this context above, the <code>value</code> argument will be equal to the <code>defaultValue</code> that was passed to <code>createContext()</code>.</p><h3 name="e74c" id="e74c"><code>static getDerivedStateFromProps()</code></h3><p name="91d2" id="91d2"><code>getDerivedStateFromProps</code>
is invoked right before calling the render method. Both on the initial
mount and on subsequent updates. It should return an object to update
the state, or null to update nothing.</p><p name="e09b" id="e09b">This method exists for <a href="https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#when-to-use-derived-state" data-href="https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#when-to-use-derived-state" rel="noopener" target="_blank">rare use cases</a> where the state depends on changes in props over time. For example, it might be handy for implementing a <code><Transition></code> component that compares its previous and next children to decide which of them to animate in and out.</p><p name="fb5c" id="fb5c">Deriving state leads to verbose code and makes your components difficult to think about.</p><p name="255e" id="255e"><a href="https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html" data-href="https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html" rel="noopener" target="_blank">Make sure you’re familiar with simpler alternatives:</a></p><ul><li name="c533" id="c533">If you need to <strong>perform a side effect</strong> (for example, data fetching or an animation) in response to a change in props, use <code><a href="https://reactjs.org/docs/react-component.html#componentdidupdate" data-href="https://reactjs.org/docs/react-component.html#componentdidupdate" rel="noopener" target="_blank">componentDidUpdate</a></code> lifecycle instead.</li><li name="a5a3" id="a5a3">If you want to <strong>re-compute some data only when a prop changes</strong>, <a href="https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#what-about-memoization" data-href="https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#what-about-memoization" rel="noopener" target="_blank">use a memoization helper instead</a>.</li><li name="8361" id="8361">If you want to <strong>“reset” some state when a prop changes</strong>, consider either making a component <a href="https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-controlled-component" data-href="https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-controlled-component" rel="noopener" target="_blank">fully controlled</a> or <a href="https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key" data-href="https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key" rel="noopener" target="_blank">fully uncontrolled with a </a><code><a href="https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key" data-href="https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key" rel="noopener" target="_blank">key</a></code> instead.</li></ul><p name="ada3" id="ada3">This method doesn’t have access to the component instance. If you’d like, you can reuse some code between <code>getDerivedStateFromProps()</code> and the other class methods by extracting pure functions of the component props and state outside the class definition.</p><p name="a78a" id="a78a">Note that this method is fired on <em>every</em> render, regardless of the cause. This is in contrast to <code>UNSAFE_componentWillReceiveProps</code>. It only fires when the parent causes a re-render and not as a result of a local <code>setState</code>.</p><p name="1c26" id="1c26">We compare <code>nextProps.someValue</code> with <code>this.props.someValue.</code> If both are different then we perform some operation, <code>setState</code></p><pre name="f330" id="f330">static getDerivedStateFromProps(nextProps, prevState){ if(nextProps.someValue!==prevState.someValue){ <br> return { someState: nextProps.someValue}; <br>} else return null;}</pre><p name="46c5" id="46c5">It receives two params <code>nextProps</code> and <code>prevState</code>. As mentioned previously, you cannot access <code>this</code> inside this method. You’ll have to store the props in the state to compare the <code>nextProps</code> with previous props. In above code <code>nextProps</code> and <code>prevState</code> are compared. If both are different then an object will be returned to update the state. Otherwise <code>null</code> will be returned indicating state update not required. If state changes then <code>componentDidUpdate</code> is called where we can perform the desired operations as we did in <code>componentWillReceiveProps</code>.</p><h3 name="f658" id="f658">Bonus: React Lifecycle events</h3><figure name="bf83" id="bf83"><div></div></figure><p name="6749" id="6749">Well these are some of the features that you should definitely try while working with React16!</p><p name="b671" id="b671">Happy coding 💻 😀</p></div></div></div>
</div>
<div>
</div>
</div>
<!--StartFragment-->
<p>Because context uses <strong>reference identity </strong>(referencing an object stored in memory [the main reason why 2 ===2 is true but { a: 1 } === { a: 1 } is always false]) to determine when to re-render, there are some gotchas that could trigger unintentional renders in consumers when a provider’s parent re-renders. For example, the code below will re-render all consumers every time the Provider re-renders because a new object is always created for <code>value</code>:</p>
<p> </p>
<pre><code>class App extends React.Component {
render() {
return (
<MyContext.Provider value={{something: 'something'}}> <Toolbar />
</MyContext.Provider>
);
}
}</code></pre>
<p> </p>
<p>To get around this, lift the value into the parent’s state:</p>
<p> </p>
<p>Here, instead of generating a new object on every re-render of the Provider (which would trigger a re-render of the Consumer), we instead reference the same object via the variable that owns it.</p>
<pre><code>class App extends React.Component {
constructor(props) {
super(props);
this.state = {
value: {something: 'something'}, };
}
render() {
return (
<MyContext.Provider value={this.state.value}> <Toolbar />
</MyContext.Provider>
);
}
}</code></pre><!--EndFragment-->
<p><u>Important terms</u></p>
<ul>
<li><u></u>React element: an html element returned by a React component</li>
<li>React component: an independent piece of UI code that can be reused. It can be stateless, pure function or a stateful class and can return react elements, or other components in the case of <strong>higher order components (HOC)</strong></li>
<li>HOCs: a React component that returns another React component. Since they're meant to be independently reused, HOCs shouldn't mutate the components they return, but instead use <strong>composition </strong>design patterns to add details to them.</li></ul>
<hr />
<p>There are four main types of <em>ReactJS</em> components:</p>
<ol>
<li>State-full or class-based components</li>
<li>State-less or function-based components</li>
<li>Presentational (or high-order) components</li>
<li>Container components</li></ol>
<p><img src="https://miro.medium.com/max/1488/1*p1Ej4slk27NuCISlt0EcYA.png" /></p>
<p>A preferred structure of your components tree is displayed on the left.</p>
<h2>State-full components or class-based components</h2>
<p>A state-full component has its state and data associated with the state. You can pass data inside this type of component via state or props objects. State-full components are also harder to support as they persist some data and may change the global state of the app. Also, state-full components are most often class-based components that have a constructor (it’s considered a best practice to set state for your component in the constructor).</p>
<p>Here is an example of the state-full, class-based <em>ReactJS</em> component:</p>
<p><img src="https://miro.medium.com/max/2244/0*1-H1z9phHWTRfze7.png" /></p>
<p>Props are immutable and are one-way bound to a state, and this is why you cannot change them within your component. You use props to set a state for the component and to render its UI. If you try to change props in your component, you will get a Type Error.</p>
<p><img src="https://miro.medium.com/max/6668/1*81eK6pKH81DChtOV4CdjfQ.png" /></p>
<p>State is an object that is exposed to a component. State scope is limited to inside the component where it is declared. Components can initialize state and pass it to another component. We can declare a state in two ways, using the constructor or declaring state property. With the second case, that is just syntactic sugar, and the transpiler (such as Babel) will turn your state property declaration into the constructor for you under the hood. State-less components or function-based components and what React Hooks is for Function-based components are just simple JavaScript functions. Function-based components return a <em>ReactJS</em> element or a collection, which can be a ‘partial component’ like <code><>...</></code> or a fully function-based component with the logic and embedded components. Since you cannot use a constructor in a function-based component (well, actually you do, since <em>ReactJS</em> v16.8), you cannot make your component state-full. It is state-less because you cannot persist any data in these types of components. Most often you pass in props to the function-based component to render its UI.Here is an example of the state-less, function-based <em>ReactJS</em> component:</p>
<p><img src="https://miro.medium.com/max/2256/0*UjwffjIGdUgC7F6D.png" /></p>
<p>From the performance point-of-view, there is practically no difference between using class-based components and using function-based components. <em>ReactJS</em> rendering mechanism is smart enough to optimize that for us.</p>
<p>Function-based components are easier to work with and more comfortable to test. This is why the community of <em>ReactJS</em> developers will nudge you to write function-based components instead of class-based ones. State-less function-based components have some limitations and essentially must have one global place to manage state. That is different from the <em>ReactJS</em> paradigm of writing components (for more details, see below).</p>
<p>To enable developers to write state-full, function-based components and at the same time give the ability to use state and component life-cycle methods, React v16.8 added a new feature called React Hooks. Essentially, React Hooks is an attempt to remove class-based components. With React Hooks you can write state-full function-based components without using classes. Probably we will see class-based components eliminated with Hooks at some point in the future.</p>
<p>React Hooks also aims to simplify application design by avoiding components that do not have or do not need constructors although they are declared as classes. Most often you work with state-less components if you think about the ideal design of your app. When we build <em>ReactJS</em> apps for our clients, we usually use a thin layer between our component representation and the application’s logic. This allows us to decouple the visual representation of the component from its behavior.</p>
<hr />
<p>What is the «<strong>Data Down, Actions Up</strong>» design pattern? Essentially it means you have a Higher-Order Component (<strong>HOC </strong>— see explanation below) which accepts the data in its `props` and passes that data down into its view or nested components. To interact with the component, users trigger actions such as pressing a button and the component responds to that interaction by emitting events. So to say, it triggers an event up, in the opposite direction to how that data was passed.</p>
<p>Those events or actions are passed up to a parent component. The parent component triggers another action that changes a global application state.</p>
<hr />
<p>Higher-Order Component (or <strong>HOC</strong>) is essentially a design pattern, also known as a Decorator Pattern. In <em>ReactJS</em>, a <strong>HOC</strong> is a component that wraps another component by adding extra functionality or extra properties. This allows abstraction from some commonly used logic and keeps your code <strong>DRY</strong>. It is how you distribute complex component structure between other components in <em>ReactJS</em> and a way to decouple your application logic and UI. For instance, you may use container component as a <strong>HOC</strong> for your presentational Button component.</p>
<p>Here is an example of the <strong>HOC</strong> <em>ReactJS</em> component:</p>
<p><img src="https://miro.medium.com/max/2614/0*w-QLTAF5W7i42jZs.png" /></p>
<hr />
<p>Container components, on the other hand, have logic to set state or have functions to emit events up to a parent component. The general rule of the thumb is to keep your component as simple as possible with a Single Responsibility Principle design principle in mind, which essentially means your component must do one thing, but do it well. Most often, these types of components are the <strong>HOC</strong>s that accommodate few presentational components. Presentational components Writing simple components may reduce your overall application complexity. Here is where presentational components come into play. These components should have minimal to no logic. Presentational components accept data and emit events to a callback that they receive as part of its props. Essentially, this type of component renders UI and executes a function that was passed into it when some action in its UI happens. This type of component is a building block and is sometimes referred to as a Lower-Order Component (or <strong>LOC</strong>).</p>
<p><a href="https://konstankino.com/"><img src="https://miro.medium.com/max/5834/1*lRusm6IzNtCF0bEeWJRocQ.png" /></a></p>
<hr />
<ul>
<li><strong>[Update May 22nd, 2019] — </strong>When using <em>ReduxJS</em>, split your <em>Reducer</em> code into smaller methods to avoid huge JSON within your <em>Reducer</em>.</li>
<li>Consider using TypeScript in your apps if you do not do it already.</li>
<li>Use the create-react-app generator to bootstrap your <em>ReactJS</em> app.</li>
<li>Keep your code DRY. Don’t Repeat Yourself, but keep in mind code duplicate is NOT always a bad thing.</li>
<li>Avoid having large classes, methods or components, including <em>Reducers</em>.</li>
<li>Use more robust managers to manage application state, such as <em>Redux</em>.</li>
<li>Use event synchronizer, such as <em>Redux</em>-<em>Thunk</em>, for interactions with your back end API.</li>
<li>Avoid passing too many attributes or arguments. Limit yourself to five props that you pass into your component.</li>
<li>Use <em>ReactJS</em> defaultProps and <em>ReactJS</em> propTypes.</li>
<li>Use linter, break up lines that are too long.</li>
<li>Keep your own jslint configuration file.</li>
<li>Always use a dependency manager with a lock file, such as NPM or yarn.</li>
<li>Test your commonly accessed code, code that is complex and prone to bugs.</li>
<li>Write more tests that give more test coverage for your code with a little effort and test code to ensure its proper functioning.</li>
<li>Every time you find a bug, make sure you write a test first.</li>
<li>Use function-based components by starting to use React Hooks, a new <em>ReactJS</em> way to create state-full components.</li>
<li>Use ES6 de-structuring for your props.</li>
<li>Use conditional rendering.</li>
<li>User `map()` to collect and render collections of components.</li>
<li>Use partial components, such as `<>` … `</>`</li>
<li>Name your event handlers with handle prefixes, such as `handleClick()` or `handleUpdate()`.</li>
<li>Use `onChange` to control your inputs, such as `onChange={this.handleInputChange}`.</li>
<li>Use JEST to test your <em>ReactJS</em> code.</li></ul>
<p>We have mentioned event synchronizers, such as <em>Redux-Thunk</em>. <em>ReactJS</em> v16.3 introduced a new feature called React Context API. Part of its functionality is to mimic redux-thunk functionality and synchronize events with <em>ReactJS</em> means. That is a feature that is in high demand, as nearly any <em>ReactJS</em> application talks to back end API and needs to synchronize requests and events. We will keep our eye on that API and will keep you posted with updates.</p>
<p>Here is an example of using defaultProps and propTypes:</p>
<p><img src="https://miro.medium.com/max/2616/0*jRKmcUovWbWh9tkt.png" /></p>
<h1>React Hooks</h1>
<p>There are lots of React Hooks including <code>useState</code>, <code>useEffect</code>, <code>useContext</code>, <code>useReducer</code>, <code>useMemo</code>, <code>useCallback</code>, <code>useRef</code>, <code>useImperativeHandle</code>, <code>useLayoutEffect</code>, <code>useDebugValue</code>, and you can create your own custom Hooks.</p>
<p>We are going to run through some of them and compare them with a class-based component without Hooks.</p>
<h2><strong>useState Hook</strong></h2>
<p>We’ve already seen a basic example of <code>useState</code> Hooks in the counter logic above.</p>
<p>The <code>useState</code> Hooks return an array in which the first element is the state name and the second one is a function to modify the state value. In <code>useState</code>, we pass the initial value of the state.</p>
<pre>const [count , setCount] = useState(0)</pre>
<p><img alt="" src="https://miro.medium.com/max/2976/1*4IUgOjhmjQr70gUw92lyHQ.png" /></p>
<p>Refer to code <a href="https://codesandbox.io/s/basic-of-hooks-i7v3d" target="_blank">here</a></p>
<p>This is how React Hooks manage state to store values similarly to class-based components.</p>
<p>The code for functional components is way smaller than that of class-based components. The same logic can be performed with the class-based component, as follows:</p>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/2976/1*Rqg4EjgRBbcRQxpTMIZUow.png" /></p>
<p>You can see that React Hooks minimize the code to almost half of the simple counter logic, compared to the class-based component.</p>
<h2>useEffect Hook</h2>
<p>The <code>useEffect</code> Hook is used to handle the lifecycle method in a functional component.</p>
<p>If you’re familiar with the React class lifecycle methods, you can think of the <code>useEffect</code> Hook as <code>componentDidMount</code>, <code>componentDidUpdate</code>, <code>componentWillUnmount</code>, and <code>getDerivedStateFromProps</code> combined as a beginner.</p>
<p>It helps to write the logic in one place itself. But Dan Abramov has repeated many times that <code>useEffect</code> shouldn’t be introduced as an alternative to these lifecycle methods<strong> </strong><em>only</em><strong>.</strong></p>
<p>If you use <code>useEffect</code> with that mental model, you’ll get confused later. Instead, he suggests thinking of <code>useEffect</code> as a place where you run side-effects when a value in the dependency array changes.</p>
<p><code>useEffect</code>is a callback function where we can give the second element as dependency array, which can contain anything like variables, props, state, etc., on which we have to run <code>componentDidUpdate</code>.</p>
<p>There are two common kinds of side effects in React components — those that don’t require cleanup and those that do.</p>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/1488/1*A_jM5ORYizV0X4-GBCkc-A.png" /></p>
<p>This is a basic example of using <code>componentDidMount</code> and <code>componentDidUpdate</code> using a class-based component, which changes the title of the page based on the count value. This is an extension of the previous count logic.</p>
<p><img alt="" src="https://miro.medium.com/max/1488/1*Zpqs3c2zpr_UWhu8Eu7y1A.png" /></p>
<p>This is how we can perform the same logic with Hooks. It decreases the code length almost to half and increases efficiency as well.</p>
<p>The dependency array comes into the picture when we have more than one state and we have to use the <code>useEffect</code> Hook only on a particular state change.</p>
<p>In the below example, we have two state counts and names and we have to update the document title only when our count value changes. That’s why a dependency array contains only <code>count</code><strong>.</strong></p>
<p><img alt="" src="https://miro.medium.com/max/1488/1*5wcLVfIb0kmb6w19EEEc3g.png" /></p>
<p>Complete code <a href="https://codesandbox.io/s/useeffect-in-hooks-e9e4e" target="_blank">here</a></p>
<p>Earlier, we looked at how to express side effects that don’t require any cleanup. However, some effects do.</p>
<p>For example, we might want to set up a subscription to an external data source. In that case, it is important to clean up so that we don’t introduce a memory leak!</p>
<p>For a cleanup function like <code>componentWillUnmount</code><em>, </em>every effect may return a function that cleans up after it.</p>
<p><img alt="" src="https://miro.medium.com/max/1488/1*RqK_6Zmq1MUecIYHOfdpCg.png" /></p>
<p>Refer to this example, which uses <code>useState</code> and <code>useEffect</code> Hooks to count the time left for the next day in HH:MM:SS format.</p>
<p> </p>
<p><a href="https://codesandbox.io/s/timer-71ivn" target="_blank">Code Link</a></p>
<h2>useContext Hook</h2>
<p>Accepts a context object (the value returned from <code>React.createContext</code>) and returns the current context value for that context.</p>
<p>The current context value is determined by the <code>value</code> prop of the nearest <code><MyContext.Provider></code> above the calling component in the tree.</p>
<pre>const value = useContext(MyContext)</pre>
<p>When the nearest <code><MyContext.Provider></code> above the component updates, this Hook will trigger a re-render with the latest context <code>value</code> passed to that <code>MyContext</code> provider.</p>
<p>If you’re familiar with the context API before Hooks, <code>useContext(MyContext)</code> is equivalent to <code>static contextType = MyContext</code> in a class, or to <code><MyContext.Consumer></code>.</p>
<p><code>useContext(MyContext)</code>only lets you <em>read</em> the context and subscribe to its changes. You still need a <code><MyContext.Provider></code> above in the tree to <em>provide</em> the value for this context.</p>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/1488/1*P5qSSWexVySP4iWmBwBiUg.png" /></p>
<p><a href="https://codesandbox.io/s/usecontext-hook-09gjc" target="_blank">For complete code refer this Link</a></p>
<h2>useReducer Hook</h2>
<p>An alternative to <code>useState</code>. Accepts a reducer of type <code>(state, action) => newState</code> and returns the current state paired with a <code>dispatch</code> method. (If you’re familiar with Redux, you already know how this works.)</p>
<p><code>useReducer</code>is usually preferable to <code>useState</code> when you have complex state logic that involves multiple sub-values or when the next state depends on the previous one.</p>
<p><code>useReducer</code>also lets you optimize performance for components that trigger deep updates because you can pass <em>dispatch</em> down instead of callbacks.</p>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/1488/1*vS4l4NRmhbDFKW14YimC9w.png" /></p>
<p>Complete code<a href="https://codesandbox.io/s/usereducer-hooks-err6b" target="_blank"> here</a></p>
<p>There are two different ways to initialize the <code>useReducer</code> state. You may choose either one depending on the use case. The simplest way is to pass the initial state as a second argument and the next one is by lazily.</p>
<h2><strong>u</strong>seMemo Hook</h2>
<p>If you need to cache the result of an invoked function, <code>useMemo</code> comes into the picture. It is helpful in performance optimization.</p>
<p><code>useMemo</code>is a Hook that will only recompute the cached value when one of the dependencies has changed. This optimization leads to avoiding expensive calculations on every render.</p>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/1488/1*O5Viqopaz0eC7Iw30QEk6A.png" /></p>
<p>Complete code <a href="https://codesandbox.io/s/usememo-hook-jl8jf" target="_blank">here</a></p>
<p>In the above example, because of <code>useMemo</code>, the <code>isEven</code> operation will only happen when <code>counterOne</code> is incremented.</p>
<p>If <code>useMemo</code> was not there, it would happen even if <code>counterTwo</code> was changed and it decreases the efficiency as we add a heavy operation in the <code>isEven</code> function.</p>
<p>In the future, React may choose to “forget” some previously memoized values and recalculate them on the next render, e.g. to free memory for offscreen components.</p>
<p>Write your code so that it still works without <code>useMemo</code> — and then add it to optimize performance.</p>
<p>If you need to cache a function, <code>useCallback</code> comes into the picture. It is also used for performance optimization.</p>
<h2><strong>Custom Hooks</strong></h2>
<p>Building your own Hooks lets you extract component logic into reusable functions. Traditionally in React, we’ve had two popular ways to share stateful logic between components: <a href="https://reactjs.org/docs/render-props.html">render props</a> and <a href="https://reactjs.org/docs/higher-order-components.html">higher-order components</a>. We can now use custom hooks to solve many of the same problems without forcing you to add more components to the tree.</p>
<p>A custom Hook is a JavaScript function whose name starts with <code>use</code> and who may call other Hooks. For a complete understanding of custom Hooks refer to this <a href="https://reactjs.org/docs/hooks-custom.html" target="_blank">documentation</a>.</p>
<div>
<div><a class="domain reader-domain" href="https://medium.com/better-programming/create-a-react-native-app-on-an-android-emulator-4da57107de16">medium.com</a>
<div> </div>
<h1>Create a React Native App on an Android Emulator</h1>
<div>Charles Stover</div>
<div>
<div>7-9 minutes</div></div></div>
<hr />
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<p><a href="https://medium.com/@Charles_Stover"><img alt="Charles Stover" src="https://miro.medium.com/fit/c/96/96/0*Twxo6QQr7lARsGtI.jpg" style="height:48px; width:48px" /></a></p></div></div></div>
<div>
<div>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/700/1*QTP1oOEcBErljiovvJj_vA.png" style="height:310px; width:700px" /></p></div></div>
<p>This is the challenge I had to tackle this week in an enterprise setting. Bootstrapping a <a href="https://reactjs.org/">React Native</a> project with <code>create-react-native-app</code>, having it be live-testable on the same machine with an Android emulator, and doing this all within the confounds of a high-security, non-permissive corporate setting (namely, using proxies).</p>
<p>React Native recommends the Genymotion emulator out of the box. For many developers (and corporations), the price tag on Genymotion is not worth the expense. We’ll be using the <strong><em>free</em></strong> Android Studio emulator for this walkthrough.</p>
<p>While it’s unlikely you will need all of the steps provided, I am hoping this walkthrough covers any of the boxes you happen to need checked.</p></div>
<hr />
<div>
<p>If you are the project creator, bootstrap a project using <a href="https://github.com/react-community/create-react-native-app">create-react-native-app</a>. They have great documentation to get you through this step, and it should be about as easy as <code>npm i -g create-react-native-app && create-react-native-app my-app</code>. In your <code>my-app</code> directory, open <code>app.json</code> and change <code>sdkVersion</code> to <code>28.0.0.</code> Then, execute <code>yarn add expo@^28.0.0 jest-expo@~28.0.0</code> to upgrade your Expo dependencies to the latest API version. Your co-contributors do not need to perform these actions.</p>
<p>If you are a project contributor, download the project and install its dependencies by executing <code>yarn</code> in the root directory (where the <code>package.json</code> and <code>yarn.lock</code> files are located).</p></div>
<hr />
<div>
<p>Download and install Android Studio 3.0 or newer. Your company may offer a pre-configured bundle through its software center.</p>
<p>From the command line, execute <code>npm i -g exp expo</code> or <code>yarn global add exp expo</code> to install the Expo CLI globally.</p>
<p>From <a href="https://docs.expo.io/versions/v29.0.0/introduction/installation.html">expo.io</a>, download and install the Expo Development Environment. As of the time of writing, direct links for the installers are <a href="https://xde-updates.exponentjs.com/download/mac">macOS</a>, <a href="https://xde-updates.exponentjs.com/download/win32">Windows (64-bit)</a>, and <a href="https://xde-updates.exponentjs.com/download/linux-x86_64">Linux</a>. The Expo Development Environment is a GUI for the expo command line tool. Many of you may prefer GUIs to CLIs.</p>
<p>Directly interacting with Expo is not necessary when running a React Native project bootstrapped by CRNA (neither through GUI or CLI). But there is one feature in this GUI that is not supported by the CLI: updating the Expo app on the Android emulator to the latest version. We will use it for that, as well as offer it as a GUI for anyone who so happens to want to use it.</p>
<p>🏠 <strong>Windows Pro and Enterprise users only:</strong> From your start menu, search for “Turn Windows features on or off.” This will require administrative account permissions. Uncheck <code>Hyper-V</code>, then click Ok. Restart your computer when prompted (yes, it’s actually necessary).</p>
<p>👤 <strong>Proxy configuration:</strong> From Android Studio, select <code>File</code> and then <code>Settings...</code>. Under the <code>Appearance & Behavior</code> category, and then under the <code>System Settings</code> category, select the <code>HTTP Proxy</code> page. Select <code>Manual proxy configuration</code> and adjust accordingly.</p>
<p>From Android Studio, select <code>File</code> and then <code>Settings...</code>. Under the <code>Appearance & Behavior</code> category, and then under the <code>System Settings</code> category, select the <code>Android SDK</code> page.</p>
<p>Select the <code>SDK Platforms</code> tab, if it’s not selected by default. Select the <code>Show Package Details</code> checkbox. Under <code>Android API 28</code>, check the boxes for <code>Intel x86 Atom System Image</code> and <code>Intel x86 Atom_64 System Image</code>.</p>
<div>
<div>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/700/1*nJXvrHWDllweaveDNPxLew.png" style="height:402px; width:700px" /></p></div></div>
<p>Select the <code>SDK Tools</code> tab. Check the boxes next to <code>Android SDK Platform-Tools</code> and <code>Intel x86 Emulator Accelerator (HAXM installer)</code>. Click OK, and then click OK again.</p>
<div>
<div>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/700/1*rBtIcoYDQ-9jumZShdwY0g.png" style="height:477px; width:700px" /></p></div></div>
<p>Accept all License Agreements and Recommended settings. If prompted for administrative access, log in with an authorized account. Click Finish, and then click Finish again.</p>
<p>From your start menu, search for “Edit the system environment variables.” This will require administrative account permissions. Click <code>Environment variables...</code>. Under <code>System variables</code>, click <code>New...</code>. Enter <code>ANDROID_SDK</code> as the variable name and <code>%LOCALAPPDATA\Android\Sdk</code> as the variable value. Under <code>System variables</code>, edit <code>Path</code>. If your configuration takes a single string, append <code>;%LOCALAPPDATA%\Android\Sdk\platform-tools</code> (preceding semicolon). If your configuration takes multiple strings, append <code>%LOCALAPPDATA%\Android\Sdk\platform-tools</code> (no preceding semicolon). Click OK, then click OK again.</p>
<p>From the command line, execute <code>exp path</code> to configure Expo’s path to match your newly-set environment variables.</p>
<p>From Android Studio, select <code>Tool</code> and then <code>AVD Manager</code>. To the right of <code>Nexus 5X API 28 x86</code>, press the green Play arrow to launch the Android emulator.</p>
<div>
<div>
<p><img alt="" src="https://miro.medium.com/max/700/1*zRlwVNSAi_rn_uHJlQ5fKQ.png" style="height:81px; width:700px" /></p></div></div>
<p>👤 <strong>Proxy configuration: </strong>From the Android emulator, open the Settings app. Choose <code>Network & internet</code>, then <code>Wi-Fi</code>, then <code>AndroidWifi</code>, and then click the Edit button.</p>
<div>
<div>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/700/1*G_yFezEuypWbxFvSvrejzg.png" style="height:310px; width:700px" /></p></div></div>
<p>👤 <strong>Proxy configuration (cont.):</strong> Set <code>Proxy</code> to <code>Manual</code>. Set <code>Proxy hostname</code> and <code>Proxy port</code> accordingly. Set <code>Bypass proxy for</code> to <code>127.0.0.1,localhost</code>. Click Save.</p>
<p>From the Android emulator, open Google Chrome. Navigate to <code><a href="https://d1ahtucjixef4r.cloudfront.net/Exponent-1.14.0.apk">https://d1ahtucjixef4r.cloudfront.net/Exponent-1.14.0.apk</a></code>. Download and install the APK. Adjust the system permissions as needed to allow this, which should be as easy as following the prompts.</p>
<p>From the Expo Development Environment, choose <code>Open existing project...</code> and choose your React Native application. Select <code>Expo XDE</code> (where File is normally located), then <code>Install Android App</code>.</p>
<div>
<div>
<p><img alt="" src="https://miro.medium.com/max/229/1*pGc7YQP0zh3NVXAY2Jh1kg.png" style="height:81px; width:229px" /></p></div></div>
<p>This will uninstall the APK we just installed and replace it with the newest version. Why did we just install an outdated version? Because attempting to install the newest version without having an outdated version results in an error while attempting to uninstall a non-existent outdated version.</p>
<p>You will not get an “Installation success!” message. The spinner will simply disappear upon completion.</p>
<p>Still in the Expo Development Environment, click the settings gear, and then change the <code>Host</code> to <code>localhost</code>.</p>
<div>
<div>
<p><img alt="" src="https://miro.medium.com/max/384/1*EHUeh0ZwJW3LL8go6BBSbw.png" style="height:142px; width:384px" /></p></div></div>
<p>From the Android emulator, open the emulator settings via the <code>...</code> on the right-hand side of the window.</p>
<div>
<div>
<p><img alt="" src="https://miro.medium.com/max/224/1*_1egFRky-sPJXQg1K0UELw.png" style="height:506px; width:224px" /></p></div></div>
<p>Click the <code>Snapshots</code> page and then click the <code>Take Snapshot</code> button. This will help ensure your work thus far won’t be erased! Your configuration should now be in a working state.</p></div>
<hr />
<div>
<p>From Android Studio, select <code>Tools</code> then <code>AVD Manager</code>. To the right of <code>Nexus 5X API 28 x86</code>, press the green Play arrow. This will start your emulator. You may close the AVD Manager and Android Studio windows, leaving only the emulator open.</p>
<p>From the command line, execute <code>yarn android</code> in the root directory of your React Native project.</p>
<p>From the Android emulator, open the Expo app. To find the Expo app, drag up on the Google search bar, and then click Expo.</p>
<div>
<div>
<p><img alt="" src="https://miro.medium.com/max/700/1*pNJ0v3VNl1d7_loYHKwd4w.png" style="height:310px; width:700px" /></p></div></div>
<p>You may click and hold your mouse on the Expo app to place it on your desktop for easy access in the future.</p>
<p>From the Expo app, click the Explore icon.</p>
<div>
<div>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/366/1*uw1PFrBmnfVEQlGC08wrkA.png" style="height:276px; width:366px" /></p></div></div>
<p>Click the search icon and type <code>exp://localhost:19000</code> or the URL that was output by <code>yarn android</code>.</p>
<div>
<div>
<p><img alt="" src="https://miro.medium.com/max/428/1*o7XeSm2SuqQ783Xz-Hb4XQ.png" style="height:67px; width:428px" /></p></div></div>
<p>Click <code>Tap to attempt to open project at exp://localhost:19000</code>. You should now see your React Native application in the flesh! Edit the project files in your favorite text editor and enjoy the hot reloading.</p>
<p><strong>Note:</strong> You can pin the emulator to always be in front of other windows (e.g. your text editor). Under the emulator settings (<code>...</code> to the right of the window), click the <code>Settings</code> page. Under the <code>General</code> tab, toggle the <code>Emulator always on top</code> switch.</p></div></div></div></div></div>
<div> </div></div>
<p>Or how to make composable components:</p>
<div>
<p>The open/closed React component:</p>
<p>A component that is based on the open/closed principle, which states that “software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification”.</p>
<p>Thread 👇</p></div>
<div>
<p>A component is closed for modification when you don’t need to update its source code to extend its functionality. This automatically implies that the component is open for extension.</p>
<p>Native HTML elements are the best examples of open/closed components.</p></div>
<div>
<p>We can say the more a component resembles a native HTML element, the closer it will be to this open/closed pattern.</p>
<p>Other good examples of open/closed components are the ones you get from styled-components.</p></div>
<div>
<p>If you want to make your custom components open for extension, here are some tips I’ve gathered over the years:</p>
<p>- Pass all the rest props down.<br />
- Merge style props.<br />
- Merge event handler props.<br />
- Forward refs.</p></div>
<p>Pass all the rest props down 👇</p>
<p>[img[https://pbs.twimg.com/media/Ehn_y7uXkAAuyz4.jpg]]</p>
<p>Merge style props 👇</p>
<p>[img[https://pbs.twimg.com/media/EhoB6INXgAAUf-0.jpg]]</p>
<p>Merge event handler props 👇</p>
<p>[img[https://pbs.twimg.com/media/EhoLciFWsAEBoh5.jpg]]</p>
<p>Forward refs 👇</p>
<p>[img[https://pbs.twimg.com/media/EhoL7ebWAAAB1Yc.jpg]]</p>
<p>But most of the time, in practice, it’s not that straightforward. You surely have complex components with more internal props and elements. How do we make them open for extension?</p>
<div>
<p>Here’s a component that renders an inaccessible button as a div element that opens a modal (which let’s assume is accessible).</p>
<p>If you tried this in the browser, you wouldn’t be able to focus on the button and open the modal using the keyboard.</p>
<p><a href="https://carbon.now.sh/?bg=rgba(171%2C%20184%2C%20195%2C%201)&t=night-owl&wt=sharp&l=jsx&ds=false&dsyoff=20px&dsblur=68px&wc=true&wa=true&pv=0px&ph=0px&ln=true&fl=1&fm=MonoLisa&fs=15.5px&lh=133%25&si=false&es=2x&wm=false&code=function%2520ButtonWithModal(%257B%2520title%2520%257D)%2520%257B%250A%2520%2520const%2520%255BisOpen%252C%2520setIsOpen%255D%2520%253D%2520React.useState(false)%253B%250A%2520%2520const%2520handleClick%2520%253D%2520()%2520%253D%253E%2520setIsOpen(!isOpen)%253B%250A%2520%2520return%2520(%250A%2520%2520%2520%2520%253C%253E%250A%2520%2520%2520%2520%2520%2520%253Cdiv%2520onClick%253D%257BhandleClick%257D%253E%257Btitle%257D%253C%252Fdiv%253E%250A%2520%2520%2520%2520%2520%2520%253CModal%2520isOpen%253D%257BisOpen%257D%253E%257Btitle%257D%253C%252FModal%253E%250A%2520%2520%2520%2520%253C%252F%253E%250A%2520%2520)%253B%250A%257D">carbon.now.sh/?bg=rgba(171%2…</a> <a href="https://pbs.twimg.com/media/Eh3U5JaXYAADYpz.jpg" target="_blank"><img alt="Screenshot of code: a button with modal component with two e" src="https://pbs.twimg.com/media/Eh3U5JaXYAADYpz.jpg" /></a></p></div>
<div>
<p>To make that an open/closed component, you’ll have to choose a main element. It’ll depend on the context and how you intend to combine it with other components. This main element will receive the incoming props.</p>
<p><a href="https://carbon.now.sh/?bg=rgba(171%2C%20184%2C%20195%2C%201)&t=night-owl&wt=sharp&l=jsx&ds=false&dsyoff=20px&dsblur=68px&wc=true&wa=true&pv=0px&ph=0px&ln=true&fl=1&fm=MonoLisa&fs=15.5px&lh=133%25&si=false&es=2x&wm=false&code=function%2520mergeEvent(htmlHandler%252C%2520handler)%2520%257B%250A%2520%2520return%2520(event)%2520%253D%253E%2520%257B%250A%2520%2520%2520%2520if%2520(htmlHandler)%2520%257B%250A%2520%2520%2520%2520%2520%2520htmlHandler(event)%253B%250A%2520%2520%2520%2520%257D%250A%2520%2520%2520%2520if%2520(!event.defaultPrevented)%2520%257B%250A%2520%2520%2520%2520%2520%2520handler(event)%253B%250A%2520%2520%2520%2520%257D%250A%2520%2520%257D%253B%250A%257D%250A%250Afunction%2520ButtonWithModal(%257B%2520title%252C%2520onClick%252C%2520children%252C%2520...props%2520%257D%252C%2520ref)%2520%257B%250A%2520%2520const%2520%255BisOpen%252C%2520setIsOpen%255D%2520%253D%2520React.useState(false)%253B%250A%2520%2520const%2520handleClick%2520%253D%2520mergeEvent(onClick%252C%2520()%2520%253D%253E%2520setIsOpen(!isOpen))%253B%250A%2520%2520return%2520(%250A%2520%2520%2520%2520%253C%253E%250A%2520%2520%2520%2520%2520%2520%253Cdiv%2520ref%253D%257Bref%257D%2520onClick%253D%257BhandleClick%257D%2520%257B...props%257D%253E%250A%2520%2520%2520%2520%2520%2520%2520%2520%257Bchildren%2520%257C%257C%2520title%257D%250A%2520%2520%2520%2520%2520%2520%253C%252Fdiv%253E%250A%2520%2520%2520%2520%2520%2520%253CModal%2520isOpen%253D%257BisOpen%257D%253E%257Btitle%257D%253C%252FModal%253E%250A%2520%2520%2520%2520%253C%252F%253E%250A%2520%2520)%253B%250A%257D%250A%250Aexport%2520default%2520React.forwardRef(ButtonWithModal)%253B">carbon.now.sh/?bg=rgba(171%2…</a> <a href="https://pbs.twimg.com/media/Eh3VCyxXYAAdW79.jpg" target="_blank"><img alt="Screenshot of code: a refactored button with modal component" src="https://pbs.twimg.com/media/Eh3VCyxXYAAdW79.jpg" /></a></p></div>
<div>
<p>Now you can make the component accessible from outside by passing proper attributes and event handlers to it.</p>
<p><a href="https://carbon.now.sh/?bg=rgba(171%2C%20184%2C%20195%2C%201)&t=night-owl&wt=sharp&l=jsx&ds=false&dsyoff=20px&dsblur=68px&wc=true&wa=true&pv=0px&ph=0px&ln=true&fl=1&fm=MonoLisa&fs=15.5px&lh=133%25&si=false&es=2x&wm=false&code=function%2520triggerClickOn(key)%2520%257B%250A%2520%2520return%2520(event)%2520%253D%253E%2520%257B%250A%2520%2520%2520%2520if%2520(event.key%2520%253D%253D%253D%2520key)%2520%257B%250A%2520%2520%2520%2520%2520%2520event.preventDefault()%253B%250A%2520%2520%2520%2520%2520%2520event.currentTarget.click()%253B%250A%2520%2520%2520%2520%257D%250A%2520%2520%257D%253B%250A%257D%250A%250Aconst%2520buttonProps%2520%253D%2520%257B%250A%2520%2520role%253A%2520%2522button%2522%252C%250A%2520%2520tabIndex%253A%25200%252C%250A%2520%2520onKeyDown%253A%2520triggerClickOn(%2522Enter%2522)%252C%250A%2520%2520onKeyUp%253A%2520triggerClickOn(%2522%2520%2522)%252C%250A%257D%253B%250A%250A%253CButtonWithModal%2520%257B...buttonProps%257D%2520%252F%253E">carbon.now.sh/?bg=rgba(171%2…</a> <a href="https://pbs.twimg.com/media/Eh3VNo8WkAAp2Lc.png" target="_blank"><img alt="Screenshot of code: passing accessible button props to the r" src="https://pbs.twimg.com/media/Eh3VNo8WkAAp2Lc.png" /></a></p></div>
<div>
<p>Or compose it with other components like a Tooltip.</p>
<p><a href="https://carbon.now.sh/?bg=rgba(171%2C%20184%2C%20195%2C%201)&t=night-owl&wt=sharp&l=jsx&ds=false&dsyoff=20px&dsblur=68px&wc=true&wa=true&pv=0px&ph=0px&ln=true&fl=1&fm=MonoLisa&fs=15.5px&lh=133%25&si=false&es=2x&wm=false&code=const%2520tooltipReferenceProps%2520%253D%2520%257B%250A%2520%2520%2522aria-describedby%2522%253A%2520tooltipId%252C%250A%2520%2520onMouseEnter%253A%2520showTooltip%252C%250A%2520%2520onMouseLeave%253A%2520hideTooltip%252C%250A%2520%2520onFocus%253A%2520showTooltip%252C%250A%2520%2520onBlur%253A%2520hideTooltip%252C%250A%257D%253B%250A%250A%253CButtonWithModal%2520%257B...buttonProps%257D%2520%257B...tooltipReferenceProps%257D%2520%252F%253E">carbon.now.sh/?bg=rgba(171%2…</a> <a href="https://pbs.twimg.com/media/Eh3VVpzXcAM4XjZ.jpg" target="_blank"><img alt="Screenshot of code: passing button and tooltip reference pro" src="https://pbs.twimg.com/media/Eh3VVpzXcAM4XjZ.jpg" /></a></p></div>
<div>
<p>And you could go further and make the TooltipButtonWithModal component also an open/closed component by merging the incoming props with the internal buttonProps and tooltipReferenceProps.</p>
<p><a href="https://carbon.now.sh/?bg=rgba(171%2C%20184%2C%20195%2C%201)&t=night-owl&wt=sharp&l=jsx&ds=false&dsyoff=20px&dsblur=68px&wc=true&wa=true&pv=0px&ph=0px&ln=true&fl=1&fm=MonoLisa&fs=15.5px&lh=133%25&si=false&es=2x&wm=false&code=function%2520TooltipButtonWithModal(props%252C%2520ref)%2520%257B%250A%2520%2520return%2520(%250A%2520%2520%2520%2520%253CButtonWithModal%250A%2520%2520%2520%2520%2520%2520ref%253D%257Bref%257D%250A%2520%2520%2520%2520%2520%2520role%253D%2522button%2522%250A%2520%2520%2520%2520%2520%2520tabIndex%253D%257B0%257D%250A%2520%2520%2520%2520%2520%2520aria-describedby%253D%257BtooltipId%257D%250A%2520%2520%2520%2520%2520%2520%257B...props%257D%250A%2520%2520%2520%2520%2520%2520onKeyDown%253D%257BmergeEvent(props.onKeyDown%252C%2520triggerClickOn(%2522Enter%2522))%257D%250A%2520%2520%2520%2520%2520%2520onKeyUp%253D%257BmergeEvent(props.onKeyUp%252C%2520triggerClickOn(%2522%2520%2522))%257D%250A%2520%2520%2520%2520%2520%2520onMouseEnter%253D%257BmergeEvent(props.onMouseEnter%252C%2520showTooltip)%257D%250A%2520%2520%2520%2520%2520%2520onMouseLeave%253D%257BmergeEvent(props.onMouseLeave%252C%2520hideTooltip)%257D%250A%2520%2520%2520%2520%2520%2520onFocus%253D%257BmergeEvent(props.onFocus%252C%2520showTooltip)%257D%250A%2520%2520%2520%2520%2520%2520onBlur%253D%257BmergeEvent(props.onBlur%252C%2520hideTooltip)%257D%250A%2520%2520%2520%2520%252F%253E%250A%2520%2520)%253B%250A%257D%250A%250Aexport%2520default%2520React.forwardRef(TooltipButtonWithModal)%253B">carbon.now.sh/?bg=rgba(171%2…</a> <a href="https://pbs.twimg.com/media/Eh3VdAdXsAUvSSg.jpg" target="_blank"><img alt="Screenshot of code: a component called tooltip button with m" src="https://pbs.twimg.com/media/Eh3VdAdXsAUvSSg.jpg" /></a></p></div>
<p>If you took a closer look into the examples above, you might’ve thought of creating React hooks like useButton and useTooltipReference to get buttonProps and tooltipReferenceProps.</p>
<div>
<p>Soon I’ll talk about different methods you can use to combine open/closed components to create more complex interfaces using React hooks, render props and the “as” prop, and their pros & cons.</p>
<p>This thread is a prerequisite for that. Stay tuned! 😁</p></div>
<<list-links "[tag[ReactJS]sort[title]]">>
Real painpoint: EHRs. Doctors die by a thousand cuts by them.
Some have offered guiding principles. These are:
# Billing and notes will have nothing to do with each other
# You can copy and paste NOTHING. You can only document what you type. Just your immediate thoughts.
# Each person has a single summary that is a wikipedia page, all physicians can edit
# Data is given to pts on thumb drives, or to the patient's cloud
# All EMRs are compatible (single standard, like VHS)
# All imaging given to pt on their thumb drive and in cloud
# If there is more than 050 ms lag with the click of any button, then I am about to get all STEVE JOBS up in here
# Physicians work patiently with IT who have the ability to quickly implement suggestions tailored to end user. Bonus points for being able to share tools across systems.
Addendum: sea of text is a problem. Too much auto-populated text with no substance.
Credit
# [[Vinay Prasad|https://twitter.com/VPrasadMDMPH]]
# [[John Kang|https://twitter.com/DrJohnKang]]
There is one that seems to notorious in America: EPIC. VA's CPRS seems to be the best according to Vinay.
The ultimate question: why is this the case? Some say bureaucratic requirements. Others say that, and regulatory requirements.
[[Reference timeline|https://twitter.com/VPrasadMDMPH/status/1151705744938377216]]
Ever wanted to wake up like a president and have a live analytics summary delivered to you every second for you to look over during breakfast or as you do your morning exercise?
Successful competitor: [[Upboard.io|https://upboard.io]]
[[Feb 6, 2020. The Citizen|https://www.thecitizen.co.tz/news/business/1840414-5446508-4c4fmh/index.html]]
NMB Bank will work with Financial Technology (Fintech) firms and individuals to come up with products that will benefit late-stage startup companies.
Non-trivial business needs and wants are on the rise; people desire more control and empowered ways of banking:
<<<
Fintech seeks to serve tech-savvy customers who expect money transfer, lending, loan management and investing to services that are conducted effortlessly, securely and that they must also be scalable and without the assistance of a person or the visit of a bank.
<<<
You had recently done an information session with SmartLab (who we are currently in the midst of forming a partnership with) on a Fintech initiative programme in February.
<<<
On Tuesday, the bank piloted a new Fintech initiative-programme through an information session that was conducted in collaboration with Smart Lab. Smart Lab is a locally-grown innovation and acceleration lab. Fintech refers to software and other modern technologies used by businesses that provide automated and improved financial services.
<<<
Fintech initiatives can become costly, nightmarish innovation projects without the right mindset, approach and strategy. And we've seen many companies approach such initiatives without any of these and lose big time.
[[Pitch]]
<p><a href="https://dev.to/srajesh636/how-we-reduced-our-production-apk-size-by-70-in-react-native-1lci">dev.to</a></p>
<h1>How we reduced our production apk size by 70% in React Native?</h1>
<p>U Sai Rajesh</p>
<p>4 minutes</p>
<hr />
<p>Android app size was one of the biggest concerns we had while working on React Native. As it makes tough on lower-end devices to deal will storage and performance issues.</p>
<p>Also app's with larger apk sizes makes it less interesting to download for some audiences.</p>
<p>So we decided to reduce the android <code>apk</code> size 📦 and started researching and analyzed what are the factors that bloat's up the app size and helped us to reduce size of production apk from <code>43 MB</code> to <code>17 MB</code>.</p>
<p>We will explain the whole process of reducing the apk size through a simple <code>Hello World</code> react-native app in the article.</p>
<h2>Lets get Started</h2>
<blockquote>
<p>Create a React Native app called "HelloWorld"</p></blockquote>
<pre><code> npx react-native init HelloWorld
</code></pre>
<p>After the <code>HelloWorld</code> app is successfully created 🎉🎉</p>
<ul>
<li>We removed the boilerplate code from <code>App.js</code> and replaced it with just a Text displaying <code>Hello World !</code></li></ul>
<pre><code>import React from 'react';
import {View, StyleSheet, Text} from 'react-native';
const App = () => {
return (
<>
<View style={styles.container}>
<Text>Hello World !</Text>
</View>
</>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
});
export default App;
</code></pre>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rRYe1Qvv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13884296/82128364-41269880-97d8-11ea-8609-c1fb44721a84.png"><img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--rRYe1Qvv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13884296/82128364-41269880-97d8-11ea-8609-c1fb44721a84.png" /></a></p>
<p>Let's create a production release apk for <code>HelloWorld</code> App and see what is the apk size.</p>
<ul>
<li>We Noticed that we got an apk with size <code>23 MB</code> 🙄 for just a app with Text <code>Hello World !</code>.</li></ul>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tUdQs7YE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13884296/82129104-01fb4600-97de-11ea-9528-bfab28e58295.png"><img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--tUdQs7YE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13884296/82129104-01fb4600-97de-11ea-9528-bfab28e58295.png" /></a></p>
<h3>Why does <code>react-native</code> created an <code>apk</code> of size 23 MB 🤔 ?</h3>
<p>After reading through React Native official docs we found that All the apps from Google Playstore work's on different ABI such as</p>
<ul>
<li>armeabi-v7a</li>
<li>arm64-v8a</li>
<li>x86</li>
<li>x86_64</li></ul>
<p>So in order to support all the above ABI's <code>react-native</code> by default creates a <code>Universal APK</code> which contains files required for different device configuration into a single <code>apk</code> which bloated the apk size to <code>23 MB</code>.</p>
<h3>What is an ABI 🤔 ?</h3>
<blockquote>
<p>Different Android devices use different CPUs, which in turn support different instruction sets. Each combination of CPU and instruction set has its own Application Binary Interface (ABI).</p></blockquote>
<h3>How did we reduce our apk size?</h3>
<p>Instead of Generating a <code>Universal apk</code> we switched to a completely new Publishing format called <code>.aab</code></p>
<p>After generating aab file and uploading to Google Playstore, The Application size reduced drastically by 70% and App size to <code>7.29 MB</code> from <code>23 MB</code> 🍻</p>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yKUtEtIo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13884296/82130925-696cc200-97ed-11ea-8ea8-f1f4f333e0f5.png"><img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--yKUtEtIo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13884296/82130925-696cc200-97ed-11ea-8ea8-f1f4f333e0f5.png" /></a></p>
<p>Seems Interesting Right 😎</p>
<h3>So What exactly is <code>aab</code> and how did it help us ?</h3>
<blockquote>
<p>An AAB (Android App Bundle) is a new publishing format from google that includes all your app’s compiled code and resources.</p></blockquote>
<p>Google Play uses the app bundle uploaded to generate and serve optimized and smaller APK for each device configuration and hardware, so only the code and resources that are needed for a specific device are downloaded to run your app and no extra files are bundled in <code>apk</code> which reduces the <code>apk</code> size massively.</p>
<p>Below Flowchart will help you to understand how does the whole process a little better.</p>
<blockquote>
<p>APK</p></blockquote>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ej4jI-it--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13884296/82132079-814a4300-97f9-11ea-8d1f-b203464d47f5.png"><img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ej4jI-it--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13884296/82132079-814a4300-97f9-11ea-8d1f-b203464d47f5.png" /></a></p>
<blockquote>
<p>AAB</p></blockquote>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ylUvurC8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13884296/82132077-7e4f5280-97f9-11ea-9a6a-c8e7dea59a2f.png"><img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--ylUvurC8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13884296/82132077-7e4f5280-97f9-11ea-9a6a-c8e7dea59a2f.png" /></a></p>
<h3>How to generate aab ?</h3>
<p>To generate an aab is very simple.You can generate an aab both from <code>Android studio</code> and also through <code>terminal</code>.</p>
<blockquote>
<p>Android Studio</p></blockquote>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dEbLmQM2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13884296/82132119-06355c80-97fa-11ea-8e2e-e8c35f8cb14e.png"><img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--dEbLmQM2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/13884296/82132119-06355c80-97fa-11ea-8e2e-e8c35f8cb14e.png" /></a></p>
<blockquote>
<p>Terminal</p></blockquote>
<pre><code> cd android/ && ./gradlew bundleRelease
</code></pre>
<p>The generated AAB can be found under <code>android/app/build/outputs/bundle/release/app.aab</code>, and is ready to be uploaded to Google Play</p>
<p><a href="https://dev.to/asayerio_techblog/redux-is-dead-long-live-redux-toolkit-db8">dev.to</a></p>
<h1>Redux is Dead: Long Live Redux Toolkit</h1>
<p>OpenReplay Tech Blog</p>
<p>12 - 15 minutes</p>
<hr />
<p><img alt="Cover image for Redux is Dead: Long Live Redux Toolkit" src="https://res.cloudinary.com/practicaldev/image/fetch/s--AkrPEBCj--/c_imagga_scale,f_auto,fl_progressive,h_420,q_auto,w_1000/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c3c1di48g862hcwdyntl.png" /></p>
<p><a href="https://dev.to/asayerio_techblog"><img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--uEaFYWaY--/c_fill,f_auto,fl_progressive,h_50,q_auto,w_50/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/571683/45e65127-c153-48fb-b5e8-f079879fe709.png" /> OpenReplay Tech Blog </a></p>
<p>Tech blog for Asayer.io. Quality content by developers for developers interested in JavaScript and related front-end technologies.</p>
<p>Sep 28 <em> Originally published at <a href="https://blog.openreplay.com/redux-is-dead-long-live-redux-toolkit">blog.openreplay.com</a> </em> ・7 min read</p>
<p><em>by author <a href="https://blog.openreplay.com/authors/victoria-lo">Victoria Lo</a></em></p>
<p>In this article, let's learn about Redux Toolkit, or as the development team calls it, "the official, opinionated, batteries-included toolset for efficient Redux development".</p>
<h2>What is Redux & How it Works</h2>
<p>Most web developers would probably have heard of Redux, a popular state management library. It first came to the front-end world in 2015 as the revolutionary state management solution built by Dan Abramov and Andrew Clark.</p>
<p>In front-end frameworks like React, Angular or Vue, each component internally manages their own states. As the app gets more complex, managing states across many components becomes tedious and difficult. Redux became the solution to this issue.</p>
<p>Redux works by providing a centralized 'store', which holds all the states within the app. Each component in the app can access this store without having to pass props around in the component tree.</p>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KOZ8NdaJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yynniyb9mulj7zzs1fxd.png"><img alt="redux-store.png" src="https://res.cloudinary.com/practicaldev/image/fetch/s--KOZ8NdaJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yynniyb9mulj7zzs1fxd.png" /></a><br />
<em>Image from <a href="https://blog.codecentric.de/en/2017/12/developing-modern-offline-apps-reactjs-redux-electron-part-3-reactjs-redux-basics/">codecentric</a></em></p>
<h3>The Redux Flow</h3>
<p>The typical Redux flow is as follows:</p>
<ol>
<li>A user interacts with the View to trigger a state update</li>
<li>When a state update is required, the View dispatches an action</li>
<li>The reducers receive the action from the dispatch and updates the state in the Store according to what is described by the action</li>
<li>The View is subscribed to the Store to listen for state changes. The changes are notified via the subscription methods and the View updates its UI accordingly</li></ol>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P8_BRML5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/npkhmwgqfo3rrpqoizqe.png"><img alt="redux-flow.png" src="https://res.cloudinary.com/practicaldev/image/fetch/s--P8_BRML5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/npkhmwgqfo3rrpqoizqe.png" /></a><br />
<em>Image from <a href="https://www.esri.com/arcgis-blog/products/3d-gis/3d-gis/react-redux-building-modern-web-apps-with-the-arcgis-js-api/">esri</a></em></p>
<p>The Redux flow is made up of 3 main components: Actions, Reducers and Store. Understanding the relationship between these components is necessary to know how Redux works.</p>
<p><strong>Actions</strong> are JavaScript objects with a required <code>type</code> property and can include custom properties where needed. They are only used to describe what happened to the state, they are not responsible for changing them. Some examples of actions:</p>
<pre><code>//action to add a todo item
{ type: 'ADD_TODO', text: 'This is a new todo' }
//action that pass a login payload
{ type: 'LOGIN', payload: { username: 'foo', password: 'bar' }}
</code></pre>
<p> </p>
<p> </p>
<p>The <code>type</code> of an action is simply a string that describes the action, and the added properties are information that are needed to update the state. An action is dispatched via the <code>store.dispatch(action)</code> method, and reducers handle updating the state.</p>
<p><strong>Reducers</strong> are pure functions that takes in the current value of a state, performs the operations on it as instructed by the action, then outputs the new value of the state. They are the ones responsible for changing the value of the state. Here's a simple example of a reducer function:</p>
<pre><code>//takes in the current state and action
//updates the value based on the action's type
function counterReducer(state = { value: 0 }, action) {
switch (action.type) {
case 'INCREASE':
return { value: state.value + 1 }
case 'DECREASE':
return { value: state.value - 1 }
default:
return state
}
}
</code></pre>
<p> </p>
<p> </p>
<p>Finally, the state will be updated in the Store. The <strong>Store</strong> is where all the states are managed. It can be created in a single line:</p>
<pre><code>const store = createStore(myComponent);
</code></pre>
<p> </p>
<p> </p>
<p>The components must be subscribed to the Store to listen for state updates to render the states correctly in the UI. The <code>store.subscribe()</code> method adds a change listener that will be called whenever an action is dispatched.</p>
<h2>Why Redux Toolkit</h2>
<p>At this point, we can see why Redux was a popular option for state management. Its pattern makes states <strong>predictable</strong>, as reducers are pure functions, which means the same state and actions passed will always result in the same output.</p>
<p>It is also <strong>easily maintainable and scalable</strong> due to the strict organization on how each part in the Redux flow should behave and work. Also, there are many other benefits such as efficient testing, easy debugging and better performance that Redux brings to the table.</p>
<p>However, this flexible and high-level state management library comes with a few challenges:</p>
<ol>
<li>Too much code to configure Store to optimized levels/best practices</li>
<li>Too much boilerplate code makes code less clean and efficient</li>
<li>Too many packages needed to install to build scalable apps</li>
<li>Writing actions and reducers becomes more complex and cumbersome in huge applications</li></ol>
<p>To address these challenge, the Redux team came up with Redux Toolkit, the official recommended approach for writing Redux logic. It aims to speed up Redux development by including Redux Core with the packages that they think are essential to build a Redux app. It is an opinionated derivative of Redux, with many best practice configurations for Redux beginners or developers who want simple, fast and clean Redux code.</p>
<p>So let's get started with Redux Toolkit and set it up with a new React app.</p>
<h2>Getting Started with Redux Toolkit</h2>
<h3>Step 1: Install Packages</h3>
<p>To get started with Redux Toolkit and React-Redux packages, you can run the following command on an existing React app:</p>
<pre><code>npm install @reduxjs/toolkit react-redux
</code></pre>
<p> </p>
<p> </p>
<p>Alternatively, install via Create React App with:</p>
<pre><code>npx create-react-app my-app --template redux
</code></pre>
<p> </p>
<p> </p>
<h3>Step 2: Create & Initialize Store</h3>
<p>Now let's create a store to hold our states. We can create a <code>store.js</code> file in our <code>src</code> folder and add the following code in it:</p>
<pre><code>import { configureStore } from '@reduxjs/toolkit'
export default configureStore({
reducer: {} //add reducers here
})
</code></pre>
<p> </p>
<p> </p>
<p>The <code>configureStore</code> here replaces the original <code>createStore</code> from Redux. Unlike <code>createStore</code>, <code>configureStore</code> from Redux Toolkit not only creates a store, but it can also accept reducer functions as arguments and automatically sets up the Redux DevTools Extension for easy debugging.</p>
<h3>Step 3: Provide Store in React app</h3>
<p>Once our store is created, which we will need every component in our React app to be able to access. We can do this using the <code>Provider</code> from our <code>react-redux</code> package we installed.</p>
<p>In our <code>index.js</code> file, we import the <code>Provider</code> and our <code>store.js</code> like so:</p>
<pre><code>import store from './store'
import { Provider } from 'react-redux'
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
)
</code></pre>
<p> </p>
<p> </p>
<h3>Step 4: Write Reducers and Actions</h3>
<p>We can now write some reducer functions and actions for our Redux store.</p>
<p>In the traditional Redux, we usually write reducers and actions separately. For example, a simple reducer and action for a counter app will be written in traditional Redux like so:</p>
<h4>Actions</h4>
<pre><code>// actions/index.js
export const Increase = () => ({
type: 'INCREASE'
})
export const Decrease = () => ({
type: 'DECREASE'
})
</code></pre>
<p> </p>
<p> </p>
<h4>Reducers</h4>
<pre><code>// reducers/index.js
export default (state = 0, action) => {
switch (action.type) {
case 'INCREASE':
return state + 1
case 'DECREASE':
return state - 1
default:
return state
}
}
</code></pre>
<p> </p>
<p> </p>
<p>With Redux Toolkit, we can make the code much more concise by using <code>createSlice</code>. Create a <code>counterSlice.js</code> file in the <code>src</code> folder of the app. Both the reducers and actions can be written under a slice like so:</p>
<pre><code>import { createSlice } from '@reduxjs/toolkit'
export const counterSlice = createSlice({
name: 'counter',
initialState: {
value: 0
},
reducers: {
increase: state => {
state.value += 1
},
decrease: state => {
state.value -= 1
}
}
})
// each case under reducers becomes an action
export const { increase, decrease } = counterSlice.actions
export default counterSlice.reducer
</code></pre>
<p> </p>
<p> </p>
<p>As seen from the code above, defining reducers and actions become cleaner and faster in Redux Toolkit. There is no longer need to use the switch statements to manage the action with its corresponding reducer.</p>
<p>Another thing you may have noticed is that it seems we are now directly mutating the state's value in the reducer function instead of returning a new value to update the state. This is actually because Redux Toolkit uses the Immer library, which allows writing "mutating" logic in reducers.</p>
<blockquote>
<p>For more information on how Immer works, feel free to visit its documentation <a href="https://immerjs.github.io/immer/">here</a>.</p></blockquote>
<h3>Step 5: Import Reducer to Store</h3>
<p>We have exported our reducers and actions from our <code>counterSlice.js</code>. So let's import the reducer into our <code>store.js</code>.</p>
<pre><code>import { configureStore } from '@reduxjs/toolkit'
import counterReducer from '.counterSlice' //import our reducer from step 4
export default configureStore({
reducer: {
counter: counterReducer //add our reducer from step 4
}
})
</code></pre>
<p> </p>
<p> </p>
<h3>Step 6: Dispatch Actions from UI</h3>
<p>As we have learned earlier, our View triggers an action to be dispatched in order to update a state. In Redux, we use <code>store.dispatch(action)</code> to dispatch an action.</p>
<p>Instead, let's use React-Redux to use the <code>useDispatch</code> hook to dispatch actions and <code>useSelector</code> to read data from the store.</p>
<p>Create a <code>Counter.js</code> file in our <code>src</code> folder to represent our Counter component. In this file, we will import our <code>useDispatch</code> and <code>useSelector</code> hooks from React-Redux. We will also import our actions from our <code>counterSlice.js</code>.</p>
<pre><code>import { useSelector, useDispatch } from 'react-redux'
import { decrease, increase } from './counterSlice'
</code></pre>
<p> </p>
<p> </p>
<p>Then, our Counter function will initialize our 2 hooks and return UI elements with our <code>dispatch(action)</code> triggered when clicked.</p>
<pre><code>export function Counter() {
const count = useSelector(state => state.counter.value)
// in our slice, we provided the name property as 'counter'
// and the initialState with a 'value' property
// thus to read our data, we need useSelector to return the state.counter.value
const dispatch = useDispatch()
// gets the dispatch function to dispatch our actions
return (
<div>
<button onClick={() => dispatch(increase())}>
Increase
</button>
<p>{count}<p>
<button onClick={() => dispatch(decrease())}>
Decrease
</button>
</div>
)
}
</code></pre>
<p> </p>
<p> </p>
<h2>Open Source Session Replay</h2>
<p>Debugging a web application in production may be challenging and time-consuming. <a href="https://github.com/openreplay/openreplay">OpenReplay</a> is an Open-source alternative to FullStory, LogRocket and Hotjar. It allows you to monitor and replay everything your users do and shows how your app behaves for every issue.<br />
It’s like having your browser’s inspector open while looking over your user’s shoulder.<br />
OpenReplay is the only open-source alternative currently available.</p>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MvoFt7Qf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/openreplay/openreplay/main/static/replayer.png"><img alt="OpenReplay" src="https://res.cloudinary.com/practicaldev/image/fetch/s--MvoFt7Qf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/openreplay/openreplay/main/static/replayer.png" /></a></p>
<p>Happy debugging, for modern frontend teams - <a href="https://github.com/openreplay/openreplay">Start monitoring your web app for free</a>.</p>
<h2>Conclusion</h2>
<p>Redux Toolkit is a great option for both beginners and developers who wants to reduce the amount of boilerplate code in Redux. It allows us to write cleaner and more readable code while keeping the Redux flow and pattern.</p>
<p>Thank you for reading. I hope this article has been helpful in getting you started with understanding Redux and using Redux Toolkit in your applications. Cheers!</p>
#### Build your own `Regex Engine`
* [**C**: _A Regular Expression Matcher_](https://www.cs.princeton.edu/courses/archive/spr09/cos333/beautiful.html)
* [**C**: _Regular Expression Matching Can Be Simple And Fast_](https://swtch.com/~rsc/regexp/regexp1.html)
* [**JavaScript**: _Build a Regex Engine in Less than 40 Lines of Code_](https://nickdrane.com/build-your-own-regex/)
* [**JavaScript**: _How to implement regular expressions in functional javascript using derivatives_](http://dpk.io/dregs/toydregs)
* [**Perl**: _How Regexes Work_](https://perl.plover.com/Regex/article.html)
* [**Scala**: _No Magic: Regular Expressions_](https://rcoh.svbtle.com/no-magic-regular-expressions)
A ''Regular Expression Literal'' expresses a text-matching expression, and uses [[the same syntax as in JavaScript|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions]].
```
/hello/ig
```
Regular expressions are a powerful way to search and capture text information, but a full explanation is outside the scope of this document.
__Release roadmap__
* ''2021''
**''December''
*** <$checkbox tag="done" tiddler="Beta release with support for local device"> [[Beta release with support for local device]]</$checkbox>
*** <$checkbox tag="done" tiddler="Beta release with support for Dropbox"> [[Beta release with support for Dropbox]]</$checkbox>
*** <$checkbox tag="done" tiddler="Beta release with support for Google drive"> [[Beta release with support for Google drive]]</$checkbox>
[[Remote|https://remote.com]] is a global payroll, tax, HR and compliance solution for distributed teams, i.e. an [[employer of record]]. It's UVP is to enable easy management of remote workers for anyone. They have a number of [[technology partners program|https://partners.remote.com/]] that we might want to consider for OnePlaybook or any other future work.
There's a [[TiddlyWiki plugin|https://github.com/fiatjaf/tiddlywiki-remotestorage]] that uses the interesting [[remoteStoragejs|https://remotestorage.io]] library for connecting to remote storage servers and protocol. It's not present in the community links aggregator.
Managing projects with Excel sheets is fine. But only up to a point. This is a seeing point that we should stress on in the landing page, and track its impression on visitors.
[[From this article|https://app.getpocket.com/read/959328204]], the author talks about how he was pretty poor at managing his own research, and how he's trying to make it easier for others via [[SaaS]].
__Why is this important?__
# It makes any research project more accessible to everyone
# Makes research projects more efficient. Paper notebooks for example cannot capture the entirety of research products like spreadsheets and videos. Taking a digital first and always online approach is the best way to make things more efficient
# Software allows for machine-enabled automation for capturing and reproducing all important meta-data
# Funding bodies are now more keen on open research products, specifically notebooks, settings, etc
# Funding bodies and IRBs require a detailed research data management plan. This builds on the next point
# Having a standardized system will minimize the inevitable heterogeneity in research data management plans
# No more chaotic management systems that are hard to navigate, that can only be accessed on-site, and have:
<<<
Folders for every month with files that have names like ‘Updated characterisation of mobilised MSCs - Use this one - New’.
<<<
That last point made me chuckle 😄
All of these can be applied to [[Research Ops Managment]] as well
Here's a [[list of things|https://blog.sli.do/9-tips-engaging-webinars/]] we could do to make a good webinar.
With regards to topics, we could do a webinar featuring Salum Awadh on how to make your startup attractive to investors, and how to benefit from his equity platform that he recently launched.
Now we need to decide on the appropriate platform that we can use for this webinar.
__Problem__
Lack of integrated workspace to support the following:
# Effective collaborative writing is not easy
# Version control is problematic in research writing
# Lack of support for [[ResOps]]
Basically, there's nothing out there that assists researchers specifically to [[manage research|Research Management]].
It's important to remember that researchers and academics already have tools they favor. Therefore it is important to either add better value than those tools, or add significant value on top of those tools.
From [[ResearchOps|https://researchops.community/about/]]:
<<<
ResearchOps is the people, mechanisms, and strategies that set ~~user~~ research in motion. It provides the roles, tools and processes needed to support researchers in delivering and scaling the impact of the craft across an organisation.
<<<
Here's a [[ResearchOps framework]] to get at what ResOps entails.
__Why operationalize research?__
Why is ResearchOps important? There are lots of reasons given in/implied by the [[framework|ResearchOps framework]] and [[here|https://medium.com/@AnnieBruxner/resops-the-next-step-in-ux-cx-sd-research-b6ddfd024279]]. Some of the most notable include:
* democratically enable individuals of a company to access existing insights and engage in research,
* whilst reducing duplication of research effort so that the core research team can focus on exciting hypothesis driven projects
* enabling best practices: Coordinated, standardised and governed best-practice research methods, processes and procedures. This includes methods in recruitment, research methods, data collection, analysis. For all of these it also comes down to knowing when to employ particular methods, processes or procedures. This all helps to ensure quality knowledge is obtained that's relevant.
Research DevOps groups together all the tools and techniques used to deliver and support research operations in cloud environments (i.e., data transfer or data storage).
In addition, ResOps also focuses on the optimisation of research workloads for clouds, defining two main approaches: legacy, where on-prem infrastructure is replicated in the cloud environment, and cloud-first, where cloud computing paradigms are fully adopted when designing the workloads.
Both approaches have their own advantages and disadvantages, and impact the efficiency of the designed solution.
You can use these public APIs for some projects
* https://publicapis.sznm.dev
* https://public-apis.io/
* https://github.com/public-apis/public-apis
<p><p><strong>Developer Gets Paid</strong></p></p><p><p>It is one of the
most common API monetisation models based on revenue sharing. In this
model, an e-commerce enterprise like Amazon or eBay makes its APIs
available to the developers. When the end-user purchases on the
e-commerce site, the developer receives a percentage of the revenue;
Expedia earns over $2 million per year through their API leveraging this
monetisation model. The developer gets paid model also has sub-models:
Affiliate, Revenue Share, and Referal.</p></p><p><ul>
<li><strong>Affiliate</strong> – In the affiliate model, a partner
leverages your content/advertisements to drive potential user traffic to
you. This type of engagement has further sub-models: clicks,
impressions, action/acquisition, and engagement. Examples of this model
include Amozon.com and Google Adsense.</li>
<li><strong>Revenue Share</strong> – In this model, the developer acts
as an agent to help API providers sell their products or assets. The API
consumer receives a fixed percentage in commission. An example of this
model is car comparison portal Cars.com.</li>
<li><strong>Referal</strong> – This model draws similarities with the
affiliate model the only difference being that payment is involved only
when the end-user makes a purchase. Payments may be recurring or one
time. An example of this model is job placement site Monster.com.</li></ul></p>
\define revenue-streams-tag()
[[$(currentTiddler)$ Revenue Streams]] [[$(currentTiddler)$]]
\end
\define revenue-streams-filtertagparam()
$(currentTiddler)$ Revenue Streams
\end
''Revenue Streams''
<$button style="border: none; font-size: 10px">
➕
<$action-sendmessage $message="tm-new-tiddler" tags=<<revenue-streams-tag>> title="Revenue stream" />
Add item
</$button>
<ol>
<$list filter="[!has[draft.of]tag<revenue-streams-filtertagparam>sort[created]]">
<li style="font-size: 12px">
<$link to={{!!title}}><$view field="title"/></$link>
<$button message="tm-delete-tiddler" param={{!!title}} style="border:none;">❎</$button>
</li>
</$list>
</ol>
I just had an idea. A periodic review card or digest for TiddlyWiki: a tiddler containing all the things you've captured in a single day with generated links to other tiddlers that may be related to what you have. The pain point being addressed is that sometimes people are too lazy to review their stuff. So what if the stuff they need to review makes itself immediately available right when they open their app?
{{Purpose of note-taking}}
Tenders, scholarships, sales, you name it. It could be nice to have a system that could bring them all to your finger tips.
<<list-links "[tag[Rust]sort[title]]">>
<iframe src="https://doc.rust-lang.org/book/index.html" frameborder="0" width="100%" height="400px">
</iframe>
RxDB (short for Reactive Database) is a NoSQL-database for JavaScript Applications like Websites, hybrid Apps, Electron-Apps and NodeJs. Reactive means that you can not only query the current state, but subscribe to all state-changes like the result of a query or even a single field of a document. This is useful for UI-based apps that always display the realtime state to the user. RxDB can do a realtime replication with any CouchDB compliant endpoint and also with GraphQL endpoints.
<iframe src="https://rxdb.info/" style="position:relative;width:100%;height:80vh;" frameborder=0></iframe>
<<list-links "[regexp[SaaS]!is[system]!title[SaaS]!regexp[Draft of 'SaaS']]">>
From this [[article by chargebee|https://www.chargebee.com/blog/saas-pricing-scale-value-not-usage/?utm_campaign=Submission&utm_medium=Community&utm_source=GrowthHackers.com]].
When thinking about capturing value, we need to think a lot about scaling the value, not merely scaling the usage. Blind usage without accumulation of value yields nothing but frustrations, and it causes the user to feel like they're being taxed for their needs, not success.
<mark>This creates an unnecessary barrier to further growth.</mark>
Examples:
* [[Michelin value based pricing]]
* [[Google "value based pricing"]]
The examples above illustrate ''[[value based pricing|Value based pricing]]''.
__Problems__
* The regulatory authority in Tanzania places a heavy burden on customers for every EFD they have to buy. The upfront costs are enormous (around 1.3 million shillings MINIMUM)
* These machines aren't the easiest things to use
* There is a severe knowledge and service gap around helping small businesses on taxation, including processing and managing taxes
__Possible solutions__
* A cloud solution that virtualizes the EFD, reducing costs
* A more limited form of hardware designed to work with ordinary smartphones. May be more expensive and riskier
__Challenges__
* The law. Specifically the [[Income Tax Act of 2012|https://www.tra.go.tz/tax%20laws/EFD%20Regulation.pdf]]
** Under section 8 governing the Appointment of EFD manufacturer, paragraph two, the Commissioner shall not appoint any person to be a manufacturer of Electronic Fiscal Devices unless that person has:
*** a reputable financial position;
*** own and possess a high technical expertise in manufacturing Electronic Fiscal Devices and fiscal management system;
*** a minimum of five years experience in manufacturing Electronic Fiscal Devices;
*** internal policy and objectives of granting product guarantees and warranties covering a period of not less than three years;
*** made a guarantee in the Contract to be executed with the Commissioner and in each contract the manufacturer enters with the approved supplier that he shall supply both the approved Electronic Fiscal Devices and the attendant spare parts for at least a period of five years regardless of the change of technology; and
*** any other requirement as may be prescribed by the Commissioner.
Samsara is a Connected Operations Cloud provider, which allows businesses that depend on physical operations to harness IoT data to develop actionable business insights and improve their operations.
[[API and developer portal|https://developers.samsara.com/reference/overview]]
From reading about how [[Airbnb scaled knowledge|https://medium.com/airbnb-engineering/scaling-knowledge-at-airbnb-875d73eff091]] at their company, we can learn some essential points:
Needs grow with time: it becomes difficult to scale knowledge using email and google docs when the company grows. "As an organization grows, how do we make sure that an insight uncovered by one person effectively transfers beyond the targeted recipient? Internally, we call this scaling knowledge... Based on conversations with other companies, this experience is all too common. As an organization grows, the cost of transmitting knowledge across teams and across time increases. ''An inefficient and anarchic research environment raises this cost, slowing down analysis and the speed of decision making.'' Thus, a more streamlined solution can expedite the rate at which decisions are made and keep the company nimble atop a growing base of knowledge."
Since the focus in the article is about improving access to data science knowledge, the solution's characteristics are based on that goal, with a need to marry code review practices with academic peer reviewing:
* Reproducibility — There should be no opportunity for code forks. The entire set of queries, transforms, visualizations, and write-up should be contained in each contribution and be up to date with the results.
* Quality — No piece of research should be shared without being reviewed for correctness and precision.
* Consumability — The results should be understandable to readers besides the author. Aesthetics should be consistent and on brand across research.
* Discoverability — Anyone should be able to find, navigate, and stay up to date on the existing set of work on a topic.
* Learning — In line with reproducibility, other researchers should be able to expand their abilities with tools and techniques from others’ work.
An interesting quote that contrasts the characteristics of bad software code and bad knowledge:
<<<
Unlike engineering code, low quality research doesn’t create metric drops or crash reports. Instead, low quality research manifests as an environment of knowledge cacophony, where teams only read and trust research that they themselves created.
<<<
The article also notes that data scientists may spend a lot of time reinventing some things in their field. ''Given that Airbnb spent a nontrivial amount of time working on their "knowledge repo" system, it's clear that this may be an upfront cost that many organizations may want to avoid despite their desire to benefit from scaling their knowledge.''
<h1><strong>Problem</strong></h1>
<p>A responsibility for the Data team at Airbnb is to <a href="http://nerds.airbnb.com/scaling-data-science/" rel="noopener ugc nofollow" target="_blank">scale</a> the ability to make decisions using data. We democratize <a href="http://airbnb.io/airpal/" rel="noopener ugc nofollow" target="_blank">data access</a> to empower all employees to make data-informed decisions, give everybody the ability to use <a href="http://nerds.airbnb.com/experiment-reporting-framework/" rel="noopener ugc nofollow" target="_blank">experiments</a> to correctly measure the impact of their decisions, and turn insights on user preferences into <a href="http://nerds.airbnb.com/airbnb-machine-learning/" rel="noopener ugc nofollow" target="_blank">data products</a> that improve the experience of using Airbnb. Recently, we’ve started to tackle a different type of problem. As an organization grows, how do we make sure that an insight uncovered by one person effectively transfers beyond the targeted recipient? Internally, we call this <strong>scaling knowledge</strong>.</p>
<p>When our team consisted of just a handful of people, it was easy to share and discover research findings and techniques. But as our team has grown, issues that were once minor have become more significant. Take the case of Jennifer, a new data scientist looking to expand on work produced by a colleague on the topic of host rejections. Here’s what we’d see happening:</p>
<ol>
<li>Jennifer asks other people on the team for any previous work, and is sent a mixed bag of presentations, emails, and Google Docs.</li>
<li>The previous work doesn’t have the up-to-date code. Jennifer tracks down the local copy on the original author’s machine or an outdated GitHub link.</li>
<li>After fiddling with the code, Jennifer realizes it’s slightly different from what made the previous plots. Jennifer decides to either adapt the deviated code or start from scratch.</li>
<li>After spending time reproducing the results, or giving up and starting from scratch, she does her work.</li>
<li>Jennifer distributes the results through a presentation, email, or Google Doc, perpetuating the cycle.</li></ol>
<p>Based on conversations with other companies, this experience is all too common. As an organization grows, the cost of transmitting knowledge across teams and across time increases. An inefficient and anarchic research environment raises this cost, slowing down analysis and the speed of decision making. Thus, a more streamlined solution can expedite the rate at which decisions are made and keep the company nimble atop a growing base of knowledge.</p>
<h1>Solution</h1>
<p>As we saw this problematic workflow play out over and over, we realized that we could do better. As a team, we got together and decided on five key tenets for what we wanted in our DS research:</p>
<ul>
<li><em>Reproducibility</em> — There should be no opportunity for code forks. The entire set of queries, transforms, visualizations, and write-up should be contained in each contribution and be up to date with the results.</li>
<li><em>Quality</em> — No piece of research should be shared without being reviewed for correctness and precision.</li>
<li><em>Consumability</em> — The results should be understandable to readers besides the author. Aesthetics should be consistent and on brand across research.</li>
<li><em>Discoverability</em> — Anyone should be able to find, navigate, and stay up to date on the existing set of work on a topic.</li>
<li><em>Learning</em> — In line with reproducibility, other researchers should be able to expand their abilities with tools and techniques from others’ work.</li></ul>
<p>With these tenets in mind, we surveyed the existing set of tools that had solved these problems in isolation. We noticed that R Markdowns and iPython notebooks solved the issue of reproducibility by marrying code and results. Github provided a framework for a review process, but wasn’t well adapted to content outside of code and writing, such as images. Discoverability was usually based on folder organization, but other sites such as Quora were structuring many-to-one topic inheritance with tags. Learning was based on whatever code had been committed online, or via personal relationships.</p>
<p>Together, we combined these ideas into one system. Our solution combines a <em>process</em> around contributing and reviewing work, with a <em>tool</em> to present and distribute it. Internally, we call it the <strong>Knowledge Repo</strong>.</p>
<p><img alt="" src="https://miro.medium.com/max/1400/1*cNc7N42Fbt5YHcZIxD96zg.png" /></p>
<p>At the core there is a Git repository, to which we commit our work. Posts are written in Jupyter notebooks, Rmarkdown files, or in plain Markdown, but all files (including query files and other scripts) are committed. Every file starts with a small amount of structured meta-data, including author(s), tags, and a TLDR. A Python script validates the content and transforms the post into plain text with Markdown syntax. We use GitHub’s pull request system for the review process. Finally, there is a Flask web-app that renders the Repo’s contents as an internal blog, organized by time, topic, or contents.</p>
<p>On top of these tools, we have a process focused on making sure all research is high quality and consumable. Unlike engineering code, low quality research doesn’t create metric drops or crash reports. Instead, low quality research manifests as an environment of knowledge cacophony, where teams only read and trust research that they themselves created.</p>
<p>To prevent this from happening, our process combines the code review of engineering with the peer review of academia, wrapped in tools to make it all go at startup speed. As in code reviews, we check for code correctness and best practices and tools. As in peer reviews, we check for methodological improvements, connections with preexisting work, and precision in expository claims. We typically don’t aim for a research post to cover every corner of investigation, but instead prefer quick iterations that are correct and transparent about their limitations. Our tooling includes internal R and Python libraries to maintain on-brand, aesthetic consistency, functions to integrate with our data warehouse, and file processing to fit R and Python notebook files to GitHub pull requests.</p>
<p><img alt="" src="https://miro.medium.com/max/1400/1*MPdpSg36RzBeinrL0wIGwQ.png" /></p>
<p><em>Figure 1 — A screenshot of the knowledge feed showing the summary cards for two posts.</em></p>
<p><img alt="" src="https://miro.medium.com/max/1400/1*oib1FYv2tb3vFBsbdKIMKg.png" /></p>
<p><em>Figure 2 — An example of a post examining gap days in host acceptance decision making.</em></p>
<p>Together, this provides great functionality around our knowledge tenets:</p>
<ul>
<li><em>Reproducibility </em>— The entirety of the work, from the query of our core ETL tables, to the transforms, visualizations, and write-up, is contained in one file, the Jupyter notebook, RMarkdown, or markdown file.</li>
<li><em>Quality </em>— By leaning on GitHub’s functionality of pull requests prior to publishing, peer review and version control is put directly into the flow of work.</li>
<li><em>Consumability </em>— The markdown served by our web-app hides code and uses our internal branded aesthetics, making the work more accessible to less technical readers. The peer review process also provides feedback on writing and communication, which improves the impact of the work.</li>
<li><em>Discoverability </em>— The structured meta-data allows for easier navigation through past research. Each post has a set of tags, providing a many-to-one topic inheritance that goes beyond the folder location of the file. Users can subscribe to topics and get notified of a new contribution. Posts can be bookmarked, browsed by author, or perused as a blog feed.</li>
<li><em>Learning</em> — By having previous work easily accessible, it becomes easier to learn from each other. For example, one can review each other’s queries, see the code used for a creative visualization, and discover new data sources. This exposes Data Scientists to new methodologies and coding techniques, speeds up on-boarding, and makes it possible for people outside our team to learn about our field.</li></ul>
<p>The Knowledge Repo houses a large variety of content. The bulk of the work consists of deep-dives aimed at answering non-trivial questions, but examinations of experiment results not covered by our <a href="http://nerds.airbnb.com/experiment-reporting-framework/" rel="noopener ugc nofollow" target="_blank">experiment reporter</a> are also common. Other posts are written purely to broaden the base of people who do data analysis, including writeups of a new methodology, example of a tool or package, and tutorials on SQL and Spark. Our public data blog posts also now live in the Knowledge Repo, including this one. In general, the heuristic is: if it could potentially be useful to someone in the future, post it!</p>
<h1>Future</h1>
<p>The Knowledge Repo is still a work in progress. The small team that is working on it continuously addresses feature requests. We are working towards adoption by all teams in the company that do research, such as Qualitative Researchers who don’t use GitHub. To that end, we are testing an internally built review process on an in-browser Markdown editing app. Another possible feature is a moderator for proposing and upvoting research topics. We are also looking into making it easier to fork existing posts and continue working on them as new posts.</p>
<p>One issue we are working on is the synthesis of the work that is done by individuals. Now that we have an archive for our knowledge threads, we have an opportunity to weave them into a shared understanding of Airbnb’s ecosystem. We put a high premium on employees owning their own <a href="http://nerds.airbnb.com/engineering-culture-airbnb/" rel="noopener ugc nofollow" target="_blank">strategic impact</a>, and want to enable everyone to develop a broad and deep understanding of any side of the business. We are currently iterating on the best way to keep content current and structured while the company is rapidly evolving and team structures changing.</p>
<p>Especially in the nascent field of Data Science, different data teams are likely reinventing the wheel regularly. In sharing our process we hope to inspire other organizations to work towards addressing the kinds of problems we are trying to solve, and share their learnings so we can collaboratively produce best practices.</p>
Scientific DevOps refers to DevOps practices applied in the context of scientific computing.
Jimenez, Ivo. (2019, October). SciOps: Accelerating Science Delivery by Following DevOps-Inspired Principles. Zenodo. http://doi.org/10.5281/zenodo.3501181
Scribe, an online tool that allows you to automatically generate step-by-step guides for any task. Could we replicate this for TiddlyWiki?
https://scribehow.com/
# You worked at Buni for more than a couple of years with Jumanne. Now you all have your own going concerns that are doing very well Tell us briefly about your time in the startup ecosystem and your recent stint in the serial founders business.
# When you look at the startup ecosystem now and compare it with back when you started at Buni, we've gotten pretty far. But obviously we still have a long way to go. What do you think of our ecosystem's strengths and weaknesses?
# It takes more than a startup to make an ecosystem. What about institutions like venture funds, government, private companies and whatnot. Do you feel they're more involved in this than ever before? What are the gaps and opportunities in your opinion?
# As a mentor, tell us your war stories. Biggest successes you've seen and the worst. The Good, the bad and the ugly.
# You've obviously mentored many startups over the years. And some have gone on to succeed and some have not. In your opinion, what does it take for a startup to thrive in the Tanzanian environment?
# Do you think startups run themselves well enough, or is there a systematic trend of bad practices that cripples so many of them? What are they?
# Are incubators in Tanzania doing right by the startups that they incubate?
# What about the private sector? There's been an uptick in acquisitions, especially among telecoms with respect to fintech. And we've had high profile ones like ~KopaGas. What do you think of that?
# Many startups these days try to bring business models that worked in other countries into Tanzania. They're trying to build the next Tanzanian service platform giant like Uber, et cetera. Do you think that's foolhardy is there something to this fad?
# You cofounded Studio19 back in 2015 correct? Our listeners would be interested in knowing any advice you have for their businesses based on your personal experience founding a new business. What did it take?
# What would you suggest an startup team should do to become an A team based on your Studio19 team?
# Closing questions and remarks.
#### Build your own `Search Engine`
* [**CSS**: _A search engine in CSS_](https://stories.algolia.com/a-search-engine-in-css-b5ec4e902e97)
* [**Python**: _Implementing a Search Engine with Ranking in Python_](http://aakashjapi.com/fuckin-search-engines-how-do-they-work/)
* [**Python**: _Building a search engine using Redis and redis-py_](http://www.dr-josiah.com/2010/07/building-search-engine-using-redis-and.html)
* [**Python**: _Building a Vector Space Indexing Engine in Python_](https://boyter.org/2010/08/build-vector-space-search-engine-python/)
* [**Python**: _Building A Python-Based Search Engine_](https://www.youtube.com/watch?v=cY7pE7vX6MU) [video]
Imagine if knowledge just came to us like in Pinterest; search-less which enables pinpoint access as well as discovery.
{{How much time we lose when searching}}
Our brain is for having ideas, not storing them. Building A Second Brain is a methodology for saving and systematically reminding us of the ideas, inspirations, insights, and connections we've gained through our experience. It expands our memory and our intellect using the modern tools of technology and networks.
In P2Pedia, only wiki pages are downloaded from one computer to another. You can also fully control which peers you connect to, unlike in regular file-sharing networks. Generally speaking, do not download content form people you don’t trust — this is a basic strategy that you should always apply
* Some users share their files with strangers and other people by:
** Sharing from a single folder or
** Sharing from another service altogether
* Formalizing this sharing and publication practice together via OnePlaybook might be worth it. This might work because according to the [[survey|Cloud storage user habits]], one in two may use more at least 3 different cloud storage services.
These are the segments we should target for [[seo|Linked pages for SEO]] according to the data so far from [[oneplaybook's waitlist analysis|https://docs.google.com/spreadsheets/d/1cS2VvbGSn7xbe2OyQ7panIJ6ecr9eDZXwUmaUNt2UXo/edit#gid=401438910]]:
# Profession: there is more or less evenly spread among the following professions
## ''Engineer'' (16.1%)
## ''Manager'' (14.9%)
## ''Student'' (14.9%)
## ''Freelancer'' (11.9%)
## Researchers, lawyers, doctors/nurses, business owners all made up less than 10%
## A big chunk answered other professions. Maybe we might have to follow up on them
# Most users are in distributed teams (64.4%)
# Problem to be solved: [[Knowledge management]] is a clear winner (59.8%), followed by effective collaboration (13.*%). The rest have less than 5% share
# On average, most folks use 2 apps for their work. This is probably not important because we will focus exclusively on solving [[Knowledge management]]. The highest is among
## business owners (5),
## managers (3)
## researchers (3)
## and students (2)
# We can neatly cut our segment into either
## ''Duo/personal'' with 1-2 headcount group (44.8%)
## ''Small teams'' of 3-5 (18.4%)
## and 6-10 (17.2%)
## the rest make up less than 10%. We looked up to 40+. The blind spot here is that we have no data about [[Enterprises]]
# Most projects being managed are either
## ''Personal'' (43.7%)
## ''Business'' (34.5%)
## ''Research'' (12.6%) though probably not a formal researcher
## Surprisingly, engineering made up only 9.2%. What does this mean?
<p><a href="https://copingmechanism.com/2021/writing-everything-in-tiddlywiki/">copingmechanism.com</a></p>
<h1>Writing everything in TiddlyWiki and publishing just the public parts – Coping Mechanism</h1>
<p>7 - 8 minutes</p>
<hr />
<p>I take all my notes in <a href="https://tiddlywiki.com/">TiddlyWiki</a> now, and publish most of them to <a href="https://rudimentarylathe.wiki/">rudimentarylathe.wiki</a>.</p>
<p>For the past few years, I’ve published my wiki using TiddlyWiki. I write daily, publicly sharable notes there. Private stuff goes elsewhere…or did, until yesterday.</p>
<p>It’s the “elsewhere” part that drove me nuts. I have a private <a href="https://roamresearch.com/">Roam</a> database in which I would track things I <em>don’t</em> want to share. Or maybe I should write it in <a href="https://orgmode.org/">Org mode</a>. Or <a href="https://obsidian.md/">Obsidian</a>, or <a href="https://www.craft.do/">Craft</a>, or or or. The difficult part for me has been that I want to take a note about, say, a new camera purchase. There are two components to it, the information about the camera itself, and information about the purchase. The former is public, the latter is private. This means I create one note in TiddlyWiki and one in, let’s say, Roam. There are dozens of examples like this, and it’s crazy-making. I thought I could manage this using links or copy/paste but it sucks trying to do that. I could also make everything public or private. Neither of these are feasible.</p>
<p>If only I could keep everything in one place, but only publish things I wanted public. Then, a few days ago, Soren Bjornstad came to the rescue with his video, <a href="https://www.youtube.com/watch?v=GjpjE5pMZMI">A Tour Through My Zettelkasten</a>.</p>
<p>Wow, other than building an amazing Zettelkasten, Soren has implemented nearly everything I needed in order to go all-in with TiddlyWiki for my own wiki.</p>
<p>A few highlights:</p>
<ul>
<li>Public and Private tiddlers</li>
<li>Sensible tagging and organization</li>
<li>Override the “copy permalink” feature to substitute public URL when on localhost</li>
<li>Scripted rendering and publishing of public wiki</li>
<li>Specific behavior when viewing public vs private editions</li>
<li>A number of other nice touches</li></ul>
<p>I borrowed some of these and integrated them into <a href="https://rudimentarylathe.wiki/">Rudimentary Lathe</a>. Now, I’m taking all my notes in TiddyWiki. I’ll describe the process a little.</p>
<p><strong>Editing the wiki locally</strong>.</p>
<p>I use TiddlyWiki as a local Node.js app. While one of TiddlyWiki’s great features is that can be just a single HTML file, running it locally as a single-page web app via node.js makes things a bit more flexible. Also, it’s the easiest way to allow for saving changes in Safari. The file structure looks like this:</p>
<pre>├── files/
├── plugins/
├── tiddlers/
└── tiddlywiki.info</pre>
<p>All tiddlers are kept as separate “.tld” files in the tiddlers folder. Here’s an example:</p>
<pre>created: 20201220181044760
creator: jack
modified: 20210505182021507
modifier: jack
revision: 0
tags: Public
title: Leica APO-Summicron-SL 35mm ASPH
type: text/vnd.tiddlywiki
[img[files/2020/leica-apo-summicron-sl-35mm.jpg]]
I prefer primes, so this is the one I've chosen for the [[Leica SL2-S]]. Watching Peter Karbe admit it's is desert-island lens and suggesting it's the best lens Leica has ever produced made the decision a little easier.</pre>
<p>I have over 2300 of them currently. Another nice side effect is that git diffs are much more usable on individual text files than on a giant HTML file.</p>
<p><strong>Public vs Private content</strong>.</p>
<p>Any tiddler I want to be public gets a “Public” tag. That’s it. The export script is smart enough to automatically include all system tiddlers, etc so that everything works.</p>
<p>As a useful helper, each tiddler displays a “Publish this tiddler” checkbox to make adding the tag easier, as well as serving as a handy indicator of private vs public status. The export script updates one of the configuration tiddlers so that the published version doesn’t show this checkbox.</p>
<p>I can’t tell you how huge this is. Not having to choose the tool or app for new notes is so liberating. I can now write and link freely with <em>everything</em> and can still share most of it publicly.</p>
<p><strong>Hosting</strong></p>
<p>I’ve never used Github Pages for hosting any content, so thought this would be a good opportunity to try it. Basically, I keep a separate repo of the public version and pushing to that repo automatically publishes it. Super easy to set up.</p>
<p><strong>Publishing workflow</strong>.</p>
<p>Soren was kind enough to share a version of the script for publishing his wiki (publish.sh), which I’ve modified slightly. Here are the highlights.</p>
<pre><code>PRIV_FOLDER="rl-wiki"
PUB_FOLDER="public-wiki"
FILT='[is[system]] [tag[Public]] -[[$:/plugins/tiddlywiki/tiddlyweb]] -[[$:/plugins/tiddlywiki/filesystem]] -[prefix[$:/temp]] -[prefix[$:/state]] -[prefix[$:/sib/StorySaver/saved]] +[!field:title[$:/sib/WriteSideBar]]'
WIKI_NAME="index.html"
ext_image_folder="extimage"</code></pre>
<p>“FILT” is the tiddlywiki filter for determining which tiddlers to include (and exclude). The <code>[tag[Public]]</code> bit is the key to the public/private thing.</p>
<p>Then we export tiddlers based on the filter and settings above.</p>
<pre><code>"$(npm bin)/tiddlywiki" "$PRIV_FOLDER" --savewikifolder "$pub_wiki" "$FILT"</code></pre>
<p>Next, generate a single HTML version of the wiki and copy over the separate image files..</p>
<pre><code>"$(npm bin)/tiddlywiki" "$pub_wiki" \
--render "$:/core/save/all" "$WIKI_NAME" text/plain
cp -r "$pub_wiki/output"/* "$pub_ghpages"
cp -R "$PRIV_FOLDER/files" "$pub_ghpages"</code></pre>
<p>Isn’t TiddlyWiki amazing!?</p>
<p>Finally, we commit and push the public wiki to Github…</p>
<pre><code>if [ "$1" = "--push" ]; then
echo "Pushing compiled wiki to GitHub..."
cd "$pub_ghpages" || exit 1
git add .
git commit -m "publish checkpoint"
git push
else
echo "Not pushing the wiki to GitHub because the --push switch was not provided."
fi</code></pre>
<p>And voilà!</p>
<p><strong>A few nice odds and ends</strong>.</p>
<p>Soren’s “Reference Explorer”, seen at the bottom of individual tiddlers, replaces my handmade backlinks display. His is much fancier. I removed a few tabs I don’t use, and may exclude the tags at some point. I conditionally exclude the explorer from my Daily Notes pages. (anything tagged “DailyNote” hides the explorer.) Another nice tweak is that if I add a “refexplorer-hide” field to any tiddler and set it to “true”, the explorer is not shown on that tiddler. Nifty.</p>
<p>TiddlyWiki comes with a button for copying a permalink to each tiddler. The problem with that for me is that when I’m running the wiki locally, permalinks look like this</p>
<p>http://localhost:8080/#CommandLineInterface, which obviously won’t work. Soren’s version of the button replaces localhost:8080 with the live hostname, e.g. https://rudimentarylathe.wiki/#CommandLineInterface. This saves me a ton of copy/paste/edit hassles.</p>
<p><strong>Putting it all together</strong>.</p>
<p>When I’m ready to publish, I open a terminal and type <code>prl</code> (for “publish rudimentary lathe”)</p>
<p>prl is a script…</p>
<pre><code>#!/bin/sh
cd ~/Sync/rudimentarylathe
./scripts/publish.sh --push</code></pre>
<p>That’s it.</p>
<p>I wish more people would spend time getting to know TiddlyWiki. It’s amazing. It’s a <a href="https://en.wikipedia.org/wiki/Quine_(computing)">Quine</a>, which makes it ridiculously flexible and powerful. And yet it’s very simple. It’s also a free, local-first, easily-distributable, storable, backup-able single HTML file.</p>
<p>TiddlyWiki is fun, fancy, and future-proof. I live there now.</p>
We have form builders for the web and other platforms. How about SMS?
There are many stories of young, careless/callous founders and startup partners ganging up on disadvantaged employees using their self-proclaimed titles of CEO and CTO. In many cases, the stories usually start with unfeasible deadlines or expectations which lead to the usually consequences inherent in these 'plan to fail' initiatives due to employees working overtime for less pay and finally scapegoating. It's a very toxic affair enabled partly by these executive titles.
When managing a bouncing, wide-eyed early stage startup, I believe it is important for founders to understand that:-
# ''Startup founders and partners are not executives''. They should consider themselves a mere team member with collective ownership. They're responsible for everything, especially the welfare of people who decide to work at their startup for less (and against their better judgement). There will be plenty of time for titles once the company achieves stable revenue streams and profitability.
# Startup employees are a gift from heaven. An early stage startup is anything but a safe investment of their time and effort. Founders should appreciate them risking their finances, wellbeing and careers for their (probably unprofitable) dream company. They deserve more than respect; they deserve genuine love and empathy. Founders should give them at least that if they cannot afford their overtime and only have equity to offer in place of salaries.
# Finally, as the saying goes, karma is a bitch. How founders treat employees will impact their company in the long run. For example, retaining talent will feel easier if they do right by them. Founders should invest in their employees' learning, help them with their difficulties wherever possible, provide transparency, and consider their wellbeing whenever they make key decisions that affect them. Involve the whole team equally as much as possible and be their leader, and not a C-suite wannabe with issues.
Given a version number MAJOR.MINOR.PATCH, increment the:
MAJOR version when you make incompatible API changes,
MINOR version when you add functionality in a backwards compatible manner, and
PATCH version when you make backwards compatible bug fixes.
Additional labels for [[pre-release and build metadata]] are available as extensions to the MAJOR.MINOR.PATCH format.
<p><a href="https://news.codecademy.com/your-guide-to-semicolons-in-javascript/">news.codecademy.com</a></p>
<h1>Your Guide to Semicolons in JavaScript</h1>
<p>Codecademy Team</p>
<p>4-5 minutes</p>
<hr />
<p><em>This is a guest post by moderator <a href="http://www.codecademy.com/fanaugen">Alex J</a>. If you see him in the forums, say hello!</em></p>
<p>When do you need a semicolon? Here's a handy cheat sheet!</p>
<h4>Required: When two statements are on the same line</h4>
<p>The semicolon is only obligatory when you have two or more statements on the same line:</p>
<pre><code>var i = 0; i++ // <-- semicolon obligatory
// (but optional before newline)
var i = 0 // <-- semicolon optional
i++ // <-- semicolon optional
</code></pre>
<h4>Optional: After statements</h4>
<p>The semicolon in JavaScript is used to separate statements, but it can be omitted if the statement is followed by a line break (or there’s only <em>one</em> statement in a <code>{</code>block<code>}</code>). A <em>statement</em> is a piece of code that tells the computer to do something. Here are the most common types of statements:</p>
<pre><code>var i; // variable declaration
i = 5; // value assignment
i = i + 1; // value assignment
i++; // same as above
var x = 9; // declaration & assignment
var fun = function() {...}; // var decl., assignmt, and func. defin.
alert("hi"); // function call
</code></pre>
<p>All of these statements can end with a <code>;</code> but none of them must. Some consider it a good habit to terminate each statement with a <code>;</code> – that makes your code a little easier to parse, and to compress: if you remove line breaks you needn't worry about several statements ending up unseparated on the same line.</p>
<h4>Avoid!</h4>
<p><strong>1. After a closing curly bracket</strong></p>
<p>You shouldn’t put a semicolon after a closing curly bracket <code>}</code>. The only exceptions are <em>assignment statements</em>, such as <code>var obj = {};</code>, see above.</p>
<pre><code>// NO semicolons after }:
if (...) {...} else {...}
for (...) {...}
while (...) {...}
// BUT:
do {...} while (...);
// function statement:
function (arg) { /*do this*/ } // NO semicolon after }
</code></pre>
<p><strong>2. After the round bracket of an if, for, while or switch statement</strong></p>
<p>It won't harm to put a semicolon after the <code>{ }</code> of an <code>if</code> statement (it will be ignored, and you might see a warning that it's unnecessary). But a semicolon where it doesn't belong (such as after the round <code>(</code>brackets<code>)</code> of an <code>if</code>, <code>for</code>, <code>while</code>, or <code>switch</code> statement) is a very bad idea:</p>
<pre><code>if (0 === 1); { alert("hi") }
// equivalent to:
if (0 === 1) /*do nothing*/ ;
alert ("hi");
</code></pre>
<p>This code will alert "hi", but not because 0 equals 1, but because of the semicolon. It makes JavaScript think that you have an <em>empty statement</em> there, and everything to the right of it is treated as no longer belonging to the <code>if</code> conditional and thus independent of it.</p>
<h4>Of course there's an exception...</h4>
<p>An important quirk: inside the <code>()</code> of a <code>for</code> loop, semicolons only go after the first and second statement, never after the third.</p>
Send tiddlers & other items to calendars.
Roberto Robles 📈 🚀 (@robertodigital_) Tweeted:
SEO is like a tripod
Content | On-Page | Off-Page
You need all 3 to make it work ⚡
https://twitter.com/robertodigital_/status/1410946408744509443?s=20
Apparently, nobody does SEO better than Canva. Here's a twitter thread to summarize: https://twitter.com/_buildd/status/1489091473849348096
Key Takeaways
# Search intent is very important in SEO. Before targeting a keyword, make sure to check the intent. In the case of Canva, if someone wants to create or use templates, each intent requires its own page e.g. /create/flyer vs /templates/flyer
# Organize your sites so all pages are [[internally linked|Internal linking]]. This will help even most niche pages to rank. In the case of Canva, the sub category pages has the URL structure /flyers/templates/sub-category. They all get an internal link from the main category page, that has a higher authority. The flyers template page for example has 43 subcategories like
## Tutor,
## Christmas,
## Marketing
# Create scalable web page templates to add new pages. Making pages that capture general keywords and niche keywords and linking them together at scale requires us to deploy reusable, simple page templates that help us deploy such pages quickly at scale.
* It's hard to convert users if you don't target a specific search keyword for a specific use case
* It's hard to research keywords (in fact, SEO by default is hard, especially if you don't know where or how to start, the domain knowledge etc)
* It may take months to learn how to do this yourself, and getting an expert might not be feasible too, especially if you're an early stage startup
How do we solve this with OnePlaybook?
I've just reminded myself about the importance of doing things once in React when it comes to setting state. Especially with regards to `forEach`.
Setting state for each element in an array can lead to situations where you only find the last item has been set. To avoid that, it is better to create an empty object, update it at every loop, and then set the resulting object as the new state once.
That way you can be sure that the cumulative updates have been set accordingly.
#### Build your own `Shell`
* [**C**: _Tutorial - Write a Shell in C_](https://brennan.io/2015/01/16/write-a-shell-in-c/)
* [**C**: _Let's build a shell!_](https://github.com/kamalmarhubi/shell-workshop)
* [**C**: _Writing a UNIX Shell - Part I_](https://indradhanush.github.io/blog/writing-a-unix-shell-part-1/)
* [**Ruby**: _A Unix Shell in Ruby_](https://www.jstorimer.com/blogs/workingwithcode/7766107-a-unix-shell-in-ruby)
Many entrepreneurs fail to see that the more value their business model creates, the more competition they’re likely to face.
When a firm is pursuing a successful new business model against intense competition, it’s vital to apply the three value-capture frameworks in the middle of the landscape:-
* industry attractiveness,
* competitive positioning, and
* competitive interaction.
Hello everyone and welcome to yet another episode of the Next African Unicorn, the show that looks at startup ecosystems across the continent. My name is Dr. Abraham Samma and I'll be your host for today. Our sponsor as usual is Innovation Peer dot com, {{About Innovation Peer}} check them out at innovation peer dot com if you want make successful, growing products, corporate or startup.
Our guest today is...
Peek in TiddlyWiki links without actually clicking them. Good if you want to quickly glimpse something without leaving the current page/tiddler
A new kind of chromium browser that describes itself as the new work OS, with a focus on:-
* giving desktop/mobile experience, making web apps the center of the web experience instead of browsing
* with notification badges
* Search across web apps
* Multiple accounts that you can transition to without logging in again
* Performance offers due to mitigation of tabs and suspension of unused tabs
It opened to number one product of the day and week on producthunt. But it introduces a question: how many people are willing to switch to another browser? Can't we have a similar or close to similar experience in our browser of choice?
A quick look at the numbers so far from sign ups:
* 62 sign ups since 6^^th^^ October last year
* Most sign ups consist of engineers (21.3%), followed by:-
** Freelancers
** Students
** Managers
** researchers (''what are the needs of researchers?'')
** business owners
** most recently, a small number of lawyers
* Most sign ups with teams said they have team of 1-2 people (45.9%)
** the runner ups are medium large (3-5, followed by 6-10)
** A decent number (just below 10%) range from 21-40
** Others scattered between 11-20 and 40 plus
* A very large majority are in distributed teams. However, one-third work on-site
* 63.9% are concerned about knowledge management (bias from our website?), followed by effective collaboration
* Biggest projects being managed are either personal or for business
** 13% are engineering projects
** 6.6% are research projects
* On average, every profession uses on average 2 application software to achieve their aims, though businesses tended to use the most apps, followed by managers and researchers
{{Notes on BYOC}}
Also, found this nifty encyclopedia online called [[Simplicable|https://simplicable.com/new/knowledge-processes]] that has some interesting topics on knowledge processes. Worth bookmarking for future reference.
Also, should we add a button that helps people create personal OnePlaybook portals by simply forking on the original domain?
A knowledge base and wiki as a service. Free up to 10 users. Starting price $6.67 per user per month, with about 3 guest users per user.
They focus on offering:
* modern editing that makes content look good
* offer additional organizational tools besides folders and tags: "Folders and tags are not enough. Slab Topics both organize and provide relevant context to make it easy for your team to learn about company policies and procedures, and each others' ideas and insights."
* Aggregated search: you can search through ALL of your existing tools inside Slab. This I think THIS the most compelling offer
* Integrations: they make it a point to NOT replace other tools in a user's stack by being a very good wiki as a service app
{{Building Wikis from Slack}}
__When to use Slack__
* Short-lived conversations which are synchronous e.g. back-channel, scheduling, coordination and war room scenarios
* Ideation
* Status updates
* Chatting
* Link sharing
__When not to use Slack__
* Complex discussions for benefitting long-term knowledge management
* When doing deep work, Slack can be a distraction with its notifications and demand for immediate feedback
* When you want to prioritize long-term productivity and mental health of participants, and avoid problematic social dynamics and the inevitable pull of social media by design
There is a place for everything, but it is clear that when it comes to [[knowledge management|Knowledge management]], Slack isn't up to the job, which explains the rise of complementary Slack apps like Tettra that solve that problem. As this [[article]] by a former Palantir employee suggests:
<<<
Another knowledge management issue concerns transparency: In theory, all content of public channels is available for all employees, but in practice, only employees following a conversation synchronously are able to follow or contribute to a conversation. For everyone else, the information is typically lost.
<<<
Unlike email where conversations are terse and focus on the topic at hand, chat is full of side conversations even in threads that dilute the conversation.
Patino-Ramirez, F., Arson, C. & Dussutour, A. Substrate and cell fusion influence on slime mold network dynamics. Sci Rep 11, 1498 (2021). https://doi.org/10.1038/s41598-020-80320-2
Objectives should be
* Specific
* Measurable
* Achievable
* Relevant
* Time-Bound
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Smartlabs'>>
</div>
It's the public square so its important to understand them and how to target them.
<<list-links "[tag[Social networks]sort[title]]">>
Social Wiki is where a wiki and a social network collide. Its concepts are inspired from our (University of Carleton, Canada) [[P2Pedia]] project, but because it is integrated in the Moodle LMS it gains account management features, which makes it feasible to integrate many familiar concepts from popular existing social networks. You can “like” a document, and you can “follow” a user. Just like in P2Pedia, a search for a wiki entry will return all existing versions, and you then need to sort the versions according your choice of trust metrics that rely on the “likes” and “follows”.
A huge amount of administrative effort is required for large wiki systems to produce and maintain high quality pages with existing naive access control policies. This paper introduces SocialWiki, a prototype wiki system which leverages the power of social networks to automatically manage reputation and trust for wiki users based on the content they contribute and the ratings they receive. SocialWiki also utilizes interests to facilitate collaborative editing. Although a wiki page is visible to everyone, it can only be edited by a group of users who share similar interests and have a certain level of trust with each other. The editing privilege is circulated among these users to prevent/reduce vandalisms and spams, and to encourage user participation by adding social context to the revision process of a wiki page. By presenting the design and implementation of this proof-of-concept system, we show that social context can be used to build an efficient, self-adaptive and robust collaborative editing system.
<p>[[Source|https://azeynalli1990.medium.com/software-architecture-cheat-sheet-for-daily-usage-9923922ea75b]]</p>
<p>Having clean software architecture and staying conform to pre-defined design principles from start of the project is one of the best ways to avoid possible technical debt in the future of that software system. Clean Software Design is a key point for an effective software product.<br />
Let us have a look at some important principles, rules, guidelines that ensure a clean software design:</p>
<p><em>Principles:</em></p>
<ol>
<li><em>Loose Coupling — </em>if classes use each other, they are coupled together. The less classes are coupled, the easier is to change them.</li>
<li><em>High Cohesion — </em>degree to which elements of a whole belong together. Components of the class should be highly cohesive.</li>
<li><em>Only Local Changes — </em>Changes, maintenance, extensions are only local. This leads to no harming whole environment.</li>
<li><em>Easy to Remove —</em> Software Components should be easily removeable.</li>
<li><em>Small Components — </em>software system should be only of small components ideally each doing only one task.</li></ol>
<p><em>Class Design:</em></p>
<ol>
<li><em>Single Responsibility Principle (SRP) — </em>class should do only one task.</li>
<li><em>Open Closed Principle (OCP) — </em>class should be extended not modified.</li>
<li><em>Liskov Substitution Principle (LSP) — </em>derived classes must be substitutable for their base classes.</li>
<li><em>Dependency Inversion Principle (DIP) — </em>depend on abstractions, not on concretions.</li>
<li><em>Interface Segregation Principle (ISP) — </em>interfaces should be fine-grained</li>
<li>Classes Should be Small.</li>
<li><em>Do stuff or know others, but not both.</em></li></ol>
<p><em>Cohesion Principles:</em></p>
<ol>
<li><em>Release Reuse Equivalency Principle (RREP) —</em> only together releaseable components should be bundled together.</li>
<li><em>Common Closure Principle (CCP) — </em>classes that change together should be bundled together.</li>
<li><em>Common Reuse Principle (CRP) — </em>classes that are used together should be bundled together.</li></ol>
<p><em>Coupling Principles:</em></p>
<ol>
<li><em>Acyclic Dependencies Principle (ADP) — </em>no dependency cycles.</li>
<li><em>Stable Dependencies Principle (SDP) — </em>depend on direction of stability.</li>
<li><em>Stable Abstractions Principle (SAP) —</em> the more abstract, the more stable.</li></ol>
<p>High-Level Design:</p>
<ol>
<li><em>Keep Configurable Data at High Levels —</em> constants or config datas should be kept in high level.</li>
<li><em>Don’t Be Arbitrary — </em>have a convention, principle, rule or guidelines and always follow them.</li>
<li><em>Prefer Polymorphism To If/Else or Switch/Case.</em></li>
<li><em>Symmetry / Analogy — </em>Favour symmetric designs (e.g. Load — Save) and designs that follow analogies (e.g. same design as found in .NET framework).</li>
<li><em>Separate Multi-Threading Code —</em> isolate multi-thread from rest of the code.</li>
<li><em>Code at Wrong Level of Abstraction —</em> stay conform to existing abstraction layers.</li>
<li><em>Fields Not Defining State — </em>fields holding data that does not belong to the state of the instance but are to hold temporary data. Use local variables or extract to a class abstracting the performed action.</li>
<li><em>Micro Layers — </em>avoid unnecessary design layers.</li></ol>
<p><em>Environment:</em></p>
<ol>
<li><em>Project Build Requires Only One Step.</em></li>
<li><em>Executing Tests Requires Only One Step.</em></li>
<li><em>Source Control System — </em>Always use a source control system.</li>
<li><em>Continuous Integration — </em>Assure integrity with Continuous Integration.</li>
<li><em>Overridden Safeties — </em>Do not override warnings, errors, exception handling</li></ol>
<p><em>Dependencies:</em></p>
<ol>
<li><em>Make Logical Dependencies Physical</em> — If one module depends upon another, that dependency should be physical not just logical. Don’t make assumptions.</li>
<li><em>Singletons / Service Locator</em> — Make use of dependency injection.</li>
<li><em>Base Classes Depending On Their Derivatives</em> — Base classes should work with any derived class.</li>
<li><em>Feature Envy</em> — The methods of a class should be interested in the variables and functions of the class they belong to, and not the variables and functions of other classes. Using accessors and mutators of some other object to manipulate its data, is envying the scope of the other object (c).</li>
<li><em>Artificial Coupling</em> — Things that don’t depend upon each other should not be artificially coupled.</li>
<li><em>Hidden Temporal Coupling</em> — If the order of some method calls is important, then make sure that they cannot be called in the wrong order.</li>
<li><em>Transitive Navigation</em> — (Law of Demeter), writing shy code. A module should know only its direct dependencies.</li></ol>
# Dedoose (mixed research analysis tool that's web based and collaborative)
# NVIVO
<p>Like any other programming language, JavaScript is also subject to the principles outlined in SOLID.</p>
<p>SOLID consists of 5 concepts that we can use to make our programs better. They are:</p>
<ul>
<li>Single responsibility principle</li>
<li>Open / closed principles</li>
<li>Liskov Substitution principle</li>
<li>Interface segregation principle</li>
<li>Dependency inversion principle</li></ul>
<p>In this article, we’ll look at each and see how we can apply them to JavaScript programs.</p>
<h1>Single Responsibility Principle</h1>
<p>The single responsibility principle says that each of our classes has to be only used for one purpose.</p>
<p>We need this so that we don’t have to change code as often when something changes. It’s also hard to understand what the class is doing if it’s doing many things.</p>
<p>Unrelated concepts in the same class also make comprehending the purpose of the code harder.</p>
<p>For example, we can write something like the following to follow the single responsibility principle:</p>
<pre>class Rectangle {
constructor(length, width) {
this.length = length;
this.width = width;
} get area() {
return this.length * this.width;
}
}</pre>
<p>The <code>Rectangle</code> class above only has the <code>length</code> and <code>width</code> of a rectangle as members and lets us get the area from it.</p>
<p>It does nothing else, so it follows the single responsibility principle.</p>
<p>A bad example would be:</p>
<pre>class Rectangle {
constructor(length, width) {
this.length = length;
this.width = width;
} get area() {
return this.length * this.width;
} createCircle() { }
}</pre>
<p>We should have a <code>createCircle</code> method in a <code>Rectangle</code> class since they’re unrelated concepts.</p>
<h1>Open/Closed Principle</h1>
<p>The open/closed principle states that a piece of software is open for extension but closed for modification.</p>
<p>This means that we should be able to add more functionality without changing existing code.</p>
<p>For example, if we have the following <code>Rectangle</code> class:</p>
<pre>class Rectangle {
constructor(length, width) {
this.length = length;
this.width = width;
} get area() {
return this.length * this.width;
}
}</pre>
<p>Then if we want to add a function to for calculating its perimeter, we can do it by adding a method to do it as follows:</p>
<pre>class Rectangle {
constructor(length, width) {
this.length = length;
this.width = width;
} get area() {
return this.length * this.width;
} get perimteter() {
return 2 * (this.length + this.width);
}
}</pre>
<p>As we can see, we didn’t have to change existing code to add it, which satisfies the open/closed principle.</p>
<h1>Liskov Substitution Principle</h1>
<p>This principle states that if we have a parent class and a child class, then we can interchange the parent and child class without getting incorrect results.</p>
<p>This means that the child class must implement everything that’s in the parent class. The parent class serves the class has the base members that child classes extend from.</p>
<p>For example, if we want to implement classes for a bunch of shapes, we can have a parent <code>Shape</code> class, which are extended by all classes by implementing everything in the <code>Shape</code> class.</p>
<p>We can write the following to implement some shape classes and get the area of each instance:</p>
<pre>class Shape {
get area() {
return 0;
}
}class Rectangle extends Shape {
constructor(length, width) {
super();
this.length = length;
this.width = width;
} get area() {
return this.length * this.width;
}
}class Square extends Shape {
constructor(length) {
super();
this.length = length;
} get area() {
return this.length ** 2;
}
}class Circle extends Shape {
constructor(radius) {
super();
this.radius = radius;
} get area() {
return Math.PI * (this.radius ** 2);
}
}const shapes = [
new Rectangle(1, 2),
new Square(1, 2),
new Circle(2),
]for (let s of shapes) {
console.log(s.area);
}</pre>
<p>Since we override the <code>area</code> getter in each class that extends <code>Shape</code> , we get the right area for each shape since the correct code is run for each shape to get the area.</p>
<h1>Interface Segregation Principle</h1>
<p>The interface segregation principle states that “clients shouldn’t be forced to depend on interfaces that they don’t use.”</p>
<p>This means that we shouldn’t impose the implementation of something if it’s not needed.</p>
<p>JavaScript doesn’t have interfaces, so this principle doesn’t apply directly since it doesn’t enforce the implementation of anything via interfaces.</p>
<h1>Dependency Inversion Principle</h1>
<p>This principle states that high-level modules shouldn’t depend on low-level modules and they both should depend on abstractions, and abstractions shouldn't depend upon details. Details should depend upon abstractions.</p>
<p>This means that we shouldn’t have to know any implementation details of our dependencies. If we do, then we violated this principle.</p>
<p>We need this principle because if we do have to reference the code for the implementation details of a dependency to use it, then when the dependency changes, there’s going to be lots of breaking changes to our own code.</p>
<p>As software gets more complex, if we don’t follow this principle, then our code will break a lot.</p>
<p>One example of hiding implementation details from the code that we implement is the facade pattern. The pattern puts a facade class in front of the complex implementation underneath so we only have to depend on the facade to use the features underneath.</p>
<p>If the underlying classes change, then only the facade has to change and we don’t have to worry about making changes to our own code unless the facade has breaking changes.</p>
<p>For example, the following is a simple implementation of the facade pattern:</p>
<pre>class ClassA {}class ClassB {}class ClassC {}class Facade {
constructor() {
this.a = new ClassA();
this.b = new ClassB();
this.c = new ClassC();
}
}class Foo {
constructor() {
this.facade = new Facade();
}}</pre>
<p>We don’t have to worry about <code>ClassA</code> , <code>ClassB</code> and <code>ClassC</code> to implement the <code>Foo</code> class. As long as the <code>Facade</code> class doesn’t change, we don’t have to change our own code.</p>
<h1>Conclusion</h1>
<p>We should follow the SOLID principle to write code that’s easy to maintain.</p>
<p>To following SOLID, we have to write classes that only do one thing.</p>
<p>Our code has to open for extension but closed for modification. This reduces the chance of messing up the existing code.</p>
<p>Parent and child classes have to be interchangeable when we switch them. When we switch them, the result still has to be correct.</p>
<p>Finally, we should never have to depend on the implementation details of any piece of code that we reference so that we won’t end up with lots of breaking changes when something changes.</p>
<p>This lets us reduce the coupling between modules.</p>
\define solution-tag()
[[$(currentTiddler)$ Solution]] [[$(currentTiddler)$]]
\end
\define solution-filtertagparam()
$(currentTiddler)$ Solution
\end
''Solution''
<$button style="border: none; font-size: 10px">
➕
<$action-sendmessage $message="tm-new-tiddler" tags=<<solution-tag>> title="Solution item" />
Add item
</$button>
<ol>
<$list filter="[!has[draft.of]tag<solution-filtertagparam>sort[created]]">
<li style="font-size: 12px">
<$link to={{!!title}}><$view field="title"/></$link>
<$button message="tm-delete-tiddler" param={{!!title}} style="border:none;">❎</$button>
</li>
</$list>
</ol>
Solution Space refers to all the potential solutions to a given problem or problem space/constraints.
How do you know if what you're noting down in your personal knowledge management tool is/isn't already there?
You'd probably have to resort to AI solutions or some other means of comparing textual records against what you want to add.
Spaced repetition is the only proven metacognitive tool that seems to work as advertised. It is the basis for using flash cards as a means of assimilating and retaining more knowledge without compromising understanding of the material.
From an essay by Andy Matuschak on Why books don't work:
<<<
To help people encode more into long-term memory, we can draw on another powerful idea from cognitive science: spaced repetition. By re-testing yourself on material you’ve learned over expanding intervals, you can cheaply and reliably commit huge volumes of information to long-term memory. For a review of this effect’s practical implications, see Michael Nielsen’s “Augmenting Long-term Memory”. For more on the empirical evidence, this review by David Balota and colleagues is a good starting point.
Of course, memory is only a small slice of “understanding,” but to illustrate how one might begin to address understanding as a whole, let’s explore how we might weave a medium out of these two ideas about memory.
<<<
A tiddlywiki containing a free space that allows for manipulating and navigating between data items freely using drag, drop, attach and zoom-in-out mechanisms. This could also be turned into a LiveBoard for teams and groups, like in Miro or [[Muse|https://museapp.com/]] (see below).
<video autoplay loop width="100%" height="auto" src="https://media.museapp.com/website/2020-08-18-hero-1920w.mp4#t=0.01"></video>
* Begun split testing using Clicky
* Created tw5 centric index page for split testing with main branch index page
* Changed About page in main branch to more formal language
<p>1. What is Database?</p>
<p>A database is an organized collection of data, stored and retrieved digitally from a remote or local computer system. Databases can be vast and complex, and such databases are developed using fixed design and modeling approaches.</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/developers">#developers</a></p>
<p>2. What is DBMS?</p>
<p>DBMS stands for Database Management System. DBMS is a system software responsible for the creation, retrieval, updating and management of the database.</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/developers">#developers</a></p>
<p>3. What is SQL?</p>
<p>SQL stands for Structured Query Language. It is the standard language for relational database management systems. It is especially useful in handling organized data comprised of entities and relations between different entities of the data.</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a></p>
<p>4. What is the difference between SQL and MySQL?</p>
<p>SQL is a standard language for retrieving and manipulating structured databases. On the contrary, MySQL is a relational database management system, like <a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a> Server, Oracle , that is used to manage SQL databases.</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a></p>
<p>5. What are Tables and Fields?</p>
<p>A table is an organized collection of data stored in the form of rows and columns. Columns can be categorized as vertical and rows as horizontal. The columns in a table are called fields while the rows can be referred to as records</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a></p>
<p>6. What is a Primary Key?</p>
<p>The PRIMARY KEY constraint uniquely identifies each row in a table. It must contain UNIQUE values and has an implicit NOT NULL constraint.</p>
<p>A table in SQL is strictly restricted to have one and only one primary key.</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/developers">#developers</a></p>
<p>7. What is a UNIQUE constraint?</p>
<p>A UNIQUE constraint ensures that all values in a column are different. This provides uniqueness for the column(s) and helps identify each row uniquely. Unlike the primary key, there can be multiple unique constraints defined per table.</p>
<p><a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a></p>
<p>8. What is a Foreign Key?</p>
<p>A FOREIGN KEY comprises of single or collection of fields in a table that essentially refers to the PRIMARY KEY in another table. Foreign key constraint ensures referential integrity in the relation between two tables.</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/developers">#developers</a> <a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a></p>
<p>9. What is a Join? List its different types.</p>
<p>The SQL Join clause is used to combine records (rows) from two or more tables in a SQL database based on a related column between the two.</p>
<p>Types -</p>
<p>INNER JOIN<br />
LEFT OUTER JOIN<br />
RIGHT OUTER JOIN<br />
FULL OUTER JOIN</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a></p>
<p>10. What is a Query?</p>
<p>A query is a request for data or information from a database table or combination of tables. A database query can be either a select query or an action query.</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a></p>
<p>11. SQL create and drop database?</p>
<p>Create database db_name -<br />
=> CREATE DATABASE db_name;</p>
<p>Drop database db_name -<br />
=> DROP DATABASE db_name;</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a></p>
<p>12. Create and drop a table in SQL?</p>
<p>CREATE TABLE table_name (<br />
column1 datatype,<br />
column2 datatype,<br />
column3 datatype,<br />
....<br />
);</p>
<p>DROP TABLE table_name;</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a></p>
<p>13. What is the difference between DROP and TRUNCATE statements?</p>
<p>If a table is dropped, all things associated with the tables are dropped as well. However, if a table is truncated, none of the above problems exist and the table retains its original structure.</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a></p>
<p>14. How do we use the DISTINCT statement?</p>
<p>The DISTINCT statement is used with the SELECT statement. If a record contains duplicate values then DISTINCT will select different values among duplicate records.</p>
<p>Syntax-<br />
SELECT DISTINCT column_name<br />
FROM table_name;</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a></p>
<p>15. What is ACID property?</p>
<p>In order to maintain consistency in a database, before and after the transaction, certain properties are followed. These are called ACID properties.</p>
<p>- Atomicity<br />
- Consistency<br />
- Isolation<br />
- Durability</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a></p>
<p>16. How many Aggregate functions are available in SQL?</p>
<p>SQL Aggregate functions calculate values from multiple columns and return a single value. There are 7 aggregate functions in SQL:</p>
<p>1. AVG()<br />
2. COUNT()<br />
3. MAX()<br />
4. MIN()<br />
5. SUM()<br />
6. FIRST()<br />
7. LAST()</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a></p>
<p>17. What is View in SQL?</p>
<p>A View can be defined as a virtual table that contains rows and columns with fields from one or more tables.</p>
<p>Syntax:</p>
<p>CREATE VIEW view_name AS<br />
SELECT column_name(s)<br />
FROM table_name<br />
WHERE condition</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a></p>
<p>18. What is SQL Injection?</p>
<p>SQL Injection is a type of database attack technique where malicious SQL statements are inserted into an entry field of the database in a way that once it is executed, the database is exposed to an attacker for the attack.</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a></p>
<p>19. What is Normalization? How many Normalization forms are there?</p>
<p>Normalization is used to organize the data tor remove redundancies .</p>
<p>5 type of normal form:</p>
<p>First Normal Form(1NF)<br />
First Normal Form(2NF)<br />
Third Normal Form(3NF)<br />
Fourth Normal Form(BCNF)</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a></p>
<p>20. What is a Relationship? How many types of Relationships are there?</p>
<p>The relationship can be defined as the connection between more than one table in the database.</p>
<p>Type of Relationship -<br />
1. One to One<br />
2. Many to One<br />
3. Many to Many<br />
4. One to Many</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a></p>
<p>21. How to select all records from the table?</p>
<p>To select all the records from the table we need to use the following syntax:</p>
<p>SELECT * FROM table_name;</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a> <a href="https://threadreaderapp.com/hashtag/SQL">#SQL</a></p>
<p>22. Difference between TRUNCATE, DELETE, and DROP commands?</p>
<p>DELETE removes some or all rows from a table based on the condition.<br />
TRUNCATE removes ALL rows from a table by deallocating the memory pages.<br />
DROP command removes a table from the database completely.</p>
<p><a href="https://threadreaderapp.com/hashtag/100DaysOfCode">#100DaysOfCode</a></p>
<p>23. Define UNION, MINUS, UNION ALL?</p>
<p>MINUS – returns all distinct rows selected by the first query but not by the second.<br />
UNION – returns all distinct rows selected by either query<br />
UNION ALL – returns all rows selected by either query, including all duplicates.</p>
!!! __Basic terms and concepts__
# Databases consist of tables which consist of finite columns and infinite rows, and a single primary key column that uniquely identifies each record.
# SQL is a query language that allows for retrieval and manipulation of data
# SQL is NOT case sensitive, does not care about line breaks or white spaces, and each queries should end with a semi colon in case of multiple queries. Note comments are not supported in Microsoft Access databases
!!! __Syntax and statements__
__`SHOW` statement__
This shows information about something like a database or a table.
e,g.
```sql
SHOW database_name;
SHOW table_name;
```
__`SELECT` statement__
```sql
/*SELECT * FROM Customers;
SELECT * FROM Products;
SELECT * FROM Orders;
SELECT * FROM Categories;*/
SELECT column_name, another_column_name FROM table_name
-- You can also use the dot notation for different tables with similar column names. This is called a FULLY QUALIFIED NAME
SELECT customers.City from customers;
```
__`ORDER BY`__
This allows us to sort according to a column in ASCENDING order by default.
```sql
SELECT * FROM customers
ORDER BY FirstName
```
__`DISTINCT`__
This allows you to get rid of repetitive records.
e.g.
```sql
SELECT DISTINCT city FROM students;
```
__`LIMIT`__
This allows you to restrict results to a certain number of records, and from a certain offset
e.g.
```sql
SELECT column_name FROM table_name LIMIT 5; -- limit to first 5 records
SELECT column_name FROM table_name LIMIT 3,5; -- offset from 0 by 3, so it will show the 4th record
```
[[About JOIN|Joins in SQL]]
Date: 23/6/2020
Duration: 1400-1435hrs
Attendees: Marketing team of Stanbic Bank Tanzania
# Aloyce Kazikali
# Albert Swai
# Baraka Milinga
# Bernard M
# Abraham Samma
Agenda: Alignment with Innovation Peer offering
Decisions made: Date for marketing sprint demo to be set by their internal team. Location could be boardroom at Stanbic bank or our boardroom. Remote back is available as per request should it not be in line with Stanbic COVID-19 policy.
Saw a nice use of queries in Logseq where blocks are organized into daily standups. This can easily be implemented in TiddlyWiki, but what's the best way to implement such a thing?
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Startup'>>
</div>
Startup should first load all tiddlers in PouchDB, including the necessary system tiddlers. This should all happen before startup, so `exports.after= ['startup']`. I think the lagging behind on first load is because the story is being updated before the tiddlers are made available via the syncer which is loaded relatively late.
I'm not yet sure if we should work on making this entire startup synchronous or not. But if the data is already immediately available in the browser then we might as well let is work synchronously UNLESS maybe we'd like to load all plugins from the backend early.
The syncer should instead concentrate on loading stuff from the backend as much as possible.
Addendum: had to add an `exports.before = ["render", "story"]` to force TiddlyWiki to perform these steps before rendering & creating the story. That did the trick! 🎉
{{Pending items}}
We'll start off with brief remarks on what VC is and what do VC funds do.
# When is it the right time for a startup to go to a VC?
# What can a startup team expect when they go for VC?
# Are there any hidden dangers that startups underestimate when they go the VC route?
# Stages of funding or what the hell is pre-seed and seed funding? And what does each stage demand from the team?
# What are the trade offs of accepting VC funds versus other debt and equity options?
# What can a founder do to prevent the derailment of the company vision/mission, or retain control without upsetting VC investors?
# Most frequently asked question from the audience: what is SAFE and who else does it, and is it right for my company?
# What is the current landscape of the VC funding in Tanzania and how does it compare with the last 5 to ten years?
# What challenges VCs are facing in investing in Africa?
# Do African startups meet expectations of investors; are they ready for investment?
# What should Tanzania, and by extension African ecosytems do more to attract more VC investment?
__Wrap up question__
What golden rule would you offer to any VC in Tanzania and a startup founder looking for funding?
__Promo__
* https://the-african-unicorn.simplecast.com/episodes/episode-07-part-one
* https://drive.google.com/drive/folders/1O5c_BVdgyqPx73ZAXrxvrz9BND_mpYZ5?usp=sharing
* How do you get funding for your startup company? What's required? In this episode of The Next African Unicorn, we sit down with Salum Awadh, CEO of SSC Capital, a corporate advisory and investment management firm to answer just that, as well as talk about the his newly launched crowdfunding equity platform for local businesses, Wengi dot co dot tz. Tune in now!
I see that the unique value proposition with the problem statement and I think it looks much better than before. Much more convincing.
I think I will also try to justify each feature with a certain aspect of the problem.
# for goal setting, we justified by the fact that many respondents in the KPMG report said that unclear goals was one challenge
# assigning tasks and setting time blocks can be justified by the fact that many respondents in the report said that distractions like email ping pong and what not is another challenge. Time is a resource that cannot be replaced.
# progress analytics is business intelligence. Knowing how long something can take exactly is better than relying on guesstimates, which can lead to all sorts of problems like budget overruns.
# knowledge management. Well, do we really need to say it?
div.tc-tiddler-title {
top: 44px;
}
<$button>
<$action-sendmessage $message="tm-new-tiddler" tags="[[aika blind angel chapter]]" title="Chapter Title" />
Create New Chapter
</$button>
<<list-links "[tag[aika blind angel chapter]!sort[created]]">>
A family of seven suddenly find themselves suddenly trapped in the forests surrounding Mount Kilimanjaro. They cannot get out. A lurking malevolent force won't allow them to get out. Meanwhile, signs appear that point to an even greater threat beyond.
A ''String Literal'' in Formulas is a quoted piece of text. `'single quotes'` or `"double quotes"` may be used.
The backslash `\` may be used to "escape" characters that are difficult to include in the string normally:
|Escape Code|Result|h
|`\\`|`\`|
|`\'`|`'`|
|`\"`|`"`|
|`\n`|Line break.|
|`\r`|Carriage return.|
|`\t`|Horizontal tab.|
|`\v`|Vertical tab.|
|`\f`|Form Feed.|
|`\b`|Backspace.|
|`\0`|Null character.|
|`\u1234`|Unicode character #1234. (Any 4-digit hexadecimal value may be used.)|
Strings may be concatenated with other values using the `&` [[operator|Operators]], resulting in a string.
.template-container-style {
overflow-x: auto;
}
.template-table-style {
width: 100%;
height: 350px;
}
table.template-table-style tbody tr td {
white-space: nowrap;
}
.text-input {
width: 100%;
}
.danger-delete-btn {
background-color: #ff0000ad;
}
.app-btn {
border: none;
padding: 0 0 0 0;
}
.app-btn img {
width: 30px;
height: 30px;
}
Subscription is a thing these days. And I am quickly losing track of all my subscriptions. There is a popular app called Subs 2.0 at Product Hunt that allows you to not only track your subscriptions, but also allows you to switch them on or off. A nifty idea. Wonder if I could implement that in TW5?
__Inspiration__
Pat's experience with waking up at 4am to get to know cases with confusing, contradictory case notes, which sometimes contain blatantly wrong information based on what I can only imagine are false memories, before ward rounds.
This has caused her visible distress and leads to awkward moments where the patient has to remind the doctors about their most basic history details.
__Problem__
Professionals require a means of getting to know a case quickly without missing any crucial details so that they can begin contributing to the decision making process. However, access to good quality summaries that remain accurate and up-to-date is almost non-existent.
__Solution__
Automate the creation of "smart case summaries" for different contexts.
Would folks want one or the other? Or maybe both?
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Has anyone adopted an enterprise search solution that makes it easy to search across Google Drive, Slack, JIRA, Confluence and GitHub? Looking for recommendations.</p>— Jeremy Lewi (@jeremylewi) <a href="https://twitter.com/jeremylewi/status/1478708975768006659?ref_src=twsrc%5Etfw">January 5, 2022</a></blockquote>
There are some interesting open solutions like [[datasette|https://datasette.io/]]:
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">I built one at a previous employer. It ran on a cron and pulled in docs from Confluence, GitHub wikis, markdown in GitHub, Google Docs and a few other places, stuck them in a SQLite FTS database and ran a <a href="https://twitter.com/datasetteproj?ref_src=twsrc%5Etfw">@datasetteproj</a> search UI over the top. Worked really well!</p>— Simon Willison (@simonw) <a href="https://twitter.com/simonw/status/1478761949374541825?ref_src=twsrc%5Etfw">January 5, 2022</a></blockquote>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">That script wasn't open source, but I've since built an open source alternative: <a href="https://t.co/4PpTp6H4EI">https://t.co/4PpTp6H4EI</a><br><br>Here's a demo: <a href="https://t.co/wRC1uk5Fa6">https://t.co/wRC1uk5Fa6</a></p>— Simon Willison (@simonw) <a href="https://twitter.com/simonw/status/1478762309493268482?ref_src=twsrc%5Etfw">January 5, 2022</a></blockquote>
As well as commercial options like [[Glean|https://glean.com]].
We're drowning in Swahili recordings yet we don't have a means of transcribing this data?
A Sybil attack is a kind of security threat on an online system where one person tries to take over the network by creating multiple accounts, nodes or computers.
This can be as simple as one person creating multiple social media accounts.
But in the world of cryptocurrencies, a more relevant example is where somebody runs multiple nodes on a blockchain network.
The word “Sybil” in the name comes from a case study about a woman named Sybil Dorsett, who was treated for Dissociative Identity Disorder – also called Multiple Personality Disorder.
! Introduction
SyncAdaptorModules encapsulate storage mechanisms that can be used by the SyncMechanism. Two examples are:
* The TiddlyWebAdaptor interfaces with servers compatible with TiddlyWeb's HTTP API, such as TiddlyWeb itself and TiddlyWiki5's built-in ServerMechanism.
* The LocalFileAdaptor interfaces with file systems with an API compatible with Node.js's `fs` module
SyncAdaptorModules are represented as JavaScript tiddlers with the field `module-type` set to `syncadaptor`.
See [[this pull request|https://github.com/Jermolene/TiddlyWiki5/pull/4373]] for background on the evolution of this API.
! Exports
The following properties should be exposed via the `exports` object:
|!Property |!Description |
|adaptorClass |The JavaScript class for the adaptor |
Nothing should be exported if the adaptor detects that it isn't capable of operating successfully (eg, because it only runs on either the browser or the server, or because a dependency is missing).
! Adaptor Module Methods
Adaptor modules must handle the methods described below.
!!! Error Handling
The syncadaptor must invoke the provided callback with the ''err'' parameter containing a string describing the error.
The syncer has special handling for connection errors. For backwards compatibilty reasons, the syncer identifies connection errors as the string comprised of the content of the tiddler $:/language/Error/XMLHttpRequest with the string ": 0" appended to the end. For example, in English, the string is "XMLHttpRequest error code: 0" and in Brazilian Portuguese it is "Código de erro XMLHttpRequest: 0".
!! `Constructor(options)`
Initialises a new adaptor instance.
|!Parameter |!Description |
|options |See below |
Options include:
* ''options.wiki'': reference to wiki to use with this syncadaptor
!! `getTiddlerInfo(tiddler)`
Gets the supplemental information that the adaptor needs to keep track of for a particular tiddler. For example, the TiddlyWeb adaptor includes a `bag` field indicating the original bag of the tiddler.
|!Parameter |!Description |
|tiddler |Target tiddler |
Returns an object storing any additional information required by the adaptor.
!! `getTiddlerRevision(title)`
Gets the revision ID associated with the specified tiddler title.
|!Parameter |!Description |
|title |Tiddler title |
Returns a revision ID.
!! `getStatus(callback)`
Retrieves status information from the server. This method is optional.
|!Parameter |!Description |
|callback |Callback function invoked with parameters `err,isLoggedIn,username,isReadOnly` |
!! `login(username,password,callback)`
Attempts to login to the server with specified credentials. This method is optional.
|!Parameter |!Description |
|username |Username |
|password |Password |
|callback |Callback function invoked with parameter `err` |
!! `displayLoginPrompt(syncer)`
Invoked by the syncer to display a custom login promopt. This method is optional.
|!Parameter |!Description |
|syncer |Reference to the syncer object making the call |
The custom login prompt should send the widget message `tm-login` with the username and password in parameters ''username'' and ''password''.
!! `logout(callback)`
Attempts to logout of the server. This method is optional.
|!Parameter |!Description |
|callback |Callback function invoked with parameter `err` |
!! `getUpdatedTiddlers(syncer,callback)`
Retrieves the titles of tiddlers that need to be updated from the server.
This method is optional. If an adaptor doesn't implement it then synchronisation will be unidirectional from the TiddlyWiki store to the adaptor, but not the other way.
The syncer will use the `getUpdatedTiddlers()` method in preference to the `getSkinnyTiddlers()` method.
|!Parameter |!Description |
|syncer |Reference to the syncer object making the call |
|callback |Callback function invoked with parameter `err,data` -- see below |
The data provided by the callback is as follows:
```
{
modifications: [<array of title>],
deletions: [<array of title>],
}
```
!! `getSkinnyTiddlers(callback)`
Retrieves a list of skinny tiddlers from the server.
This method is optional. If an adaptor doesn't implement it then synchronisation will be unidirectional from the TiddlyWiki store to the adaptor, but not the other way.
The syncer will use the `getUpdatedTiddlers()` method in preference to the `getSkinnyTiddlers()` method.
|!Parameter |!Description |
|callback |Callback function invoked with parameter `err,tiddlers`, where `tiddlers` is an array of tiddler field objects |
!! `saveTiddler(tiddler,callback)`
Saves a tiddler to the server.
|!Parameter |!Description |
|tiddler |Tiddler to be saved |
|callback |Callback function invoked with parameter `err,adaptorInfo,revision` |
|tiddlerInfo |The tiddlerInfo maintained by the syncer for this tiddler |
!! `loadTiddler(title,callback)`
Loads a tiddler from the server.
|!Parameter |!Description |
|title |Title of tiddler to be retrieved |
|callback |Callback function invoked with parameter `err,tiddlerFields` |
!! `deleteTiddler(title,callback,options)`
Delete a tiddler from the server.
|!Parameter |!Description |
|title |Title of tiddler to be deleted |
|callback |Callback function invoked with parameter `err` |
|options |See below |
The options parameter contains the following properties:
|!Property |!Description |
|tiddlerInfo |The tiddlerInfo maintained by the syncer for this tiddler |
System tags are used to give special behaviour to tiddlers.
! Available system tags
These are the available system tags
|<<tag "$:/tags/AboveStory">> |for elements to be placed at the top of the story river |
|<<tag "$:/tags/AdvancedSearch>> |for search elements |
|<<tag "$:/tags/AdvancedSearch/FilterButton>> |for filter buttons |
|<<tag "$:/tags/Alert>> |for alerts |
|<<tag "$:/tags/BelowStory>> |for elements to be placed at the bottom of the story river |
|<<tag "$:/tags/ControlPanel>> |for control panel tabs |
|<<tag "$:/tags/ControlPanel/Advanced>> |for control panel advanced tabs |
|<<tag "$:/tags/ControlPanel/Appearance>> |for control panel appearance tabs |
|<<tag "$:/tags/ControlPanel/Info>> |for control panel info tabs |
|<<tag "$:/tags/ControlPanel/Saving>> |for saving configurations |
|<<tag "$:/tags/ControlPanel/Settings>> |for control panel settings tabs |
|<<tag "$:/tags/ControlPanel/Toolbars>> |for control panel toolbar customisation tabs |
|<<tag "$:/tags/EditorToolbar>> |for the editor toolbar buttons |
|<<tag "$:/tags/EditPreview>> |for custom preview panes |
|<<tag "$:/tags/EditTemplate>> |for the edit template |
|<<tag "$:/tags/EditToolbar>> |for the edit mode tiddler toolbar |
|<<tag "$:/tags/Exporter>> |for the exporters |
|<<tag "$:/tags/Filter>> |for filters in advanced seach sample filter dropdown |
|<<tag "$:/tags/Image>> |for (core) images |
|<<tag "$:/tags/Manager/ItemMain>> |for the tiddler manager. $:/Manager |
|<<tag "$:/tags/Manager/ItemSidebar>> |for the tiddler manager |
|<<tag "$:/tags/Macro>> |for global macros |
|<<tag "$:/tags/MoreSideBar>> |for tabs in the "more" sidebar |
|<<tag "$:/tags/MoreSideBar/Plugins>> |for Sidebar: More: Plugins tab |
|<<tag "$:/tags/PageControls>> |for the page control tools in the sidebar |
|<<tag "$:/tags/PageTemplate>> |for the main page elements |
|<<tag "$:/tags/Palette>> |for colour palettes |
|<<tag "$:/tags/PluginLibrary>> |for the plugin library |
|<<tag "$:/tags/RawMarkup>> |for raw markup to be included in the generated HTML file. To activate the tag, TiddlyWiki needs to be reloaded |
|<<tag "$:/tags/RawMarkupWikified>> |for raw markup to be included in the generated HTML file. To activate the tag, TiddlyWiki needs to be reloaded |
|<<tag "$:/tags/RawStaticContent>> |for "raw" content to be saved into the TW code. Be careful! |
|<<tag "$:/tags/RemoteAssetInfo>> |for plugin import handling |
|<<tag "$:/tags/SearchResults>> |for customised search results |
|<<tag "$:/tags/ServerConnection>> |for plugin import handling |
|<<tag "$:/tags/SideBar>> |for sidebar tabs | |
|<<tag "$:/tags/Stylesheet>> |to indicate that a tiddler should be applied as a CSS stylesheet | |
|<<tag "$:/tags/TagDropdown>> |for tags dropdown sorting |
|<<tag "$:/tags/Texteditor/Snippet>> |for text snippets |
|<<tag "$:/tags/TiddlerInfo>> |for tiddler info panel tabs |
|<<tag "$:/tags/TiddlerInfo/Advanced>> |for tabs under the advanced tiddler tab |
|<<tag "$:/tags/ToolbarButtonStyle>> |for the style of the buttons |
|<<tag "$:/tags/TopLeftBar>> |for the top left bar |
|<<tag "$:/tags/TopRightBar>> |for the top right bar |
|<<tag "$:/tags/ViewTemplate>> |for the view template |
|<<tag "$:/tags/ViewToolbar>> |for the view mode tiddler toolbar |
! ~TiddlyWiki plugins
|<<tag "$:/tags/HelpPanel>> |can be seen at: [[tiddlywiki prerelease|https://tiddlywiki.com/prerelease/]] see: top left page control bubble|
|<<tag "$:/tags/HelpPanel/Videos>> |help panel "videos" tab|
|<<tag "$:/tags/MakeQR>> |can be seen at: [[tiddlywiki prerelease|https://tiddlywiki.com/prerelease/]]. see: Tiddler toolbar |
|<<tag "$:/tags/TranslationGroup>> |used by the [[translators edition|https://tiddlywiki.com/editions/translators/]] |
|<<tag "$:/tags/TwitterUsage>> |twitter plugin |
|<<tag "$:/tags/ViewToolbarButton/QRcode>> |see: [[tiddlywiki prerelease|https://tiddlywiki.com/prerelease/]] |
|<<tag "$:/tags/test-spec>> |tiddlywiki test suite |
! System tags in use
These are the system tags in use in this wiki:
<ul>
<$list filter="[all[shadows+tiddlers]tags[]prefix[$:/]sort[title]]">
<li>{{||$:/core/ui/TagTemplate}}</li>
</$list>
</ul>
* [[Privacy policy|https://www.privacypolicygenerator.info/live.php?token=h4qZBHl3h48yoB9BlrTRhJ9oDNMgTKPk]]
* [[Terms and Conditions|https://www.termsandconditionsgenerator.com/live.php?token=mvhTidtHJzVjbN8Nojmil9wHgW6fYmM3]]
<$macrocall
$name="toc-tabbed-internal-nav"
tag="TableOfContents"
sort=sort[created]
selectedTiddler="$:/temp/toc/selectedTiddler"
unselectedText="<p>Select a topic in the table of contents. Click the arrow to expand a topic.</p>"
missingText="<p>Missing tiddler.</p>"
/>
\define TableWizardDisplayTableDummyMacro()
<<DisplayTable """$(ConfigTiddler)$""">>
\end
\define TableWizardColumnSelectCheckbox()
<$checkbox tiddler='$:/state/$(ConfigTiddler)$/Display Columns/$(ThisDisplayColumn)$' field='show' checked='$(ThisDisplayColumn)$' unchecked=''>
<$view tiddler="""$(ThisDisplayColumn)$""" field=caption>
$(ThisDisplayColumn)$
</$view>
</$checkbox>
\end
\define TableWizardSubcolumnSelectCheckbox()
<$checkbox tiddler='$:/state/$(ConfigTiddler)$/Display Subcolumns/$(ThisDisplaySubcolumn)$' field='show' checked='$(ThisDisplaySubcolumn)$' unchecked=''>
<$view tiddler="""$(ThisDisplaySubcolumn)$""" field=caption>
$(ThisDisplaySubcolumn)$
</$view>
</$checkbox>
\end
\define TableWizardRowSelectCheckbox()
<$checkbox tiddler='$:/state/$(ConfigTiddler)$/Display Rows/$(ThisDisplayRow)$' field='show' checked='$(ThisDisplayRow)$' unchecked=''>
<$view tiddler="""$(ThisDisplayRow)$""" field=caption>
$(ThisDisplayRow)$
</$view>
</$checkbox>
\end
\define TableWizardMakeColumnSelectCheckbox()
<$list filter='[tag{$(ConfigTiddler)$!!column_tag}]' variable=ThisDisplayColumn>
<<TableWizardColumnSelectCheckbox>>
</$list>
\end
\define TableWizardMakeSubcolumnSelectCheckbox()
<$list filter='[tag{$(ConfigTiddler)$!!subcolumn_tag}]' variable=ThisDisplaySubcolumn>
<<TableWizardSubcolumnSelectCheckbox>>
</$list>
\end
\define TableWizardMakeRowSelectCheckbox()
<$list filter='[tag{$(ConfigTiddler)$!!row_tag}]' variable=ThisDisplayRow>
<<TableWizardRowSelectCheckbox>>
</$list>
\end
\define TableWizardButtonSubcolumn()
<$reveal type='nomatch' state="""$:/state/$(ConfigTiddler)$/$(ThisRow)$/$(ThisColumn)$/$(ThisSubcolumn)$""" text='edit'>
<div style='height:100%;width:100%;'>
<$button class='tc-btn-invisible' style='height:100%;width:100%;'>
<$view tiddler="""$:/Data/$(ThisRow)$/$(ThisColumn)$/$(ThisSubcolumn)$/$(ThisItem)$""" field=subcolumn_data>
<<MissingMessage>>
</$view>
<$action-setfield $tiddler="""$:/state/$(ConfigTiddler)$/$(ThisRow)$/$(ThisColumn)$/$(ThisSubcolumn)$""" $value=edit/>
</$button>
</div>
</$reveal>
<$reveal type='match' state="""$:/state/$(ConfigTiddler)$/$(ThisRow)$/$(ThisColumn)$/$(ThisSubcolumn)$""" text='edit'>
<$button>
{{$:/core/images/done-button}}
<$action-setfield $tiddler="""$:/state/$(ConfigTiddler)$/$(ThisRow)$/$(ThisColumn)$/$(ThisSubcolumn)$""" $value=''/>
</$button>
<$edit-text tiddler="""$:/Data/$(ThisRow)$/$(ThisColumn)$/$(ThisSubcolumn)$/$(ThisItem)$""" field=subcolumn_data size=1/>
</$reveal>
\end
\define TableWizardSubcolumnDisplayEntry()
<td>
<$reveal type='nomatch' state="""$(ConfigTiddler)$!!allow_edit""" text='yes'>
<$view tiddler="""$:/Data/$(ThisRow)$/$(ThisColumn)$/$(ThisSubcolumn)$/$(ThisItem)$""" field=subcolumn_data>
<<MissingMessage>>
</$view>
</$reveal>
<$reveal type='match' state="""$(ConfigTiddler)$!!allow_edit""" text='yes'>
<<TableWizardButtonSubcolumn>>
</$reveal>
</td>
\end
\define TableWizardButtonColumn()
<$reveal type='nomatch' state="""$:/state/$(ConfigTiddler)$/$(ThisRow)$/$(ThisColumn)$!!$(ThisColumn)$""" text='edit'>
<div style='height:100%;width:100%;'>
<$button class='tc-btn-invisible' style='height:100%;width:100%;'>
<$view tiddler="""$:/Data/$(ThisRow)$/$(ThisColumn)$/$(ThisItem)$""" field='column_data'>
<<MissingMessage>>
</$view>
<$action-setfield $tiddler="""$:/state/$(ConfigTiddler)$/$(ThisRow)$/$(ThisColumn)$""" $field=$(ThisColumn)$ $value=edit/>
</$button>
</div>
</$reveal>
<$reveal type='match' state="""$:/state/$(ConfigTiddler)$/$(ThisRow)$/$(ThisColumn)$!!$(ThisColumn)$""" text='edit'>
<$button>
{{$:/core/images/done-button}}
<$action-setfield $tiddler="""$:/state/$(ConfigTiddler)$/$(ThisRow)$/$(ThisColumn)$""" $field=$(ThisColumn)$ $value=''/>
</$button>
<$edit-text tiddler="""$:/Data/$(ThisRow)$/$(ThisColumn)$/$(ThisItem)$""" field=column_data size=1/>
</$reveal>
\end
\define TableWizardColumnDisplayEntry()
<td>
<$reveal type='nomatch' state="""$(ConfigTiddler)$!!allow_edit""" text='yes'>
<$view tiddler="""$:/Data/$(ThisRow)$/$(ThisColumn)$/$(ThisItem)$""" field='column_data'>
<<MissingMessage>>
</$view>
</$reveal>
<$reveal type='match' state="""$(ConfigTiddler)$!!allow_edit""" text='yes'>
<<TableWizardButtonColumn>>
</$reveal>
</td>
\end
\define TableWizardDisplayTableWithSubcolumns(DataTag ColumnTag SubcolumnTag RowTag SubcolumnPerColumn EmptyMessage)
@@text-align:center;
<$set name='ColumnList' filter='[prefix[$:/state/$(ConfigTiddler)$/Display Columns]has[show]get[show]tag[$ColumnTag$]sort[title]]-[[text]]-[[title]]-[[modified]]-[[created]]'>
<$set name='SubcolumnList' filter='[prefix[$:/state/$(ConfigTiddler)$/Display Subcolumns]has[show]get[show]tag[$SubcolumnTag$]sort[title]]-[[text]]-[[title]]-[[modified]]-[[created]]'>
<$set name='RowList' filter='[prefix[$:/state/$(ConfigTiddler)$/Display Rows]has[show]get[show]tag[$RowTag$]sort[title]]-[[text]]-[[title]]-[[modified]]-[[created]]'>
<$set name=MissingMessage value='$EmptyMessage$'>
<$set name=ThisItem value={{$(ConfigTiddler)$!!selected_data}}>
<table style='width:100%;border-color:black;'>
<tr>
<td style='background-color:lightgrey;border-color:black;'>
</td>
<$list filter=<<ColumnList>>>
<td colspan="$SubcolumnPerColumn$" style='background-color:lightgrey;border-color:black;'>
<$link to=<<currentTiddler>>>
<$view field='caption'>
<<currentTiddler>>
</$view>
</$link>
</td>
</$list>
</tr>
<tr style='width:100%;bordor-color:black;'>
<td style='border-left-color:black;'>
</td>
<$list filter=<<ColumnList>>>
<$list filter=<<SubcolumnList>> variable=ThisSubcolumn>
<td>
<$link to=<<ThisSubcolumn>>>
<$view tiddler=<<ThisSubcolumn>> field=caption>
<<ThisSubcolumn>>
</$view>
</$link>
</td>
</$list>
</$list>
</tr>
<$list filter=<<RowList>> variable=ThisRow>
<tr>
<td style='border-left:0px;'>
<$link to=<<ThisRow>>>
<$view tiddler=<<ThisRow>> field=caption>
<<ThisRow>>
</$view>
</$link>
</td>
<$list filter=<<ColumnList>> variable=ThisColumn>
<$list filter=<<SubcolumnList>> variable=ThisSubcolumn>
<<TableWizardSubcolumnDisplayEntry>>
</$list>
</$list>
</tr>
</$list>
</table>
</$set>
</$set>
</$set>
</$set>
</$set>
@@
\end
\define TableWizardDisplayTableMacro(DataTag ColumnTag RowTag EmptyMessage)
@@text-align:center;
<$set name='ColumnList' filter='[prefix[$:/state/$(ConfigTiddler)$/Display Columns]has[show]get[show]tag[$ColumnTag$]sort[title]]-[[text]]-[[title]]-[[modified]]-[[created]]'>
<$set name='RowList' filter='[prefix[$:/state/$(ConfigTiddler)$/Display Rows]has[show]get[show]tag[$RowTag$]sort[title]]-[[text]]-[[title]]-[[modified]]-[[created]]'>
<$set name=ThisItem value={{$(ConfigTiddler)$!!selected_data}}>
<$set name=MissingMessage value='$EmptyMessage$'>
<table style='width:100%;border-color:black;'>
<tr>
<td style='background-color:lightgrey;border-color:black;'>
</td>
<$list filter=<<ColumnList>>>
<td style='background-color:lightgrey;border-color:black;'>
<$link to=<<currentTiddler>>>
<$view field='caption'>
<<currentTiddler>>
</$view>
</$link>
</td>
</$list>
</tr>
<$list filter=<<RowList>> variable=ThisRow>
<tr>
<td style='border-left:0px;'>
<$link to=<<ThisRow>>>
<$view tiddler=<<ThisRow>> field=caption>
<<ThisRow>>
</$view>
</$link>
</td>
<$list filter=<<ColumnList>> variable=ThisColumn>
<<TableWizardColumnDisplayEntry>>
</$list>
</tr>
</$list>
</table>
</$set>
</$set>
</$set>
</$set>
@@
\end
\define MakeTableWizard()
Enter the name of the configuration tiddler to create:
<$edit-text tiddler='$:/temp/MakeTableWizard' field='config_tiddler_name' class='tc-edit-texteditor' placeholder='Configuration Tiddler Name'/>
<$reveal type='match' state='$:/temp/MakeTableWizard!!config_tiddler_name' text=''>
You have to enter a configuration tiddler name first.
</$reveal>
<$reveal type='nomatch' state='$:/temp/MakeTableWizard!!config_tiddler_name' text=''>
<$set name=ConfigTiddler value={{$:/temp/MakeTableWizard!!config_tiddler_name}}>
<$checkbox tiddler=<<ConfigTiddler>> field='include_subcolumns' checked='yes' unchecked='no'>Include Subcolumns</$checkbox><br>
<$tiddler tiddler=<<ConfigTiddler>>>
Data tag:
<$edit-text field='dataset_tag' class='tc-edit-texteditor'/>
Select Dataset Name <$reveal type='nomatch' state='!!show_new_dataset' text='true'>(<$button>Create New Datasets<$action-setfield show_new_dataset=true/></$button>):<br><br></$reveal>
<$reveal type='match' state='!!show_new_dataset' text='true'>(<$button>Done Creating Datasets<$action-setfield show_new_dataset=false/></$button>):<br><br>
<$edit-text tiddler='$:/temp/MakeTableWizard' field='new_dataset_name' class='tc-edit-texteditor' placeholder='New Dataset Name'/>
<$button>Create Dataset<$action-setfield $tiddler={{$:/temp/MakeTableWizard!!new_dataset_name}} tags={{!!dataset_tag}}/><$action-setfield $tiddler='$:/temp/MakeTableWizard' new_dataset_name=''/></$button><br><br>
</$reveal>
<$select field='selected_data'><$list filter='[tag{!!dataset_tag}]'><option><<currentTiddler>></option></$list></$select>
<br>
<$set name=SelectedData value={{!!selected_data}}>
Column tag:
<$edit-text field='column_tag' class='tc-edit-texteditor'/><br><br>
Select Columns to display <$reveal type='nomatch' state='!!show_new_column' text='true'>(<$button>Create New Columns<$action-setfield show_new_column=true/></$button>):<br><br></$reveal>
<$reveal type='match' state='!!show_new_column' text='true'>(<$button>Done Creating Columns<$action-setfield show_new_column=false/></$button>):<br><br>
<$edit-text tiddler='$:/temp/MakeTableWizard' field='new_column_name' class='tc-edit-texteditor' placeholder='New Column Name'/>
<$button>Create Column<$action-setfield $tiddler={{$:/temp/MakeTableWizard!!new_column_name}} tags={{!!column_tag}}/><$action-setfield $tiddler='$:/temp/MakeTableWizard' new_column_name=''/></$button><br><br>
</$reveal>
<<TableWizardMakeColumnSelectCheckbox>><br><br>
<$reveal type='match' state='!!include_subcolumns' text='yes'>
Subcolumn tag:
<$edit-text field='subcolumn_tag' class='tc-edit-texteditor'/>
Subcolumns per column:
<$edit-text field='subcolumn_per_column' class='tc-edit-texteditor'/>
Select subcolumns to display <$reveal type='nomatch' state='!!show_new_subcolumn' text='true'>(<$button>Create New Subcolmun<$action-setfield show_new_subcolumn=true/></$button>):<br><br></$reveal>
<$reveal type='match' state='!!show_new_subcolumn' text='true'>(<$button>Done Creating Subcolumns<$action-setfield show_new_subcolumn=false/></$button>):<br><br>
<$edit-text tiddler='$:/temp/MakeTableWizard' field='new_subcolumn_name' class='tc-edit-texteditor' placeholder='New Subcolumn Name'/>
<$button>Create Subcolumn<$action-setfield $tiddler={{$:/temp/MakeTableWizard!!new_subcolumn_name}} tags={{!!subcolumn_tag}}/><$action-setfield $tiddler='$:/temp/MakeTableWizard' new_subcolumn_name=''/></$button><br><br>
</$reveal>
<<TableWizardMakeSubcolumnSelectCheckbox>><br>
</$reveal>
Row tag:
<$edit-text field='row_tag' class='tc-edit-texteditor'/><br><br>
Select rows to display <$reveal type='nomatch' state='!!show_new_row' text='true'>(<$button>Create New Rows<$action-setfield show_new_row=true/></$button>):<br><br></$reveal>
<$reveal type='match' state='!!show_new_row' text='true'>(<$button>Done Creating Rows<$action-setfield show_new_row=false/></$button>):<br><br>
<$edit-text tiddler='$:/temp/MakeTableWizard' field='new_row_name' class='tc-edit-texteditor' placeholder='New Row Name'/>
<$button>Create Row<$action-setfield $tiddler={{$:/temp/MakeTableWizard!!new_row_name}} tags={{!!row_tag}}/><$action-setfield $tiddler='$:/temp/MakeTableWizard' new_row_name=''/></$button><br><br>
</$reveal>
<<TableWizardMakeRowSelectCheckbox>><br><br>
Empty cell message:
<$edit-text field='empty_message' class='tc-edit-texteditor'/>
<$checkbox field='allow_edit' checked='yes' unchecked='no'>Allow Inline Editing</$checkbox><br>
<$reveal type='match' state='!!show_table' text='yes'>
</$reveal>
</$set>
</$tiddler>
<$button>Refresh Table
<$action-setfield dummy=1/>
</$button>
<<TableWizardDisplayTableDummyMacro>>
</$set>
</$reveal>
\end
\define TableWizardDisplayTableInside()
<$reveal type='nomatch' state="""$(ConfigTiddler)$!!include_subcolumns""" text='yes'>
<$macrocall $name=TableWizardDisplayTableMacro DataTag={{$(ConfigTiddler)$!!dataset_tag}} ColumnTag={{$(ConfigTiddler)$!!column_tag}} RowTag={{$(ConfigTiddler)$!!row_tag}} EmptyMessage={{$(ConfigTiddler)$!!empty_message}}/>
</$reveal>
<$reveal type='match' state="""$(ConfigTiddler)$!!include_subcolumns""" text='yes'>
<$macrocall $name=TableWizardDisplayTableWithSubcolumns DataTag={{$(ConfigTiddler)$!!dataset_tag}} ColumnTag={{$(ConfigTiddler)$!!column_tag}} RowTag={{$(ConfigTiddler)$!!row_tag}} EmptyMessage={{$(ConfigTiddler)$!!empty_message}} SubcolumnTag={{$(ConfigTiddler)$!!subcolumn_tag}} SubcolumnPerColumn={{$(ConfigTiddler)$!!subcolumn_per_column}}/>
</$reveal>
\end
\define DisplayTable(ConfigTiddler)
<$set name=ConfigTiddler value="""$ConfigTiddler$""">
<<TableWizardDisplayTableInside>>
</$set>
\end
\define TableMacrosColumnInnerInnerRows()
<tr>
<th>
</th>
<$list filter='$(ColumnList)$+[sort{$(TableMacrosMakeTableSortStateTiddler)$}]'>
<th>
<<currentTiddler>>
</th>
</$list>
</tr>
<$list filter=<<FieldsList>> variable=ThisField>
<tr>
<th>
<$button class='tc-btn-invisible' set=<<TableMacrosMakeTableSortStateTiddler>> setTo=<<ThisField>>><<ThisField>></$button>
</th>
<$list filter='$(ColumnList)$+[sort{$(TableMacrosMakeTableSortStateTiddler)$}]' variable=ThisTiddler>
<td>
<<TableMacrosInlineEditButton>>
</td>
</$list>
</tr>
</$list>
\end
\define TableMacrosInnerColumnTable()
<$set name=FieldsList1 filter='$(ColumnList)$+[fields[]]-[[text]]-[[title]]-[[modified]]-[[created]]-[[tags]]'>
<$set name=FieldsList filter='[is[system]!is[system]]$(FieldsUsed)$' emptyValue=<<FieldsList1>>>
<$set name=RowOrColumn value=Column>
<$set name=TableSortState value=<<TableMacrosMakeTableSortState>>>
<table>
<<TableMacrosColumnInnerInnerRows>>
</table>
</$set>
</$set>
</$set>
</$set>
\end
\define TableMacrosMakeTableSortState()
{{$:/state/tables/Sort/$(RowOrColumn)$/$(FieldsList)$}}
\end
\define TableMacrosMakeTableSortStateTiddler()
$:/state/tables/Sort/$(RowOrColumn)$/$(FieldsList)$
\end
\define TableMacrosRowTableInnerInnerRows()
<$list filter='$(RowList)$+[sort{$(TableMacrosMakeTableSortStateTiddler)$}]' variable=ThisTiddler>
<tr>
<th>
<<ThisTiddler>>
</th>
<$list filter=<<FieldsList>> variable=ThisField>
<td>
<<TableMacrosInlineEditButton>>
</td>
</$list>
</tr>
</$list>
\end
\define TableMacrosInnerRowTable()
<$set name=FieldsList1 filter='$(RowList)$+[fields[]]-[[text]]-[[title]]-[[modified]]-[[created]]-[[tags]]'>
<$set name=FieldsList filter='[is[system]!is[system]]$(FieldsUsed)$' emptyValue=<<FieldsList1>>>
<$set name=RowOrColumn value=Row>
<$set name=TableSortState value=<<TableMacrosMakeTableSortState>>>
<table>
<tr>
<th>
<$button class='tc-btn-invisible' style='width:100%;height:100%' set=<<TableMacrosMakeTableSortStateTiddler>> setTo=title>Title</$button>
</th>
<$list filter=<<FieldsList>>>
<th>
<$button class='tc-btn-invisible' set=<<TableMacrosMakeTableSortStateTiddler>> setTo=<<currentTiddler>>><<currentTiddler>></$button>
</th>
</$list>
</tr>
<<TableMacrosRowTableInnerInnerRows>>
</table>
</$set>
</$set>
</$set>
</$set>
\end
\define ColumnTable(filter fields)
<$set name='ColumnList' value='$filter$'>
<$set name='FieldsUsed' value='$fields$'>
<<TableMacrosInnerColumnTable>>
</$set>
</$set>
\end
\define RowTable(filter fields)
<$set name='RowList' value='$filter$'>
<$set name='FieldsUsed' value='$fields$'>
<<TableMacrosInnerRowTable>>
</$set>
</$set>
\end
\define TableMacrosInlineEditButton()
<$reveal type='nomatch' state="""$:/temp/edit/$(ThisTiddler)$/$(ThisField)$""" text='edit'>
<$button set="""$:/temp/edit/$(ThisTiddler)$/$(ThisField)$""" setTo=edit class='tc-btn-invisible' style='width:100%;hegiht:100%'>
<$view tiddler=<<ThisTiddler>> field=<<ThisField>>>--</$view>
</$button>
</$reveal>
<$reveal type='match' state="""$:/temp/edit/$(ThisTiddler)$/$(ThisField)$""" text='edit'>
<$button set="""$:/temp/edit/$(ThisTiddler)$/$(ThisField)$""" setTo=noedit>{{$:/core/images/done-button}}</$button>
<$edit-text tiddler=<<ThisTiddler>> field=<<ThisField>> size=1/>
</$reveal>
\end
* 30/6/2021: Z score is being calculated in greater than ten day old infants according to Rose.
We bring together doers and experts from diverse fields and markets to discuss how Tanzania can better embrace and promote more "creative destruction" in its economy in a live panel discussion.
References
* https://en.wikipedia.org/wiki/Innovation_economics#Evidence
[[Notes|Technical notes on Task aide]]
__Problem__
Task management in a team can be difficult, especially when dealing with certain inequalities like motherhood, working from very different time zones. You have to manage the human element of fairness, equity while avoid burnout and overwork.
The payoff of caring about these things is increased mindful productivity, improved team dynamics and retention of valuable talent.
__Solution__
A task assistant tool inside TiddlyWiki with third party app integration for
# Notification via preferred channels e.g. email or sms or WhatsApp or Slack
# Tracking
# Triggering task status updates without visiting the app
These tasks should fit into overall themes or goals or operations that are hierarchical that provide a bird's eye view of what a team or a person is working towards if needed. These can then be tracked using Gantt charts for example.
__Possible Challenges__
This application should not create communication debt that will result in hanging tasks and poor team dynamics. It should be purely asynchronous as much as possible.
However, this all depends on how we manage the assigner-assignee relationship. Neither should feel cheated, overworked or disrespected and the possibility of being disrespectful should be avoided at all costs.
Possible solutions include limiting the number of tasks that can be assigned, etc.
__Customers & Early adopters__
TiddlyWiki users and white collar workers will be our early adopters, but we envision teams around the world using this to distribute work.
Just discovered [[Taskade|https://www.taskade.com/]], 'a tool that allows teams to manage projects, brainstorm ideas, write product specs, and video chat together seamlessly, with everything syncing in real-time across all devices'. They launched their [[v3.0 on producthunt on the 6th October|https://www.producthunt.com/posts/taskade-3-0]] and are now the product of the day. How ironic that OnePlaybook happened to go live on the same day.
They seem to have a lot of features oriented towards teams, including task tracking, management etc. Their pricing strategy includes a free tier, a $5 per person price tag for every user and an enterprise tier that requires contacting them. They seem to be focused on tasks (hence the name I suppose). They also include many things, including calendars, brainstorming methods, org views, etc.
It's overall design is remarkably similar to TiddlyWiki, yet very intuitive. I might take a leaf from their handling of tasks.
<iframe src="https://www.taskade.com/static_assets/static/70bea49dd051ba199f0738909cd3df65/38674/mindmap_demo.png" width="100%" height="500px" frameborder=0></iframe>
<iframe src="https://www.taskade.com/static_assets/static/91ed4bd980b64977ca7557a2a09fac39/38674/board_demo.png" width="100%" height="500px" frameborder=0></iframe>
<iframe src="https://www.taskade.com/static_assets/static/556519dd9b109d50d8aca01da3e3dfe7/38674/list_demo.png" width="100%" height="500px" frameborder=0></iframe>
<$checkbox tag="done"> <$link to={{!!title}}><$view field="title"/></$link></$checkbox> <$button message="tm-delete-tiddler" style="border:none;">❎</$button>
INTRODUCTION
The Tanzania Communications Regulatory Authority (TCRA) is a quasi independent Government body responsible for regulating the Communications and Broadcasting sectors in Tanzania. It was established under the Tanzania Communications Regulatory Act No.12 of 2003 to regulate the electronic communications, and Postal services, and management of the national frequency spectrum in the United Republic of Tanzania. The Authority became operational on 1st November 2003 and effectively took over the functions of the now defunct Tanzania Communications Commission (TTC) and Tanzania Broadcasting Commission (TBC) respectively.
OUR VISION
"To be a world-class Communications Regulator creating a level playing field among Communication Service Providers, and promoting environmentally friendly, accessible and affordable services to consumers."
OUR MISSION
"To develop an effective and efficient communications regulatory framework, promote efficiency among the Communications Services Providers, and protect consumer interests with an objective of contributing to socio-economic and technological development in the United Republic of Tanzania."
STRATEGIC GOAL
To enhance the welfare of Tanzanians through effective and efficient regulatory framework that ensures universal access to communications.
STRATEGIC OBJECTIVES
# To enhance TCRA capacity, Staff competences in regulation, research and related fields;
# To promote efficient, reliable and affordable communications infrastructure and applications;
# To promote efficient communication services and increase access to ICTs in underserved and un-served areas;
# To protect interests of consumers and enhance awareness of their rights and obligations;
# To monitor performance of regulated services and enforce compliance to legislations, regulations and standards; and
# To coordinate implementation of regional and international sector commitments.
QUALITY MANAGEMENT SYSTEM:TCRA is ISO 9001: 2008 Certified
QUALITY POLICY Policy
Tanzania Communications Regulatory Authority (TCRA) is committed to enhancing the welfare of Tanzanians through provision of effective and efficient regulatory services that ensures Universal Access to Communication Services, through Quality Management System in all processes needed in our areas of jurisdiction. TCRA continuously improves and reviews her Quality objectives regularly and communicates the policy within the organization.
QUALITY OBJECTIVES
# To maintain an effective Quality Management System complying with International Standard ISO 9001:2008;
# To achieve and maintain a level of quality which enhances the TCRA reputation with stakeholders;
# To ensure compliance with relevant statutory and regulatory requirements;
# To endeavour, at all times to maximize stakeholder satisfaction with our services.
The quality objectives are measurable and reviewed against performance goals at each Management review meeting.
ORGANISATION STRUCTURE
The Board of Directors
The Board of Directors is the Authority’s Governing Body. It is composed of seven members, namely a Chairman and Vice-Chairman, four members and the Director-General.
The Chairman and Vice Chairman are appointed by the President of the United Republic of Tanzania after a competitive selection procedure as per Section 7 of the TCRA Act while the four members and Director General are appointed by the Minister responsible for Communications in consultation with the Minister responsible for Broadcasting,after a competitive selection procedure as per Section 7 of the TCRA Act.
The Director General
The Director General is the Authority’s Chief Executive Officer and is responsible for the day-to-day operations of the Authority. The Director General is a member of the Board and is appointed by the Minister responsible for communications,after a competitive selection procedure as per Section 13 of the TCRA Act.
Directorates and Units
There are five Directorates and five Units in the Office of the Director General. The Directorates are Consumer and Industry Affairs, Corporate Resources Management, Legal Services, Broadcasting and Postal Affairs. The Units are Zone Coordination, Systems Management, Corporate Communications, Procurement and Research and Planning.
CORE VALUES
TCRA has a set of core values as outlined below;
# Professionalism: We maintain the highest degree of professionalism and ethical standards, building value-added relationships with customers and stakeholders to deliver quality services.
# Respect:We are an organisation that values its employees and respects its customers.
# Empowerment:We believe in empowerment and effective delegation enabling employees to make decisions and take challenges commensurate with their own levels of responsibility.
# Innovation: We encourage creativity and innovation leading to enhancement of our capacity in handling regulatory issues.
# Integrity: We believe in integrity and we are determined to treat customers and each other with trust, confidentiality and honesty.
# Accountability:We are accountable, undertaking our duties fairly, with care and transparency.
# Teamwork:We benefit from teamwork, putting together diverse expertise to achieve success.
# Objectivity:We undertake our activities objectively and we are result oriented
# Efficiency:We believe in providing our regulatory services in an efficient way.
# Nondiscrimination: We believe in equal opportunity and treatment for our internal and external Stakeholders and do not discriminate against Gender, Religion, race, affiliation and origin.
TCRA has the following functions;
* To issue, renew and cancel licenses;
* To establish standards for regulated goods and services;
* To establish standards for the terms and conditions of supply of the regulated goods and services;
* To regulate rates and charges;
* To monitor the performance of the regulated sectors in relation to:-
# Levels of investment;
# Availability, quality and standards of service;
# The cost of services;
# The efficiency of production and distribution of services
* To facilitate the resolutions of complaints and disputes between operator vs operator and consumer vs operator;
* To disseminate information about matters relevant to the functions of the Authority.
In carrying out its functions, the Authority strives to enhance the welfare of the Tanzanian society by:-
# Promoting effective competition and economic efficiency;
# Protecting the interests of consumers;
# Protecting financial viability of efficient suppliers;
# Promoting the availability of regulated services to all consumers including low income, rural and disadvantaged consumers;
Enhancing public knowledge, awareness and understanding of the regulated sectors including:-
* The rights and obligations of consumers;
* The way in which complaints may be initiated and resolved;
* The duties, functions and activities of the Authority
CORPORATE SOCIAL RESPONSIBILITY
With our success comes the responsibility of giving back to our society in a meaningful and sustainable fashion. TCRA support efforts of corporate social investment that aims to improve lives of Tanzanians through poverty alleviation and promoting economic development. The focus is on three areas, Education, Health and Economic empowerment. These are in line with National Development Priorities.
DIRECTORATE OF ICT AND APPLICATION SERVICES
Main Functions
(i) Formulate and coordinate implementation of policies on information and communications technologies development;
(ii) Formulate Standards, Procedures, Rules, Guidelines and Regulations for operating communication networks, systems and services;
(iii) Formulate work programmes of the Directorate, supervises and coordinates implementation and evaluates performance;
(iv) Develop and implement Public Key Infrastructure (PKI);
(v) Oversee the operations of Tz-CERT;
(vi) Oversee the operation of Communications Museum;
(vii) Oversee the implementation of issues related to Cyber Security;
Oversee Corporate ICT function;
(ix) Coordinate activities of Regional and International Organizations responsible for regulated sectors development pertaining to Technology and Standards
When tasks are created and assigned, they should track and maintain themselves automatically. Specifically:
# Tasks, if possible, should be self-aware about location, qualifications, resources available, etc
# They should notify the assignee about the task
# Tasks, if possible, should trigger friendly advice, references and templates that might be needed by the assignee to complete the task
# Check-ins should be automatic & two way but not disruptive/annoying and tracking info should be made available somehow
# The assignee's work should be automatically trigger task completion
# Task completion should trigger a notification to the assigner, along with essential telemetry for future analytical reference
<<<
"Human ideas manifest as text, connections, diagrams and more: thus how to store them and present them is a crucial issue for civilization."
Ted Nelson
<<<
<a href={{!!source}}>Secondary source</a>. The primary source is from //Transliterature, A Humanist Design//
#### Build your own `Template Engine`
* [**JavaScript**: _JavaScript template engine in just 20 lines_](http://krasimirtsonev.com/blog/article/Javascript-template-engine-in-just-20-line)
* [**Python**: _Approach: Building a toy template engine in Python_](http://alexmic.net/building-a-template-engine/)
* [**Python**: _A Template Engine_](http://aosabook.org/en/500L/a-template-engine.html)
* [**Ruby**: _How to write a template engine in less than 30 lines of code_](http://bits.citrusbyte.com/how-to-write-a-template-library/)
<$button>
<$action-sendmessage $message="tm-new-tiddler" tags="[[Template idea]]" title="New template idea" />
New idea 💡
</$button>
<<list-links "[tag[Template idea]sort[title]]">>
/templates
* Blank wiki
*
Here's a scenario: you're busy writing in your tiddlywiki. You're using a todo list plugin to list down things to do. But now, for every todo, you have to open a calendar app to set reminders for your todo. This inefficient as you're using one feature for the price of setting two apps. Two solutions exist:
# Forgo the tiddlywiki app entirely and miss out on all its features for a single calendar app to get things done
# Let tiddlywiki do that second task of setting reminders for you, allow the calendar to automatically update tiddlywiki
Bonus advantage: ask tiddlywiki to add a database of notable events that you cannot normally add to your calendar in bulk besides birthdays and holiday events. For example, you can turn your tiddlywiki into a living almanac for your life.
I was also thinking about exploring a location-aware functionality that would alert you about certain todo items like groceries whenever you approach a certain location, like a grocery store, or maybe to remind you of groceries whenever it seems like you're on your way home without them.
<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/TiddlyWiki?ref_src=twsrc%5Etfw">@TiddlyWiki</a> is so flexible, that you can easily replicate the functionality of so many apps in the so called PKM/knowledge management stack in one tool, freeing your wallet up and allowing you to take advantage of its features to do things that more specialized apps cannot do.</p>— OnePlaybook ࿋ (@OnePlaybookHQ) <a href="https://twitter.com/OnePlaybookHQ/status/1501844120997879809?ref_src=twsrc%5Etfw">March 10, 2022</a></blockquote>
Instead of spending so much time fine-tuning a knowledge stack (which is means of procrastinating via busywork), one should stick to a flexible tool that can accommodate as many use cases as possible while offering a wide set of primitives that can be reapplied everywhere. This also helps mitigate [[balkanization|Problem being solved]], a key problem with using a KnowledgeStack. A comprehensive, unified framework is better than a bunch of tools that were never designed to work together. Especially when it comes to scaling knowledge management across big projects.
<p><span style="background-color:Yellow">work management platforms will
be the cornerstone of any successful organization’s collaboration tech
stack. Unlike other tools, a work management platform can support
orderly work coordination, connecting your team across departments, time
zones, locations, and apps. It becomes the central hub for all work,
from ideation to the delivery.</span></p>
<p><span style="background-color:Yellow">Embracing a purpose-built work
management platform as part of an organization’s collaboration tech
stack is essential for saving considerable time, effort, and money.</span> But having a work management platform isn’t enough. <span style="background-color:Yellow">It needs to have a robust integrations ecosystem to really reduce the amount of app switching your team does. According to <a href="https://www.idc.com/getdoc.jsp?containerId=US43486518" rel="nofollow">IDC</a>, teams who use three or more integrations experience significantly more time savings—over 30 hours per week. That’s enormous!</span></p>
<p>Why is app switching so costly for organizations? Asana’s <a href="http://www.asana.com/anatomy?utm_campaign=AOW2021&amp;utm_medium=paid&amp;utm_source=idg&amp;utm_content=bp&amp;utm_term=1" rel="nofollow">Anatomy of Work Index 2021</a> found that, with excessive app switching:</p>
<ul>
<li>27% of messages and actions are missed</li>
<li>26% of individuals are less efficient</li>
<li>24% of work is duplicated</li></ul>
There are many bits & pieces of important knowledge being continuously created then lost by individuals and organizations at various scales, especially in the era of many kinds of different digital platforms & apps. This "dispersed knowledge [management] problem" prevents many problems from being solved efficiently. Currently, the internet has helped solve the problem partially using search engines, wikis and various aggregator websites and services.
However, there might be some people who are interested in consolidating all that knowledge and services into one workspace.
The basic features of the Memex could be summarized as such:
# A storage and retrieval mechanism (you can think of Google searching through its index to bring you links to pages)
# An import mechanism for importing new info and displaying it to allow users to add in newly recorded media and later for view or print it
# A linking mechanism (hyperlinks)
# A classification system (you can think of this as tagging)
# [[Information “trails”|Memex Trails]], bits of information (think web pages) linked by the user as he/she explores the corpus of knowledge, and the ability to perform “trailblazing”, i.e. creating these trails. These trails should be permanent so that they can be archived. The closest modern counterpart here could be bookmarks.
# Later, it was added that trails should also be mutable to allow for adaption
# Automated associative linking using machine learning
<div>
<div><a class="domain" href="https://medium.com/evergreen-business-weekly/flywheel-effect-why-positive-feedback-loops-are-a-meta-competitive-advantage-6d0ed55b67c5">medium.com</a>
<h1>Flywheel Effect: Why Positive Feedback Loops are a Meta-Competitive Advantage</h1>
<div>Eric Jorgenson</div>
<div>
<div>15 - 19 minutes</div></div></div>
<hr />
<div>
<div>
<div>
<div>
<div>
<p><a href="https://medium.com/@ericjorgenson?source=post_page-----6d0ed55b67c5--------------------------------" rel="noopener"><img alt="Eric Jorgenson" src="https://miro.medium.com/fit/c/96/96/0*llKpsFld-5XxTJLL.jpeg" style="height:48px; width:48px" /></a></p></div>
<p><a href="https://medium.com/@ericjorgenson/mission-method-of-evergreen-business-weekly-13940793e507" rel="noopener"><em>Evergreen</em></a><em> is a collection of links to the best learning resources in business, collected by a group of managers, founders, and investors. We contribute resources about one topic, which are synthesized and shared in this Collection. The goal is to learn more efficiently through increased context and focus.</em></p>
<p><em>Remember, </em><strong><em>these are designed to feel like short books, you’re meant to meander and spend ~3 hours on this topic</em></strong><em>. Save these links and read them throughout the week. Immerse yourself in this topic and leave the week smarter than you started it!</em></p></div>
<div>
<p>I admit, I was not completely sure what I was talking about when I chose “Flywheel Effects” as a topic. But that’s part of the fun.</p>
<p>This turned into a fascinating adventure through Competitive Advantages, Mental Models, and practical lessons for operators. Also lots of fun pictures and diagrams in this one!</p>
<p>Here’s the “Table of Contents”:</p>
<ul>
<li>What is the Flywheel Effect?</li>
<li>Applications of Flywheel Effect (and Meta-Competitive Advantages)</li>
<li>The Best Examples of Flywheels</li>
<li>How to Push the Flywheel</li></ul>
<p>I think we ended up in a good place, but as always I’d love to hear if you think I’m wrong on any of this so I don’t stay quite as ignorant as I am now.</p>
<h2>Definition…?</h2>
<p>There doesn’t seem to be a generally agreed-upon definition of the Flywheel Effect. It was used because it was a metaphor to help readers visualize momentum.</p>
<h2>Visualization</h2>
<p>Jim Collins originally used the Flywheel as a metaphor in <a href="http://amzn.to/2wkhFI3" rel="noopener nofollow">Good To Great</a>:</p>
<blockquote>
<p>Picture a huge, heavy flywheel — a massive metal disk mounted horizontally on an axle, about 30 feet in diameter, 2 feet thick, and weighing about 5,000 pounds. Now imagine your task is to get the flywheel rotating on the axle as fast and long as possible.</p>
<p>Pushing with great effort, you get the flywheel to inch forward, moving almost imperceptibly at first. You keep pushing and, after two or three hours of persistent effort, you get the flywheel to complete one entire turn.</p></blockquote>
<h2>Dissection</h2>
<p>The Flywheel Effect is used to describe a handful of concepts at once, which are rarely split apart. Here is each component piece I could identify, and how it relates to the Flywheel illustration.</p>
<p><strong>Momentum</strong> — An object at rest tends to stay at rest, and object in motion tends to continue in motion. Newton’s first law, applied to business. Flywheels (being massive heavy objects) are hard to get moving. If they get moving, they are likely to continue.</p>
<p><strong>Feedback Loops</strong> — The faster the wheel is spinning, the easier it is to add incremental speed. The faster it moves, the more energy it generates. And the more excited everyone is about how great this Flywheel is!</p>
<p><strong>Compounding Return on Effort </strong>—No “one push” makes it happen. Continuous small inputs add up into an impressive output, eventually.</p>
<p><strong>Direction </strong>— Sustained effort must be focused in one direction in order to maintain momentum and compounding returns. Misplaced effort is either wasted or counterproductive.</p>
<p>You can see each of these concepts in this one paragraph from <a href="http://amzn.to/2wkhFI3" rel="noopener nofollow">Good To Great</a> explaining the effect:</p>
<blockquote>
<p>The momentum of the thing kicks in your favor, hurling the flywheel forward, turn after turn … whoosh! … its own heavy weight working for you. You’re pushing no harder than during the first rotation, but the flywheel goes faster and faster. Each turn of the flywheel builds upon work done earlier, compounding your investment of effort. A thousand times faster, then ten thousand, then a hundred thousand. The huge heavy disk flies forward, with almost unstoppable momentum.</p></blockquote>
<h2>Definition, again</h2>
<p>Though really this whole post is an attempt to define and understand The Flywheel Effect, it seems like a let-down without a one-sentence explanation. So with all that said… here’s my shot at a definition.</p>
<blockquote>
<p>Flywheel Effect: Positive feedback loops that build momentum, increasing the payoff of incremental effort.</p></blockquote>
<p><strong>Or, Flywheel Effect in Normal English:</strong> When good things you do lead to more good things “just happening”.</p>
<p>In resources mentioning the Flywheel Effect, it is often conflated with ideas that co-occur, but are distinct concepts. It seems like an easy mistake to make.</p>
<blockquote>
<p>My current thinking is The Flywheel Effect, as we’ve defined it, is a kind of meta-competitive advantage.</p></blockquote>
<p>It can accelerate the growth of a business and the widening of a moat, but it is not itself a source of competitive advantage. It is a force-multiplier of existing competitive advantages.</p>
<p>Let’s see how the Flywheel Effect interacts with Competitive Advantages:</p>
<h2>Supply-Side Economies of Scale</h2>
<p>The most basic and old-school competitive advantage — the bigger you get, the cheaper you can produce things and the more available your product is. Think Wal-Mart and Carnegie Steel.</p>
<p>The bigger these companies got, the cheaper they could sell their goods for, the more leverage over suppliers, and the bigger the brand became.</p>
<p>Another example, from <a href="https://vimeo.com/188095817" rel="noopener nofollow">Ben Gilbert’s talk</a> (more later) is Disney. As their empire of entertainment grew, the positive feedback loops between their various businesses became stronger:</p>
<div>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/1404/1*tTnxkJo77_9KTWFfl8cA-g.png" /></p></div>
<h2><strong>Brand</strong></h2>
<p>Another basic Flywheel Effect exists for Brand. To use an oddball example to isolate the effect better — think of College Basketball programs recruiting players.</p>
<p>Every time they have a player drafted or win a championship, it becomes a more desirable school for the next round of players, and on it goes. Each win makes the next win slightly easier.</p>
<p>Another example, <a href="https://old.ycombinator.com/munger.html" rel="noopener nofollow">Munger’s explanation</a> of the powers of scale for Coca-cola.</p>
<blockquote>
<p>Another advantage of scale comes from psychology. The psychologists use the term social proof. We are all influenced — subconsciously and to some extent consciously — by what we see others do and approve. Therefore, if everybody’s buying something, we think it’s better. We don’t like to be the one guy who’s out of step.</p>
<p>The social proof phenomenon which comes right out of psychology gives huge advantages to scale — for example, with very wide distribution, which of course is hard to get. One advantage of Coca-Cola is that it’s available almost everywhere in the world.</p></blockquote>
<h2><strong>Network Effects (Demand-side Economies of Scale)</strong></h2>
<p><a href="https://medium.com/evergreen-business-weekly/the-power-of-network-effects-why-they-make-such-valuable-companies-and-how-to-harness-them-5d3fbc3659f8" rel="noopener">Network Effects</a> and Flywheel Effect are very commonly conflated, because they so commonly occur together.</p>
<p><a href="https://medium.com/evergreen-business-weekly/the-power-of-network-effects-why-they-make-such-valuable-companies-and-how-to-harness-them-5d3fbc3659f8" rel="noopener">Network effects</a> almost always lead to or create a Flywheel Effect, but the Flywheel Effect can occur where network effects do not, as we’ve seen in the previous examples.</p>
<blockquote>
<p>Network Effects are the most powerful source of the Flywheel Effect.</p></blockquote>
<p>This is because Network Effects (past a certain tipping point, especially when combined with virality), can be auto-catalytic.</p>
<blockquote>
<p><strong>Auto-catalysis</strong> — A “runaway feedback loop” describes a situation in which the output of a reaction becomes its own catalyst. (<a href="https://www.farnamstreetblog.com/mental-models/" rel="noopener nofollow">Thanks Farnam Street</a>)</p></blockquote>
<p>The compounding return on effort is massive, and accelerates as it grows. These combined factors are maybe best exemplified in Facebook, and explain more about how insanely fast it became globally-dominant.</p>
<p>This takes the Flywheel Effect to a whole new level. It becomes like a magical physics-defying Flywheel that uses it’s own momentum to speed itself up even faster without additional input. “Flywheel” so inadequately describes a run-away Network Effect that we really need a whole new way to explain it. (And Magic Flywheel probably won’t stick.)</p>
<h2>Amazon</h2>
<p>Obviously. With their long-term perspective and fanatical focus on price, selection, and convenience, it shouldn’t be a surprise to see Amazon has been pushing the Flywheel.</p>
<div>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/1746/1*I1TRzzy9TCNKHe1Af02t5g.png" /></p></div>
<p>I stole this screenshot from <a href="https://vimeo.com/188095817" rel="noopener nofollow">Ben Gilbert’s talk about Network Effects</a>, which I highly recommend. He highlights these complex overlapping Flywheel effects very well. He also has a great example from Airbnb:</p>
<div>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/2880/1*xymaFQ4N8uowCApfB4HPog.png" /></p></div>
<p>(Which will make much more sense if you hear his voice-over.)</p>
<h2>Uber</h2>
<p><a href="http://andrewchen.co/ubers-virtuous-cycle-5-important-reads-about-uber/" rel="noopener nofollow">This great post</a> by Andrew Chen, contributed by <a href="http://twitter.com/gitamar" rel="noopener nofollow">Itamar Goldminz</a>, gives an overview of the Positive Feedback Loops in Uber’s business, and how their business model is driving their growth.</p>
<div>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/1200/1*YEAgf7hVQj4DgL3Tgo6kDQ.png" /></p></div>
<p>If this napkin drawing isn’t self-explanatory, Bill Gurley’s post about Uber’s Valuation (mainly assessing Total Addressable Market and Market Share limit) is a very thorough look at each of these effects.</p>
<blockquote>
<p><strong>Pick-up times. </strong>As Uber expands in a market, and as demand and supply both grow, pickup times fall. Residents of San Francisco have seen this play out over many years. Shorter pickup times mean more reliability and more potential use cases. The more people that use Uber, the shorter the pick up times in each region.</p>
<p><strong>Coverage Density.</strong> As Uber grows in a city, the outer geographic range of supplier liquidity increases and increases. Once again, Uber started in San Francisco proper. Today there is coverage from South San Jose all the way up to Napa. The more people that use Uber, the greater the coverage.</p>
<p><strong>Utilization.</strong> As Uber grows in any given city, utilization increases. Basically, the time that a driver has a paying ride per hour is constantly rising. This is simply a math problem — more demand and more supply make the economical traveling-salesman type problem easier to solve. Uber then uses the increased utilization to lower rates — which results in lower prices which once again leads to more use cases. The more people that use Uber, the lower the overall price will be for the consumer.</p></blockquote>
<h2>(Homework Option)</h2>
<p>If you want to work this idea out a bit, pick a company not already an example here and draw one of these swoopy charts that tracks their positive feedback loops and see where they are building momentum and growing their moats. Level 1: Coke or WalMart.</p>
<h2>Atlassian</h2>
<p>One more unique example is Atlassian, and thanks to <a href="https://twitter.com/ktuong" rel="noopener nofollow">Khanh Tuong</a> for sending me these links, because this was definitely a new one to me.</p>
<p>Atlassian has been quietly dominating…</p>
<div>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/2560/1*nQt6iqZ7a8s6YJI33517EQ.png" /></p></div>
<p>And Tom Tunguz has written <a href="http://tomtunguz.com/saas-innovators-solution/" rel="noopener nofollow">a great short post</a> about how they’re doing it. He calls it The Flywheel Saas Company.</p>
<blockquote>
<p>The Flywheel Model differs from the Traditional Model in one fundamental regard. The enterprise sales team is exclusively inbound. They are explicitly denied the option of seeking business outside the customer base, and must gin up business from only existing customers. The enterprise sales team is an up-sell and cross-sell team. In fact, so is the mid-market sales team. Only the SMB marketing team is permitted to acquire new leads.</p>
<p>The company famously touts that it has grown without sales reps, precisely because its mid-market and enterprise teams farm exclusively within the pool created by the company’s marketing engine.</p>
<p>Flywheel models have a simple beauty about them. The entire company is focused on the same thing: building the momentum in one main customer acquisition mechanism.</p></blockquote>
<div>
<p> </p>
<p><img alt="" src="https://miro.medium.com/max/3448/1*V-4ifmowOCfeYqdDPpwbPA.png" /></p></div>
<p>I like this example because it doesn’t rely on Network Effects or Economies of Scale. This was a bootstrapped company with fantastic growth because they ignored conventional wisdom and found a way to focus more effort on one specific goal of the business.</p>
<h2>Pick the right direction as early as possible</h2>
<p>Changes in direction (except small corrections) reset the Flywheel. The earlier you can get moving in the right direction, the sooner the efforts will compound and the momentum will build.</p>
<h2>Focus Efforts</h2>
<p>Find the things really moving the Flywheel the most, and focus efforts on those pieces of work. Find ways to eliminate work that doesn’t push on those core pieces (like Atlassian), or fold them into current efforts.</p>
<h2>Make Progress Visible</h2>
<p>One of my favorite pieces of <a href="http://amzn.to/2wkhFI3" rel="noopener nofollow">Good To Great</a> is about strategic alignment:</p>
<blockquote>
<p>We learned that under the right conditions, the problems of commitment, alignment, motivation, and change just melt away. They largely take care of themselves.[…]</p>
<p>What do the right people want more than almost anything else? They want to be part of a winning team. They want to contribute to producing visible, tangible results. They want to feel excitement of being involved in something that <strong>just flat-out works</strong>. […]</p>
<p>When they begin to see tangible results, when they can <strong>feel</strong> the flywheel beginning to build speed — <strong>that’s</strong> when the bulk of people line up to throw their shoulders agains the wheel and push.</p></blockquote>
<div>
<p><img alt="" src="https://miro.medium.com/max/1174/1*vKdWvqx9XvBELPMKGpQFVA.jpeg" /></p></div>
<p>Reading this, the <strong>visible results</strong> piece becomes incredibly important. Show the team you’re starting a winning streak, and they’ll be motivated to get onboard.</p>
<h2>Look for additional positive Feedback Loops</h2>
<p>There are a huge number of possible feedback loops in any business. Ways to increase visible consumption (like a stamp on a coffee cup) create a small viral advertisement, or creating <a href="https://www.instagram.com/p/4sLIEtNP8t/" rel="noopener nofollow">a beautiful Instagram-worthy drink</a>.</p>
<p>There are probably ways to add positive Feedback Loops to your business if you think hard about it. For inspiration, this is the full version of Walt Disney’s original sketch of the feedback loops of his business.</p>
<div>
<p><img alt="" src="https://miro.medium.com/max/4866/1*MDZQmqfxkg6OQKtQrAthkw.jpeg" /></p></div>
<h2>Find Every Incremental Gain</h2>
<p>This is a game of long-term compounding where every contribution to the momentum makes the next step easier, and effort pays off for years afterward. In games like this, every little gain will be surprisingly valuable in the long run.</p>
<p>This means you should look for ways to eke out every improvement possible. <a href="https://hbr.org/2015/10/how-1-performance-improvements-led-to-olympic-gold" rel="noopener nofollow">This HBR article</a> contributed by <a href="https://twitter.com/kathrynoday" rel="noopener nofollow">Kathryn O’Day</a> about Gold Medal Cyclers will help you get in the mindset and break down the goals.</p>
<h2>Keep Pushing</h2>
<p>Patience. This is a long game, and you’ve chosen a strategy that looks slow at first, and builds into an invincible behemoth over time. Own it.</p>
<p>Stay focused and keep pushing.</p></div>
<div>
<p>If you enjoyed this, you’ll get more like it by joining Evergreen:</p>
<p>Upcoming Book: <a href="http://navalmanack.com/" rel="noopener nofollow">The Almanack of Naval Ravikant</a></p>
<p>Mini-book: <a href="https://www.amazon.com/gp/product/B07CK11SZW/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=ericjorg-20&creative=9325&linkCode=as2&creativeASIN=B07CK11SZW&linkId=a0b7422a9ce6d616b37b7dc5f4a58097" rel="noopener nofollow">Career Advice for Uniquely Ambitious People</a></p>
<p>Personal Site: <a href="http://ejorgenson.com/" rel="noopener nofollow">EJorgenson.com</a></p>
<p>Evergreen requires time and money. If you find this project helpful, please consider <a href="http://omella.com/o/8eTNQ" rel="noopener nofollow">buying me a coffee</a>, or sending some Bitcoin.</p>
<p>BTC Wallet: 3KiLX3bjnpmb3a4YiBhm3vSNiV2Erxk1fX (If you’ve never used Crypto before, <a href="https://www.coinbase.com/join/jorgen_1q" rel="noopener nofollow">Coinbase</a> is the easiest way to start.)</p>
<p>Thank you very much! ❤ ☺</p>
<p>Massive appreciation for those who suggested pieces of content (or wrote something new) for this Edition of Evergreen: <a href="http://twitter.com/gitamar" rel="noopener nofollow">Itamar Goldminz</a>, <a href="https://www.linkedin.com/in/vigneshwaar/" rel="noopener nofollow">Vignesh Srinivasan</a>, <a href="https://twitter.com/kathrynoday" rel="noopener nofollow">Kathryn O’Day</a>, <a href="http://twitter.com/vingar" rel="noopener nofollow">Vinish Garg</a>, <a href="https://twitter.com/nickseguin" rel="noopener nofollow">Nick Seguin</a>, <a href="https://twitter.com/ktuong" rel="noopener nofollow">Khanh Tuong</a>, <a href="https://twitter.com/gilbert" rel="noopener nofollow">Ben Gilbert</a>, <a href="https://twitter.com/scougs" rel="noopener nofollow">Stewart Scougall</a>, Karthik Rajeshwaran, <a href="https://twitter.com/TaylorPearsonMe" rel="noopener nofollow">Taylor Pearson</a>, <a href="http://twitter.com/awolfson0" rel="noopener nofollow">Aaron Wolfson</a>, <a href="https://twitter.com/duggandes" rel="noopener nofollow">Desmond Duggan</a>, and <a href="http://twitter.com/derekbaynton" rel="noopener nofollow">Derek Baynton</a>.</p>
<p>Many thanks for being a part of this project! Not every suggestion is able to make it to the final edit, but every single suggestion is read and appreciated.</p>
<p>As my Father always says: “There’s always room for the best.” There’s always a better resource out there. These collections can always get better, and I hope that they do. If you can think of anything that was missed, I welcome you to share it.</p>
<p>To share your thoughts, improvements or additions: <a href="mailto:erjorgenson@gmail.com" rel="noopener nofollow">Email</a> or <a href="http://twitter.com/ericjorgenson" rel="noopener nofollow">Twitter</a>.</p>
<pre>If you liked this, check out other Editions of Evergreen:Building and Managing a Team:<a href="https://medium.com/evergreen-business-weekly/how-to-find-and-recruit-the-team-you-need-to-build-a-successful-business-1cf7a02dd2aa" rel="noopener">How to Find and Recruit the Team you Need</a>
<a href="https://medium.com/@ericjorgenson/how-not-to-hire-like-a-clownshow-evergreen-business-weekly-2-hiring-f4da0e9d3230" rel="noopener">How Not to Hire like a Clownshow</a>
<a href="https://medium.com/@ericjorgenson/compensation-rules-everything-around-me-evergreen-business-weekly-4-compensation-75874cd11963" rel="noopener">Compensation Rules Everything Around Me</a>
<a href="https://medium.com/evergreen-business-weekly/why-employee-onboarding-is-holding-back-your-team-and-how-to-get-it-right-3ec5b3b36f6e" rel="noopener">Why Employee Onboarding is holding you back</a>
<a href="https://medium.com/evergreen-business-weekly/how-to-boost-employee-retention-creating-long-and-happy-working-relationships-7f6af1b9eea0" rel="noopener">How to Boost Employee Retention</a>
<a href="https://medium.com/evergreen-business-weekly/how-performance-reviews-are-being-reinvented-refined-and-perfected-eebc1e33c245" rel="noopener">How Performance Reviews are being Reinvented</a>
<a href="https://medium.com/@ericjorgenson/lets-stop-communicating-like-minions-evergreen-business-weekly-3-internal-communication-97a9705eb71a" rel="noopener">Secrets to Perfecting Organizational Communication</a>
<a href="https://medium.com/evergreen-business-weekly/how-to-manage-scale-and-operate-in-scaling-organizations-55cd26e382f7" rel="noopener">How to Manage Scale, and Operate in Scaling Organizations</a>
<a href="https://medium.com/evergreen-business-weekly/how-to-fire-someone-how-to-decide-when-to-do-it-and-how-to-be-guilt-free-65715a98d51c" rel="noopener">How to Fire an Employee</a>
<a href="https://medium.com/evergreen-business-weekly/most-company-culture-posts-are-fluffy-bullshit-here-is-what-you-actually-need-to-know-1cf8597a5c2c" rel="noopener">What you actually need to know about Company Culture</a>
<a href="https://medium.com/evergreen-business-weekly/why-interviewing-prospective-hires-is-futile-and-how-to-make-it-only-slightly-less-futile-5d1d493ef5bc" rel="noopener">How to Interview Prospective Hires</a>Strategy and Competitive Advantage:<a href="https://medium.com/evergreen-business-weekly/how-to-master-the-craft-of-strategy-why-one-decision-can-make-your-company-and-how-to-get-it-right-d0346c62731d" rel="noopener">How to Master the Craft of Strategy</a>
<a href="https://medium.com/@ericjorgenson/evergreen-business-weekly-edition-1-competitive-advantage-f534bd97d7a" rel="noopener">Competitive Advantage: How to Build a Winning Business</a>
<a href="https://medium.com/evergreen-business-weekly/the-power-of-network-effects-why-they-make-such-valuable-companies-and-how-to-harness-them-5d3fbc3659f8" rel="noopener">The Power of Network Effects</a>
<a href="https://medium.com/evergreen-business-weekly/how-cost-leadership-builds-powerful-businesses-and-why-it-always-matters-83685eb1c55e" rel="noopener">How Cost Leadership Builds Powerful Businesses</a>
<a href="https://medium.com/evergreen-business-weekly/why-the-best-brands-brand-builders-stand-out-evergreen-business-weekly-6-brand-2623a922d3bf" rel="noopener">Why the Best Brands Stand Out</a>
<a href="https://medium.com/evergreen-business-weekly/scale-as-competitive-advantage-when-scale-is-your-ultimate-weapon-and-how-to-use-it-917d0d0c58d5" rel="noopener">Scale as Competitive Advantage</a>
<a href="https://medium.com/evergreen-business-weekly/how-barriers-to-entry-confused-me-terribly-and-what-i-figured-out-so-far-75df799b2559" rel="noopener">Barriers to Entry are Confusing</a>
<a href="https://medium.com/evergreen-business-weekly/flywheel-effect-why-positive-feedback-loops-are-a-meta-competitive-advantage-6d0ed55b67c5" rel="noopener">Flywheel Effect: Meta-Competitive Advantage</a>Building the Business:<a href="https://medium.com/evergreen-business-weekly/how-to-get-good-business-ideas-the-mental-alchemy-of-ideation-3ba21b66aa4d" rel="noopener">How to get good business Ideas: Mental Alchemy of Ideation</a>
<a href="https://medium.com/evergreen-business-weekly/how-to-choose-the-right-business-ideas-81327d0cfe78" rel="noopener">How to Choose the Right Business Ideas</a>
<a href="https://medium.com/evergreen-business-weekly/product-market-fit-what-it-really-means-how-to-measure-it-and-where-to-find-it-70e746be907b" rel="noopener">Product/Market Fit: What it really means & How to Measure it</a>
<a href="https://medium.com/evergreen-business-weekly/how-to-failure-proof-your-business-with-customer-development-c49ac7b01285" rel="noopener">How to Failure-proof your business with Customer Development</a>
<a href="https://medium.com/evergreen-business-weekly/how-psychology-and-strategy-work-together-to-perfect-pricing-well-almost-b0aea83714b7" rel="noopener">How Strategy and Psychology Work Together to Perfect Pricing</a>
<a href="https://medium.com/evergreen-business-weekly/the-most-important-equations-in-business-part-1-customer-acquisition-evergreen-business-weekly-8-41c135ddca05" rel="noopener">The Most Important Equations in Business - CAC (Part 1)</a>
<a href="https://medium.com/evergreen-business-weekly/the-simple-math-behind-every-profitable-business-customer-lifetime-value-f3ab809ae354" rel="noopener">The Simple Math Behind Every Profitable Business - CLV (Part 2</a>)
<a href="https://medium.com/evergreen-business-weekly/how-psychology-behind-word-of-mouth-growth-works-5b3db2d19683" rel="noopener">How Psychology behind Word-of-Mouth Works</a>
<a href="https://medium.com/evergreen-business-weekly/the-secret-core-of-every-successful-business-distribution-evergreen-business-weekly-7-aaf2509ebb68" rel="noopener">The Secret Core of Every Successful Business--Distribution</a>
<a href="https://medium.com/@ericjorgenson/the-most-important-lessons-in-sales-evergreen-business-weekly-5-sales-81c166a76b2d" rel="noopener">The Most Important Lessons in Sales</a>
<a href="https://medium.com/evergreen-business-weekly/why-value-creation-is-the-foundation-of-business-how-to-define-it-measure-it-and-manage-it-147c92b87aca" rel="noopener">Why Value Creation is the Foundation of Business</a>
<a href="https://medium.com/evergreen-business-weekly/why-value-capture-is-the-most-important-business-idea-you-haven-t-read-enough-about-c035c657d091#.af44cr4ty" rel="noopener">Why Value Capture is the most important idea you haven't read about</a>
<a href="https://medium.com/evergreen-business-weekly/the-misunderstood-underestimated-and-neglected-genius-of-advertising-c112759bef35#.6fq3ia4mt" rel="noopener">The Misunderstood and Underestimated Genius of Advertising</a>How to be a Great Human:<a href="https://medium.com/evergreen-business-weekly/how-to-start-a-new-job-1fddd420c41e" rel="noopener">How to Start a New Job: Handling Career Transitions like a Boss</a>
<a href="https://medium.com/evergreen-business-weekly/how-to-master-the-discipline-of-product-management-not-the-job-of-product-manager-28d2c493d445" rel="noopener">How to Master the Discipline of Product Management</a>
<a href="https://medium.com/evergreen-business-weekly/the-ancient-origins-of-storytelling-and-how-you-can-apply-them-in-your-life-4bad396652f1#.usga17kuy" rel="noopener">The Ancient Origins of Storytelling, and how to Apply Them</a>
<a href="https://medium.com/evergreen-business-weekly/how-to-prioritize-using-these-9-mental-models-daef8f03dd93" rel="noopener">How to Prioritize Using These 9 Mental Models</a>I've also written about How & Why we started Evergreen:<a href="https://medium.com/@ericjorgenson/how-my-prototypes-failure-created-the-next-iteration-463ae1bf3ec6" rel="noopener">How a prototype's failure created the next iteration</a>
<a href="https://medium.com/@ericjorgenson/mission-method-of-evergreen-business-weekly-13940793e507" rel="noopener">Mission & Method of Evergreen</a>Follow me on Twitter: <a href="http://twitter.com/ericjorgenson" rel="noopener nofollow"><strong>@EricJorgenson</strong></a>And Please... <a href="http://eepurl.com/bF-rN9" rel="noopener nofollow">Join Evergreen</a>.</pre></div></div></div></div></div>
__Property of Flexible Tools in General__
<<<
Yes, Emacs [used as an example here] is a platform that requires investment in time and knowledge to be mastered. But what you get is a system that is as flexible as possible to deal with present and future changes of requirements.
''I can not think of a different situation where you are using a flexible tool that you adapt to your situation which does not come with the sunk cost fallacy or some kind of lock-in effect, how I call it in my PIM lectures''
[[Source|https://karl-voit.at/2021/07/23/emacs-lock-in/]]
<<<
That last part is quite relevant to TiddlyWiki, which one might consider to be the emacs of the web (?)
<p>This is one of the pillars of Node and crucial for using many core modules so treating it isolated due to the importance.</p>
<p>Observer pattern</p>
<p>Observer is a behavioral pattern which means that is concerned about <strong>communication</strong> between objects.</p>
<p>Is an ideal solution for modelling the reactive nature of Node and a complement for callbacks.</p>
<p>In this case it takes care about the communication between a <strong>Subject</strong> (or Observable) and multiple <strong>Observers</strong>.</p>
<p>The subject target is to notify observers the state changes.</p>
<p><img src="https://miro.medium.com/max/258/0*xZtT5YojRzFsLeE8.jpeg" style="height:202px; width:258px" /></p>
<p>Event flow</p>
<p>Observers can <strong>subscribe</strong> to the Subject in order to keep track of any potential state change that might happen to the Subject. Observers can <strong>unsubscribe</strong> as well, stopping to <em>watch</em> the subject.</p>
<p>In objected-oriented programming, the observer pattern requires <strong>interfaces, </strong>concrete <strong>classes </strong>and<strong> hierarchy</strong>. You may notice that JavaScript does not have interfaces or classes are, in fact, functions. That can be seen as a blocker, but that is further from the truth.</p>
<p>In NodeJS all becomes much simpler. The observer pattern is already built into the core and available through <a href="https://nodejs.org/api/events.html#events_class_eventemitter" rel="noopener" target="_blank"><strong>EventEmitter</strong></a> class.</p>
<p>EventEmitter allows to register functions as <strong>listeners</strong>, that will be called when an specific <strong>event</strong> is fired.</p>
<p><img src="https://miro.medium.com/max/581/0*9sNEu5C1LWsxixBE.png" style="height:501px; width:581px" /></p>
<p>EventEmitter</p>
<p>The EventEmitter class is defined and exposed by the <em>events</em> module. Some of the methods are:</p>
<ul>
<li><code>on(eventName:string, listener: Function)</code>: Adds the <em>listener</em> function to the end of the listeners array for the event named <em>eventName</em>. No checks are made to see if the listener has already been added. Multiple calls passing the same combination of <em>eventName</em> and <em>listener</em> will result in the listener being added, and called, multiple times.</li>
<li><code>once(eventName:string, listener: Function)</code>: Adds a one-time <em>listener</em> function for the event named <em>eventName</em>. The next time eventName is triggered, this listener is removed and then invoked.</li>
<li><code>emit(eventName:string, [...args])</code>: Synchronously calls each of the listeners registered for the event named <em>eventName</em>, in the order they were registered, passing the supplied <em>arguments</em> to each.</li>
<li><code>removeListener(eventName:string, listener: Function)</code>: Removes the specified listener from the <em>listener</em> array for the event named <em>eventName</em>.</li></ul>
<p>All the preceding methods will return the EventEmitter <strong>instance</strong> to allow <strong>chaining</strong>. The <em>listener</em> function has the signature <code>function([arg1], [...])</code>, so it simply accepts the arguments provided the moment the event is emitted. Inside the <em>listener</em>,<code> this</code> refers to the <strong>instance</strong> of the <strong>EventEmitter</strong> that produces the event.</p>
<p>Creating an observable directly from EventEmitter class is not enough, as it is not flexible when we want to create something that goes beyond of only creating new events. So creating a generic object <strong>observable</strong> is the solution most times. That can be achieved extending the class EventEmitter.</p>
<p>To explain how this works, I did an example. The observable object is going to be a pizza 🍕. The entire <a href="https://gist.github.com/boxgames1/95ea88f202f36f55c70af70f0f2f2b13" rel="noopener" target="_blank">code file is here</a>. Let’s see the code by parts.</p>
<p><img src="https://miro.medium.com/max/509/1*0E7o33gK2AEn6ANRAW8y3Q.png" style="height:255px; width:509px" /></p>
<p>Constructor and type definition</p>
<p>Nothing special here but Pizza class is extending from EventEmitter (that if you remember a comment above, comes from <em>events</em> module). I’m skipping private methods and static sizes that is not related with this pattern.</p>
<p><img src="https://miro.medium.com/max/456/1*eNBpM4XizdTijCPMmQ9UAA.png" style="height:352px; width:456px" /></p>
<p>Add method</p>
<p>If the pizza has not reached the maximum number of ingredients, the one passed as argument is added to the list and an event emitted. Otherwise, an event is emitted as well. The instance is returned to allow chaining. This happens in all public methods.</p>
<p><img src="https://miro.medium.com/max/646/1*zRekJITrx_jsc5_x_Yfdpg.png" style="height:370px; width:646px" /></p>
<p>Remove method</p>
<p>Pretty similar to add method. If the ingredients exists in the list, it is removed and an event emitted. If it doesn’t exist, other event is emitted.</p>
<p><img src="https://miro.medium.com/max/522/1*uVszigzwUMmWc_7mcH9zkg.png" style="height:388px; width:522px" /></p>
<p>Cook method</p>
<p>Ok! The most interesting part is coming and our pizza is entering the oven 😋<br />
An event notices this occurrence and a timeout is set. Once the oven time is expired the callback is executed and emits and event with the <em>numberId</em> of another timeout. That one will be triggered after the release time passes. If the timeout was NOT cleared, our pizza will be charred, event emitted as well.</p>
<p><img src="https://miro.medium.com/max/661/1*PagdDYtE8GA4jPL_T7yZFA.png" style="height:575px; width:661px" /></p>
<p>Happy path</p>
<p>Execution time! Now that our Pizza class is created we can instance it. This chunk can look a bit messy but I encourage you to get the <a href="https://gist.github.com/boxgames1/95ea88f202f36f55c70af70f0f2f2b13" rel="noopener" target="_blank">full code example</a> and run in your local environment to see the outcome.</p>
<p>We create some <strong>listeners</strong> to be up to date of <strong>everything that happens</strong> to our pizza. Then we add/remove some ingredients and starting the cook phase.</p>
<p>The interesting part here is in the<code> cookFinished</code> listener. Apart of the logs, we are <strong>clearing a timeout</strong> using the <em>numberId</em> received as argument. And we are doing it instantly, avoiding our pizza to get charred.</p>
<p><img src="https://miro.medium.com/max/662/1*_Pi66dC7ytbd8-XCbmrGQA.png" style="height:298px; width:662px" /></p>
<p>Corner case</p>
<p>In this case we are managing the<code> cookFinished</code> listener without clearing the timeout, so the pizza won’t be released from the oven on time 😟</p>
<p>We have seen how the Pizza object has a full set of methods, in addition to being observable, by inheriting the functionality of EventEmitter.</p>
<p><strong>Alert </strong>⚠️ It is crucial that we never mix synchronous and asynchronous approaches in the same EventEmitter, but even more important, when emitting the same event type, to avoid producing synchrony issues, turning our function <strong>unpredictable.</strong></p>
<p>The main difference between emitting synchronous and asynchronous events lies in the way listeners can be registered. When the events are emitted <strong>asynchronously</strong>, the program has all the time to register new listeners even after EventEmitter is initialized, because the events are guaranteed not to be fired until the next cycle of the event loop. It represents a common approach that is used in most Node.js modules.</p>
<p>On the contrary, emitting events <strong>synchronously</strong> requires that all the listeners are registered before the EventEmitter function starts to emit any event like in our <strong>Pizza</strong> class. Using EventEmitter in this synchronous fashion is useful and makes sense in some scenarios.</p>
<p>For this reason, it’s very important to <strong>clearly highlight the behavior</strong> of our EventEmitter in its documentation to avoid confusion, and potentially incorrect usage.</p>
<hr />
<p>I’m Oliver Alonso, Software Engineer working remotely from Spain. You can find more stuff about me in <a href="https://oliveralonso.dev/" rel="noopener" target="_blank">my web</a> or <a href="https://github.com/boxgames1" rel="noopener" target="_blank">Github account.</a></p>
<p>Thanks for reading!</p>
The problem (of [[Roam|Deficiencies of Roam: opportunities]]) then becomes: planning your PKM for rediscovery, especially if you don't know what you're supposed to do in advance. Mental effort has to be either spent, or you automate the process with software to the point where the machine is doing most of the curation work while you do the actual process of just writing.
This problem affords us an [[opportunity to solve it with automation|Deficiencies of Roam: opportunities]].
<p>The Semantic Web, both as a research field and a technology stack, is seeing mainstream industry interest, especially with the knowledge graph concept emerging as a pillar for data well and efficiently managed. But what exactly are we talking about when we talk about the Semantic Web? And what are the commercial implications of <a href="https://www.ontotext.com/knowledgehub/fundamentals/semantic-web-technology/" rel="noopener" target="_blank">semantic technologies</a> for enterprise data?</p>
<p>The Semantic Web started in the late 90’s as a fascinating vision for a web of data, which is easy to interpret by both humans and machines. One of its pillars are ontologies that represent explicit formal conceptual models, used to describe semantically both unstructured content and databases. While Semantic Web is often condemned for being too academic, two of its incarnations already enjoy massive adoption.</p>
<p>The first one is Schema.org: millions of web pages are tagged with <a href="https://www.ontotext.com/knowledgehub/fundamentals/semantic-annotation/" rel="noopener" target="_blank">semantic annotations</a> to enable a much better web search experience. The second one is the Linked Open Data (LOD): a cloud of interlinked structured datasets published without centralized control across thousands of servers. Knowledge graphs (KG) came later, but quickly became a powerful driver for the adoption of Semantic Web standards and all species of semantic technology implementing them. KGs bring the Semantic Web paradigm to the enterprises, by introducing semantic metadata to drive data management and content management to new levels of efficiency and breaking silos to let them synergize with various forms of knowledge management. This way KGs help organizations smarten up proprietary information by using global knowledge as context for interpretation and source for enrichment.</p>
<p>In this post you will discover the aspects of the Semantic Web that are key to enterprise data, knowledge and content management. We will walk you through the Semantic Web roots, the debate about it and further take you beyond its academic and visionary aspect into the world of efficient enterprise data management with semantic technologies and knowledge graphs. Connecting the dots for you between concepts like RDF, semantic annotation, Linked Open Data, we will help you understand why the Semantic Web will always work and how knowledge-intensive domains and applications can benefit from its affordances.</p>
<p><a href="https://www.ontotext.com/wp-content/uploads/2021/07/tag-logo.svg"><img alt="" src="https://www.ontotext.com/wp-content/uploads/2021/07/tag-logo.svg" /></a></p>
<p><em>Source: tag.ontotext.com</em></p>
<p><img alt="" src="https://www.ontotext.com/wp-content/uploads/2021/07/Screen-Shot-2021-05-07-at-9.15.57-AM.png" /></p>
<p>In 1994 Tim Berners Lee described the Web as “a flat, boring world devoid of meaning” (<a href="https://www.w3.org/Talks/WWW94Tim/">Plenary Talk Geneva</a>) for computers. To set the stage for a Web more meaningful to our machines, in 1998, a <a href="https://www.w3.org/DesignIssues/Semantic.html" rel="noopener" target="_blank">Semantic Web Road Map</a> came into being. After the design of this “architectural plan untested by anything except thought experiments”, in 2001 the Semantic Web seized the public’s imagination with a seminal article featured in Scientific American called: <a href="https://www-sop.inria.fr/acacia/cours/essi2006/Scientific%20American_%20Feature%20Article_%20The%20Semantic%20Web_%20May%202001.pdf" rel="noopener" target="_blank">The Semantic Web: A new form of Web content that is meaningful to computers will unleash a revolution of new possibilities.</a></p>
<p>Today, 20 years after Tim Berners-Lee, James Hendler and Ora Lassila outlined a Semantic Web driven world where intelligent software agents automatically book flights and hotels and give us personalized answers, we can see Google transitioning from a search engine into a question-answering system and Alexa becoming a device that can book a flight for you. There are more than 80 million pages with semantic, machine interpretable <a href="https://www.ontotext.com/knowledgehub/fundamentals/metadata-fundamental/" rel="noopener" target="_blank">metadata</a>, according to the Schema.org standard. Take this restaurant, for example. Under the hood of its web content lie formalizations describing its address, opening hours, name and other details.</p>
<p><img alt="" src="https://www.ontotext.com/wp-content/uploads/2021/07/schema-screenshot-1024x402.png" /></p>
<p>In parallel, we have the <a href="https://www.ontotext.com/knowledgehub/fundamentals/linked-data-linked-open-data/" rel="noopener" target="_blank">Linked Open Data</a> (LOD) cloud, which currently contains 1,301 datasets with 16,283 links – datasets with mappings across them (<a href="https://lod-cloud.net/" rel="noopener" target="_blank">https://lod-cloud.net/</a> as of May 2021).</p>
<p><img alt="" src="https://www.ontotext.com/wp-content/uploads/2021/07/lod-cloud-2021-1005x1024.png" /></p>
<p>Schema.org and Linked Open Data are just two incarnations of the Semantic Web vision. Those are two massive information domains using W3C’s stack of the <a href="https://www.w3.org/2001/sw/wiki/Main_Page" rel="noopener" target="_blank">Semantic Web standards</a> (RDF, SPARQL, OWL, etc.).</p>
<p>And still there is confusion around the Semantic Web.</p>
<p>What is it? How exactly is the Web semantic? What can it do and how are enterprise knowledge graphs related to it?</p>
<p>Let’s start with the first question.</p>
<h2>Which Semantic Web?</h2>
<p>Paradoxically, the Semantic Web, which aims to unambiguously describe things, people and concepts, is itself an ambiguous term.</p>
<p>For some, the Semantic Web is about intelligent agents browsing the Web and executing sophisticated tasks. For others, the concept boils down to smart and efficient data management (Pascal Hiltzer traced the <a href="https://mags.acm.org/communications/february_2021/MobilePagedReplica.action?=undefined&pm=2&folio=75#pg77" rel="noopener" target="_blank">triumphs and challenges of two decades of Semantic Web research</a> and applications in a recent Review of the Semantic Web Field). For its critics, it is a pipe-dream, too academic to be realized, a never to come true vision (see the <a href="http://semantic-web-journal.net/system/files/swj2303.pdf" rel="noopener" target="_blank">perspectives regarding the degree to which the original Semantic Web vision has been realised</a> and the impact it can potentially have on the Web gathered by Aidan Hogan.) Authors Marshal and Shipman, for example, explored the many rhetorical, theoretical and pragmatic perspectives on the Semantic Web, discerning three major threads in them. The Semantic Web, their research showed, is seen as:</p>
<blockquote>
<p> (1) a universal library, to be readily accessed and used by humans in a variety of information use contexts; (2) the backdrop for the work of computational agents completing sophisticated activities on behalf of their human counterparts; and (3) a method for federating particular knowledge bases and databases to perform anticipated tasks for humans and their agents.</p></blockquote>
<p>17 years later, in the third edition of <em>The Semantic Web for the Working Ontologist</em>, authors Dean Allemang, Hedler and Gandon covered these same perspectives with one distilled explanation:</p>
<blockquote>
<p>The Semantic Web faces the problem of distributed data head-on.</p></blockquote>
<p>In more detail, they explained that just as the hypertext Web changed how we think about the availability of documents, the Semantic Web is a radical way of thinking about data. Its main idea is to support a distributed Web at the level of the data where organizations or individuals don’t just publish a human-readable presentation of information but a distributable, machine-readable description of the data.</p>
<p>We can see all of the above theoretical investigations in practice when it comes to what Tim Berners Lee said once when asked about the Semantic Web: <a href="https://youtu.be/HeUrEh-nqtU?t=75" rel="noopener" target="_blank">a way to pull data and then pull other data and connect them to see</a> how things fit in.</p>
<h2>What Does The Semantic Web Already Do for Us?</h2>
<p>If you’ve used Google, you’ve used the cornucopia of Linked data across the Web, through Google’s Knowledge Graph (Google’s Knowledge Graph is reportedly supported by <a href="https://arxiv.org/pdf/1805.03885.pdf" rel="noopener" target="_blank">Freebase – the knowledge acquired by Google in 2010.</a>) If you’ve enjoyed the efficiency of rich snippets, you’ve enjoyed the riches schema.org (<a href="https://twitter.com/danbri/status/1386993437472432128" rel="noopener" target="_blank">based on RDF</a>) brings to the world of search since 2011. If you’ve used Wikidata – the structured encyclopedia – you’ve been using a giant RDF knowledge graph, describing about 100 million topics with over 10 billion properties and relationships. That is also one of the sources from which Google’s Knowledge Graph is updated.</p>
<p>Taking a closer look at these applications, we see two main perspectives from which the Web is becoming increasingly semantic.</p>
<p><img alt="" src="https://www.ontotext.com/wp-content/uploads/2021/07/Weaving-the-Semantic-Web-01.png" /></p>
<h2>Weaving the Semantic Web with Semantic Annotations and Linked Open Data</h2>
<p>Ontotext was founded in 2000 with the Semantic Web in its genes and we had the chance to be part of the community of its pioneers. We can’t imagine looking at the Semantic Web as an artifact. We rather see it as a new paradigm that is revolutionizing enterprise data integration and knowledge discovery. Below, we outline the two directions in which we at Ontotext see and build the Semantic Web.</p>
<p>The two distinct threads interlacing in the current Semantic Web fabrics are the semantically annotated web pages with schema.org (structured data on top of the existing Web) and the Web of Data existing as Linked Open Data.</p>
<p>It is these two important types of data, which, taken together, implement the Semantic Web vision bringing forward innovative ways of tackling data management and data integration challenges. (Read about schema.org and LOD in our<a href="https://www.ontotext.com/knowledgehub/fundamentals/what-is-the-semantic-web/" rel="noopener" target="_blank"> Knowledge Hub</a>)<em>. </em>In them, we can see context being the enabler of value creation – context built by bringing data pieces together, at web-scale. And that connectivity at data level is what makes the Semantic Web and the technologies related to it such a good solution to the challenges of knowledge management and data integration. Ultimately, for the latest reincarnation of the field: the knowledge graph.</p>
<p><img alt="" src="https://www.ontotext.com/wp-content/uploads/2021/07/Sem-web-with-knowledge-graph.png" /></p>
<h2>Enterprise Knowledge Graphs and the Semantic Web</h2>
<p>Facing the need to manage and analyze information at a previously unforeseen level, organizations began searching for infrastructures that could handle the massivity of available data and provide the means to make sense of this data. In this “data + knowledge” era in the history of creating intelligent systems to integrate knowledge and data at large scale (as Juan Sequeda calls the period from 2000s till now in his <a href="https://knowledgegraph.today/" rel="noopener" target="_blank">“A Brief History of Knowledge Graphs”</a>) knowledge graphs began to emerge as such infrastructures.</p>
<p>Еnabling semantic search, easier and deeper navigation across diverse data, knowledge graphs have become a business-critical element for many enterprises today. Among the largest knowledge graphs are those of Google, IBM, Amazon, Samsung, Ebay, Bloomberg, NY Times. Most of those first big knowledge graphs are used in web-to-consumer applications where a single graph serves a wide variety of clients based on non-proprietary information.</p>
<p>Enterprise knowledge graphs came as a second wave to serve a different purpose – they use <a href="https://www.ontotext.com/knowledgehub/fundamentals/what-are-ontologies/" rel="noopener" target="_blank">ontologies</a> to make explicit various conceptual models (schemas, taxonomies, vocabularies, etc.) used across different systems in the enterprise. Using the enterprise data management slang, knowledge graphs represent a premium sort of semantic reference data: a collection of interlinked descriptions of entities – objects, events or concepts (see our <a href="https://www.ontotext.com/knowledgehub/fundamentals/what-is-a-knowledge-graph/" rel="noopener" target="_blank">definition of knowledge graphs</a>).</p>
<p>Providing a formal unified conceptual model, ontologies enable unified access to and correct interpretation of diverse information and greatly facilitate analytics, decision making and knowledge re-use. The most advanced enterprise knowledge graphs smarten up proprietary information by using global knowledge as context for interpretation and source for enrichment. Such knowledge graphs deliver not only “operational optimizations”, but help organizations combine their proprietary wisdom and information with rich domain knowledge and get a competitive advantage in dynamic environments. And while not all knowledge graphs (see <a href="https://www.slideshare.net/Frank.van.Harmelen/adoption-of-knowledge-graphs-late-2019" rel="noopener" target="_blank">Adoption of Knowledge Graphs, late 2019</a>) are built <a href="https://www.ontotext.com/blog/knowledge-graph-with-semantic-data-modeling/" rel="noopener" target="_blank">the semantic modelling way</a>, they all have benefited from the Semantic Web. This is either because they use <a href="https://www.ontotext.com/knowledgehub/fundamentals/what-is-rdf/">RDF</a> or because, to a different extent, they’ve used Linked Data to broaden the scope of what the graph “knows”.</p>
<p>The “know more thread” is central to understanding the rapid adoption of semantic technologies for knowledge graphs. This is because for a system to “know” more it is essential to have broader knowledge. Such broader knowledge is unattainable by any single organization. No one company on the planet can build the ultimate knowledge graph. As <a href="https://www.linkedin.com/pulse/why-do-knowledge-graphs-need-10000-pairs-hands-amit-sheth/" rel="noopener" target="_blank">Amit Sheth explained</a>, today’s knowledge graphs needed for Google Semantic Search or Amazon Alexa seem to be built, as a rule of thumb, with at least 10,000 pairs of hands.</p>
<p>It is exactly that ability to derive knowledge by interconnecting data that turns the building and maintaining of an enterprise knowledge graph into an activity of building a competitive advantage. The more connected the data (Linked Data), the more knowledge the enterprise knowledge graph is infused with. And it is that knowledge (enabled by the technologies of the Semantic Web, specifically by RDF) that gives a competitive advantage to the company building the graph.</p>
<p>The major added value of knowledge graphs is the paradigm for using ontologies, explicit formal conceptual models, to put together data scattered across different systems. The key characteristic is that ontologies can capture, integrate and operationalize knowledge across several disciplines and type of systems:</p>
<ul>
<li>Database schemas;</li>
<li>Master and reference data (critical in enterprise data management);</li>
<li>Taxonomies and controlled vocabularies (critical in content management and knowledge management);</li>
<li>Scientific data;</li>
<li>Product catalogues.</li></ul>
<h2>Epilogue: Why the Semantic Web Will Always Work</h2>
<p>In any of its aspects, for us and our clients, the Semantic Web will always work, by incessantly providing the necessary technologies for granular, detailed and well-described semantic metadata. The richness of RDF is expressive enough to be able to put them together and work together. That’s the genius of RDF – as a way of presenting data and metadata, it’s a good fit for all these things at once. The RDF data model and the other standards in W3C’s Semantic Web stack (e.g., OWL and SPARQL) enable the use of these knowledge models as hubs for:</p>
<ul>
<li>integration of data across different systems, without collisions;</li>
<li>virtualized or federated access to data residing in different systems;</li>
<li>data unification and fusion;</li>
<li>providing alternative views on top of a single dataset;</li>
<li>management of diverse structured metadata.</li></ul>
<p>In a nutshell, summarizing the enabling features of these standards, it is global identifiers that facilitate interoperability, formal semantics that brings explicit common meaning and validation (SHACL/RDF Forms) that leads to high data quality.</p>
<p>Despite the widespread belief that knowledge graphs help enterprises find content easier and deal with heterogeneous data more efficiently (which they do), the biggest driver for the enterprises to build KG is to get better insights and competitive advantage, smartening up their proprietary information by using global knowledge as context for interpretation and source for enrichment.</p>
<p>In knowledge-intensive domains and applications, which require highly interconnected reference data and building complex relationships between them, knowledge graphs help enterprises get profound insights via linking, analysis and exploration of diverse databases, content, proprietary and global data.</p>
<p>And all that mesh of data, or data fabrics as you might see it referred to, wouldn’t have been possible if it weren’t for the affordances of the Semantic Web to connect data in knowledge graphs in order to derive value from it.</p>
<p><strong>Are you ready to learn more about the reincarnation of the Semantic Web – the knowledge graph?</strong></p>
<p>Listen to our webinar: <a href="https://www.ontotext.com/knowledgehub/webinars/knowledge-graph-maps/" rel="noopener" target="_blank">Knowledge Graph Maps: 20+ Application and 30+ Capabilities</a>, which focuses on enterprise knowledge graphs as hubs for data, metadata and content offering unified views to diverse information.</p>
<p><a href="https://cta-redirect.hubspot.com/cta/redirect/5619976/4cc57c62-b5ef-4c98-9b7f-e3107bd597fe"><img alt="New call-to-action" id="hs-cta-img-4cc57c62-b5ef-4c98-9b7f-e3107bd597fe" src="https://no-cache.hubspot.com/cta/default/5619976/4cc57c62-b5ef-4c98-9b7f-e3107bd597fe.png" /></a></p>
Andrus, D. Calvin, The Wiki and the Blog: Toward a Complex Adaptive Intelligence Community. Studies in Intelligence, Vol 49, No 3, September 2005, Available at SSRN: https://ssrn.com/abstract=755904
<p>The lean canvas is a tool that helps entrepreneur to form their idea into a macro plan and later (hopefully) a full function service or product. I have used it many times and it’s a special useful tool if you wish to test an idea efficiently.</p>
<p>You can use something like a <a class="bq de gv gw gx gy" href="http://ift.tt/2etZCp4" rel="noopener nofollow" target="_blank">good pitch deck</a> to do the same. The core in these tools is to help you articulate what are you going to do and how you are going to win with it.</p>
<p>Let’s have a look at the page below. You can click on it to see it on a full page. If you wish to work with such a template — scroll down and print the clean one that we got in the bottom of this post.</p>
<div>
<div>
<div>
<div> </div><img alt="lean canvas" class="ak ds hh hq ly nu t u" src="https://miro.medium.com/max/696/0*tPk9pTtuFD6x1SzH." style="height:325px; width:696px" /></div></div></div>
<p>The idea here is to think on our idea and to break it down to the different aspects.</p>
<p>We will fill in short bullet points each section. If you have a co-founder or advisor/mentor to consult with, please do so. It will improve the final result. Also, show the result to many people that you respect. Each might give you a point of view you didn’t think about.</p>
<h1>The Problem (think on it as opportunity)</h1>
<p>What is the problem and why it’s worth doing?<br />
Describe the need. If you have customers it’s even better.</p>
<h1>The Solution</h1>
<p>What are you doing that address the problem at #1.<br />
This should be a short and articulate description of what you do.</p>
<h1>Key Performance Indicator</h1>
<p>What are the KPIs that you will move you forward?<br />
How are you going to measure them?</p>
<h1><strong>Unique Value Proposition</strong></h1>
<p>What is the value of the solution you are going to provide?<br />
Why it’s unique and no one else could do it better than you?<br />
How much money/time/effort it will save or generate?<br />
If you can show that it’s a ‘must have’ and people will be happy to pay for it. Try to show how this value fits in the big picture.</p>
<h1>Unfair Advantage</h1>
<p>What are you doing that no one else does?<br />
Is it faster, cheaper, better? In what way? Why?<br />
It might be special talent, some intellectual property or new way to do things.</p>
<h1><strong>Channels / Go To Market Plan</strong></h1>
<p>How are you going to get customers?<br />
What are the ways you plan to interact with them?<br />
Are you going to use direct sales, channels, freemium or something else?<br />
What will be the cost of acquisition?</p>
<h1>Customer Segments</h1>
<p>What are the segments in the market that you are going to help?<br />
You might want to have few ‘user personas’ and address each one with prioritization.<br />
Try to identify the early adopters (that hopefully are going to LOVE your solution).</p>
<h1>Cost Structure</h1>
<p>What will it cost to launch and run your business? Break it down to people (in most cases this is the heavy part), hosting, customer acquisition, distribution cost, sales etc’</p>
<h1>Revenue Streams</h1>
<p>How are you going to make money?<br />
What is your pricing model? This is the most challenging aspect — to come with the right pricing. You want it to be extremely competitive and on the other hand, not to leave (too much) money on the table.<br />
What is the lifetime value of your user?<br />
What will be the gross margin?</p>
<p>(!) Learn more about your options with this course on <a class="bq de gv gw gx gy" href="http://ift.tt/1EVtcKN" rel="noopener nofollow" target="_blank">App Monetization</a>.</p>
<div>
<div>
<div>
<div> </div><img alt="lean-canvas-template-1" class="ak ds hh hq ly nu t u" src="https://miro.medium.com/max/696/0*q0ldtHC_kUeppoBg." style="height:402px; width:696px" /></div></div></div>
<h2>Bonus points</h2>
<p>Try to identify your competitors (visible and hidden). Give a short overview of what the competitors are doing and how you plan to win. Build credibility by showing that you are aware of all the major visible competitors and even some hidden ones. A nice chart the shows your strengths and weaknesses vis a vis your competitors will help here.</p>
<p>That’s it!</p>
<p>Happy new year!</p>
<p><em>Originally published on </em><a class="bq de gv gw gx gy" href="http://ift.tt/2hAH0bX" rel="noopener nofollow" target="_blank"><em>Ido Green</em></a></p>
I would like my nurse to be able to record nursing activities rendered to a given patient
I would also like my receptionist to be able to create new patient profiles, or reactivate discharged patient profiles in an intuitive manner
As a doctor, I would like to initiate a file, document cases, order and record lab and other investigation results so that I can help my patient
As a business owner and doctor, I would like to ensure data is stored on premise to ensure security and confidentiality.
I would like pharmacy prescription fulfillment to be noted
I would like my lab to be able to read orders and report results
<$tmap view="Default" editor="advanced" height="500px" ></$tmap>
The group: https://groups.google.com/forum/#!forum/tiddlywiki
Tips: http://tobibeer.github.io/tb5/#Welcome
BJ Tools for examples: http://bjtools.tiddlyspot.com/
Widget specific notes: http://cjhunt.github.io/
~PouchDB for TW5: https://github.com/danielo515/tw5-pouchdb
TW scripts and useful tools: https://kookma.github.io/TW-Scripts
<<list-links "[tag[TiddlyWiki]]">>
We could insert TiddlyWiki directly into the normal workflow of life by solving email the way Hey has.
We could try to turn TiddlyWiki into a screening/triaging tool for email. There seem to be problems with [[Hey's offering|https://www.nytimes.com/2020/06/17/technology/personaltech/hey-email-service-screening.html]] (yes, I realize the irony of me using a NYT article to make a judge a software service).
Here's a [[summary of Hey's features|Hey]], including pros and cons. However, there is also an elephant in the room that we have to deal with: the rise of messenger apps and their displacement of email as a primary communication tool. Having a way to [[manage communications|Did you get my slack/email/text?]] from so many channels and allowing folks to reply from a single point would be a great way of dealing with the information overload, though it has to be done in such a way so as to not overwhelm that single point of contact.
We could imagine a kanban-like system that minimizes waste of attention:
|!Backlog (to screen and filter)|!Categorized action items (to prioritize and review periodically)|!Customized columns (good for prolonged periods of focused work)|!Done|
|All messages come here & you can filter accordingly once into categories. Ideally you shouldn't have to come back to this column for a long time after you're done with it|The screened messages can be further divided into various categories of items based on anything, including the [[Time management matrix]]|One can create new columns based on tags in the categorized action items basket for uncluttered focus|Messages that have already been dealt with but can be reviewed in an organized fashion|
The above table is simply a sketch of how I think this email aide should work (''it would require a form of [[auto-tagger based on some filter rules|AutoTagger]]''); but how can we [[accommodate other channels of communication|Did you get my slack/email/text?]]?
__Read Further__
* [[IMAP vs POP|https://www.pair.com/support/kb/imap-vs-pop-which-should-you-use/]]
Thinking of creating bite sized regular content about wiki patterns and other knowledge productivity tidbits.
Here's a great [[music resource we could use from Lofi Girl!|https://lofigirl.com/pages/use-the-music]]
I really like the calm, atmospheric nature of the //Journey to the Mircrocosmos// ~YouTube series by Complexly. They're very effective and I think we should try making something like that, with a similar format. It's something I should discuss with Ben this Saturday.
This is important because these videos will be helpful not just as basis for a future visual help library for OnePlaybook, but also for as a content marketing strategy for the platform.
Recently I tweeted about my reaffirmed belief that the unique value of TiddlyWiki is that it assumes very little about your needs (i.e. [[generativity|Foundation of pattern languages]]), leaving the possibility of capturing whatever processes you favor open to you.
I think that is what OnePlaybook should be: to act as a means of easily capturing valuable processes for quick and efficient execution.
So we will have to focus the landing page less on features and more on capitalizing the present audience that believes in that. That way we get to accommodate everyone else via extensions.
Time to revisit the canvases.
<p>“Who can define for us with accuracy the difference between the long and short term! Especially whenever our affairs seem to be in crisis, we are almost compelled to give our first attention to the urgent present rather than to the important future.”</p>
<blockquote>
<p>— Dwight D. Eisenhower, 1961 address to the Century Association</p></blockquote>
<p>Dwight D. Eisenhower — five-star general during World War II and 34th president of the United States — was a productive guy.</p>
<p>During his two terms as president of the United States, he led the construction of the Interstate Highway System, created NASA, signed into law the first major piece of civil rights legislation since the end of the Civil War, ended the Korean War, welcomed Alaska and Hawaii into the union, and managed to keep the Cold War with Russia cold.</p>
<p>And he did it all with panache — Eisenhower was Gallup’s most admired man of the year no less than twelve times.</p>
<p>How was Eisenhower able to rack up so many accomplishments that would have such a lasting impact on his country and the world? He understood the fundamental difference between the Urgent and the Important. In a 1954 speech, Eisenhower quoted an unnamed university president who said, “I have two kinds of problems, the urgent and the important. The urgent are not important, and the important are never urgent.”</p>
<p>Over 3 decades later in his best-selling book <a href="https://www.franklincovey.com/the-7-habits.html">The 7 Habits of Highly Effective People</a>, Stephen Covey repackaged Eisenhower’s insights into a simple tool to prioritize tasks, now known as the Eisenhower Matrix (also known as The Time Management Matrix, The Eisenhower Box, The Eisenhower Method, and The Urgent-Important Matrix). This framework for prioritization helps you combat the “mere-urgency” effect (more on that later), eliminate time-wasters in your life, and create more mental space to make progress on your goals.</p>
<p>Try the Eisenhower Matrix if you...</p>
<ul>
<li>
<p>Find yourself running around putting out fires all day (figuratively speaking)</p></li>
<li>
<p>Are busy but don’t feel like your work has a high impact</p></li>
<li>
<p>Have long-term goals but no time or energy to make progress on them</p></li>
<li>
<p>Have a hard time delegating and/or saying no</p></li>
<li>
<p>Want to be the president of the United States (hey, it worked for Eisenhower)</p></li></ul>
<p>This article will walk you through why distinguishing between the Urgent and the Important is so critical, how the Eisenhower Matrix helps you do it, and how to apply the matrix to both your big-picture projects and everyday tasks using <a href="https://todoist.com/?itm_campaign=eisenhower_matrix&itm_medium=referral&itm_source=productivity_methods_guides">Todoist</a>.</p>
<h2>The Mere-Urgency Effect a.k.a. Why We're Bad at Prioritization</h2>
<p>How do we decide which task to give our attention to at any given moment? Not very well, it turns out.</p>
<p>A recent <a href="https://www.researchgate.net/publication/327103488_The_Mere_Urgency_Effect">study</a> in the Journal of Consumer Research set out to examine how people decide what to work on when faced with tasks of mixed urgency and importance. Across five separate experiments, researchers observed a curious pattern: our attention is drawn to time-sensitive tasks over tasks that are less urgent <em>even when the less urgent task offers greater rewards</em>. This psychological quirk — dubbed the "Mere-Urgency Effect" — explains why we're so bad at task and time management. We're more likely to prioritize tasks with a deadline over tasks without one regardless of their long-term payoffs.</p>
<p>And the effect is even more prominent in people who describe themselves as “busy”. The same researchers found that self-described busy people were more likely to select urgent tasks with lower payouts because they were already fixated on task duration. If you're already feeling a time crunch, you’ll likely continue to prioritize tasks that keep you focused on the clock.</p>
<p>But there's good news too — the mere-urgency effect can be reversed. When participants were prompted to consider the consequences of their choices at the time of selection, they were significantly more likely to choose the important task over the urgent one. The findings suggest that if you keep the long-term importance of non-urgent tasks in view, you can overcome the pull toward urgent distractions and focus on what really matters.</p>
<p>That’s where the Eisenhower Matrix comes in.</p>
<h2>The Eisenhower Matrix — Urgent vs. Important</h2>
<p><img alt="productivity-methods eisenhower-matrix" src="https://images.ctfassets.net/dm4oa8qtogq0/6Z0iRvBwjXMLrd28BUzTW4/c4da1ffcf2ce38f60ee4239c42c54ba9/productivity-methods_eisenhower-matrix.png" /></p>
<p>The Eisenhower Matrix is a simple tool for considering the long-term outcomes of your daily tasks and focusing on what will make you most effective, not just most productive. It helps you visualize all your tasks in a matrix of urgent/important. All of your day-to-day tasks and bigger projects will fall into one of these four quadrants:</p>
<ul>
<li>
<p>Urgent & Important tasks/projects to be completed immediately</p></li>
<li>
<p>Not Urgent & Important tasks/projects to be scheduled on your calendar</p></li>
<li>
<p>Urgent & Unimportant tasks/projects to be delegated to someone else</p></li>
<li>
<p>Not Urgent & Unimportant tasks/projects to be deleted</p></li></ul>
<p>In the real world, the distinction between urgent/non-urgent, important/not important is much murkier than under experimental conditions. Here's how Steven Covey breaks it down:</p>
<blockquote>
<p><strong>Urgent</strong> matters are those that require immediate action. These are the visible issues that pop up and demand your attention NOW. Often, urgent matters come with clear consequences for not completing these tasks. Urgent tasks are unavoidable, but spending too much time putting out fires can produce a great deal of stress and could result in burnout.</p>
<p><strong>Important</strong> matters, on the other hand, are those that contribute to long-term goals and life values. These items require planning and thoughtful action. When you focus on important matters you manage your time, energy, and attention rather than mindlessly expending these resources. What is important is subjective and depends on your own values and personal goals. No one else can define what is important for you.</p></blockquote>
<p>Below is an in-depth look at each of the four quadrants of the Eisenhower Matrix to help you identify which tasks go in each and how to handle them accordingly.</p>
<h3>Quadrant 1: Urgent & Important</h3>
<p><img alt="productivity-methods eisenhower-highlight-1" src="https://images.ctfassets.net/dm4oa8qtogq0/4gdgTBX1mhT5rQJYIOraSb/aea5e2d973cd2aab9db9545873662d00/productivity-methods_eisenhower-highlight-1.png" /></p>
<p>Urgent and Important tasks demand you take action quickly. These items typically have visible deadlines and consequences for stalling on taking action. Most often, these are either things that were sprung on you from an external source or things that you put off until faced with a looming deadline. Either way, they require a crisis mode response.</p>
<p>For example:</p>
<ul>
<li>
<p>Covering a project for a colleague out sick</p></li>
<li>
<p>Car stalls on the highway</p></li>
<li>
<p>Sink springs leak and floods your kitchen in two feet of water</p></li>
<li>
<p>Clients come to you with a pressing problem</p></li>
<li>
<p>A last-minute deadline is assigned to you</p></li></ul>
<p>Quadrant 1 tasks are inevitable. Even if you never procrastinated (which is an impossible ask), there will always be something beyond your control. However, the problem comes when you focus on these unexpected or deadline-driven tasks to the exclusion of long-term goals that are important to you.</p>
<p>Covey cautions that spending too much time on Quadrant 1 tasks can lead to increased stress, <a href="https://doist.com/blog/burnout-life-reset-start-here/?itm_campaign=eisenhower_matrix&itm_medium=referral&itm_source=productivity_methods_guides">burn out</a>, and the sense that your days are out of your control. Spending all day putting out fires will quickly rob you of energy and passion for your work, and may make it easier to settle into mindless escapism found in Quadrant 4.</p>
<h3>Quadrant 2: Not Urgent & Important</h3>
<p><img alt="productivity-methods eisenhower-highlight-2" src="https://images.ctfassets.net/dm4oa8qtogq0/3jHWkGxJZvES4GQFQ6JN2o/b3f291f3d80714f22305ca1eb49c215f/productivity-methods_eisenhower-highlight-2.png" /></p>
<p>Not urgent, but important tasks are the activities that help you achieve long-term goals. These may not have a deadline (or even an end date) so it is easy to put them off in favor of more urgent tasks. However, these tasks have a much greater effect on your long-term effectiveness in completing your goals.</p>
<p>Examples:</p>
<ul>
<li>
<p>Planning for long and short-term projects</p></li>
<li>
<p>Regular chores or maintenance projects</p></li>
<li>
<p>Professional networking and personal relationship building</p></li>
<li>
<p>Learning a new skill, keeping up with current research in your field, attending educational events</p></li>
<li>
<p>Exercise and routine healthcare</p></li></ul>
<p>Covey says that Quadrant 2 is the sweet spot of personal time management. This is the spot where you are focused not on problems (as with Q1) but on opportunities and growth. Living from this quadrant of the matrix means that you are proactive and prioritize activities that grow your skills and energy, and contribute to accomplishing meaningful goals. Quadrant 2 is where “<a href="https://doist.com/blog/complete-guide-to-deep-work/?itm_campaign=eisenhower_matrix&itm_medium=referral&itm_source=productivity_methods_guides">deep work</a>” happens because you are largely freed of pressing distractions.</p>
<p>By attending to Q2 consistently, you decrease the number of pressing problems that pop up in Q1. Living in Q2 means that you can create a plan to complete projects and avoid possible problems. For example, if you keep putting off completing routine car maintenance, you may pay for it later when your car stalls out.</p>
<p>Do you manage other people?</p>
<h3>Dig deeper</h3>
<p>Do you manage other people? Learn how you can <a href="https://doist.com/blog/heroes-housekeeping-days/?itm_campaign=eisenhower_matrix&itm_medium=referral&itm_source=productivity_methods_guides">help your team spend more time in quadrant 2</a> too.</p>
<h3>Quadrant 3: Urgent & Not Important</h3>
<p><img alt="productivity-methods eisenhower-highlight-3" src="https://images.ctfassets.net/dm4oa8qtogq0/37OnIQ3wgYXUlFkVGlhNZY/53f2c977a053fbdb775ae793dc593119/productivity-methods_eisenhower-highlight-3.png" /></p>
<p>Urgent but Not Important tasks are best described as busy work. These tasks are often based on expectations set by others and do not move you closer to your long-term goals.</p>
<p>Examples:</p>
<ul>
<li>
<p>Unnecessary interruptions from coworkers</p></li>
<li>
<p>Checking your phone or email whenever it goes off</p></li>
<li>
<p>Responding to certain texts, emails, or social media messages</p></li>
<li>
<p>Acting on coupons or limited time offers</p></li>
<li>
<p>Some meetings</p></li></ul>
<p>Quadrant 3 is where the mere urgency effect lives. The drive to complete tasks because of real or assumed deadlines means you take on tasks that aren’t actually meaningful to you. Given that Q3 tasks are urgent but typically related to someone else's priorities, spending too much time in this square can feel like you are doing things you should do rather than what you want to do. Focus on Q3 tasks may make you feel like you are not living up your larger life goals or don’t have control over your day-to-day life.</p>
<p>Covey suggests delegating as many Q3 tasks as possible. Can you have someone else take those meeting notes? Can you get your groceries delivered instead of going to the store? Can you empower your children to do the dishes? Can you hire a digital assistant to schedule family doctor visits? Is there anything in your life you can automate?</p>
<p>If you can’t delegate these tasks, try to keep them from taking over your day:</p>
<ul>
<li>
<p>Turn off notifications on your phone and computer when working</p></li>
<li>
<p>Be clear with others about how much time you can spend on a given task</p></li>
<li>
<p>Save Q3 tasks for times when you are very low on energy rather than putting them first thing in the morning</p></li>
<li>
<p>Negotiate your workload with your boss</p></li>
<li>
<p><a href="https://doist.com/blog/how-to-say-no/?itm_campaign=eisenhower_matrix&itm_medium=referral&itm_source=productivity_methods_guides">Practice saying no</a></p></li></ul>
<h3>Dig deeper</h3>
<p>For more tips on getting out of Q3, learn <a href="https://doist.com/blog/busywork-productivity-focus/?itm_campaign=eisenhower_matrix&itm_medium=referral&itm_source=productivity_methods_guides">how to Vanquish Busywork and Spend More Time on What Matters</a>.</p>
<h3>Quadrant 4: Not Urgent & Not important</h3>
<p><img alt="productivity-methods eisenhower-highlight-4" src="https://images.ctfassets.net/dm4oa8qtogq0/2hVsvbhJGJZIPi6sQixXLF/0813c1d600660b7c220f41f6c0d742e9/productivity-methods_eisenhower-highlight-4.png" /></p>
<p>Not urgent and not important tasks are time-wasting activities that should be ruthlessly cut out. These activities don’t contribute to progress on your goals but can end up taking over large chunks of time.</p>
<p>Examples:</p>
<ul>
<li>
<p>Watching TV for hours</p></li>
<li>
<p>Mindlessly refreshing social media and scrolling</p></li>
<li>
<p>Avoidance activities such as sorting and organizing email rather than answering it</p></li>
<li>
<p>Excessive shopping or online browsing</p></li></ul>
<p>Quadrant 4 is the quadrant of excess and immediate gratification that ultimately leaves you feeling unfulfilled.</p>
<p>Don’t get me wrong we all need some leisure time. Eisenhower himself was a well-known bridge player — even playing nightly up to D-Day — and was famously criticized for his many golf trips while in office. The key is that these activities were a balance for the many stressful aspects of being a political leader. However, if you're not intentional about it, the way you spend your downtime can actually drain your energy, passion, and creativity.</p>
<p>A <a href="https://www.researchgate.net/publication/330940650_Enjoy_Your_Evening_Be_Proactive_Tomorrow_How_Off-Job_Experiences_Shape_Daily_Proactivity">recent study</a> published in the Journal of Applied Psychology found that how employees spend their off-job leisure time is a strong predictor for how much energy and positivity they expressed the following workday. Employees who engaged in self-mastery activities such as exercise or volunteering were more motivated the following day. Employees who relaxed with yoga, meditation, or by listening to music approached the workday more calmly.</p>
<p>Employees who engaged in distraction activities to avoid or ignore problems, like watching excessive TV, did show a renewed positivity the following workday. However, with continued use of distraction their moods and motivation worsened as the week continued. In other words, distraction in moderation was ok, but habitual distraction resulted in less work satisfaction overall.</p>
<h3>Dig deeper</h3>
<p>At a loss for what to do in your spare time when TV and social media are off the table? <a href="https://doist.com/blog/9-ways-to-create-more-time/?itm_campaign=eisenhower_matrix&itm_medium=referral&itm_source=productivity_methods_guides">Try these ideas</a></p>
<h2>How to rebalance your quadrants</h2>
<p>According to Stephen Covey, quadrant 2 is the “Quadrant of Quality” where time spent engaging these tasks increases your overall effectiveness. This is where personal and professional growth meets planning, prevention, and action.</p>
<p>To evaluate where you currently are on the matrix, start <a href="https://doist.com/blog/quantified-self-apps/?itm_campaign=eisenhower_matrix&itm_medium=referral&itm_source=productivity_methods_guides">tracking your time</a> and tasks. If you use Todoist for task management, you can easily get a <a href="https://get.todoist.help/hc/en-us/articles/205847912-View-completed-tasks?itm_campaign=eisenhower_matrix&itm_medium=referral&itm_source=productivity_methods_guides">list of all the tasks you completed</a> and when you completed them. When you have a few days worth of data, sit down and organize your tasks into quadrants by asking the following questions:</p>
<ol>
<li>
<p>Was this urgent for me?</p></li>
<li>
<p>Was this important to me?</p></li></ol>
<p>Remember that you are only deciding these criteria based on your desired outcomes, not someone else’s.</p>
<p>Once your tasks are sorted into the appropriate quadrants, examine where your time is currently being spent. Are you happy with your quadrant balance?</p>
<p><strong>If you spend a lot of time in Q1, invest time in planning to anticipate and prevent problems:</strong></p>
<ul>
<li>
<p><strong>Next step: </strong>Organize a weekly or even monthly plan around your current goals and deadlines. At the end of each week, <a href="https://todoist.com/productivity-methods/weekly-review">do a weekly review</a>. Reflect on how well your plan worked and adjust for the next week. If most of your Q1 tasks come from external sources, strategize on how you can better plan and anticipate them. You may need to develop a more proactive workflow with a colleague or client, or talk to your boss about rebalancing an excessive workload. If there’s a particular client who’s creating a lot of Q1 tasks, the work may not be worth the stress.</p></li></ul>
<p><strong>If you spend your time in Q3, delegate, eliminate, or limit the amount of time you spend on these tasks:</strong></p>
<ul>
<li>
<p><strong>Next Step: </strong>Strategize and write out specific steps on how you’ll limit these tasks. Can you delegate them? Can you just say no? Can you <a href="https://todoist.com/productivity-methods/time-blocking#task-batching">batch these types of tasks together </a>in a single afternoon during your week? Can you have an open discussion with your boss about just how much time you’re spending on “busywork”? Schedule time in your week to take these steps.</p></li></ul>
<p><strong>If you spend your time in Q4, you may be stuck in a rut, stressed, or avoiding a problem:</strong></p>
<ul>
<li>
<p><strong>Next Step: </strong>Use your time tracking to identify the biggest time wasters and strategize on how to avoid or limit them. <a href="https://doist.com/blog/overcome-procrastination/?itm_campaign=eisenhower_matrix&itm_medium=referral&itm_source=productivity_methods_guides">Develop a plan to overcome procrastination before</a> you're tempted to procrastinate. Remember, it’s ok to just relax sometimes, but activities in this quadrant have diminishing returns when used excessively.</p></li></ul>
<p>As you shift your priorities toward quadrant 2, keep using the Eisenhower Matrix to know what you should be working on day to day.</p>
* No optimal knowledge productivity app exists: [[Knowledge Organization and Federated Wikis]]
* Does the perfect knowledge productivity app exist? [[Knowledge Organization and Federated Wikis]]
* Achieving True Productivity through Federated Knowledge Organization
* Federate all your knowledge to achieve true productivity
* Notion, APIs, Wikis and RoamResearch; How to achieve true productivity via Federated Knowledge Organization
* Productive writers use robust knowledge architectures, or why you should federate your knowledge
* Productive creators use robust knowledge architectures
* Why the cult of RoamResearch may be killing your productivity (too provocative?)
* Beyond RoamResearch: [[Knowledge Organization and Federated Wikis]]
<$button>
<$action-sendmessage $message="tm-new-tiddler" tags="task" title="New Todo" />
Create a todo
</$button>
! Outstanding tasks
//Drag the tasks to re-order them//
<<list-tagged-draggable tag:"task" subFilter:"!has[draft.of]!tag[done]" itemTemplate:"TaskManagementExampleDraggableTemplate" emptyMessage:"You don't have any active tasks">>
! Completed tasks
//(Listed in reverse order of completion)//
<$list filter="[!has[draft.of]tag[task]tag[done]sort[created]]">
<div>
<$checkbox tag="done"> ~~<$link to={{!!title}}><$view field="title"/></$link>~~</$checkbox>
<$button message="tm-delete-tiddler" style="border:none;">❎</$button>
</div>
</$list>
\import $:/plugins/kookma/todolist/macros/archive-operations
\import $:/plugins/kookma/todolist/macros/priority
!! Archive of completed (done) items
<$macrocall $name="todolist-empty-archived-tiddler" nameSpace={{!!td-namespace}} />
> <$macrocall $name="todolist-list-archived-items" nameSpace={{!!td-namespace}} />
\import $:/plugins/kookma/todolist/macros/archive-operations
\import $:/plugins/kookma/todolist/macros/priority
!! Archive of completed (done) items
<$macrocall $name="todolist-empty-archived-tiddler" nameSpace={{!!td-namespace}} />
> <$macrocall $name="todolist-list-archived-items" nameSpace={{!!td-namespace}} />
\import $:/plugins/kookma/todolist/macros/archive-operations
\import $:/plugins/kookma/todolist/macros/priority
!! Archive of completed (done) items
<$macrocall $name="todolist-empty-archived-tiddler" nameSpace={{!!td-namespace}} />
> <$macrocall $name="todolist-list-archived-items" nameSpace={{!!td-namespace}} />
\import $:/plugins/kookma/todolist/macros/archive-operations
\import $:/plugins/kookma/todolist/macros/priority
!! Archive of completed (done) items
<$macrocall $name="todolist-empty-archived-tiddler" nameSpace={{!!td-namespace}} />
> <$macrocall $name="todolist-list-archived-items" nameSpace={{!!td-namespace}} />
__Resources__
* [[Toolboksi lean canvas|https://1drv.ms/w/s!AnpVkYogMePJkBKqjcW0-OYfaPm_?e=25mZaX]]
__Meeting notes__
# Attendees
## Julian, founder of Toolboksi
## Abraham
## Ben
# Final decision: Julian will discuss with his team in anticipation of a Lean decision maker session this Saturday 13/6/2020
# Business model canvas by Alexander Osterwalder, a Swiss business theorist and ~PhD in management information systems
# Innovators canvas by Jake Nielson which combines the Business model canvas and the value proposition canvas, but also includes a "why" of your business
# Lean canvas by Ash Maurya which which puts emphasis on UVP and Key metrics
Five or ten minute short videos on Startup challenges and lessons to apply:
# Good ideas
# Funding
# Team building
# Marketing
''Transclusion'' in a Formula or Datum follows the [[same rules and syntax as in WikiText|https://tiddlywiki.com/#Transclusion%20in%20WikiText:%5B%5BTransclusion%20in%20WikiText%5D%5D]]*. The transcluded text is treated as a [[Datum]], rather than WikiText.
^^* Filtered Transclusion is not currently supported.^^
There is a special edition of TiddlyWiki that simplifies creating and maintaining translations:
* https://tiddlywiki.com/editions/translators/ to translate current version of ~TiddlyWiki
* https://tiddlywiki.com/prerelease/editions/translators/ to translate latest prerelease version of ~TiddlyWiki
Note that no knowledge of Node.js or GitHub is required.
You can translate ~TiddlyWiki on Node.js, type `tiddlywiki editions/translators --listen` and visit http://127.0.0.1:8080/ in your browser.
See https://tiddlywiki.com/dev for technical details of creating and maintaining translations.
The translation mechanism of TiddlyWiki manages and switches between language plugins that provide translations of the TiddlyWiki user interface. The developer site at https://tiddlywiki.com/dev/ explains how translators can create and submit translations for TiddlyWiki.
The title of the current language plugin is read from the tiddler [[$:/language]]. If the selected plugin changes then any displayed translateable text automatically changes.
Translation plugins are bundles of tiddlers that each contain an indepedent translatable string. The strings are transcluded as needed.
Translatable strings are generally in the namespace `$:/language/`, for example:
* [[$:/language/EditTemplate/Shadow/OverriddenWarning]]
* [[$:/language/Docs/ModuleTypes/isfilteroperator]]
* [[$:/language/EditTemplate/Fields/Add/Value/Placeholder]]
Travel in Dar is a major hassle. We can split the problems between public and private:
* Public
** [[Daladalas|Daladala painpoints]]
** Long distance buses
** Taxis
*** their sitting in one place may be required by their organization, but it woefully inefficient and inconvenient to the consumer
*** they don't have an uber-like experience of convenience to offer
** Ubers
*** drivers tend to be in the dark about basic analytics of their work. Having some analytics on where potential riders might be and at what time, fuel consumption and price visibility would save them a lot of uncertainty
*** Uber takes a big cut, that is Ube's presence is a problem
*** Uber riders sometimes cannot make it clear their presence ahead of time.
*** The Uber algorithm is relatively obscure to both riders and drivers
** Bodaboda
** Bajaji
* Private
** Traffic. Real time traffic reporting is next to impossible. Other car analytics would be nice to have, but the most important problem is traffic. It hurts.
<ul>
<li>Definition of data structure: a particular way of organizing data in a computer so that it can be used effectively.</li>
<li>Many types of basic data structures to solve application problems</li>
<li>Some are <span style="background-color:Yellow">linear</span> like:
<ul>
<li><span style="background-color:Yellow">Arrays are a good static data structure</span> that can be <strong>accessed</strong> <strong>randomly</strong> and is fairly easy to implement</li>
<li><span style="background-color:Yellow">Linked lists are dynamic</span> with linked or doubly linked and is ideal for applications that require <strong>frequent operations</strong> such as add, delete and update
<ul>
<li>Drawback of linked list: data access is sequential.</li>
<li>Drawback of arrays AND linked list: time consuming to search for item.
<ul>
<li>For example, with a data set with size n, the number of comparisons needed to find (or not find) an item may be as bad as some multiple of n.</li>
<li>Imagine doing a search on a linear data structure with n=10<sup>6</sup> nodes?</li>
<li>That would probably take a very long time. So we need a more efficient data structure to store and search.</li></ul></li></ul></li></ul></li>
<li>Other data structures:
<ul>
<li>Stacks (a linear ds with nodes stacked like plates, usually with Last In, First Out mechanism)</li>
<li>Queues (also a linear ds that elongates from the end and shortens in a First In First Out mechanism)</li>
<li>Hash tables (good for frequent search updates with a O(1))</li>
<li><strong>Trees (an example of hierarchical ds)</strong></li></ul></li>
<li>A tree: data structure with multiple relations (branches, like a tree, or a <strong>heap </strong>of rocks in the case of heaps) among its nodes.
<ul>
<li>Binary trees have nodes with no more than two relations</li>
<li>A heap is a balanced tree, i.e. a tree where no leaf is much farther away from the root than any other leaf</li>
<li>It is important to [[distinguish between heaps and trees]]</li></ul></li>
<li>Each node is connected to by a directed edge from exactly one other node: A direction is <em>parent -> children</em></li></ul>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKkAAACUCAYAAADoMQlcAAAgAElEQVR4nO1dW2wjZ9n+b7lCrZAqgZCQkKiQKBUXICFxA0KC9qJSQQiJFpCKEAWK1IMQhVZAqyIQahfaQrvbbru7zcHJJnHsxI4dH2LHjh079trxIXHiOImT2HEcO3F8Ps34+S/C9+03Y2fj7DpeJ/Fzs5vxeDyHZ97vPb//hy6ORaVSQaVSEWyr1Wr0/8ViEQCQTqfptmq1Co7j6vblOA75fB48z5/mKZ8r/N/9PoGzAI7jKOEAgOd5SjKe55HL5er2AQ7Jm8vlAADlcllAVuCQyF0cjy5Jm0CtVqMEq9VqAikpJibHcVhfXwfP84jH40ilUoLP8/k8CoUCDg4O2nPy5wBdkp4QPM+D4ziBVCyVStjd3UUoFMLk5CT6+vqgUqnQ19cHiUSCgYEBTE5OIhQKoVAo0O91JWlz6JL0GIiXaPHfAOD1ejE5OYmxsTFYrVYUi0UUCgXs7OygVqthY2MD8/PzGB0dxejoKAKBAAAgk8m05RrOOrokPQYsKcUE5TgOZrMZc3Nz2N3dFSz9N27cwM9+9rM6dWBtbQ1GoxHLy8une+LnCF2SNolarSYgXLVaRTqdhlKpRDKZpEt3tVpFOBzGSy+9hEcffRQLCwsAgP39fXqc5eVljIyMdJf7JtElaZPgOE7ghiLLuVQqBXDbDQUAy8vLeO655/CZz3wGv/rVrwSfE2JKJBJK3C7ujC5JmwBLQIJqtYpIJILx8XGBBZ9Op/Hcc8/hv//9L5599ll8/vOfh9FoFHy3VCrh+vXrKJfLAn+pWFrfCWLj7TyjS9ImUCqVKCFYf2i5XMb09DSCwSByuRwl3MjICPx+P5xOJy5fvoxAIIBqtYpqtYqDgwN4PB6Mj48LfkPs3K9Wq+B5nrq8KpUK9c82S+Tzgi5JmwAhDABKFoK1tTU4nU5YrVbMz8+jUqkI9FPWv7qwsAC9Xo+BgQGMjo5Cq9ViY2MD2WyWHq9QKCCTyRwpJXmev3C6bJekJwC7xFarVcTjcRgMBqytrcHn80Gr1UImk0GlUkGn0+Gjjz7C9PQ0VCoVBgcHIZPJsLm5SY/ncrkwNDQEt9uNVCpVJyFZ8opxkSRql6THoFwu0/+zEiwej8NqtcLn89FtJNrkcDgwOzuLt99+G/39/VhaWqJGUrlcRqFQoEZYoVCAyWTC6OgolpaWKPnI73IcR1UFsUrQJWkXAIQkJSQpFAoIBAIwm83UIb+9vU33I9J2aWkJBoOhoUQsl8uoVCp030QigeHhYfT29mJ5eRm1Wq0uqUVsLHUNpy4A1BOhXC5jeXkZLpcLOzs7Db/DxuVVKhWWlpYAHEaYSMIJAcmKIohEIhgbG4NGo0E8HkcmkzkyY6pL0i4oiIUNHBLQaDTC6XTSz0ulEgChq4rneVQqFWxtbUGpVAqW8EqlUrdUs0krwKEU7u/vx8zMDNbX1+uk6kXChSfpnfJEeZ6nUo5IQKJvAkJV4CiUy2UYjUa4XC7BcYHmdEqn0wmVSoWpqSmB5CYvDXsOYql8XnJWLzxJWXAc1/DBkmRmtVoNq9VKc0ibQblcRjgcxvT0tEANaIbgwCHRCoUCvF4vRkZGYDKZBEYXcEjYVColOPfzlLzSJen/0Mh6JqhUKojFYpiYmEAikTjRcYm1brPZBNL0JMs3a7DZ7Xb09vZienqaSmLW65BKpZp+Ac4KuiRFvQQlljWJ9ACAQqGgbiSig7K5occhkUhAoVAgmUxScjW7HJfLZWSzWaqKJJNJWK1WDA0Nwe/30+2sdCfneB5w4Ulaq9XuSJZKpQK32w2n00mNIaBxPP8oEMlmMpkwPT1NtzdDUtZ9VSwW6d/lchkbGxs0j5UECWq12h2DAGcRF56kLEisnMXCwgLUanWdXxNo3gVESJpMJtHf319nyR+HSqUieClY1aRcLiMQCEAikUChUAhIfF7QJSkDtliuUqlge3sber0e4XBYsB/RAZs1ntgYvtFohM/na1pVOGrZ5nleIDE5jsPi4iKGhoag1Wqxt7fX1PHPAi48SdkllzVmdnZ2YDQasbi4KNifSKiTLPesXzSVSqGvr6/p77PnVy6XG5KW3SebzWJ2dhYymQxarbbpc+xkXHiSsql3RDKWSiW4XC5YLJaW/haRprdu3YJCoQAgJDu7RDcraYmUFuvWiUQC8/PzGBsbQyAQoOmGYgMRqPfXVqtVlEqljvGzXniSAkIJms1mkU6nMTg42HILmagJkUgEBoMBkUik4TncbSoeS7ZarYZ0Oo3NzU0olUpIpVKqthBVgY2CAYdSvhNLrbskBQTpd6VSCaOjo1hfX2/577CE8Pl8MBgM9G8iUdkoVzO+VNZ4q1QqdS8W+XxnZwcymQxyuRy7u7uCz3K5nEC/rdVqJ1JnThsXnqTkQWWzWfA8D5PJRJf5VqfCsceLx+PQ6/VYXV0FcFuvrNVqVO1ohqQs8UmOAfFSkGOy24LBIKRSKU1gEZO6VCp1XArghScpcNuCdrvd0Ol0AE4WEToOjVxblUoFwWAQKpWKbiPLvNjVdbfgOA7JZFKgW5Kl3ufzQSqVYnZ2FtFoVPC5mOT3G12S4nbl59jYGCUnm6hxr2CzqIDb0q9UKkEul9PEEfbFOOly26gXFQtx2LdWqyGfz8PtdkOj0cBoNCIejwv275RUwAtP0lKphHK5jJGREVr12agb3t2CrY0iYF+AhYUFWCwWmhBCfvskRhspt2aXdYJSqSR4QarVKjKZjOB3dnZ2YLFYMDw8DLPZ3LT/t1248CQFAJ1OB7vdDuDwgROysq0c7xaEDI2kJClhHhwcpJY+cT01W3DXSJUgSS1iH6s4CsVWwQKH1QVGoxHj4+O0FVAn4NyTtFKp0IfDZjARaWGxWBAIBATSrVE/0tPE3NxcQ58sCQKIl+nTWoZ5nkc6nUYwGMTU1BQGBwexu7sr8Nk2+n1y70huA6vOtALnnqTiG5rL5agvcGtrCzabDaFQCOl0mt7gdhKUEFAqlWJubo5K2eMa7baqWpSoCWJXVjKZRDgchkQiwa1bt7C3t1enJ7N/i11YQOu8I+eepMR3mEqlBG85z/OQSqXUZyjGSRKb7wVEF41GoxgaGhJ8RghEwqGnUW/fSDUgIBa+y+XCxMQEXC4XEokEstksfZFjsZjgWOLvtwLnnqQEuVwOSqUS+/v7yOVyMJvNcLvd9METazeTybS9+QJRQ+RyObxeLzKZDEqlkqACtRFaueyT0mmi44pdUNFoFFNTU1AoFPB6vQL1KJfLIZfL0W0kktUlaZMgNz2Xy6G3txfAoUFkMpmQTqexv7+Pg4ODurBkO53apGNJJpPB4OAgzWE1GAy0Rp8lzmn4L1n/qBi5XI7en0wmA5PJBJVKBbfbjVKpRDOudnd3MTU11XJ16dyTlA156vV6eDwe9Pf3w2AwYGFhAcPDw1Cr1QgEAi2Jn58UxML2eDzY29vDzMwMotEoFhYWBAnSnQCWwJubm1CpVNBqtfD7/QAOyfzBBx90ddK7Bc/zGBoawk9+8hP88Ic/xJUrV2AymVAsFgXkJBZquxzZRM2w2+2Qy+XQaDT4+OOPMTc3J4jtky4m7N+nEV8nbjG2a0qxWBRY6qwra3t7G2NjYxgbG0MsFoPH40EwGBT4Yu8V556kfr8fEokEUqkUb7zxBp599llMTEzgo48+Qn9/P/r7+zE7O4vd3d26ZeokNUz3AkK2WCwGjUaDt956C2+++SZeffVVXL9+HdeuXYNEIoHRaMTGxsaph2xZNCr5rlar2NragtVqRTqdRiqVQigUgkQigUwmw7vvvtuy8wPOAUnZt5Ul1f7+PkZHRyGTybCysoL9/X3BvqRGPRKJwGQyQSaTYXZ2luqjQPuK2dhOfcFgEJ988gnGxsawsrKC1dVVJBIJrK2twe/3Y3h4GBKJRGBVk+thO/i1snxETOR0Og2PxwOVSgWDwYB///vfUKlUUCgUeP311/H9738fV65cwdraGgwGA8xmMyQSCdRqNUKhUMN0QNbrwl4TcA5IKn7T8/k80uk0FAqF4EFubW0hGAxicnISDocDwO0oDJm3tLq6Sj+7H1Cr1ZiZmaEPTEy0crmMarWKhYUFmM1mhEIhSh6x37RV0vYoY61SqSCbzWJrawvAIXH9fj+CwSBefPFFPP7445BKpXC73bh16xa2trYQCARgMpnQ19cHm83WsGCQqBrs9Z95khLpySZxXLt2jVqc5HOHw4GHH34Yf/jDH/Dwww9Tqcne/IODA0xMTGBpaaltSz1w+GAcDgdmZmYA3JZcWq0WOp0OAwMDdZny+/v76OvrE4RuWWIel3ByNzgqgEDKrSuVCjweD0KhEHiep3kRwKEOTUi5v7+P6elpzM7O1rVkF7cjAs4BSQFhtw5S3UlAJI3f78fDDz+MZ555Bg8++CAt3yD7EMf9xsYGenp62nTmt8OzY2NjNNF6d3cXV65cwQsvvIDJyUk8//zzghaT5GHr9XqEQiH6MMU9plrtqiJELJfLdUMuarUaHA4HdDod9e9qNBr885//xPXr16FUKlGpVOj1chwHu92OW7du1QVNWN81cE5IyuqQt27doiRldbTFxUV8+ctfxqVLl/D1r38dly5dot/nOI4++M3NzbaSFDgk3eTkJGKxGAqFAra3t/Hoo4+ip6cH1WqVOsnT6bQg8USn08HhcNBzP40u0MdFo0gyTqlUQm9vryDry+/348EHH8SHH36IZ555Bm+//Tb9jET6pFIpYrFYw5eL/HvmSUoIyvM8Vch7e3vpcl0qlVAsFuFwOPDpT38a77//Pr75zW/it7/9LXK5nOChptNpTExMIBAI0Hmh7UAqlcLAwACNPO3s7OCRRx7BwMAAgEPJyi7r5P/T09OYn5+nkugkgyFOAnLcO3kBtre3ceXKFQC3yZVIJPDII4/A4XDgN7/5DZ544gkAEKgAN27cwPb2dt28VrY/65knqdh/mMvlEI1GIZfL6c2o1Wp0Usjly5cxMDAAt9stOE6pVMLKygqsVmtbz5+8WLOzs7BYLPRB9fT04O9//zvtqEd0bNaYGh4eRjweFwQsTsu/yxpQJPrF1kIlEgn09/fT/dPpNNbW1vDAAw/AYrHgxRdfxFNPPUUNVYKenh56bewyz64KZ56kgDAbh+M4OJ1OaLVa3Lx5Ex6Ph8bCxUsh+d7CwgJUKhXt3EwkVbuiTqQQbmRkhD6wTCaD9fV12Gy2usx9nudhtVppC0oC1mXWqvBps8TP5XJQKBQIBoN0m0qlwre//W28/PLL+OUvf4mVlRXBdxKJBCQSybFdV84EScU3XKy0EzLl83koFApYrVaa+dTf3w+lUomBgQGoVCp4PB5YLBYYjUbodDr09/fj/fffx8jIiKBPPXDyEo57RTgchl6vh06nE5QfExSLRXg8HigUCthstpYkZbcCpMJ1cXERJpOJbtvf30cikUAikahrRRmLxeB2u7G0tFTnoRC/XGeCpAAEHe4IWBJtbm7CZDLB7/dT0pI3NJ1Ow+1241//+hcmJiag0WhgsVjg8XiwurqKQqEAhUJBm36RDJ52FKKJAwaJRAJutxsTExOQSCSYmpqCTCbD4OAgxsbGTtym57TBPpNEIgGbzYbx8XH4/X7k8/k66ZhKpbCysgKn0wmLxVIXZDmzznyxMVAoFAQXPz8/D5PJhJWVFcF0OrYDXrFYxMjICPU3su4aEj8fGBgQDPhqF0iESNwuJxqNwuv1wuVywe/3Y2dnh56zuKvz/UK1WhUMWgMOo2a9vb2Qy+WYmpqC0WiEXq+HUqmEXC6HwWBAKBRqOD+AVS3OjDNfLGmIk5qoABsbG9Dr9VhbW6Ofs1KG/B2JRKDRaBr+RrFYBM/zCAQCGBkZAdC+oQmsEdIIx7Wl7ASwujJwqE/39fXRyJjFYoHD4YDf78fm5iYODg7qrosIDnb7mTGcWJKykzjK5TKsViv0ej1d1lm/qFifnJqagtvtBsdxND+SjW4QqaRQKKhB0o7YvXg5JH7RXC6HYrFY1x8qnU53bFvHXC6HTCaDubm5Ou/JUS8hISZRrxq11ux4kjZCMpmEz+eD2WwWFNeJ30QibcvlMoaHh498uGwUJJ/Po6en58iyktMCcbmIVZujpKV4xbhfEPfvB4CBgQFBpj7ZL5vN4uDgALlc7o45p+KV5UyQlCVXPB6H0WiE3W6n5Eqn04LSBXHdfDKZxMDAAIrFIi0PEfeZJ8jlcrRRRDv0UnIujTqckOsjL1onzhQVv0Q+n48GIRp9TsAmkoghvhcdT1L2QlZXV2EymeB2u6kTnM2kYRVx8mZXKhUsLCxgcnISAASGh/gmsW+13W6n7pR2gUjTRvoai3ZXtB4H9lyuX7+OTCZT16Oq0TmzGVx36n5930kqtqRZXZLNO9za2oLJZILX66Xb2GwZMeHYt1GpVCIUCtHtbMj0uCa68/Pzded8nsbPtALkHmazWdy4cQMcx7VUn7/vJGUncRCClkolSgSe5+F0OqHT6QSNtdgSD/FbyKaUlUoljI+PCwZ1sbFjFo3akdtsNuo5AG6X8Iq7f1xkkOem0WgQCATqEkTuFR1DUuB2lSZBKpWC2+3G3NwcVlZW6hoYELCKNpHM5LjxeBxyuVxQ/XnUstKolCIQCNCxi+Q3Cbk7wXDpBFSrVaTTaVy9epVua+ULfN9JCtzuDQoIB2tpNBpaR0MgzlwS3wxxxs7i4iKUSiUAYcYUu/+d3vhUKgWPx0MTksm5AZ3jp7yfIKuS3W6H0Wis294KdARJSc05QTgchsFgwOLiInW0s/uepIfmzMwMNYAIScVZ63caNgYcElWv12Nra0tgiXeX+9sd/QYGBqjBdFxa30nRESQlKBQKWF5exvT0NLxeryB1S9wRg+1qfBSq1SrUajWWl5fp30TSir93p2NlMhns7e1BLpcLenh2SXqIxcVFyGQy+jcRAK2SpvedpGzeYDgcxuTkJE33EluJ4sxz8SADcUjt4OAAY2NjdVk2R/UfbURedjLJ8vIyHTvTCXHzTkC5XIZSqcTq6uodn8e94L6TlER5vF4vZmZm6kp1gfoCMLEznuzDbisUCojFYvQNJ/oj63Zis78JWOKKUwQzmQycTifMZjP9/KIjEolAIpEAAG2uBhwGUFqFUycpW3/TqEsdz/Ow2Wy0xofgJNPmCMS122azGU6nUxBRYpegZpYjNmkCOJSgxNUCCLtCE1KfJ/KyuRJAfSfq3t5e+tyO8nffK9oiSVnyEcU6n89jb28Per0ei4uLAlKepFGsuJsx+321Wo21tbW6GHKj794JbGfmTCaDcDgsyJhv9BJ02gSPuwV5DqxfmFzj3t4exsfHqdRk7+2ZcuaTky0Wi/RNI/qiXq+Hy+USWPbshTbr4mErFAkymQyGhobqch2PM7YagZCU4zjqbfD7/YJeTWKj7rwYVSxJxcnkTqcTDoej4dypVrrn2iJJyUUR6RKNRgXjr8lnxHBhm2Y1g0bSa3NzU5DowOIkLpJGjnuS+6jT6TA3Nwfg8KGwbbnJtvMCNtBB0h0nJiYQiUQaXm8r3VCnTlLxBfh8PshkMiSTSfrgxWQslUonesDsMk8wPz9PZySJDa+TWJ7iuaPsNa2vr0OtVtd14SDoxKyluwGru5Nr9/v90Gg0dUWQBGfWup+dnYVWqxXkEzay0k/6Boo7XnAcB51OR7t+NGo5c5LfEKfMAbcfXCgUwvDwMN2XEPa8EBQQGkFEfZuamhIk+wD1as6ZImk+n4dWq8WtW7cANHYhEWPqpI1s2RtDiJjNZjE0NEQ7fjTaF2j+JrIxezbjhxxTp9MhFAoJxtB00mzOewXrsqvVatjY2IBOp6NZaqxgOZMkzWaztMZFvCySHENxNOkkzbYaKevJZBI3btwAgLrjssRv5iYSlaRQKAiMCED4Esnlciq5xY15zwN4nqf3YmZmhvqKAWFFhDjZpxVomqSNOqqRE2P7FREkEglsbW1Bp9NhbW2t4UW0AuI2gcBh+5l2Jizz/OG8To1GQ1shAkKfIkvys6YKiN2DQ0NDgvqwo7jRqus8lqTiZYvkfRYKBRSLRRwcHNB4diqVwv7+PgqFAjY2NmAymbC+vl53kQSt8CU2IrxSqcTCwsI9H7tZkEAFMaQIpFLpkQEDtjyk00AIxqo5hHBWqxUKhUJwXURIFQqFU/EPNyVJSfjwqF7yEolEIEEWFhbgdDoRjUbrllT2+61601hpWqlUcPPmTezv77dFYomvb3x8HEtLS+B5Hjdv3kQsFkMul0O5XEYmk+k4YjbrNyakZJ3393rMZnEsSdn5PuxJ5HI5pNNpWuQGHC7x09PT0Ol0NBoj7khxGv0zCRk5jkM0GqW18+3SCwuFAlKpFBKJBA4ODjA3NweHwwG5XH7HxOh2tTu/E45q7UhAVkmO47C2tobR0VEAhytsKpVCJpOh9/moDLN7xbEkFbuEeJ4X3Nzd3V2Mj4+jVqvB7/djdnaWNt2KRCI4ODgQhNTuxsXUDMgx7XY7HS3TDknK6uJjY2MwmUyYnp7G0NAQBgYGaJUAiemTZbTT4vtsAIWsmpVKBSqVinoy1Go1bDZbw++Xy2UUCoW63lWtQFPLPWlIJa5pJ5Lrd7/7Hf74xz/i9ddfxwcffIC+vj709/fjk08+aTiTspVvm9gYGR8fp/mj7UI2m0U6nUapVILP58P4+DheffVVfPjhh3XnCbSu4107YDQasbq6inQ6DbVaTQlLZhOsrKzUFSayAqkVaIqk7JtfrVYRCoWg1WoxNDSEl156Cc8++yxu3LgBn88nSMYA0FCZPg2SAodv882bN5FMJtuW4CHubJdOp8FxHORyOZ5++mn85z//QV9fH3Q6Hfx+/5HRqfuFo8KXRLLu7u5CrVZjaGgISqUS6+vrcLvdUCqVkEgk6OnpgdvtFlTutrrDyrEkZX8wl8vBarViaGgIBoMBkUgEqVQKPp+P1iORjiKkrEDscjqNbnVsmcfNmzcFYwbbBbI8xmIxXL16FUajEclkEolEApFIBHa7HaOjo9BoNHS2fSeCFNXFYjFsbGxgbW0Nf/rTn/D0009jcHAQCoUCWq0WNpsN6+vrdcESFo2mi9wNmtJJyb9GoxELCwuC1DQiOTOZDFZXV6HX62mLmnZJM6J6BINBjI2NAWifUcLqvQ6Hg7qg2FAqm5MZDAYxNzeH1dXVtpzfcWDdS4lEAjqdDiMjIxgeHoZcLodEIsEbb7yBS5cuUQc+6abSLpWlqeU+n8/DYrEgHA5TUm5vb2NzcxOJRILmixJfoVarbWsDBSLtLRbLkYr9aYEYgsFgECaTidZeabVaPPnkk3jjjTfw1ltvYWpqin5na2sL4+PjHdMEl/g5h4aG4Pf7G7qYAoEA7Sna7oZpTZE0lUrRWDhwmETx5ptv4oknnsDVq1fxyiuvIBwO0yWWdBpp59hDjuMglUoRjUbpebRLknMch4mJCdrtpFarYWlpCZ/97Gfx3nvvQa/XIxqNIpPJ0CXQYDDA5XK15fyOw+rqal3zjZmZGdhsNkESSTabxfT0NJaWlpDJZNomiJqKOIXDYajVaupuyWaz+PDDD/HAAw/g448/FjT3ymQysNvt0Ol0p3vmDCqVCvb29mhTsnbnc1YqFYyMjNBVpVgsIpFI4Atf+AKefPJJvPXWW1QFIudkNBqP7JfaTvA8j4mJCUrQSCSC3//+9+jt7YVMJsOf//xnOBwOgUFsMpmwsbHRtnM8lqT5fB4ejwdqtVrw0PV6PR566CG88MILggEDHMchlUpBqVQ2nCHZahBl3e/3Q61W19XTnzaIoaFQKATtIpeWlvDlL38Zb775pmBQGDvehh2CcL8Qj8chlUoBHL5Ab7/9Nr72ta9hf38fbrebBkaA23r+6OgoJiYm2lZ90NRyz9ZVFwoF5HI5XLp0CZ/61Kdgs9kwPz+PVCpFJa3P56Nd7E4bhIhklj0bfWonXC4XfXB7e3vo6+vD448/jsuXLwu6shCQYbD3G7u7u5BKpdQ19tprr+Hxxx/H7u4ubty4gW9961tIJBLI5/OUlPPz83WTT04TTZE0FovBaDTSCymXy+jt7cWLL74ImUyG3t5eKkWKxSIGBwfh8XhO76wZEJ+rXC7H9vZ2yxsTHAeyuhwcHGB2dpb6SQnIPWPdMW63GyaTqSM6NtdqNQwPD9OkIZPJhKeeegpTU1N455138MUvflEwaDefz8Nut8PpdLYtD6EpknIch0AggImJCbqNWIA8zwsUaLvdTi3sdjRQIA0kRkZGqHpBOp60G5lMBsPDw3A4HIIGaeQ8iRqk1+vbfm5HoVarYXJykiakA4eeG41Gg97eXlqCA9zu1qxQKOj80HagaT9poVCAx+OByWRCMBisK9lIp9NwOByw2+0CP+q9ghS9EbD+T3IOLpeLJj4Q3I/MeI7jaLvI8fFxDA0NQafTQalUUj3O6/V2XH/TeDwOp9MJr9dbNx6SFTSbm5u4desWVlZWBE3mThvHkpQlyP7+PhYWFjA7Owu1Wo3BwUFYLBZotVqMj4/DbDYLjAe2b1KrwJbWkqjW4uIivF4veJ4XvCDtuIkkfMgik8kgFotha2sLHo8Hy8vL2NzcxN7enuB+dsJyDxzep2g0irm5Oej1etjtdsGzSyQSmJuboxK33S2GjiUpm1EO3B40u7q6CpfLBaPRCI/HQzOfAByZd3o3YEsRGh2T4zhoNBr4/X5Bhng7EzgaZaYTtHOQ7t2A1ZXL5TKWlpagVCrx8ccf47333sO7776Lnp4eTE1N0Sl9jb57mmg6C+pOxGvUoa5VPkq28S37++RtLpfLkEql2NzcPLLJ7mmDSFNyjiQ/oVEn6Xw+3xF5pGKQZ3accCG1Tu0sgWmapOKkZ/EFkSGu4v1aBVZaZbNZBINBLC8vIxKJwGw2o1qtIh6P143MOW2Ii9DEGV5swwuCkza/OE00kvLkBQJ+j98AAAf+SURBVCMNyMQTCMk+HaOTHle5KXZDkF5PrQa73BcKBQQCARiNRvj9fiiVSvj9fni9XkEAoR06n/g3Gqklje4h2968E8C+OI2k6Z3Kh04bJ6oWLZVK1HBhU/EIxPVLrbJiG2Xzb21tQaVSUSvaaDQKdKZ23Uzx75BzZRtJsJ2jG5XjdALE5KxUKnQEOwt2teiYiJN4KWPBVhOKB7i2EuyDJ0sk6fX02muvCZJuyfm0iwRsFrr4pRXP3CQ4SV+B00YzOii771FC6TRx35voHgfyJhNLslwuw2azYXR0FD/4wQ/w8ssvQ6lUIhqNCsKOnZIG18W9o+NJyrqU1tbWMDY2Bq1Wi8XFRaRSKfj9fmxsbODmzZuYnZ2ltf9dnB90PEmBw2VzbW0NS0tLCIfD1PJkjSSe52G1WuFyuQQ9mbo4+zgTJI3H49DpdAiHw0gkErh69Sq8Xi+Wl5chk8mo3kSqF2dnZ89VI9uLjjNBUrPZDKvVikqlgmQyic997nN4+eWX6bTmZDJJw6HFYhESiaQuOtLF2cWZIOng4KAgJ+CrX/0qvvvd7+Kxxx5DLBar65Q3OTnZ9lqnLk4PHU/SXC4HuVyOTCaDVCqFZDKJb3zjG/jRj36EL33pS/jFL35Bm/ISsg4MDGBvb687+/OcoONJyvM8dDodTaLe39/HV77yFfzjH//Az3/+czz00EM055G4qxQKBTweT8c5zLu4O3Q8SSuVCsxmMwwGA5WMy8vLsFgsNBNrb29P4Be9du2aYHR4F2cbHU9S4DCf0efzIRQKIZvNChqAZTIZStDt7W3aVbqL84OOJynHcdS15Ha7G3ZSJvD7/Zibm6sbVdPF2UbHk5T1da6vr0Mmk0EikcBms2Fvbw82mw0+nw+Dg4OCeeudlGHUxb2h40lKsq/Ymioyzfn69euYnJzE3NwcBgcHMTMzQ7/XJen5QceTlE0VK5VKyGazgnaS5XKZJp8sLy9jfn7+3M33vOjoeJISNEoVJCBWPykmI+6qrk56PnAmSEpaDRKQyScs2GQTiUSCnZ2drjP/nOBMkPQ4iKVsLpdDIBCA4X9TlNlW6uKJdl10Ps4lSUnH5cXFRVitVsF+wO3WN502rqaLxjiXJAUOVYR0Og25XC6IPpH+APerqKyLk+PMk5TkjR5FuO3tbej1eqRSKUpQjuPa0payi9bgzJO0marFZDIJmUyGbDbbzdg/gzgXJG20ja3ILJfL2NnZwfT0NKLRKA2bdkJzhi6Ox5kn6VFLPdnOEnF5eRkGg6G73J8xnHmSAnfWS9nwaLFYxPr6OqanpwWZ/l10Ns4FSY8D6/ivVqvw+XxwOp3Y3NwEcLsZWqlUoqTutB6iFxkXgqRA/TjBra0tGAwGBAIBAIdEJboqUQW6SSqdgXNPUrbhK9trlbRYt1qt2N7epgQm+xeLxa4ftUNw7kmazWbrhuSyEjIej0MmkwnyA8i/XUnaGTj3JAUah00JAYvFIiKRCCYnJ1EulwUdq7s+1c7AuScpcfY3WrrZXNXV1VWoVCpBw9huql9n4NyTNJPJCKTonVqq+3w+mEwmcBzXcAhsF/cH556kwO25ToSglUpFQFy2HHpiYoLORe3qpJ2BC0HS48CStlQqwePxYH5+nlr6hORHjSoU667iJO0u7g0XnqRiacnzPBKJBFwul2By3dLSEiYmJgQDuHK5HM3+r9Vq2N3dFUjlLlFbgwtPUlYKsoZUPp/H2toaXC4XCoUC7HY7FhYWjjyOWNdlqwG6uDdceJISiCfVpdNpVKtVmM1mbGxsQKPRYGlpCel0GpFIBKurq9jZ2aHhU57nkU6nO3JG01lHl6QicBwHn88HjUaDmZkZrK+vY2JiAn/9619x5coVjIyMQKlU4vLly5BKpbh69SrMZnOdf7UrSVuHC0/SRi4popOaTCbI5XK88soreP755yGVSmlz3nw+T6WvVqvFlStXYLVaBZK0GwxoDS48SQnROI6rK5MuFosIhUJYXFxELBYDcOh3ZQ0iMo6nVqthZWUFOp2OjtnuurBagwtP0kZziUjaHs/zUCgUiEaj4Hke29vb+Nvf/oa//OUv1NnPJlan02loNBr4fD4A3Q4qrcKFJylZktmkEkIu0hcVOExUyWazeOGFF/Cd73ynbikny3wmk8G1a9e6GVQtxIUnKTFuCMnYQbtqtRrr6+uC5f2nP/0pHnvsMQCH9ftkoASLa9eu0T6qXdw7LjxJCdiWPLVaDYVCAWNjY8jn84hGo3Qu6K9//Wv8+Mc/xvb2NtxuN/0Ox3GU6D09Pdjd3e1a9y1Cl6T/g9i/mc/nYTKZBB1QwuEwnn/+eXzve9/DO++8A41GAwCCuar5fB79/f3dGqoWokvS/6HRqO9wOIzR0VG6LRqNYmdnBwcHB8hkMigWi7QVJYHFYoFGo+la9i3EhSepeAoxi3K5jKmpKaysrAganDVaxovFInZ2diCVSqljny1d6eLu0SUpQzhWmpLtuVwOJpMJSqUSiUQCAKh7ipAwlUrB7XbD4XDA6/XSY3QborUGF56kbNY+u0SLI0cWiwVyuRwqlQozMzNYWVmBy+XC1NQU1Go1tFotgsEg/U48Hm/fRZxzXHiSHgfW/URGl09PT0Or1WJqagperxfRaFRA8G6KXmvRJeldgBTycRyHQqFQp6MSX2vXBdUadEl6DMrlctOZ9uIQa9eZ3xp0SdokxC0mK5UKdT0RRz7rL+2idfh/IOBltoJ4ETAAAAAASUVORK5CYII=" /></p>
<ul>
<li>
<p>A is a parent of B, C, D,<br />
B is called a child of A.<br />
on the other hand, B is a parent of E, F, K</p></li>
<li>In the previous tree, the root A has 3 sub-trees</li>
<li>Each node can have arbitrary number of children</li>
<li>Nodes with zero children are called <strong>leaves </strong>for obvious reasons. Another term for a leaf is external node</li>
<li>In the previous example, C, E, F, L, G are leaves.</li>
<li>In contrast, nodes with at least one child (that is, are not leaves) are called <strong>internal nodes</strong></li>
<li>Nodes with the same parent are called <strong>siblings</strong> (like B, C and D)</li>
<li>The <strong>depth of the node</strong> is the number of edges from the root to the node
<ul>
<li>For example, the depth of K is 2 (edges)</li></ul></li>
<li>The <strong>height of the node </strong>is the number of edges from the node to the deepest leaf
<ul>
<li>For example, the height of B is 2</li></ul></li>
<li>The <strong>height of the tree</strong> is a height of a root</li>
<li><span style="background-color:Yellow">Concept: General Tree</span> is a tree where each node may have zero or more children</li>
<li>Contrast with a <span style="background-color:Yellow">Binary tree</span> which has nodes with not more than two children. Binary trees will allow us to understand trees.</li>
<li>[[Go to Binary trees|Binary trees with JS]]</li></ul>
For any team I believe there is a triad of essential components that characterized perfect knowledge:
# the first and most important is good collaboration. This has to be backed up by good software infrastructure.
# this infrastructure should enable good knowledge management practices
# good knowledge management finally enables increased utilisation of the team's internal knowledge in the form of process automation, creation of useful business apps, and streamlining of team productivity
# TW5-Bob
BIG DISCLAMER OF DOOM - Back up your data. Do it. This has been tested but
there may be bugs that I don't know about. Also see notes below.
## What does it do?
- Multi-User support for using/editing the same wiki(s) simultaneously
- Multi-Wiki support - run it once and serve multiple wikis
- Create and configure new wikis from inside the root wiki
- Export single file wikis in a variety of ways
- Two-way real-time syncing between the browser and file system
- All configuration can be done from inside the wiki
- Serve external files (like images) so you can include them in your wikis
- Allows you to run shell scripts and commands from inside the wiki
- Can be used as a plugin library to make plugins available to other wikis (requires the TWederBob plugin on the other wikis to connect)
- Inter-server federation. Different Bob servers can communicate to share tiddlers and as chat servers/relays
A lot of the documentation is in the tiddler files in the Documentation folder
of the plugin, or in the wiki in the plugin information on the control panel.
## How do I set it up?
### Easiest Version (Bundled Application)
To make this more accessible to people I made it so you can download a single
file and then run it and everything should work. When you run it it should even
open the wiki in your default browser.
To do use this go here
(https://github.com/OokTech/TW5-BobEXE) and download the
file for your system (BobLinux for linux, BobWin.exe for windows and
BobOSX for mac). Then run the file.
- On windows it may ask if you want to allow node through your firewall. Say
yes. If you have anti-virus software it will probably say that it is from an
untrusted developer and suggest that you don't use it.
It will create an index wiki in the same folder where you run the file, so if
you want you can copy the file somewhere else. If you want to move it after you
have run it the first time just be sure to copy the `IndexWiki` folder to the
same location or it will create a new one without any changes you have made.
### Manual Version
If you are familiar with using tiddlywiki on node than you just need to put
the plugin into your plugins folder and include it in your `tiddlywiki.info`
file. For the moment this plugin must be located in the `OokTech/Bob`
subfolder of your plugins folder and listed as `OokTech/Bob` in the
`tiddlywiki.info` file. You start the server using the `wsserver` command
instead of the `server` command.
Also see <a href='./Configuration.md'>Configuration.md</a>.
#### Step by step instructions (using Node)
If you want to use a fresh local install of tiddlywiki here are command line
instructions:
Clone the tiddlywiki repo and get the plugin (Only do this the first time to
install everything):
```
git clone --depth=1 --branch v5.1.21 https://github.com/Jermolene/TiddlyWiki5.git
git clone --depth=1 https://github.com/OokTech/TW5-Bob.git TiddlyWiki5/plugins/OokTech/Bob
mkdir TiddlyWiki5/Wikis
cp -r TiddlyWiki5/plugins/OokTech/Bob/MultiUserWiki TiddlyWiki5/Wikis/BobWiki/
```
After that is finished, and to start up tiddlywiki later type:
```
cd TiddlyWiki5
node ./tiddlywiki.js Wikis/BobWiki --wsserver
```
In a browser go to `127.0.0.1:8080` and the wiki should load. From here any
tiddlers you create should have .tid files created in the
`Wikis/BobWiki/tiddlers` folder, any edits you do to those files
should be immediately reflected in the browser. Open the tiddler called
`$:/ServerIP`, if you go to the ip address listed there on port `8080` (on mine
right now the tiddler says `192.168.0.15`, so I put `192.168.0.15:8080` in the
browser of another computer on the same network to access the wiki). Now any
changes you make to tiddlers on one computer will be reflected almost
immediately on the other, and any changes you make to tiddlers or the file
system will be almost immediately reflected in all connected wikis.
If you want to use the global tiddlywiki install you have to set the
environment variable `TIDDLYWIKI_PLUGIN_PATH` and `TIDDLYWIKI_EDITION_PATH` to
the folder where you have your plugins. On OSX or Linux you open a terminal and
type these commands:
```
export TIDDLYWIKI_PLUGIN_PATH="/path/to/your/plugins"
export TIDDLYWIKI_EDITION_PATH="/path/to/your/editions"
tiddlywiki editions/BobWiki --wsserver
```
If you want to change settings see
<a href='./Configuration.md'>Configuration.md</a> for information.
#### Updating Bob on a manual install
When a new version of Bob is released you can update your plugin like this.
If you followed the instructions above exactly than you use this. If you
cloned the repo elsewhere than you need to cd into the folder where you
cloned the plugin.
You can do this to make sure you have the most recent version, running this
command when you already have the newest version does nothing and won't break
anything so you can try it if you are not sure without worrying.
In a terminal type these commands:
```
cd TiddlyWiki5
cd plugins/OokTech/Bob
git pull
```
#### Updating TiddlyWiki on a manual install
This is to update your version of tiddlywiki, not Bob.
When TiddlyWiki release a new version you need to update your TiddlyWiki
version also. This assumes that you followed the above instructions exactly.
If you cloned the TiddlyWiki repo somewhere else than you have to cd into that
folder instead.
In a terminal type these commands:
```
cd TiddlyWiki5
git fetch --all --tags --prune
git checkout tags/v5.1.21
```
To use future or previous versions you would change the `5.1.21` in the last
command to match the version number you want to use.
### Notes
*NOTE 1 - .meta files:* there isn't full support for .meta files. The only
currently known limitation is that when you rename either the .meta file or the
file it describes the changes aren't correctly reflected in the browsers.
Renaming in the browser works as expected. Also empty .tid files are created
for any tiddler with a `_canonical_uri` field in addition to the .meta file.
This has no effect on the wiki.
*NOTE 2 - command line arguments and configuration:*
I am terrible with command line arguments.
To prevent the need to have 10 or 15 command line arguments in order to fully
configure a wiki I instead added a `settings` folder in the same folder that
holds the `tiddlers` folder and the `tiddlywiki.info` file. Inside this folder
there is a `settings.json` file that you can use the configure the wiki.
This also lets you change the wiki's settings from within the wiki. Most of the
settings wouldn't take effect until the wiki server is reset, so I made a way
to reset the wiki server from inside the wiki. You can also shutdown the wiki
server from inside the wiki.
---
## More Details
Here is a more detailed list of things added or changed by this plugin
- Create new wikis from an interface inside the wiki
- Create wikis using editions
- Create wikis from existing single html file wikis
- Create wikis using tiddlers drawn from other existing wikis
- Add existing node wikis so that they are served by Bob
- Serve normal node wikis with all the features of Bob
- Two-way real-time syncing between the browser and file system
- Updates the wiki in the browser immediately when any changes are made to the file system
- Immediately save changes to tiddlers made in the browser to the file system
- Syncing can ignore tiddlers based on an editable exclude filter
- If the browser is disconnected from the server it can reconnect when the server is accessible again and sync the changes that happened. The syncing is two-way so the browser gets any changes from the server and the server gets changes from the browser.
- Conflicts are displayed for you to handle.
- Multi-User support
- Allows any number of people/computers/browser tabs to connect to the wiki
server and use or edit the same wiki(s) simultaneously.
- Prevents multiple people from editing the same tiddler at the same time by
disabling the edit button for tiddlers currently being edited
- Multi-Wiki support, the plugin can serve multiple wikis at once, each served
wiki has all the features listed here.
- Websockets!! (used on the back-end, can be used by other plugins in the
future)
- Adds a websocket interface to tiddlywiki (currently only used by this
plugin, a git plugin is currently being developed)
- Adds an action widget that allows you to send arbitrary websocket messages
to the server. This can be used to do things like trigger shell scripts
from inside the wiki.
- Adds a new command `wsserver` that starts up a minimal http and websocket
server used for the real-time communication between the browser and server.
- Adds a new command `externalserver` which starts up the wiki without a server
so that you can use an external server, like an expressjs server.
- Allows you to shutdown the tiddlywiki server from the browser using a websocket message.
- Lets you run shell scripts from inside the wiki
- Everything is configurable from inside the wiki
- Your connection to the server is monitored and you are warned if there is a problem
- If the browser disconnects from the server you can reconnect.
- If the server was shutdown/restarted than you need to reload the page to reconnect.
- Serve files from the local file system (like images) so that they can be
used in the wiki.
- Build a single file version of any served wikis from within the wiki.
- Share tiddlers between the wikis using the internalFetch mechanism
- Build single file wikis that take tiddlers from different wikis
- Inter-server federation
- Chat (see below)
- Wiki syncing
- optionally using a filter to limit which tiddlers are synced
- fetch/push tiddlers from/to other servers
- Chat
- Local chat works between different wikis/connections to the same Bob server
- Federated chat works between different Bob servers.
- Plugin library
- The server can act as a plugin library for other wikis
- The library can be updated by plugin authors without having to have access to the server
- The library can be updated directly from github/gitlab/other git server
- *coming soon* Exclude lists on a per-wiki and per-user basis
- *under consideration* Security and authentication to limit access and editing
# Plugin
## Create a folder for you/organization where your plugins will live
## Create your plugin folder
## Create your `plugin.info` at the root of your folder. You can do create this inside a subfolder, as long as you tell your TiddlyWiki which subfolder exactly in the `tiddlywiki.info` of the edition(s) you want to use when building. All plugin tiddlers & other files must reside no higher than where the `plugin.info` file is.
## You can use npm for task management and install [[Babeljs]] locally for transpiling.
## Finally, build the TiddlyWiki `index.html` file. You can use live reload to automatically reload the `index.html` file on every build.
{{Npm as a build tool}}
<ol>
<li>Full/strict binary trees
<ul>
<li>These are binary trees where all internal nodes have either 0 children or 2 children. Here, the number of leaf nodes is equal to the number of internal nodes plus one</li></ul></li>
<li>Complete binary trees
<ul>
<li>These are binary trees where all levels are completely filled except possibly the last level, and the last level has all keys as left as possible</li></ul></li>
<li>Perfect binary trees
<ul>
<li>Binary trees where:
<ul>
<li>All internal nodes have 2 children</li>
<li>All leaf nodes are at the same level</li></ul></li></ul></li>
<li>Degenerate/pathological binary trees
<ul>
<li>Binary trees whose every internal node all has one child. Performance-wise, this is the same as linked lists</li></ul></li>
<li>Balanced binary trees
<ul>
<li>a binary tree whose height is equal to O(logN) where N is the number of nodes</li>
<li>Perfomance-wise, are good for search, insert and delete because O(logN) time is required for such operations</li>
<li>Binary trees that automatically keeps its height small in the face of arbitrary item insertions and deletions is called a <a href="https://en.wikipedia.org/wiki/Self-balancing_binary_search_tree#Implementations">self-balancing binary tree</a></li></ul></li></ol>
<p> </p>
# Tactical knowledge: What is the status of this project? Who is working on that activity? When will that dependency un-block me? What are our financial goals this quarter? There is a huge industry of software products (i.e. Trello) and collection of methodologies (i.e. scrum) that are dedicated to collecting and disseminating this kind of knowledge.
# [[Cultural knowledge]]: the way a group of people make decisions in support of the company’s values
# Factual knowledge: this is the hardest to communicate because factual knowledge cannot be trusted without knowing how it was formulated. ''In order to disseminate factual knowledge, it is insufficient to simply disseminate data''. Factual knowledge must include the data themselves as well as the knowledge about how those data were produced. This is why scientists don’t just upload CSVs, they write lengthy papers describing how other scientists can reproduce their results. Otherwise, why would anyone trust them?
It is interesting to note that despite the proliferation of open source tools to manage factual knowledge like AirBnB's Knowledge Repo and Uber's Databook, there are no market leaders in this regard.^^[[source|https://blog.getdbt.com/scaling-knowledge/#:~:text=The%20project%20has,yet%20broken%20out.]]^^ This may be because most open source solutions are too idiosyncratic for others to generalize to other use cases. Perhaps a blank slate with useful primitives would be more preferable?
[[Latest lang documentation|https://www.typescriptlang.org/docs/handbook/2/]]
__Concepts__
<<list-links "[tag<currentTiddler>sort[title]]">>
#### Uncategorized
* [**(any)**: _From NAND to Tetris: Building a Modern Computer From First Principles_](http://nand2tetris.org/)
* [**Alloy**: _The Same-Origin Policy_](http://aosabook.org/en/500L/the-same-origin-policy.html)
* [**C**: _Building a software and hardware stack for a simple computer from scratch_](https://www.youtube.com/watch?v=ZjwvMcP3Nf0&list=PLU94OURih-CiP4WxKSMt3UcwMSDM3aTtX) [video]
* [**C**: _Build Your Own Text Editor_](https://viewsourcecode.org/snaptoken/kilo/)
* [**C**: _How to Write a Video Player in Less Than 1000 Lines_](http://dranger.com/ffmpeg/ffmpeg.html)
* [**C**: _Learn how to write a hash table in C_](https://github.com/jamesroutley/write-a-hash-table)
* [**C**: _Writing an SVG Library_](http://www.code-in-c.com/writing-svg-library-c/)
* [**C**: _The very basics of a terminal emulator_](https://www.uninformativ.de/blog/postings/2018-02-24/0/POSTING-en.html)
* [**C++**: _Build your own VR headset for $100_](https://github.com/relativty/Relativ)
* [**C++**: _How X Window Managers work and how to write one_](https://seasonofcode.com/posts/how-x-window-managers-work-and-how-to-write-one-part-i.html)
* [**C++**: _Writing a Linux Debugger_](https://blog.tartanllama.xyz/writing-a-linux-debugger-setup/)
* [**C++**: _How a 64k intro is made_](http://www.lofibucket.com/articles/64k_intro.html)
* [**C#**: _C# Networking: Create a TCP chater server, TCP games, UDP Pong and more_](https://16bpp.net/tutorials/csharp-networking)
* [**Go**: _Build a web application in Go_](https://www.sohamkamani.com/blog/2017/09/13/how-to-build-a-web-application-in-golang/)
* [**Java**: _Build a Flashlight App_](https://www.youtube.com/watch?v=dhWL4DC7Krs) [video]
* [**JavaScript**: _Learn JavaScript Promises by Building a Promise from Scratch_](https://levelup.gitconnected.com/understand-javascript-promises-by-building-a-promise-from-scratch-84c0fd855720)
* [**JavaScript**: _Implementing promises from scratch (TDD way)_](https://www.mauriciopoppe.com/notes/computer-science/computation/promises/)
* [**Nim**: _Writing a DMIDecode Parser_](https://xmonader.github.io/nimdays/day1_dmidecode.html#cid1)
* [**Nim**: _Writing a Bencode Parser_](https://xmonader.github.io/nimdays/day2_bencode.html#cid4)
* [**Nim**: _Writing a INI Parser_](https://xmonader.github.io/nimdays/day5_iniparser.html#cid13)
* [**Nim**: _Writing a Link Checker_](https://xmonader.github.io/nimdays/day4_asynclinkschecker.html#cid10)
* [**Nim**: _Writing a stow alternative to manage dotfiles_](https://xmonader.github.io/nimdays/day6_nistow.html#cid16)
* [**Nim**: _Writing a URL Shortening Service_](https://xmonader.github.io/nimdays/day7_shorturl.html#cid20)
* [**Python**: _How to Build a Kick-Ass Mobile Document Scanner in Just 5 Minutes_](https://www.pyimagesearch.com/2014/09/01/build-kick-ass-mobile-document-scanner-just-5-minutes/)
* [**Python**: _Continuous Integration System_](http://aosabook.org/en/500L/a-continuous-integration-system.html)
* [**Python**: _Building a Facial Recognition Pipeline with Deep Learning in Tensorflow_](https://hackernoon.com/building-a-facial-recognition-pipeline-with-deep-learning-in-tensorflow-66e7645015b8)
* [**Python**: _Recommender Systems in Python: Beginner Tutorial_](https://www.datacamp.com/community/tutorials/recommender-systems-python)
* [**Python**: _Write SMS-spam detector with Scikit-learn_](https://medium.com/@kopilov.vlad/detect-sms-spam-in-kaggle-with-scikit-learn-5f6afa7a3ca2)
* [**Python**: _A Simple Content-Based Recommendation Engine in Python_](http://blog.untrod.com/2016/06/simple-similar-products-recommendation-engine-in-python.html)
* [**Ruby**: _A Pedometer in the Real World_](http://aosabook.org/en/500L/a-pedometer-in-the-real-world.html)
* [**Ruby**: _Writing a CI Server_](https://developer.github.com/v3/guides/building-a-ci-server/)
* [**Ruby**: _Creating a Linux Desktop application with Ruby_](https://iridakos.com/tutorials/2018/01/25/creating-a-gtk-todo-application-with-ruby)
* [**Rust**: _Let's build a browser engine_](https://limpet.net/mbrubeck/2014/08/08/toy-layout-engine-1.html)
* [**Rust**: _Building a DNS server in Rust_](https://github.com/EmilHernvall/dnsguide/blob/master/README.md)
* [**TypeScript**: _Make your own GraphQL metrics dashboard_](http://all-loops-considered.org/2018/05/09/graphql-metrics-part-1/)
\import [[database-macro]]
''Unfair Advantage''
<$edit-text class="text-input" tiddler=<<database-macro>> index="unfair-advantage" default="" placeholder="Is your product faster, cheaper, better? In what way? Why?"/>
The unified cloud api class object will have the following properties and methods:
* `services` which will bring an object with key value pairs showing the name of the services available and the user selected access `status`
* `getUsers()` returns a promise that returns on object with user account data for every service
* `setServices()` which takes a name and boolean arguments to change a given service's status
* `create()`
* `read()`
* `update()`
* `delete()`
* An authentication handler
* A handler to handle logouts
An instance of the above class will take an API handler object that inherits from a basic API handler object. This extended handler object should be to instantiate an API and handle the above logic, as well as provide basic information about itself such as name of the service, status and be able to accept a client I'd, secret and/or access tokens.
Organize, relate, and discover everything in your life on your knowledge graph, all in one workspace.
* open source
* integrates with third party apps and other tools for thought like Roam et al.
* local first
* places all manner of info into one place e.g. calendar events, todo lists, emails, notes, contacts, social media posts, with full-text search and advanced semantic search.
https://unigraph.dev/
Picking up from [[our last meeting|Easter Monday Meeting with Joe and Andrea on TiddlyWiki & OnePlaybook]]:
* Andrea informs that Joe's mother is sick and so could not come to the meeting. Sent my best wishes
* Demoed the first working version of a standalone wiki app.
* Decided that taking the browser extension route for data capture is the best way to capture data generically because it enable other possibilities. We can add a simple way to display and consume useful tags in the browser extension
* CouchDB will be self-hosted on their side so they can simply pop in the URL into OnePlaybook to use
* Also mentioned the importance of access controls, though that isn't necessary for the beginning
* No need to worry too much about editions.
** Andrea likes the Stroll edition; he mentioned backlinks being a feature he likes
** But also mentioned that as far as the rest of the team is concerned, starting with simple editions without a lot features would be better.
* We could collaborate on unifying TiddlyWiki as a frontend view for CoreBOS which is the backend platform for capturing and automating business processes
* We could work on this to enable [[Building MVP for CRDB and NMB]]!
* Suggested inviting Ben and Frank for a demonstration of CoreBOS so we can decide if we use it together
* Scheduled a meeting this Thursday at 1500hrs our time for this demo
\import [[database-macro]]
''Unique Value Proposition''
<$edit-text class="text-input" tiddler=<<database-macro>> index="uvp" default="" placeholder="What is the value of the solution you are going to provide? Why it’s unique and no one else could do it better than you? How much money/time/effort it will save or generate?" />
High-level Concept
<$edit-text class="text-input" tiddler=<<database-macro>> index="high-level-concept" default="" placeholder="How does your product fit into the grans scheme of things e.g. Uber for X"/>
`React.useEffect(function[, <array>])` allows you to run functions when a given array of variables change; when you add an empty array `[]` as a second argument, a given function will be called when the component mounts, and if that function returns another function, that returned function is rendered when the component unmounts.
This latter feature is useful when you want to clean up after mounting a component, like clearing event listeners to prevent memory leaks.
Restrictive in terms of pricing, free tier privileges, self-realized problems like Slack anxiety, always available policy, et cetera.
---
id: babel-cli
title: @babel/cli
sidebar_label: cli
---
Babel comes with a built-in CLI which can be used to compile files from the command line.
In addition, various entry point scripts live in the top-level package at `@babel/cli/bin`. There is a shell-executable utility script, `babel-external-helpers.js`, and the main Babel cli script, `babel.js`.
## Install
While you _can_ install Babel CLI globally on your machine, it's much better
to install it **locally** project by project.
There are two primary reasons for this.
1. Different projects on the same machine can depend on different versions of
Babel allowing you to update them individually.
2. Not having an implicit dependency on the environment you are working in
makes your project far more portable and easier to setup.
We can install Babel CLI locally by running:
```sh
npm install --save-dev @babel/core @babel/cli
```
> **Note:** If you do not have a `package.json`, create one before installing. This will ensure proper interaction with the `npx` command.
After that finishes installing, your `package.json` file should include:
```diff
{
"devDependencies": {
+ "@babel/cli": "^7.0.0",
+ "@babel/core": "^7.0.0"
}
}
```
## Usage
> **Note:** Please install `@babel/cli` and `@babel/core` first before `npx babel`, otherwise `npx` will install out-of-dated `babel` 6.x. Other than [npx](https://medium.com/@maybekatz/introducing-npx-an-npm-package-runner-55f7d4bd282b), you can also drop it inside of an [npm run script](https://docs.npmjs.com/cli/run-script) or you may instead execute with the relative path instead. `./node_modules/.bin/babel`
```sh
npx babel script.js
```
### Compile Files
Compile the file `script.js` and **output to stdout**.
```sh
npx babel script.js
# output...
```
If you would like to **output to a file** you may use `--out-file` or `-o`.
```sh
npx babel script.js --out-file script-compiled.js
```
To compile a file **every time that you change it**, use the `--watch` or `-w` option:
```sh
npx babel script.js --watch --out-file script-compiled.js
```
### Compile with Source Maps
If you would then like to add a **source map file** you can use
`--source-maps` or `-s`. [Learn more about source maps](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/).
```sh
npx babel script.js --out-file script-compiled.js --source-maps
```
Or, if you'd rather have **inline source maps**, use `--source-maps inline` instead.
```sh
npx babel script.js --out-file script-compiled.js --source-maps inline
```
### Compile Directories
Compile the entire `src` directory and output it to the `lib` directory by using either `--out-dir` or `-d`. This doesn't overwrite any other files or directories in `lib`.
```sh
npx babel src --out-dir lib
```
Compile the entire `src` directory and output it as a single concatenated file.
```sh
npx babel src --out-file script-compiled.js
```
### Ignore files
Ignore spec and test files
```sh
npx babel src --out-dir lib --ignore "src/**/*.spec.js","src/**/*.test.js"
```
### Copy files
Copy files that will not be compiled
```sh
npx babel src --out-dir lib --copy-files
```
If you don't want to copy ignored JavaScript files:
<details>
<summary>History</summary>
| Version | Changes |
| --- | --- |
| v7.8.0 | Added `--copy-ignored` |
| v7.8.4 | Change `copyeIgnored` option default to `true`, it can be disabled by `--no-copy-ignored` |
</details>
```sh
npx babel src --out-dir lib --copy-files --no-copy-ignored
```
### Piping Files
Pipe a file in via stdin and output it to `script-compiled.js`
```sh
npx babel --out-file script-compiled.js < script.js
```
### Using Plugins
Use the `--plugins` option to specify plugins to use in compilation
```sh
npx babel script.js --out-file script-compiled.js --plugins=@babel/proposal-class-properties,@babel/transform-modules-amd
```
### Using Presets
Use the `--presets` option to specify presets to use in compilation
```sh
npx babel script.js --out-file script-compiled.js --presets=@babel/preset-env,@babel/flow
```
### Ignoring .babelrc.json or .babelrc
Ignore the configuration from the project's `.babelrc` or `.babelrc.json` file and use the cli options e.g. for a custom build
```sh
npx babel --no-babelrc script.js --out-file script-compiled.js --presets=@babel/preset-env,@babel/preset-react
```
### Custom config path
```sh
npx babel --config-file /path/to/my/babel.config.json --out-dir dist ./src
```
### Set File Extensions
Added in: `v7.8.0`
By default, Babel will override the extension of the transpiled file and use `.js` instead.
To preserve the original file extension you can pass the `--keep-file-extension`.
You can also control what file extension is used with `--out-file-extension .example-extension` e.g. `babel src/ lib/ --out-file-extension .mjs`.
Note that `--keep-file-extension` and `--out-file-extension` cannot be used together.
### Advanced Usage
There are many more options available, see [options](options.md), `babel --help` and other sections for more information.
Could we use [[MicroSaaS]] to create an engine of growth either as an agency or dev shop or as an eventual networked marketplace for enthusiasts and entrepreneurs?
TiddlyWiki5 includes a set of [[Commands]] for use on the command line to perform an extensive set of operations based on TiddlyWikiFolders, TiddlerFiles and TiddlyWikiFiles.
For example, the following command loads the tiddlers from a TiddlyWiki HTML file and then saves one of them in static HTML:
```
tiddlywiki --verbose --load mywiki.html --rendertiddler ReadMe ./readme.html
```
Running `tiddlywiki` from the command line boots the TiddlyWiki kernel, loads the core plugins and establishes an empty wiki store. It then sequentially processes the command line arguments from left to right. The arguments are separated with spaces.
<<.from-version "5.1.20">> First, there can be zero or more plugin references identified by the prefix `+` for plugin names or `++` for a path to a plugin folder. These plugins are loaded in addition to any specified in the [[TiddlyWikiFolder|TiddlyWikiFolders]].
The next argument is the optional path to the [[TiddlyWikiFolder|TiddlyWikiFolders]] to be loaded. If not present, then the current directory is used.
The commands and their individual arguments follow, each command being identified by the prefix `--`.
```
tiddlywiki [+<pluginname> | ++<pluginpath>] [<wikipath>] [--<command> [<arg>[,<arg>]]]
```
For example:
```
tiddlywiki --version
tiddlywiki +plugins/tiddlywiki/filesystem +plugins/tiddlywiki/tiddlyweb mywiki --listen
tiddlywiki ++./mygreatplugin mywiki --listen
```
<<.from-version "5.1.18">> Commands such as the ListenCommand that support large numbers of parameters can use NamedCommandParameters to make things less unwieldy. For example:
```
tiddlywiki wikipath --listen username=jeremy port=8090
```
See [[Commands]] for a full listing of the available commands.
Here's the pitch with [[SEO in mind|Linked pages for SEO]]:
<<<
!! Your open source, all-in-one knowledge tool
!!! [[Document|Documentation]], [[organize|Organize]] and share all your knowledge with just one tool to better inform and support your work, offline and online.
!!! Start with a ready-made template for... //Show options for different segments e.g. personal, teams, companies [[like so|https://maarfapad.cloudno.de/wiki/streambook#OnePlaybook%2F20220222232244020]] or like in [[Canva|https://canva.com]]//
<<<
{{Processes being optimized}}
where the price you charge for your product is tied to the value that your customers receive from it.
Why is this important? A well designed value based pricing system scales with use, allowing you to cheaply gain from small customers as well as large customers.
A good pricing based on value must be based on the right value metric (be it number of users, depth of usage or features). The value metric(s) chosen should be:
* easy for the customer to understand
* It should align with the value the customer receives
* It should grow with the customer’s usage
<mark>But most importantly, the way your revenue models captures value, shouldn’t stand in the way of you and your customers from creating more of that value.</mark>
In other words, don't tax the user's quest to derive value from your product. Instead, tax the actual SUCCESS derived from using the product. E.g. a podcast hosting company charging storage vs charging downloads which is more valuable to the user.
In many ways, this is similar to how serverless applications are priced. You don't pay much until you start getting the actual value.
Referencing [[Top down approach in B2B]]
''Variables'' in a [[Formula]] or [[Datum]] follow the [[same rules and syntax as in WikiText|https://tiddlywiki.com/#Variables%20in%20WikiText:%5B%5BVariables%20in%20WikiText%5D%5D]]*. The variable's value is interpreted as a [[Datum]], rather than WikiText.
^^* Macros with arguments are not currently supported.^^
<ol>
<li>
<p>Embed Model: This business model is almost always in the enterprise software space. You build a sales team or figure out an effective Product Led Growth motion, sell into the Fortune 500 and lock them in. Once you are locked in, it’s very hard to rip your technology out. Some examples are SAP, Salesforce, Adobe or really any major Enterprise software companies</p></li>
<li>
<p>Network Effects: Usually platform driven. At a basic level, the more buyers you have, the more sellers you get. The more sellers you have, the more buyers you get. A virtually hard to break virtuous cycle once you get going. Some examples are Craigslist, EBay, Facebook, Google.</p></li>
<li>
<p>Economies of Scale: Growing to a stage when you can use your mass size and volume for discounts and scale to outgrow. Amazon is to me the most obvious example here.</p></li>
<li>
<p>Brand: Building a brand to distinguish yourself and be the main choice of your buyer. DTC brands like Warby Parker are recent examples. Older examples could be IBM.</p></li></ol>
Nassim Nicholas Taleb defines Via Negativa as,
<<<
“The principle that we know what is wrong with more clarity than what is right, and that knowledge grows by subtraction."
<<<
Case in point: all the white swans of the world would add nothing to falsify a claim that all swans are white. A single negative observation, i.e. a black swan sighting is worth an infinite number of //via positiva// observations.
<<<
Violence is the last refuge of the incompetent.
- Isaac Asimov
<<<
From [[this article on how to go Viral|https://medium.com/swlh/how-to-turn-your-product-into-a-viral-sensation-fad43dc9fc3d]] by Aidan Kenealy, we see a way of quantifying the state/condition of a product going viral, i.e. [[viral coefficient|Viral Coefficient]], a measure of the virality of a product.
{{Viral Coefficient}}
We can look at example here:
{{Example of Viral Coefficient Formula}}
It is important for any team/company to target a VC value of more than 1. Less than that is not optimal if the goal is viral growth.
For any company looking to going viral, their strategies should focus on improving the Referral rate per customer (R) or the conversion rate per referral (CR).
{{Leveraging the Viral Coefficient}}
And such initiatives can be segmented between active or passive recruitment for both of these components. Aidan Kenealy also recommends further segmenting these into organic versus paid.
{{Segmenting Virality Initiatives}}
<p>The Virtual DOM was initially pioneered by the React authors on the basis of making delarative JavaScript patterns performant - but how? To understand this, we need to quickly review how traditional DOM manipulation works.</p>
<p>Generally speaking, the easiest way of changing the DOM ("Modifying the HTML") is to mutate the <code>innerHTML</code> property on an element. For example, if I want to add a <code>div</code> element in the document body, I could do something like this:</p>
<div>
<pre><code><span>document</span><span>.</span><span>body</span><span>.</span><span>innerHTML</span> <span>=</span> <span>'</span><span><div>Hello World!</div></span><span>'</span><span>;</span>
<span>// <body> now has a <div>Hello World!</div> child.</span>
</code></pre>
<div>
<p> </p></div></div>
<div>
<div>
<p> </p></div></div>
<p>This seems to be computationally performant, but it really isn't. While the action of reassignment is computationally performant, the DOM repaint ("Updating what the user sees") is not. This is because <code>innerHTML</code> needs to parse DOM nodes from a string, preprocess, and append it, resulting in less-than-optimal performance. The issues with performance are increasingly noticable when there are more children/attributes and when the interval of mutation is shorter.</p>
<p>So, how is this issue fixed? Well, instead, we do pinpoint changes to the DOM. For example, this solution would be almost <strong>10x faster</strong> than the <code>innerHTML</code> solution.</p>
<div>
<pre><code><span>const</span> <span>div</span> <span>=</span> <span>document</span><span>.</span><span>createElement</span><span>(</span><span>'</span><span>div</span><span>'</span><span>);</span>
<span>div</span><span>.</span><span>textContent</span> <span>=</span> <span>'</span><span>Hello World!</span><span>'</span><span>;</span>
<span>document</span><span>.</span><span>body</span><span>.</span><span>appendChild</span><span>(</span><span>div</span><span>);</span>
</code></pre>
<div>
<p> </p></div></div>
<div>
<div>
<p> </p></div></div>
<p>While this is simple enough, once you start performing continous mutations, more complexity arises. <strong>This is why the virtual DOM was created - to allow you to write declarative content (like the string in the <code>innerHTML</code> example) while harnessing performance by making only pinpoint changes to the DOM.</strong></p>
<h2>Virtual DOM</h2>
<p>The virtual DOM is a tree of virtual nodes that represents what the DOM looks like. virtual nodes are light, stateless, and are JavaScript objects that only contain necessary fields. virtual nodes can be assembled into trees, and "diffed" to make pinpoint changes to the DOM.</p>
<p>While this is efficient, it has some caveats. Notably, diffing is not computationally free. Traversing the trees have <code>O(n^3)</code> time complexity, meaning the more children, the longer the time it will take to perform the action. To solve this, Million was created.</p>
<p><a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IIIL_Je5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qvsysw9ta4950c9tuc5v.png"><img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--IIIL_Je5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qvsysw9ta4950c9tuc5v.png" /></a></p>
<p><a href="https://dev.to/aidenybai/how-does-virtual-dom-work-b74">Read this article</a> if you don't understand what the Virtual DOM is.</p>
<$tmap view="OnePlaybook system" editor="advanced" height="500px" ></$tmap>
Met with Naiman Moshi. Albert was available with slides.
__What was decided__
# Naiman will send his email address via text
# I will send a business synopsis by tomorrow
# He will sit with the marketing team to onboard them for a wider department call for us with the provided synopsis
# Then they will decide with us on when to have the demo
A program that provides facilitation to innovative startup businesses that will take them to the next level.
This program cares a lot about these startups being scalable:
<<<
Reaching many users and generating high revenues in the future.
<<<
<p><a href="http://smartlab.co.tz/read/over-500-startups-compete-in-the-vodacom-digital-accelerator-as-smart-lab-and-vodacom-tanzania-plc-select-their-first-top-15-companies-to-enter-the-2nd-phase">smartlab.co.tz</a></p>
<h1>Smart Lab | Connecting Learners and Corporates</h1>
<p>4-5 minutes</p>
<hr />
<p> </p>
<p><strong>29th April 2020 - Dar es Salaam</strong>: Smart Lab and Vodacom Tanzania Plc have chosen its first batch of technology start-ups for its Vodacom Digital Accelerator program, with specializations ranging from fintech, health, e-commerce, media, education, agriculture, and telecom. </p>
<p>The selected companies will go through a three-month program that includes mentoring from experienced Vodacom staff, Smart Codes staff, and other professional mentors. Startups will also receive technology and creative support to launch and grow their startups from Smart Lab - which is a top tech and media company in Africa. After 3 months of building during the accelerator, startups will enter a validation phase for another 3 months where they will get marketing strategy and support, business connection, partnership, and funding.</p>
<p> </p>
<p>Tanzania’s largest telco launched the Vodacom Digital Accelerator last year in partnership with the top startup accelerator and innovation lab, Smart Lab with the mission to support local tech entrepreneurs and create more startup success stories from the Tanzania ecosystem.</p>
<p>Vodacom Tanzania Plc has invested $150,000 to support startups in the Vodacom Digital Accelerator program in the first year of its operation.</p>
<p>Almost 500 startups from 18 regions in Tanzania applied for the Vodacom Digital Accelerator program which shows the appetite for corporate-startup partnerships of which Smart Lab has been an advocate and pioneer. Of these, the Education sector accounted for 16.3% of applications, E-commerce 15.4%, Agriculture 15.0%, Fintech 10.4%, Health 10.4%, Media 7.9%, Telecom 6.7%, and Others such as Transport, Energy, and Environment totaled 18.4%. </p>
<p><strong>The selected startups:</strong></p>
<p><strong>SmartClass</strong></p>
<p><em>Education</em></p>
<p>An online platform that matches very qualified and certified tutors/experts to learners in remote areas who want to learn basic skills</p>
<p><strong>BongoVocha</strong></p>
<p><em>E-commerce</em></p>
<p>Coupon/discount platform for retailers and other businesses who want to attract customers through promotions and also get analytics/insights</p>
<p><strong>Study Buddy</strong></p>
<p><em>Education</em></p>
<p>Convenient e-learning resource platform for working professionals who are pursuing their professional qualifications despite their busy schedules</p>
<p><strong>Foodsasa</strong></p>
<p><em>E-commerce</em></p>
<p>Online food ordering and delivery platform</p>
<p><strong>MyHi by Innovasie Ltd</strong></p>
<p><em>Health</em></p>
<p>Mobile app that enables seamless access to purchasing and accessing health insurance services for people with smartphones</p>
<p><strong>Cargo Fleet by Amora</strong></p>
<p><em>Transport & logistics</em></p>
<p>App that connects truck & van owners to people who need their loads delivered</p>
<p><strong>Kasome International</strong></p>
<p><em>Education</em></p>
<p>Online platform providing a comprehensive video library of tutorials covering the secondary school curriculum, using the best recognized teachers in Tanzania</p>
<p><strong>TakaCycle</strong></p>
<p><em>Environment</em></p>
<p>Mobile app for smart waste collection that provides rewards-for-recycling to help and incentivize people in low-income communities to capture value from their waste</p>
<p><strong>Ninsiima eDispensary</strong></p>
<p><em>Health</em></p>
<p>A mobile/web app and telegram bot for patients to book clinical officers for home visits</p>
<p> <strong>Hashtag Pools</strong></p>
<p><em>E-commerce</em></p>
<p>App that allows buyers of the same product or service to purchase in bulk so that they can all mutually enjoy maximum price discounts</p>
<p><strong>Ecoshilling by Hype</strong></p>
<p><em>Environment</em></p>
<p>Payment collection platform for waste management companies</p>
<p><strong>Belltro</strong></p>
<p><em>Data analytics</em></p>
<p>Tech company creating data driven products and data strategies to help organizations get better insights of their businesses and provide better customer experience</p>
<p><strong>Kisomo by Smartcore</strong></p>
<p><em>Education</em></p>
<p>Online platform for creation and distribution of digital learning materials which cover the local curricula and reflect the actual local learning environment</p>
<p><strong>Spot</strong></p>
<p><em>E-commerce</em></p>
<p>Events discovery platform</p>
<p><strong>Wakala Search</strong></p>
<p><em>Fintech</em></p>
<p>Uber-like app that links mobile money users to reliable mobile money agents</p>
<p>We wish them all the best as they enter into the 2nd round of selection. The future is exciting</p>
<p> </p>
<p><strong>End</strong></p>
<p>For more information about the Vodacom Digital Accelerator visit <a href="https://vodacomaccelerator.co.tz/">vodacomaccelerator.co.tz</a></p>
<p>On 08, May 2020</p>
Onboarding business development manager Crisantus Mumburi. Bachelor in economics, graduated from UDSM. Founder of Desapoint and web developer.
Vodacom's Vision 2020 is to be a leading digital company that empowers a connected society, delivering on our core purpose of 'we connect for a better future.
What we offer is ways for your team to innovate better. We offer tools and methodologies that not only add value to the company's customers and profit margins, but also internal value and unfair advantage.
For example, do you like meetings? I don't! Introduce lean decision maker tool.
Or another example, marketing department.
Offer demo.
Mr. Mumburi suggests that we talk with HR because they handle all onboarding of new methodologies for employees. Moreover Vodacom prefers our remote service instead of physical sessions.
He'd be happy to offer help connecting us with HR.
<iframe src="https://vuejs.org/v2/guide/" style="position:relative;width:100%;height:80vh;" frameborder=0></iframe>
Get vulnerability reports for things you use and services you subscribe to all in one place in real time.
[[Access it here. Don't forget to open it in a Oneplaybook container in Firefox desktop by right-clicking|https://docs.google.com/spreadsheets/d/1cS2VvbGSn7xbe2OyQ7panIJ6ecr9eDZXwUmaUNt2UXo/edit?usp=drive_web]]
Better rename the CTA as "join the waitlist" instead. Also, I've read someone's playbook on validating ideas and they pointed that many Americans are more likely to acquiesce to joining a waitlist than global consumers. That's something to look into.
I might also have to do a small advertisement campaign to accelerate the data collection.
__References for a web extension__
# For [[chrome|https://developer.chrome.com/extensions]]
# For [[firefox|https://developer.mozilla.org/en-US/Add-ons/WebExtensions]]
# [[yeoman generator for web extension|https://github.com/HaNdTriX/generator-chrome-extension-kickstart]]
Hosting place: [[cloude node|https://cloudno.de/dashboard]]
[[Sharing objects with content scripts in Firefox|https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Sharing_objects_with_page_scripts]]
#### Build your own `Web Search Engine`
* [**PHP**: _Code a Search Engine in PHP_](https://boyter.org/2013/01/code-for-a-search-engine-in-php-part-1/)
* [**Ruby**: _Write an Internet search engine with 200 lines of Ruby code_](https://blog.saush.com/2009/03/17/write-an-internet-search-engine-with-200-lines-of-ruby-code/)
#### Build your own `Web Server`
* [**C#**: _Writing a Web Server from Scratch_](https://www.codeproject.com/Articles/859108/Writing-a-Web-Server-from-Scratch)
* [**Node.js**: _Let's code a web server from scratch with NodeJS Streams_](https://www.codementor.io/ziad-saab/let-s-code-a-web-server-from-scratch-with-nodejs-streams-h4uc9utji)
* [**PHP**: _Writing a webserver in pure PHP_](http://station.clancats.com/writing-a-webserver-in-pure-php/)
* [**Python**: _A Simple Web Server_](http://aosabook.org/en/500L/a-simple-web-server.html)
* [**Python**: _Let’s Build A Web Server._](https://ruslanspivak.com/lsbaws-part1/)
* [**Python**: _Web application from scratch_](https://defn.io/2018/02/25/web-app-from-scratch-01/)
* [**Python**: _Building a basic HTTP Server from scratch in Python_](http://joaoventura.net/blog/2017/python-webserver/)
* [**Ruby**: _Building a simple websockets server from scratch in Ruby_](http://blog.honeybadger.io/building-a-simple-websockets-server-from-scratch-in-ruby/)
*HTML5 form validation techniques: http://tinyurl.com/jk4djqz
*Regex cheatsheet: https://www.debuggex.com/cheatsheet/regex/javascript
`\` escapes, `^` begins the string and `$` is end of string, e.g `/\d$/` is one digit (eqv to [0-9]) with end of string.
* [[Manipulate the DOM using plain javascript |https://www.sitepoint.com/dom-manipulation-vanilla-javascript-no-jquery/]]
* [[Fetching data from the server |http://tinyurl.com/lle4uun]]
* [[Building universal browser add-ons |https://www.smashingmagazine.com/2017/04/browser-extension-edge-chrome-firefox-opera-brave-vivaldi/]]
* [[Webpack absolute basics |https://hackernoon.com/webpack-the-basics-2712a7ad640b]]
* [[Try out some es6 |https://es6console.com/]]
* [[Concerning JS scopes|https://toddmotto.com/everything-you-wanted-to-know-about-javascript-scope/]]
* [[Concerning node exports and require|https://www.sitepoint.com/understanding-module-exports-exports-node-js/]]
Others:
<<list-links "[tag[Webdev references]sort[title]]">>
<<list-links "[tag<currentTiddler>sort[title]]">>
* Making WebRTC video calls scale in a mesh network beyond one on one video calls is tough because of
** Bandwidth
** Uplink strain
* Much better to use a media server
* These challenges may not exist for the data channel, though that hasn't been explored in this article
https://bloggeek.me/webrtc-p2p-mesh/#h-what-is-webrtc-p2p-mesh
|!Header|Logo|Links to Benefits, About, Blog|CTA|<|
|! Above fold| Uvp, sub heading, CTA button | Illus |<|<|
|! Second section| Benefit 1 | Benefit 2 | Benefit 3 |<|
|! Third section| Interactive demo showing flexibility |<|<|<|
|! Fourth section| Integration and deployment options |<|<|<|
|! Fifth section| Open tech testimonials |<|<|<|
|! Sixth section| Final CTA with primary bg color |<|<|<|
|! Footer| Logo | First column links | Second column links |<|
Addendum: the problem section
Will consist of a responsive infobox with a bold statistical headline on left and big problems identified by workers.
|!Header|[[Logo]]|Why ~OnePlaybook|Use cases|Pricing|Support|Blog|CTA|<|
|! Above fold| Uvp, sub heading, CTA button | Interactive device frame demos |<|<|<|<|<|<|
|! Second section| Benefit 1 | Benefit 2 | Benefit 3 |<|<|<|<|<|
|! Third section| Interactive demo showing flexibility |<|<|<|<|<|<|<|
|! Fourth section| Integration and deployment options |<|<|<|<|<|<|<|
|! Fifth section| Open tech testimonials |<|<|<|<|<|<|<|
|! Sixth section| Final CTA with primary bg color |<|<|<|<|<|<|<|
|! Footer| Product | About | Resources | Solutions |<|<|<|<|
__Related__
* [[Moving the navbar to the bottom]]
* [[Full page scrolls and parallax effect]]
* https://browserframe.com/
* [[Devices dot css|https://github.com/picturepan2/devices.css]] this is the best. We can scale the iframes in the device frames and make them interactive demos!
The aim of this is to extract more value from meetings.
We can break down the painpoints by dividing it up into its constituents:
# Pre-meeting
## Scheduling: getting everyone to be available at the same time is hard. People usually use Calendly or just Google calendar to address this
## Preparing for a meeting can be time consuming. Especially when you remember it at the very last minute
# Intra-meeting
## Distractions: there's always something nicer to look at
## Alignment
# Post-meeting
## Making sure everyone comes out remembering key points. Some people use Fireflies, an automated bullet points note-taking tool that allows for searchable recollection of key points
## Effective follow-up is hard. Sending minutes to everyone may not be enough
One problem we could solve in the pre-meeting and intra-meeting section is the problem of having appropriate information on hand immediately depending on the context of the meeting, i.e. the agenda or the actual conversation. The benefit of such a discovery engine would be to reduce the amount of time wasted in looking for a document or information in a meeting.
There are so many end-products required after a meeting. Action items, minutes, and follow-ups. Automating the generation of these would be nice.
In team communication, we need to consider a couple of factors:
# importance/urgency: does a particular communication need to be responded now or can it be dealt with later, or even never?
# distance: is the initiator or recipient or both separated by multiple timezones?
# quantity: how many channels do team members need to keep watch over? And how fast is the turnover of information in these channels?
Communication is easy these days, but it is a double edged sword. Too much communication leads to overload. Increasing the quality of the process would pay off. But how do we do that?
One way we could reduce communication overload in team communications would be to create asynchronous communication products from streamlined synchronous communications via active or passive autonomous documentation. That way teams can spend less time asking and documenting (clerical stuff) and more time doing valuable stuff.
''From the investor's POV''
[[Five questions about the startup|https://gabygoldberg.medium.com/my-framework-for-evaluating-early-stage-consumer-companies-c673c9fd4a2a]] (if it is an early stage consumer company):-
# Why do people come?
## who are these people and what values pull them to you?
# Why do people stay?
## Retention of cohorts and what these cohorts are
## Is the cohort retention curve flattening or continuing to drop?
## Only when you have seen the [[signs of good retention|https://www.lennysnewsletter.com/p/what-is-good-retention-issue-29]] can you say you have product-market fit
# Why do people share?
## Propensity of [[Virality]]
# Why do people pay?
## Is this sustainable and defensible?
## Do the economics make sense?
## Does the business model make sense?
''From the startup's POV''
__Ideal problem__
* A lot of people should have the problem (that they care about)
* The problem/market is growing 20% per year
* Problems that require a solution urgently
* Problems that cost a lot to solve or at least add up to some billion dollar total addressable market
* Problems borne from changed laws or regulations
* Problem that occurs frequently
__Solution__
* don't start here!
__Unfair advantage/insight__
This has to be related to growth 📈. An insight into what you're doing to grow quickly. And you have to express why this problem is worth solving in this framework.
Types of insights:-
* Founder advantage: only you can solve this? Most people don't fall here. Don't label yourself an expert just yet unless maybe you have a patent or thesis that you wrote and own.
* Market is growing 20% per year. This is the weakest if it's the only advantage you have! But it's important to have.
* Is your product 10x better than the competition?
* Acquisition
* Monopoly: as you grow, is it more difficult for competitors to catch up? E.g. companies with network effects or marketplaces
<p><a href="https://hackernoon.com/how-to-level-up-from-100-month-saas-deals-to-1m-enterprise-sales-3909fff55ba3" rel="bookmark">How to Level up from $100/month SaaS Deals to $1M Enterprise Sales</a></p>
<p><img src="https://cdn-images-1.medium.com/max/1600/1*RIjSunqvEZb_OUBwyM71DA.png" /></p>
<p><a dir="auto" href="https://hackernoon.com/@foundercollective?source=post_header_lockup"><img alt="Go to the profile of Founder Collective" src="https://cdn-images-1.medium.com/fit/c/100/100/1*q-oDqs62LJTpqS5zOa0F9g.png" /></a></p>
<p>Aug 11, 2017</p>
<p>Memoirs written by people in their mid-thirties tend to involve tales of hard living, steamy scandals, and other salacious subject matter, but Grant Miller’s story is one of a misspent youth struggling with…enterprise software product requirements. “Struggle” may be the wrong word, as he and his co-founder, Marc Campbell, managed to <a href="https://mixergy.com/interviews/grant-miller-look-io-interview/" rel="noopener" target="_blank">make themselves millionaires nine months after founding their first company together</a>, but along with this new venture, <a href="https://www.replicated.com/" rel="noopener" target="_blank">Replicated</a>(<a href="https://twitter.com/search?l=&q=%23PI%20OR%20%23ProudInvestor%20from%3Afcollective&src=typd&lang=en" rel="noopener" target="_blank">#ProudInvestor</a>), Miller hopes to help founders enjoy a smoother path to success.</p>
<p><img src="https://cdn-images-1.medium.com/max/1600/1*I0v9sI0u_x0TA3GJ2XHUhg.jpeg" /></p>
<p>The 11 Principles of Becoming “Enterprise Ready.”</p>
<p>His autobiography takes the form of <a href="https://www.enterpriseready.io/" rel="noopener" target="_blank">EnterpriseReady.io</a>, a collection of resources that help SaaS founders understand the complex product requirements that come with selling to established businesses. He’s identified 11 features an application must have to be adopted broadly by large clients:</p>
<ol>
<li><strong>Product Assortment:</strong> Different versions of a product to meet differing needs</li>
<li><strong>Single Sign On:</strong> Enable enterprises to manage users from a single, central directory</li>
<li><strong>Audit Logs:</strong> Provide admins with a detailed trail of account activity</li>
<li><strong>Role Based Access Control:</strong> Allow for the separation of privileges by user role</li>
<li><strong>Change Management:</strong> Empower admins with tools to roll out features/product changes</li>
<li><strong>Product Security:</strong> Demonstrable application security through best practices</li>
<li><strong>Deployment Options:</strong> Data security + application overhead + flexible deployment</li>
<li><strong>Team Management:</strong> Centrally managed collaboration with coworkers is a must</li>
<li><strong>Integrations:</strong> Enable data portability by allowing data in and out of your app</li>
<li><strong>Reporting & Analytics:</strong> Allow admins to demonstrate value gained from your app</li>
<li><strong>SLA and Support:</strong> Big businesses are less forgiving than beta customers</li></ol>
<p>At EnterpriseReady.io readers will find how-to guides and case studies that demonstrate successful deployments for each of these items. But beyond this laundry list, Grant has identified a few broad mindsets that founders can benefit from, even those who might be years away from pursuing enterprise sales.</p>
<h3>Big Companies Aren’t Dumb</h3>
<p>The most pernicious problem Miller sees is a belief among elite technical founders that big companies are dumb, or at least seriously behind the times. “The funny thing is that many founders don’t want huge potential customers like ‘stodgy banks’ using their apps, only cool, hip companies,” says Miller—though these founders may change their tunes when they need to live up to the ambitious valuations they accepted while fundraising.</p>
<p>These beliefs, by and large, are rooted in some truth. Behemoth corporations don’t adopt modern frameworks or design patterns rapidly. New UI paradigms take years to trickle into their products if they ever do. But these complaints miss the bigger picture. Massive conglomerates earned their size because they have built many successful lines of business that are in the market, producing revenue, and likely…profits. By default, these companies are more risk averse and more interested in protecting the status quo. On the other hand, startups are actively trying to exploit change to disrupt the status quo to create the market opportunity they need to thrive. For startups to be successful working with large enterprise customers, they have to recognize these inherent differences in perspective.</p>
<p> </p>
<p>Miller adds that it isn’t just about risk aversion, “Founders often don’t appreciate the large differences in priority that comes with massive scale,” says Miller. “When a company has 100,000 employees, they can’t be managed the same way they would be at a 10-person or even a 100-person startup.” He points to <a href="https://www.enterpriseready.io/features/teams/" rel="noopener" target="_blank">Team Management</a>, <a href="https://www.enterpriseready.io/features/single-sign-on/" rel="noopener" target="_blank">Single Sign-On</a> and <a href="https://www.enterpriseready.io/features/role-based-access-control/" rel="noopener" target="_blank">Role Based Access Control</a> as examples of how enterprises need applications to be administered differently. A two person team might be happy to share usernames & passwords to access 10–20 applications (even then it’s a bad idea). But, for enterprises trying to engage tens or hundreds of users with an application, they can’t even think about managing each of their users in each of the proprietary user management systems for each application, there are just too many to manage manually.</p>
<p>Large corporations aren’t stupid; they just have a different set of constraints that many startup teams won’t truly appreciate unless they’ve run a large enterprise IT department (or struggled with meeting the requirements of these companies for years).</p>
<h3>In the Enterprise You Sell “<em>Through</em>,” Not “To”</h3>
<p>As iterated above, enterprises are not just large SMBs. Founders are often surprised by how much of the sales process is done through a champion inside of the enterprise organization versus a more direct process to a decision maker inside of a small business. Simultaneously selling to many stakeholders inside of a large organization — end users, corporate IT, finance, just to name a few — creates challenges compared to speaking directly with a person who will use your product and holds the credit card.</p>
<p>As a result, SaaS companies looking to move up market into the enterprise have to enable the people inside of large enterprises to spread the product horizontally and sell it up through their organization. It isn’t just about satisfying a single type of user’s direct business needs (though that is the first step) but the next step is to be able to meet the needs of all of the adjacent parties. For example, features like <a href="https://www.enterpriseready.io/features/product-security/" rel="noopener" target="_blank">product security</a> to pacify the CISO and <a href="https://www.enterpriseready.io/features/audit-log/" rel="noopener" target="_blank">audit logs</a> to appease the compliance officer can go a long way in communicating that a startup “gets it”.</p>
<p>Beyond just building these features, SaaS companies should document how these features work in the form of marketing collateral that can be shared within an organization. Founders need to get comfortable allowing 3rd parties to push their product. Instead of wordsmithing every bit of copy, entrepreneurs need to orient their marketing to the multiple different audiences inside of a large organization, this means developing a wide variety of collateral in the form of PDFs and PowerPoint decks. These resources allow an internal champion to communicate effectively with other parts of their organization about the areas that each is concerned.</p>
<p>Once the deal is closed, and the customer is onboarding, Miller advises that SaaS companies think about how they can accelerate the career of their champion within these enterprises. Often these advocates have risked their hard earned relationship capital within their organization to support new technologies. One key he suggests is to embrace and provide air cover back to the champion by providing <a href="https://www.enterpriseready.io/features/advanced-reporting/" rel="noopener" target="_blank">advanced reporting</a> functionality to prove the business case & ROI that has been unlocked by the adoption of the product.</p>
<h3>Listen for Common Requests</h3>
<p>One warning: listen to and learn from these sherpas, but don’t let them design your software. You will hear dozens of feature requests from customers, but it’s the job of a great product person to sift through those ideas and to build generalizable tools that can be sold across multiple enterprises. EnterpriseReady can help give product leaders distinct buckets in which they can group feature requests to understand if they are common requests or just the personal preference of a specific customer. Often the biggest challenge is just being on the same page with the various parties within an organization as to what their requirements are. Find a common vernacular and specific example that you can reference when taking feature requests.</p>
<h3>The Humble Art of Helping Corporations</h3>
<p>Selling to the enterprise can be equal parts frustrating and lucrative. As easy as it is to poke fun at boring old behemoths, entrepreneurs should empathize with them — after all, the goal is to become one.</p>
<p>You’ve probably run into the jobs-to-be-done framework/theory. I did several years ago when I first stumbled into the <a href="https://www.youtube.com/watch?v=sfGtw2C95Ms" rel="noopener">Milkshake Study</a> popularized by Clayton Christensen.</p>
<p>I was immediately intrigued and had more questions than answers.</p>
<p>I read up everything I could find and even worked alongside several JTBD thought leaders and practitioners including Bob Moesta, Chris Spiek, Tony Ulwick, Alan Klement, Des Traynor. A lot of their work influenced the development and still ongoing evolution of the <a href="http://innovatorsgift.com/" rel="noopener">Customer Forces Canvas and the Innovator’s Gift project</a>.</p>
<p>But even after all this research, two things continue to bother me.</p>
<p>First, the commonly found definitions of a jtbd are <strong>circular, polymorphic, or purposely vague</strong>. Second, a lot of the case studies felt like <strong>neat magic tricks </strong>— obvious in hindsight, but hard to recreate with your own product.</p>
<p>I want to attempt to tackle the definitions problem first. I believe starting with a clearer, more concise, simpler definition automatically moves us forward on the second issue.</p>
<h3>The Definitions Problem</h3>
<p>Here is a sampling of some of the definitions out there:</p>
<p><strong>Circular definition:</strong><br />
<strong><em>People don’t buy products, they hire them to get a job done.</em></strong><br />
A job then is something people are trying to get done. What is that?</p>
<p><strong>Polymorphic definition:</strong><br />
<strong><em>A task, goal or objective a person is trying to accomplish or a problem they are trying to resolve.</em></strong><br />
Tasks, goals, and problems are separate and distinct things. How can a job be three different things?</p>
<p><strong>Purposely vague definition:</strong><br />
<strong><em>A job to be done describes the progress people are trying to make.</em></strong><br />
How do we scope progress?</p>
<p>You’ll notice I left out the attributions on these definitions. This was intentional. Seasoned practitioners should have no problem identifying the sources and the curious should be able to easily look them up. I left them out because my goal isn’t casting judgment (or creating needless controversy). A lot of overlapping pieces are already laid out in these definitions. I am simply trying to piece them together through deconstruction.</p>
<p>The definition below helped me see and practice jtbd more clearly. I’d love to hear your thoughts in the comments below.</p>
<p>.</p>
<p>.</p>
<h3>What then is a Job-to-be-done?</h3>
<h4><strong>A simpler definition</strong></h4>
<p>A job to be done is the instantiation of an unmet need or want (in response to a trigger).</p>
<p><img alt="" src="https://blog.leanstack.com/content/images/max/800/1-74LQCZxm-BqOTDlv7f_NWA.png" /></p>
<p>A job to be done is the instantiation of an unmet need or want (in response to a trigger).</p>
<p><em>Notes: One could argue that you could simplify this further: A job is an unmet need or want. This isn’t as actionable a definition. What differentiates a </em><strong><em>job</em></strong><em> from a </em><strong><em>job to be done</em></strong><em> is the time-boxed sense of urgency that a trigger creates towards fulfilling an unmet need or want. In other words, jobs could be aspirational nice to haves. Jobs-to-be-done, on the other hand, signal action.</em></p>
<h4>All jobs start with a trigger</h4>
<p>We encounter triggering events throughout the day which means we encounter jobs to be done throughout the day too.</p>
<ul>
<li>It’s 12:36 pm and my stomach is grumbling. I need to eat.</li>
<li>It’s 7:36 pm and my stomach is grumbling and it’s my wife’s birthday. I want to take her to a fancy restaurant.</li></ul>
<p>Triggers are what define the context that shapes the job to be done.</p>
<p><em>Notes: Progress doesn’t have to game-changing or aspirational. It could simply be taking me from being hungry to being fed.</em></p>
<h4>Habits define what we do most of the times</h4>
<p>Having to find new solutions for every trigger we encounter would generate too much cognitive load so we rely on existing alternatives most of the times (like where to eat lunch).</p>
<p><em>Notes: Some jtbd practitioners focus jtbd solely around the hiring and firing of products which implies buying or switching. I decouple a jtbd from a switch or a purchase. In other words, hiring doesn’t require switching. One could simply be reusing a previously purchased product to get a job done.</em></p>
<h4>Until we encounter a switching trigger</h4>
<p>A switching trigger is a special trigger that comes with an <strong>expectation violation</strong>. That’s when we realize that our existing alternative(s) isn’t good enough to get the job done. That’s also when we seek new and different solutions.</p>
<p>In the lunch example above, what could cause us to seek out a new restaurant:</p>
<ul>
<li>a change in circumstance e.g. first day on a new job,</li>
<li>a bad experience e.g. food poisoning from the usual lunch spot,</li>
<li>an awareness event e.g. heard the new restaurant finally opened.</li></ul>
<p><em>Notes: Triggers instantiate jobs to be done which favor familiar solutions (existing alternatives). Switching triggers create expectation violations which open spaces for new solutions.</em></p>
<h4>Getting hired is only the first battle</h4>
<p>When prompted to switch, customers often evaluate and trial multiple products in search of the one that best gets their job done. Getting hired, while an important first step, is only the first step. Unless you can quickly deliver value (the aha-moment) and then establish yourself as the new status quo (the habit-moment), you could easily find yourself on the firing block.</p>
<p><img alt="" src="https://blog.leanstack.com/content/images/max/800/1-qDet0dtLC48qT-h9uVa9nQ.png" /></p>
<p><em>Notes: Getting a job done isn’t just about acquisition. Activation and retention are where the rubber hits the road.</em></p>
<p>In case you are wondering how the customer forces canvas relates to the customer factory blueprint… here you go:</p>
<p><img alt="" src="https://blog.leanstack.com/content/images/max/800/1-6I6YMnGmb9mM1T56WYapYg.png" /></p>
<p>The customer factory is a systems view of how customers move through your product funnel transitioning through 5 states of unaware visitors to passionate, happy customers.</p>
<p>The customer forces describe the internal forces that make a customer go through between these state transitions.</p>
<h4>Needs versus Wants</h4>
<p>Needs are functional. Wants are emotional.<br />
Needs have utility. Wants have energy.<br />
Needs favor existing solutions. Wants favor new solutions.</p>
<p><strong>There is a place for both.</strong></p>
<p>We tend to focus on unmet needs in order to optimize existing solutions.<br />
We tend to focus on unmet wants in order to search for new solutions.<br />
Needs live in the solution context. Wants live in the bigger context.</p>
<p><em>Notes: The most effective marketing triggers on our wants, not our needs. When Apple announces a new product, people have already made an emotional purchase. They then read the features to rationalize the purchase.</em></p>
<h4>The bigger context is where you’ll find new spaces for innovation</h4>
<p>Every product exists in multiple contexts: the solution context and the bigger context.</p>
<p><img alt="" src="https://blog.leanstack.com/content/images/max/800/1-mVUuosaj6eZKtq3dYsODuQ.png" /></p>
<p>Examples:</p>
<ul>
<li>Cameras existing in the product context. Photography is the bigger context.</li>
<li>Lean Canvas exists in the product context. Innovation is the bigger context.</li></ul>
<p>Leveling up too many times on the bigger context can quickly get meta-physical quickly where you start questioning the meaning of life. But most innovators don’t level up at all.</p>
<p><strong>It’s better to level up and get out of scope and then narrowing down a level, than staying stuck in the weeds</strong></p>
<p>How do you find the bigger context? While the pursuit for better products should be outcome driven, not all outcomes are desirable. For example, you could build a stronger drill-bit that doesn’t break which delivers a better “hole in your wall”. But a “hole in your wall” is not the desirable outcome.</p>
<p><strong>Chasing desirable outcomes is how you move out of the solution space and into the bigger context.</strong></p>
<p><strong>Why do people drill a hole in their wall?</strong><br />
- to get a quarter-inch hole (not desirable)<br />
- to secure a hook (not desirable)<br />
- to hang a painting (desirable)<br />
- to decorate their home (desirable)<br />
- to express their style (desirable)</p>
<p><img alt="" src="https://blog.leanstack.com/content/images/max/800/1-bSwgQle-29tPZTjNGV69cw.png" /></p>
<p>Leveling up on outcomes from tasks/activities to the bigger context</p>
<p><strong>What do you do with this:</strong><br />
- <strong>If you are a drill manufacturer</strong>, you might be inclined to focus on building better drill bits that don’t break.</p>
<p><img alt="" src="https://blog.leanstack.com/content/images/max/800/1-clVZendPJOLVgr04Ozp8ug.png" /></p>
<p>A “stronger” titanium drill bit</p>
<p>- <strong>If you are 3M</strong>, you might build <a href="https://www.scotchbrand.com/3M/en_US/scotch-brand/products/catalog/~/?N=4335+3294268145+3294529207+3294857497&rt=rud" rel="noopener">strong mounting tape</a> that eliminates the need for drilling.</p>
<p><img alt="" src="https://blog.leanstack.com/content/images/max/800/1-eHjYDq7NYVS5-8KATQfhMg.png" /></p>
<p>3M Extremely strong mounting tape: Hang paintings with no fuss, no mess.</p>
<p>- <strong>If you are Samsung</strong>, you might sell more <a href="https://www.samsung.com/us/explore/the-frame/design/" rel="noopener">flatscreen displays</a> that replace artwork on walls.</p>
<p><img alt="" src="https://blog.leanstack.com/content/images/max/800/1-OL7ATDJdV3J7CauvaRArdg.png" /></p>
<p>Samsung Frame TV: TV when it’s on, Art when it’s off.</p>
<p>If you are solution-agnostic, you could consider all three.</p>
<p>That’s why this stuff is so much fun…</p>
<p>This is sometimes equated to disruptive innovation — doing old jobs with new solutions.</p>
<p>When you’re moving really fast and constantly uncovering, prioritizing, and delivering on the unmet needs and wants of your customers, you’re not pursuing sustaining or disruptive innovation — <strong>it’s all continuous innovation</strong>.</p>
<p>Doing this not only positions your business model for causing switch. More importantly, it positions your business model against switch.</p>
<p><strong>Delivering on the bigger context is how you cause switch and preventing switch is how you continue to stay relevant to your customers.</strong></p>
<h3>How do you systematically uncover the right job-to-be-done?</h3>
<p>By using carefully scripted customer interviews and summarizing your key insights on a Customer Forces Canvas.</p>
<p><img alt="" src="https://blog.leanstack.com/content/images/max/800/1-7zJshx6QAYONEPD6TV1V3Q.png" /></p>
Prototype is just a property that every function in JavaScript has and, as we saw above, it allows us to share methods across all instances of a function. All our functionality is still the same, but now instead of having to manage a separate object for all the methods, we can just use another object that comes built into the Animal function itself, `Animal.prototype`.
[[Source|https://medium.freecodecamp.org/a-beginners-guide-to-javascript-s-prototype-9c049fe7b34]]
A ~WeakSet is just like a normal Set with a few key differences:
# a ~WeakSet can only contain objects
# a ~WeakSet is not iterable which means it can’t be looped over
# a ~WeakSet does not have a .clear() method
~WeakMaps also work exactly the same way.
{{2018-06-11T18:23:14.997Z}}
Intellipedia is an online system for collaborative data sharing used by the United States Intelligence Community (IC). It comprises of three separate wikis (I guess to ensure [[security via compartmentalization|https://en.wikipedia.org/wiki/Compartmentalization_(information_security)]]):
* one wiki runs on (Joint Worldwide Intelligence Communication System) JWICS (Intellipedia-TS) network. This wiki houses Top Secret, highly sensitive and compartmentalized
* another on ( Secret Internet Protocol Router Network) SIPRNet (Intellipedia-S) network. This wiki houses information that is classified as 'secret' ([[see classification system for US intel|https://en.wikipedia.org/wiki/Classified_information_in_the_United_States#Secret]])
* and one on DNI-U (Intellipedia-U) network, an unclassified network for opensource intelligence
<p>There are four events that cause a React component to render:</p>
<ol>
<li>State change</li>
<li>Prop change</li>
<li>Parent render</li>
<li>Context change</li></ol>
<p>When state changes, you can skip the render via:</p>
<ol>
<li><a href="https://reactjs.org/docs/react-component.html#shouldcomponentupdate">shouldComponentUpdate</a></li>
<li><a href="https://reactjs.org/docs/react-api.html#reactmemo">React.memo</a> which stands for <em>memoization </em>in that the result is cached and allows for the rendering 'calculation' to happen only once.</li></ol>
<p>When props change or a parent renders, you can skip the render via:</p>
<ol>
<li><a href="https://reactjs.org/docs/react-component.html#shouldcomponentupdate">shouldComponentUpdate</a></li>
<li><a href="https://reactjs.org/docs/react-api.html#reactpurecomponent">PureComponent</a> which helps you render a pure component which renders only once</li>
<li><a href="https://reactjs.org/docs/react-api.html#reactmemo">React.memo</a> same as above</li></ol>
<p>When context changes, <a href="https://reactjs.org/docs/context.html#contextprovider">React always renders</a> the context’s consumers.</p>
<p>You can also force a render via <a href="https://reactjs.org/docs/react-component.html#forceupdate">forceUpdate</a>, but that’s rarely the right approach.</p>
<p><img alt="Reasons React renders" src="https://i0.wp.com/www.bitnative.com/wp-content/uploads/2020/07/reasons-react-renders-1.png?fit=640%2C360&ssl=1" /></p>
<p>Update:</p>
<p>Apparently you can also use the key attribute to force a re-render (given that it's a prop):</p>
<blockquote>
<p>Q: For what purpose a <code>key</code> can be used in React? (apart from assigning it to a list of items)</p>
<p>A: To force re-render of a component</p></blockquote>
[[Reference|https://monday.com/blog/remote-work/wfh-is-video-conferencing-draining-our-productivity/]]
Why do we do videoconferences, or why do we have meetings in the first place? I think it depends on what we want to to accomplish.
Every meeting needs to have a central theme to organize itself around. And each theme has its own demands.
Here are some possible themes:
# Brainstorming session. Here, there's emphasis on active collaboration.
# Reporting session. Here we simply report or present updates for stakeholders to consider.
# Decision session. Here, decisions must be made based on a given discussion.
However, in the referenced article, it is mentioned that there are times you might want to not be to do a full-blown videoconference for something like getting someone's thoughts on a subject. It has to be something big, like a major decision, a major report/update or a major crisis/activity that requires input of ideas.
An interesting productivity web app that markets itself as
<<<
a unified suite of collaboration tools. Great for product specs, wikis, brainstorming, ideation, user flows, architecture diagrams and more.
<<<
Their UVP is compelling:
<<<
Think together. No office required.
<<<
They offer the following tools together with real-time collaboration:
* Flow chart builder
* Docs
* Wireframes (a Google docs for wireframes)
* Sticky notes (for visual project management)
* Mind maps (a very elegant map can be built here)
Their starter package is very generous. They allow as many editors as you can fit, together with real-time collaboration and only charge for guest editing and public viewing. But there are a couple of weaknesses:
* Pricing (apparently they don't allow many boards and the full price is very high)
* Export options are limited. Not granular enough
* Customizing is somewhat limited
* Not enough templates in only one case
The key strength is the SIMPLICITY and BEAUTY. I noted most of the [[reviews|https://www.capterra.com/p/172789/Whimsical/reviews/]] are from LinkedIn folks. Have to keep that in mind.
<<list-links "[tag<currentTiddler>sort[title]]">>
Successful products and services are desirable (people want it), feasible (it can be built), and viable (revenue is created). If you don't see your business along these lines of thought, your business is almost bound to fail.
Some people confuse innovation with cutting edge technology. But this isn't the case for most valuable companies. In fact, companies usually use ordinary technologies that have been around for a long time, and spend more time coming up with a business model that's trivial but valuable. Let's illustrate this by using Uber as an example.
<<<
Effective knowledge sharing is essential for all organizations, yet many struggle to get employees on board. Our results suggest that if managers want to encourage more sharing, they need to design work so that people want to discuss what they know.
<<<
[[Source|https://hbr.org/amp/2019/07/why-employees-dont-share-knowledge-with-each-other]]
Intellipedia is intended to be a platform for sharing & harmonizing the various points of view of the agencies and analysts of the Intelligence Community. It is used to help experts pool their knowledge, form virtual teams, and make quick assessments, with "... No bureaucracy, no mother-may-I, no convening meetings." to stand in the way.
It's guiding points are quite valuable in the evaluation of knowledge management systems, which are:
{{Guiding principles of OHS framework}}
Moreover, the requirements are grounded on research into user needs and can inform the design of future systems, whose overarching goal is to allow us to make the best use of our collective IQ.
{{Further reading into hyperdocuments}}
We could turn TiddlyWiki into a bot/headless wiki as a service that fulfills requests via a function-like API or autonomously.
{{Macro recorder for TiddlyWiki}}
Ward Cunningham, the inventor of wiki, coauthored a paper with Michael Mehaffy titled [[Wiki as a Pattern Language|http://www.sustasis.net/wiki-as-pl.pdf]] in 2014 where they argue that there are deep relationships between wikis and [[pattern languages]] (aka design patterns), and that wikis "were in fact developed as tools to facilitate efficient sharing and modifying of [design] patterns".
Ward Cunningham and Michael W. Mehaffy. 2013. Wiki as pattern language. In <i>Proceedings of the 20th Conference on Pattern Languages of Programs</i> (<i>PLoP '13</i>). The Hillside Group, USA, Article 32, 1–14.
<p>We keep hearing the phrase "content is king" in the content marketing domain. If your content can generate a following and a sense of community, then it could generate a reliable stream of leads very well. What if we instead reverse some roles here: instead of using content only to market software products, maybe we can use software to market the product (whatever it may be).</p>
<p>This could be the opportunity for the Explore functionality in OnePlaybook. Maybe this could be the [small market|[Monopolies: notes from Zero to One by Peter Thiel]] we've been searching for: interactive knowledge content creation. One could also envision enabling API exploration and solutions creating right inside an interactive white paper app powered by TiddlyWiki.</p>
https://meta.wikimedia.org/wiki/WikiAfrica_Hour/Newsroom
GitHub was originally started as a convenient place for sharing and working on code. The Wikipedia for code.
Why can't we have a similar thing for thinking tools?
Here are a collection of articles about the amazing world of wikis:
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Wikis'>>
</div>
<p><a href="https://subconscious.substack.com/p/wiki-as-a-commons">subconscious.substack.com</a></p>
<h1>Wiki as a Commons</h1>
<p>Gordon Brander</p>
<p>5 - 6 minutes</p>
<hr />
<p>Wikis are like Minecraft for thought — very simple, very open-ended.</p>
<p><a href="https://cdn.substack.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F441fbdbd-2b14-4d61-870d-6005c018e431_800x449.gif" target="_blank"><img alt="" src="https://cdn.substack.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F441fbdbd-2b14-4d61-870d-6005c018e431_800x449.gif" /></a></p>
<p>A wiki has two essential concepts:</p>
<ol>
<li>
<p>Everyone can write on every page.</p></li>
<li>
<p>You can link other pages, whether or not they exist.</p></li></ol>
<p>That’s it. <a href="https://www.artima.com/articles/the-simplest-thing-that-could-possibly-work">The simplest thing that could possibly work</a>. Yet this simple <strong><a href="https://subconscious.substack.com/p/provoking-emergence-with-alphabets">alphabet</a></strong> can generate complex living systems, from personal notes, to collaborative <a href="https://expanse.fandom.com/wiki/The_Expanse_Wiki">fansites</a>, to <a href="http://wikipedia.org/">Wikipedia</a>.</p>
<h3>Everybody is in charge of everything</h3>
<blockquote>
<p><strong>Bill Venners</strong>: The collective code ownership aspect of Extreme Programming (XP) reminds me of wikis, where everybody is in charge of everything.</p>
<p><strong>Ward Cunningham</strong>: That's absolutely intentional. In the months before I made wiki, we had been having an argument. I think Kent Beck and I were on one side. People who had a lot of faith in the prevailing dogma of software engineering were on the other side. We said, “Collective code ownership is good.” They said, “That's ridiculous. You'll never get responsibility. You'll never get quality if you don't have responsibility. And the only way you'll get responsibility is ownership. You have to pin the bugs back on somebody if you want them to ever rise above producing bugs.” And I said, “Well that's wrong.” The decisions I made designing wiki were very much inspired by my desire to create a model for the collaborative process I thought should happen in large code bases. I wanted wiki to mimic that.”</p>
<p><em><a href="https://www.artima.com/articles/collective-ownership-of-code-and-text">Interview with Ward Cunningham, 2003-12-01</a></em></p></blockquote>
<p>Like Minecraft, and the wider world around us, a wiki is a shared, mutable world that we craft together.</p>
<p><strong>Wikis are open-ended</strong>. Anyone can create a page for any purpose. Yet all page names belong to <strong>one global namespace</strong>. This creates a<strong> scarcity</strong>—who will define the meaning of each name? The result is a generative tussle that forces the emergence of negotiation, communal norms, communal goals, communal meanings.</p>
<p><strong>Open-ended meaning-making, shared world, scarce real-estate.</strong> These three properties are crucial. Every game with more than one player becomes a game about the interaction between those players. Without shared scarcity, there is no incentive to join our realities, and <a href="https://twitter.com/gordonbrander/status/1348315480319135744">meaning-making becomes fork-only</a>.</p>
<h3>Soft security</h3>
<p>Today’s internet is an <a href="https://www.ribbonfarm.com/2020/01/16/the-internet-of-beefs/">Internet of Beefs</a>. Flat, global networks like Facebook, Twitter, and YouTube are overrun by memetic epidemics — harassment mobs, disinformation, conspiracy theories, alternative facts, troll farms, state actors, ransomware, extremists.</p>
<p>How is it that Wikipedia, with its cooperative ownership, has not been overrun by these same forces? Sites like YouTube have even resorted to <a href="https://slate.com/technology/2018/08/youtube-is-adding-fact-check-links-from-wikipedia-and-encyclopedia-britannica-for-videos-on-topics-that-inspire-conspiracy-theories.html">outsourcing fact-checking to Wikipedia</a>. What’s going on? Something different.</p>
<p>Rather than defaulting to restricting access, <a href="http://meatballwiki.org/wiki/SoftSecurity">Soft Security</a> defaults to making everything open, everything shared, everything reversible. It relies on evolving a community to govern this shared space.</p>
<h3>Wikis and Ostrom’s Commons</h3>
<p>Wikis are a commons:</p>
<ul>
<li>
<p><strong>Shared resource</strong>: the wiki.</p></li>
<li>
<p><strong>Scarcity</strong>: page titles.</p></li></ul>
<p>…so why aren’t they also <a href="https://en.wikipedia.org/wiki/Tragedy_of_the_commons">a tragedy</a>?</p>
<p><a href="https://en.wikipedia.org/wiki/Elinor_Ostrom#Design_principles_for_Common_Pool_Resource_(CPR)_institution">Ostrom’s Theory of the Commons</a> outlines eight conditions under which a commons can be managed without tragedy.</p>
<p>Let’s look at how wikis stack up against Ostrom’s rules for managing a commons:</p>
<ol>
<li>
<p><strong>Clear boundaries</strong>: the wiki domain, and those who can edit it.</p></li>
<li>
<p><strong>Managed by locals</strong>: wiki users.</p></li>
<li>
<p><strong>Community makes its own rules</strong>: wikis have no formal rules beyond actions the community carries out.</p></li>
<li>
<p><strong>Community can monitor behavior</strong>: edit history.</p></li>
<li>
<p><strong>Graduated sanctions for those who violate community rules</strong>: reprimands on talk pages, page rollbacks, banning.</p></li>
<li>
<p><strong>Cheap, accessible conflict resolution</strong>: rollbacks.</p></li>
<li>
<p><strong>Self-determination of the community</strong>: it’s a volunteer project.</p></li>
<li>
<p><strong>In large commons, multiple levels of management</strong>: on Wikipedia, administrators.</p></li></ol>
<h3>The wiki way of building</h3>
<p><strong>The wiki way of building</strong>: create simple technologies with extremely wide ranges of motion, then evolve communities to govern them.</p>
<ul>
<li>
<p>Build the simplest thing that could possibly work.</p></li>
<li>
<p>Construct it out of an <strong><a href="https://subconscious.substack.com/p/provoking-emergence-with-alphabets">open-ended alphabet</a></strong>.</p></li>
<li>
<p>Don’t constrain its range of motion.</p></li>
<li>
<p>Don’t impose meaning. Let meaning emerge from interactions between people.</p></li>
<li>
<p>Create a shared commons with Ostrom’s 8 Rules.</p></li>
<li>
<p>Garden a community, a culture, an ecology of trust.</p></li></ul>
<p>These are conditions under which we can build shared understandings. They can create space for sensemaking together, even within our networked <a href="https://twitter.com/gordonbrander/status/1348315480319135744">fork-only information environment</a>. There are probably other conditions under which we can build shared understandings on the internet, but at least we know of one.</p>
<p><em>I'm building a new tool for thought. I have a general sense of the direction I’m traveling, but I will be as surprised as you are at what I discover along the way. I'm posting these emails as trail markers every week or so. I share updates, ideas, design patterns, and snippets of books and papers.</em></p>
//These are my notes exploring a paper from 2014 by Ward Cunningham et al that explores the relationship between Agile software development and wikis. I found it to be an extremely productive and enjoyable excursion into the minds of some giants in the hypertext space. Please feel free to borrow my notes by dragging and dropping the associated tags above into your [[TiddlyWiki|https://tiddlywiki.com]] if you use one (and you should be; it was instrumental in helping me to properly explore this seminal paper). I may expand on this topic in the future by talking about [[TiddlyWiki patterns]].//
{{Wiki as a Pattern Language}}
From the paper:
{{Link between Pattern languages & Wikis}}
These limitations may have stymied the adoption of the idea of [[pattern languages]] in its home domain of architecture as we shall see below.
!!!__Origin of the concept of Pattern Languages__
{{History of Pattern Languages}} However, these limitations are not exclusive to books.
{{Limitations of classical wikis & other media & alternatives}}
Another limiting factor is inherent to pattern languages themselves; {{Limitations of Pattern Languages}}
It is here that we begin to understand the direct link between [[Agile principles in software development|Agile development]], wikis and pattern languages.
!!!__Agile, Wiki & Pattern Languages__
{{Agile, Wiki & Pattern Languages}}
It seems there are some who have experimented with the concept of [[WikiStory|https://wiki.c2.com/?WikiStory]] before. Yet the website to that attempt doesn't work anymore. I wonder why.
Quote from wiki c2:
<<<
WikiStory.com allows you to write a short story together with other authors or to write one alone but share it with and receive feedback from thousands of others.
Become a member of WikiStory to contribute to, begin, or edit a story, poem, plot, or character description. Whether you want to comment on the plotline, edit a sentence, flesh out a character, write a chapter, or just fix grammar and spelling errors, WikiStory is the place for you to let your creative energies loose. In addition to stories, you may work on poems, independent plot outlines, or character descriptions, which you may then use in your writing or others may use.
If you want to write without allowing your work to be edited by others, you may put your work on your Author Page or an Author Subpage. In this case, other authors will not be able to edit your story, although they will still be free to make comments about your work on a talk page.
<<<
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
{{Important links}}
<<todolist-ui caption:"!! Work" base:"work" width:50%>>
<$button>
<$action-sendmessage $message="tm-new-tiddler" tags="Work" title="New Work Note" />
Make a Work Note
</$button>
''Listed Tiddlers tagged <<tag-pill "Work">>''
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Work'>>
</div>
```javascript
this.addEventListener('install', function (event) {
console.log('Mpad-v20 service worker installed');
return
});
self.addEventListener('activate', function (event) {
var cacheWhitelist = ['mpad-v20'];
event.waitUntil(
caches.keys().then(function (keyList) {
return Promise.all(keyList.map(function (key) {
if (cacheWhitelist.indexOf(key) === -1) {
return caches.delete(key);
}
}));
})
);
});
this.addEventListener('fetch', function (event) {
/**
* Generic request body with redirect set to follow
*/
var cachedRequest = new Request(event.request.url, {
bodyUsed: false,
credentials: "include",
integrity: "",
method: "GET",
redirect: "follow", // needed to prevent respondWith() from throwing network error
referrer: "",
referrerPolicy: "no-referrer-when-downgrade"
})
if (event.request.method == 'OPTIONS') return
if (event.request.method == 'HEAD') return
/**
* Respond normally when network available and cache,
* else serve cached items.
*/
event.respondWith(
fetch(event.request).then(function(res){
if (event.request.method == 'PUT') {
// update cache after successful PUT
var eventURL = event.request.url;
caches.open('mpad-v20').then(function (cache) {
cache.keys().then(function (keys) {
keys.forEach(function (request) {
var array = eventURL.match(request.url)
if (array) {
console.log('Cached ' + array[0]);
var cachedRequestForPut = new Request(array[0], {
bodyUsed: false,
credentials: "include",
integrity: "",
method: "GET",
redirect: "follow",
referrer: "",
referrerPolicy: "no-referrer-when-downgrade"
})
cache.add(cachedRequestForPut);
}
});
});
});
}
// cache all GET requests
if (event.request.method == 'GET') {
caches.open('mpad-v20').then(function(cache){
console.log('Cached ' + cachedRequest.url)
cache.put(cachedRequest,res);
});
}
return res.clone();
}).catch(function(){
// return cache if failed connection
console.log('Serving cache of: ' + cachedRequest.url);
return caches.match(cachedRequest);
})
)
});
```
* Will divide functionality into two plugins:
** The data persistence plugin will persist all data for all respective users, creating shared databases wherever required. The data by default must only be only viewable and editable by the person who made it.
** The state persistence plugin will work with the [[webrtc|https://webrtcforthecurious.com/docs/01-what-why-and-how/]] framework ([[whatever it may be|Collaboration framework options]] to share NON DATA state.
* To keep things simple, maybe we should focus on showing what collaborating users are:-
** looking at (only shared tiddlers, either viewable or viewable and editable),
** editing
** opening tiddlers being edited into draft mode should show us edits being done live.
** an optional way of showing individual mouses could be added as an experiment
** realtime chat (with tiddlers persisting via data persistence plugin)
I'm having some difficulty with my web forms. Figures. I have to find a way to take form data from two forms and send them together somehow as one. I haven't figured out how I'm going to accomplish that yet. I suppose I could iterate over the other form and append the data to one 'primary' form and send that along.
Meanwhile, I have discovered why my checkbox data isn't going; they haven't had their names set properly. I had originally thought that the their Material-UI component API had a `name` attribute. But apparently I need to use the `inputProps` attribute instead.
With that in mind, I hope to be done with this by tonight, or maybe tomorrow. I'm eager to deploy this as soon as possible at Netlify so I can begin validating my [[Rats collection]].
This awesome web extension and app enables bookmarking, web annotation and note-taking for web power users. Its primary feature is allowing you to import your bookmarks to make them full-text searchable. It's local first and you pay 3 euros a month to sync between desktop and mobile. It's pretty neat and it has a relatively large following!
The syncing is paid because there is no other way to sync data. But I wonder if you can mitigate this by adding some logic to sync to whatever service you'd like, then making it accessible to other platforms. That would very cool!
Wrike, Inc. is a privately held project management application service provider based in San Jose, California
__Features__
Two categories:
* Project mx: to track project dates dependencies
* Team collaboration: to aid in conversations, asset creation, and decision-making by teams.
Feature summary:
* @mentions
* API
* Access control
* Activity dashboard
* Activity management
* Activity tracking
* Andriod and iPhone app
* Approval process control
* Asset management
* Automate recurring tasks & projects
* Automatic backup
* Branded workspace
* Budget tracking
* Built-in time-tracker
* Built-in timer and reports
* Calendar
* Calendar integrations with Google and iCalendar
* Calendar management
* Collaboration tools
* Collaborative workspace
* Configurable workflow
* Custom calendars for vacations, sick leave etc.
* Customizable reporting
* Dashboard creation
* Data backups
* Data encryption
* Due date tracking
* Email & calendar synchronization
* Email-to-task syncing
* File management
* File sharing
* File version control
* Forms management
* Personal dashboard
* Planning tools
* Prioritizing
* Progress reports
* Project reporting
* Project time tracking
* Project tracking
* Project workflow
* Real time reporting
* Reporting & statistics
* Resource management
* Role-based permissions
* Secure data storage
* Shared workspace
* Subtasks
* Task management
* Task planning
* Task scheduling
* Task tracking
* Task-related discussions
* Template management
* Third party integration
* Time tracking by project
* Timeline management
* User access controls
* User groups
* Workflow management
* Workload view & scheduling
* assignment tracking
* bug tracking
Most of us work as part time copywriters, constantly typing out the same thoughts, ideas and information to suit the presentation medium of our choice.
This drains us of energy and vitality. If only we could transclude our way out of the problem. Write once, present everywhere.
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Writing'>>
</div>
<div><a class="domain reader-domain" href="https://yeoman.io/authoring/">yeoman.io</a>
<div> </div>
<h1>Writing Your Own Yeoman Generator</h1>
<div> </div>
<div>
<div>6-7 minutes</div></div></div>
<div>
<hr />
<div>
<div>
<div>
<p>Generators are the building blocks of the Yeoman ecosystem. They’re the plugins run by <code>yo</code> to generate files for end users.</p>
<p>In reading this section, you’ll learn how to create and distribute your own.</p>
<h2>Organizing your generators</h2>
<h3>Setting up as a node module</h3>
<p>A generator is, at its core, a Node.js module.</p>
<p>First, create a folder within which you’ll write your generator. This folder must be named <code>generator-name</code> (where <code>name</code> is the name of your generator). This is important, as Yeoman relies on the file system to find available generators.</p>
<p>Once inside your generator folder, create a <code>package.json</code> file. This file is a Node.js module manifest. You can generate this file by running <code>npm init</code> from your command line or by entering the following manually:</p>
<div>
<pre><code><span><span>{</span></span><span><span>
</span></span><span><span>"name"</span></span><span><span>:</span></span><span><span> </span></span><span><span>"generator-name"</span></span><span><span>,</span></span><span><span>
</span></span><span><span>"version"</span></span><span><span>:</span></span><span><span> </span></span><span><span>"0.1.0"</span></span><span><span>,</span></span><span><span>
</span></span><span><span>"description"</span></span><span><span>:</span></span><span><span> </span></span><span><span>""</span></span><span><span>,</span></span><span><span>
</span></span><span><span>"files"</span></span><span><span>:</span></span><span><span> </span></span><span><span>[</span></span><span><span>
</span></span><span><span>"generators"</span></span><span><span>
</span></span><span><span>],</span></span><span><span>
</span></span><span><span>"keywords"</span></span><span><span>:</span></span><span><span> </span></span><span><span>[</span></span><span><span>"yeoman-generator"</span></span><span><span>],</span></span><span><span>
</span></span><span><span>"dependencies"</span></span><span><span>:</span></span><span><span> </span></span><span><span>{</span></span><span><span>
</span></span><span><span>"yeoman-generator"</span></span><span><span>:</span></span><span><span> </span></span><span><span>"^1.0.0"</span></span><span><span>
</span></span><span><span>}</span></span><span><span>
</span></span><span><span>}</span></span><span>
</span></code></pre></div>
<p>The <code>name</code> property must be prefixed by <code>generator-</code>. The <code>keywords</code> property must contain <code>"yeoman-generator"</code> and the repo must have a description to be indexed by our <a href="https://yeoman.io/generators/">generators page</a>.</p>
<p>You should make sure you set the latest version of <code>yeoman-generator</code> as a dependency. You can do this by running: <code>npm install --save yeoman-generator</code>.</p>
<p>The <code>files</code> property must be an array of files and directories that is used by your generator.</p>
<p>Add other <a href="https://docs.npmjs.com/files/package.json"><code>package.json</code> properties</a> as needed.</p>
<h3>Folder tree</h3>
<p>Yeoman’s functionality is dependent on how you structure your directory tree. Each sub-generator is contained within its own folder.</p>
<p>The default generator used when you call <code>yo name</code> is the <code>app</code> generator. This must be contained within the <code>app/</code> directory.</p>
<p>Sub-generators, used when you call <code>yo name:subcommand</code>, are stored in folders named exactly like the sub command.</p>
<p>In an example project, a directory tree could look like this:</p>
<div>
<pre><code><span>├───</span><span>package</span><span>.</span><span>json
</span><span>└───</span><span>generators</span><span>/</span><span>
</span><span>├───</span><span>app</span><span>/</span><span>
</span><span>│</span><span> </span><span>└───</span><span>index</span><span>.</span><span>js
</span><span>└───</span><span>router</span><span>/</span><span>
</span><span>└───</span><span>index</span><span>.</span><span>js</span></code></pre></div>
<p>This generator will expose <code>yo name</code> and <code>yo name:router</code> commands.</p>
<p>Yeoman allows two different directory structures. It’ll look in <code>./</code> and in <code>generators/</code> to register available generators.</p>
<p>The previous example can also be written as follows:</p>
<div>
<pre><code><span>├───</span><span>package</span><span>.</span><span>json
</span><span>├───</span><span>app</span><span>/</span><span>
</span><span>│</span><span> </span><span>└───</span><span>index</span><span>.</span><span>js
</span><span>└───</span><span>router</span><span>/</span><span>
</span><span>└───</span><span>index</span><span>.</span><span>js</span></code></pre></div>
<p>If you use this second directory structure, make sure you point the <code>files</code> property in your <code>package.json</code> at all the generator folders.</p>
<div>
<pre><code><span><span>{</span></span><span><span>
</span></span><span><span>"files"</span></span><span><span>:</span></span><span><span> </span></span><span><span>[</span></span><span><span>
</span></span><span><span>"app"</span></span><span><span>,</span></span><span><span>
</span></span><span><span>"router"</span></span><span><span>
</span></span><span><span>]</span></span><span><span>
</span></span><span><span>}</span></span><span>
</span></code></pre></div>
<h2>Extending generator</h2>
<p>Once you have this structure in place, it’s time to write the actual generator.</p>
<p>Yeoman offers a base generator which you can extend to implement your own behavior. This base generator will add most of the functionalities you’d expect to ease your task.</p>
<p>In the generator’s index.js file, here’s how you extend the base generator:</p>
<div>
<pre><code><span><span>var</span></span><span> </span><span><span>Generator</span></span><span> </span><span><span>=</span></span><span> </span><span><span>require</span></span><span><span>(</span></span><span><span>'yeoman-generator'</span></span><span><span>);</span></span><span>
</span><span><span>module</span></span><span><span>.</span></span><span><span>exports</span></span><span> </span><span><span>=</span></span><span> </span><span><span>class</span></span><span> </span><span><span>extends</span></span><span> </span><span><span>Generator</span></span><span> </span><span><span>{};</span></span>
</code></pre></div>
<p>We assign the extended generator to <code>module.exports</code> to make it available to the ecosystem. This is how we <a href="https://nodejs.org/api/modules.html#modules_module_exports">export modules in Node.js</a>.</p>
<h3>Overwriting the constructor</h3>
<p>Some generator methods can only be called inside the <code>constructor</code> function. These special methods may do things like set up important state controls and may not function outside of the constructor.</p>
<p>To override the generator constructor, add a constructor method like so:</p>
<div>
<pre><code><span><span>module</span></span><span><span>.</span></span><span><span>exports</span></span><span> </span><span><span>=</span></span><span> </span><span><span>class</span></span><span> </span><span><span>extends</span></span><span> </span><span><span>Generator</span></span><span> </span><span><span>{</span></span><span>
</span><span><span>// The name `constructor` is important here</span></span><span>
</span><span><span>constructor</span></span><span><span>(</span></span><span><span>args</span></span><span><span>,</span></span><span> </span><span><span>opts</span></span><span><span>)</span></span><span> </span><span><span>{</span></span><span>
</span><span><span>// Calling the super constructor is important so our generator is correctly set up</span></span><span>
</span><span><span>super</span></span><span><span>(</span></span><span><span>args</span></span><span><span>,</span></span><span> </span><span><span>opts</span></span><span><span>);</span></span><span>
</span><span><span>// Next, add your custom code</span></span><span>
</span><span><span>this</span></span><span><span>.</span></span><span><span>option</span></span><span><span>(</span></span><span><span>'babel'</span></span><span><span>);</span></span><span> </span><span><span>// This method adds support for a `--babel` flag</span></span><span>
</span><span><span>}</span></span><span>
</span><span><span>};</span></span>
</code></pre></div>
<h3>Adding your own functionality</h3>
<p>Every method added to the prototype is run once the generator is called–and usually in sequence. But, as we’ll see in the next section, some special method names will trigger a specific run order.</p>
<p>Let’s add some methods:</p>
<div>
<pre><code><span><span>module</span></span><span><span>.</span></span><span><span>exports</span></span><span> </span><span><span>=</span></span><span> </span><span><span>class</span></span><span> </span><span><span>extends</span></span><span> </span><span><span>Generator</span></span><span> </span><span><span>{</span></span><span>
</span><span><span>method1</span></span><span><span>()</span></span><span> </span><span><span>{</span></span><span>
</span><span><span>this</span></span><span><span>.</span></span><span><span>log</span></span><span><span>(</span></span><span><span>'method 1 just ran'</span></span><span><span>);</span></span><span>
</span><span><span>}</span></span><span>
</span><span><span>method2</span></span><span><span>()</span></span><span> </span><span><span>{</span></span><span>
</span><span><span>this</span></span><span><span>.</span></span><span><span>log</span></span><span><span>(</span></span><span><span>'method 2 just ran'</span></span><span><span>);</span></span><span>
</span><span><span>}</span></span><span>
</span><span><span>};</span></span>
</code></pre></div>
<p>When we run the generator later, you’ll see these lines logged to the console.</p>
<h2>Running the generator</h2>
<p>At this point, you have a working generator. The next logical step would be to run it and see if it works.</p>
<p>Since you’re developing the generator locally, it’s not yet available as a global npm module. A global module may be created and symlinked to a local one, using npm. Here’s what you’ll want to do:</p>
<p>On the command line, from the root of your generator project (in the <code>generator-name/</code> folder), type:</p>
<pre>npm link</pre>
<pre> </pre>
<p>That will install your project dependencies and symlink a global module to your local file. After npm is done, you’ll be able to call <code>yo name</code> and you should see the <code>this.log</code>, defined earlier, rendered in the terminal. Congratulations, you just built your first generator!</p>
<h3>Finding the project root</h3>
<p>While running a generator, Yeoman will try to figure some things out based on the context of the folder it’s running from.</p>
<p>Most importantly, Yeoman searches the directory tree for a <code>.yo-rc.json</code> file. If found, it considers the location of the file as the root of the project. Behind the scenes, Yeoman will change the current directory to the <code>.yo-rc.json</code> file location and run the requested generator there.</p>
<p>The Storage module creates the <code>.yo-rc.json</code> file. Calling <code>this.config.save()</code> from a generator for the first time will create the file.</p>
<p>So, if your generator is not running in your current working directory, make sure you don’t have a <code>.yo-rc.json</code> somewhere up the directory tree.</p>
<h2>Where to go from here?</h2>
<p>After reading this, you should be able to create a local generator and run it.</p>
<p>If this is your first time writing a generator, you should definitely read the next section on <a href="https://yeoman.io/authoring/running-context.html">running context and the run loop</a>. This section is vital to understanding the context in which your generator will run, and to ensure that it will compose well with other generators in the Yeoman ecosystem. The other sections of the documentation will present functionality available within the Yeoman core to help you achieve your goals.</p></div></div></div></div>
<div>
<div><a class="domain" href="https://www.freecodecamp.org/news/cross-site-scripting-what-is-xss/amp/?__twitter_impression=true">www.freecodecamp.org</a>
<h1>What is Cross Site Scripting? How to Protect against XSS Attacks</h1>
<div>Megan Kaczanowski</div>
<div>
<div>8 - 10 minutes</div></div></div>
<hr />
<div>
<div>
<div>
<p>Cross Site Scripting is the second most prevalent issue in the Open Source Foundation for Application Security (OWASP) top 10 – it's found in roughly 2/3 of all applications.</p>
<p>While automated tools can find some of these problems, there are also automated tools designed to detect and exploit these vulnerabilities.</p>
<h2>What is Cross-Site Scripting?</h2>
<p>XSS attacks occur when data enters a web application through an untrusted source (like a web request), and is sent to a user without being validated.</p>
<p>XSS can cause scripts to be executed in the user's browser, resulting in hijacked sessions, website defacement, and redirection of users to malicious sites.</p>
<p>Essentially an attacker is inputting malicious code into a section for user input which the server expects to be data (but is instead code designed to be executed).</p>
<p>And if you don't handle it appropriately, the malicious code can break out of the 'data plane' and execute as normal code (the 'control plane').</p>
<p>We can group most XSS attacks into two categories: stored and reflected. A third type, which is less common, is referred to as DOM-based XSS.</p>
<p>Any XSS attack occurs when data enters via an untrusted source and is sent to a user (in dynamic content) without being checked for malicious content. The malicious content can be JavaScript, Flash, HTML, or any other code a browser is capable of executing.</p>
<h3>Reflected XSS (Impact: Moderate)</h3>
<p>This is the most basic type of XSS, wherein an application receives data and then includes that data in the response to the user in an insecure way.</p>
<p>For example, if an attacker convinces a user to click this phishing link:</p>
<p>http://legitwebsite.com/message=<script>malicious code</script></p>
<p>If the legitimate site doesn't process the data and just returns it to the user, the user's browser will execute the malicious code.</p>
<h3>Stored XSS (Impact: Severe)</h3>
<p>Stored XSS occurs when the injection is permanently stored on the target's servers, such as a message in a forum or comment section, in a database, and so on. Essentially this means that the exploit impacts every visitor to the site/application.</p>
<p>For example, if a site allows users to comment and then displays their comments, a user could enter the following:</p>
<p><p><script>malicious code</script></p></p>
<p>If the site doesn't check user input appropriately, it could result in the script executing for any other user who sees this message.</p>
<h3>DOM-based XSS/Client Side XSS (Impact: Moderate)</h3>
<p>The big difference between reflected and stored XSS and DOM-based is where the attack is injected.</p>
<p>Reflected and stored XSS are server side issues, while DOM-based is a client (browser) side issue. DOM-based XSS occurs in the DOM (document object model) instead of as part of the HTML.</p>
<p>Rather than inserting malicious code into the page, this attack will allow the legitimate page to load, then leverage user input to add HTML to the page, executing the malicious script. This takes advantage of the increasing amounts of HTML generated by the client.</p>
<p>For example, an attacker could social engineer a victim into clicking on a malicious link (such as http://www.legitimatewebsite.com/contact#<script>malicious code</script>). The website will receive the legitimate request for the page, but not the malicious fragment (because browsers don't send anything after the # character to a site's server). The victim will see the legitimate website, but the victim's browser will also execute the malicious script.</p>
<p>Due to the way this attack works, server-side protections won't prevent it as the malicious code isn't being sent to the server at all.</p>
<p>Instead, protecting against this attack requires ensuring that JavaScript doesn't interpret URI fragments (uniform resource identifier - A URI identifies a resource at a specified location such as a URL) in an insecure manner.</p>
<h2>Mitigation Measures for XSS Attacks</h2>
<p>Mitigating effectively against XSS attacks requires a combination of the below measures, which, when you use them together, can provide a robust defense against XSS.</p>
<h3>Avoid inserting user-supplied/untrusted data anywhere other than specified locations</h3>
<p>This is the first and most important rule. Encoding, escaping, validating, and filtering input is extremely difficult and very complicated.</p>
<p>It's much easier to limit the number of places where someone can input untrusted data. The safest assumption is that all untrusted data is malicious.</p>
<h3>Validate/Filter Input</h3>
<p>Ideally, all input should be validated against a list of acceptable values.</p>
<h3>Encode Output</h3>
<p>Any user-input data should be encoded to prevent it from being read as active. This may require CSS, JavaScript, URL, and/or HTML encoding.</p>
<p>It's particularly important to ensure output is encoded at any point where it is exposed, as the same data could be stored and displayed in multiple places.</p>
<h3>Choose Frameworks Carefully</h3>
<p>Use frameworks which provide automatic escaping functionality (like Go Templates) or those which have native defenses against XSS (like .NET's request validation).</p>
<h3>Set the HttpOnly Flag</h3>
<p>XSS attacks often use JavaScript to steal session cookies (and normal web apps rarely need to use JavaScript to access session cookies). So setting the HttpOnly flag protects session cookies from attackers, while not limiting normal behavior. Most browsers support setting this flag.</p>
<p>Similar to HttpOnly flags, any HTTP responses which shouldn't contain HTML or JavaScript can leverage 'Content-Type' and 'X-Content-Type-Options' headers to ensure that browsers only interpret responses in the way they were intended to do.</p>
<h3>Educate Developers about Security</h3>
<p>Education specifically targeted at developers, like 'Security Champions' programs which pair application security team members with developers, are important. They can help educate developers about security vulnerabilities (like XSS) and how to prevent them.</p>
<h3>Have a Content Security Policy</h3>
<p>A content security policy (CSP) can help you detect and mitigate XSS and other data injection attacks.</p>
<p>They set allowlists for sources of trusted content and can apply only to sensitive pages (like payment pages) or, ideally, to the entire site. They can even provide notifications if content is loaded from a page which it should not.</p>
<p>They're fairly easy to deploy – just add the Content-Security-Policy HTTP header to the webpage and any directives that are appropriate.</p>
<p>The <a href="https://github.com/david-risney/CSP-Fiddler-Extension">CSP Fiddler Extension</a> can help you generate a baseline CSP. The tool will build a policy around reports submitted by the browser, creating a changeable baseline policy.</p>
<p>Additionally, you can use <a href="https://report-uri.com/">Report URI</a>, run by Troy Hunt and Scott Helme, to get alerts on CSP violations in order to more proactively monitor your sites.</p>
<p>Typically a policy consists of a series of directives which will describe the policy for a type of resource or area. One of these directives, sub-resource integrity checks, is used to ensure that a browser verifies that third party content (from sources like a CDN) is delivered without being manipulated.</p>
<p>Essentially, a provided cryptographic hash must match the loaded file. If a hacker modifies the third party's content, the site simply will not load the malicious content.</p>
<p>The problem is that if the content provider updates the file or makes legitimate changes, the content will also not load (because the hash will have changed).</p>
<p>The main way to work around this issue is to leverage versioned JavaScript resources, such as chatbot_0.1.23.js, instead of chatbot.js. This is a best practice in general, and it also ensures the continuity of services if the JS file changes.</p>
<p>While browsers do not universally support this feature, for those browsers which lack the feature, using it won't break the site (it simply won't leverage the technology).</p>
<p>For more detail on the various directives, check out <a href="https://developers.google.com/web/fundamentals/security/csp">these</a> <a href="https://content-security-policy.com/">guides</a>.</p>
<h3>Sources/Further Reading:</h3>
<ul>
<li><a href="https://www.troyhunt.com/owasp-top-10-for-net-developers-part-2/">Cross-Site Scripting from Troy Hunt</a></li>
<li><a href="https://www.troyhunt.com/understanding-xss-input-sanitisation/">Understanding XSS - Input Sanitization Semantics and Output Encoding Contexts</a></li>
<li><a href="https://owasp.org/www-community/attacks/xss/">OWASP XSS</a></li>
<li><a href="https://owasp.org/www-community/Types_of_Cross-Site_Scripting">OWASP Types of XSS</a></li>
<li><a href="https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html#rule-8-prevent-dom-based-xss">OWASP Cross Site Scripting Prevention</a></li>
<li><a href="https://cheatsheetseries.owasp.org/cheatsheets/DOM_based_XSS_Prevention_Cheat_Sheet.html">OWASP DOM-Based XSS</a></li>
<li><a href="https://www.acunetix.com/websitesecurity/cross-site-scripting/">Acunetix Cross Site Scripting</a></li>
<li><a href="https://portswigger.net/web-security/cross-site-scripting">PortSwigger XSS</a></li>
<li><a href="https://www.rapid7.com/fundamentals/cross-site-scripting/">Rapid7 XSS</a></li></ul></div></div></div></div>
https://future.africa/yc-application-guide-africa-startups/
Many young and inexperienced founders underestimate the great chasm that exists between having a business idea and a working business. Crossing this chasm safely on the path to a profitable business is what separates the Elon Musks from mere dreamers.
Taking time out to properly do your homework and figure out the details of your idea can be a very rewarding and helpful experience. Not to mention it can save you a lot of time and money! However, I must stress one important thing. This is by no means a way of discouraging you from trying out your idea. It's important to make every effort to pursue worthwhile projects that can lead to a new source of income if nothing else. The point of "thinking it through" is to reduce the amount of risk in executing your idea to and acceptable amount.
Furthermore, this process also helps prevent you from going overboard with your 'passion'. Too many founders have fallen into the trap of loving their idea too much. This can lead you to the sunken cost fallacy: the erroneous idea that you must stay the course because of how much effort in time and resource you've already sunk into the project.
Nothing in this universe or beyond says you shouldn't want out of your own project. In fact, preparing and following a strict criteria for success can save you a lot of the anxiety that comes with making the decision to persevere, pivot or call it a day. The process liberates you to do what you need to succeed or fail //safely//.
However, 'thinking through your project' is not as simple as some might think. It can take a while to master. But at the end of this process, you end up with actionable deliverables that you can use to test the riskiest assumptions in your idea. Failure to do this will cost you in the long run. If you haven't thought your idea through, then no amount of external funding (which BTW is usually given with the assumption that you've already come up with a recurring revenue model that can scale, and not otherwise) can save your severely flawed startup company.
At Innovation Peer, we're helping many people, from first time founders full of potential to established players to properly apply these processes of business model innovation to come up with robust business models that they can then evaluate in the real market via rapid experiments. We invite you to come talk to us at [[Innovation Peer|https://innovationpeer.com]] to help apply more thought to your project.